diff --git a/.bundlemonrc.json b/.bundlemonrc.json index 4dfd4d327..27668c1f8 100644 --- a/.bundlemonrc.json +++ b/.bundlemonrc.json @@ -22,7 +22,7 @@ }, { "path": "./libraries/browser-tracker-core/dist/index.module.js", - "maxSize": "25kb", + "maxSize": "27.5kb", "maxPercentIncrease": 10 }, { @@ -31,5 +31,5 @@ "maxPercentIncrease": 10 } ], - "reportOutput": ["github"] + "reportOutput": [] } diff --git a/.github/RELEASE.md b/.github/RELEASE.md new file mode 100644 index 000000000..c4f8ad361 --- /dev/null +++ b/.github/RELEASE.md @@ -0,0 +1,92 @@ +# Preparing a release + +The `Prepare release PR` workflow (`.github/workflows/prepare-release.yml`) +automates the "Prepare for X.Y.Z release" commit and the release PR that +maintainers used to write by hand. + +Note: the JS tracker is a Rush monorepo. Per-package version bumps and per- +package `CHANGELOG.md` entries are produced by `rush version --bump` and +`rush publish --apply` during `publish.yml`, **not** by the prepare-release +workflow. The prepare-release step only sets the `nextBump` field in +`common/config/rush/version-policies.json` so Rush bumps to the right target +on publish. + +## How a release works now + +1. Create the release branch from `master` and merge feature/bug-fix PRs into + it as usual: + ```bash + git checkout master && git pull + git checkout -b release/4.9.0 + git push -u origin release/4.9.0 + ``` +2. When the branch is ready to ship, go to **Actions → Prepare release PR → + Run workflow** and fill in: + - `release_branch`: `release/4.9.0` + - `dry_run`: leave unchecked for a real run; check it for a preview. +3. The workflow computes the correct `nextBump` (`patch` / `minor` / `major`) + from the current version in `version-policies.json` vs the target version + parsed from the branch name, then updates the single line in + `common/config/rush/version-policies.json`. +4. Commits as `Prepare for X.Y.Z release` and pushes to the release branch. +5. Asks Claude to draft the PR body from the commits on the branch (using the + previous release PR as a style example) — flat bullets for 1–2 changes, + `**New features** / **Enhancements** / **Bug fixes**` groups for 3+, with + `thanks to @user` attribution for external contributors only. +6. Opens (or updates) a PR titled `Release/X.Y.Z` against `master`. + +Review the PR, edit the PR body in place if needed, then merge. After +merging, run **Actions → Deploy Tracker** with the version string as the +input. `publish.yml` runs `rush version --bump` (which performs the actual +per-package version bumps and generates the per-package CHANGELOGs from the +`rush change` files under `common/changes/`), cross-validates the resulting +tracker version against your input, builds, tests, publishes to npm, tags +`X.Y.Z`, and creates the GitHub release with `sp.js` / `sp.lite.js` and the +plugins zip attached. + +## Re-running on the same branch + +If you push a small fix to the release branch after the workflow ran, re-run +the workflow. It detects that `HEAD` is already a `Prepare for X.Y.Z release` +commit and skips the bump+commit — it only refreshes the PR body. + +If you need the bump re-done from scratch, drop the prepare commit locally +(`git reset --hard HEAD~1 && git push --force-with-lease`) and re-run the +workflow. + +## Dry-run mode + +`dry_run: true` runs everything up to (but not including) the push and the PR +write. The full `git diff` and the generated PR body are printed to the +workflow log. Use this the first time you exercise the workflow on a real +release branch. + +## Inputs that will make the workflow fail loudly + +- A `release_branch` that doesn't match `release/X.Y.Z`. +- A `release_branch` that doesn't exist on origin. +- A target version that isn't a valid next semver bump from the current + version in `version-policies.json` (e.g. you're on `4.8.1` and you ask + for `5.1.0`; the script only accepts the next patch, the next minor, or + the next major). +- A previous release tag that can't be found on `master` (the workflow needs + one to compute the commit list). + +## Notes on the commit filter + +`commits-raw.txt` is built by filtering out commits the JS publish pipeline +creates automatically, so they don't end up in the release notes: + +- `Prepare for ...` +- `Bump versions [skip ci]` (from `rush version --bump`) +- `Update changelogs [skip ci]` (from `rush publish --apply`) +- `Applying documentation updates.` (api-docs commit during publish) + +If the publish pipeline ever changes its commit subjects, update the +`grep -v -E` line in `prepare-release.yml` to match. + +## Requirements + +- `ANTHROPIC_API_KEY` secret must be set on the repository. +- `GITHUB_TOKEN` (provided automatically) needs `contents: write` and + `pull-requests: write`, which the workflow declares. diff --git a/.github/scripts/classify-commits.sh b/.github/scripts/classify-commits.sh new file mode 100755 index 000000000..62e87ae72 --- /dev/null +++ b/.github/scripts/classify-commits.sh @@ -0,0 +1,179 @@ +#!/usr/bin/env bash +# +# Classify release commits into categories for CHANGELOG entries and PR bodies. +# +# Reads annotated commit lines on stdin, one per line, in the format produced by +# the "Annotate commits with author + external flag" workflow step: +# +# -- author= external= +# +# Writes TSV to stdout, one line per included commit: +# +# \t\t\t\t +# +# where is one of: breaking, feature, fix, improvement, enhancement +# and is either "#NNN" or empty. +# +# Chore-type commits (chore/ci/docs/test/build/style, version-bump and +# release-automation commits) are dropped entirely. +# +# Classification order: +# 1. Conventional-commit prefix (feat:, fix:, perf:, ...). A "!" before the +# colon, or a "BREAKING CHANGE" marker, promotes the commit to breaking. +# 2. Leading imperative verb, for the many historical commits in these repos +# that predate conventional commits. +# 3. Anything left over becomes "enhancement". + +set -euo pipefail + +# Subjects matching these patterns are release-automation noise, never user-facing. +readonly SKIP_SUBJECT_RE='^(Prepare for |Bump versions|Update changelogs|Applying documentation updates|Merge (branch|pull request|remote-tracking)|Release/|Run rush change|Initial (commit|release)|Resync )' + +# Conventional-commit types that never appear in release notes. +readonly SKIP_TYPE_RE='^(chore|ci|docs|test|tests|build|style|revert)$' + +# Bare-subject chore detection, for the many commits predating conventional +# commits. Deliberately narrow: it requires a chore *object* (CI, README, API +# docs, the test suite, a linter) so that user-facing changes which merely +# mention a version or a dependency are still included. Verified against the +# existing hand-written CHANGELOGs, which omit exactly these. +readonly SKIP_BARE_RE='(^|[[:space:]])(ci|CI)([[:space:]]|$)|[Ll]inting|[Ll]int issues|(unit|integration|flaky)[[:space:]]+tests?|tests?[[:space:]]+(in|on)[[:space:]]+CI|README|API docs|api docs|[Dd]ocumentation (build|updates|page)|docs\.snowplow\.io|API ref|[Cc]hangelog|GitHub [Aa]ction|publish action|prepare-release|\[skip ci\]|[Cc]laude|CLAUDE\.md|[Aa]gent pipeline|instrumentation|jest tests|[Ss]igning config for demo|[Bb]undlemon|[Cc]overalls|[Dd]ependabot|[Aa]ddress (PR )?review|[Aa]ddress review comments|[Ff]ix(up)? review|[Aa]pply review|[Ss]elf-review|[Rr]ebase|[Mm]erge conflict|[Tt]ypo in (test|CI)' + +while IFS= read -r line; do + [[ -z "$line" ]] && continue + + # Split the trailing "-- author=... external=..." metadata off the subject. + # The separator is optional: dry runs and manual testing pipe bare + # " " lines, and treating those as metadata would leak the + # parsed fields into the description. + if [[ "$line" == *" -- author="* ]]; then + meta="${line##*" -- "}" + head="${line%" -- "*}" + else + meta="" + head="$line" + fi + + # The leading short sha is dropped; only the subject drives classification. + subject="${head#* }" + [[ "$subject" == "$head" ]] && subject="" + [[ -z "$subject" ]] && continue + + login="" + external="false" + if [[ -n "$meta" ]]; then + if [[ "$meta" =~ author=([^[:space:]]*) ]]; then + login="${BASH_REMATCH[1]}" + fi + if [[ "$meta" =~ external=([^[:space:]]*) ]]; then + external="${BASH_REMATCH[1]}" + fi + fi + + # Drop release-automation commits. + if [[ "$subject" =~ $SKIP_SUBJECT_RE ]]; then + continue + fi + + breaking="false" + # "BREAKING CHANGE" / "BREAKING-CHANGE" anywhere in the subject is a strong signal. + if [[ "$subject" == *"BREAKING CHANGE"* || "$subject" == *"BREAKING-CHANGE"* ]]; then + breaking="true" + fi + + category="" + description="$subject" + + # --- Rule 1: conventional-commit prefix --------------------------------- + # Matches "type: ", "type(scope): ", and the breaking "type!: " / "type(scope)!: ". + if [[ "$subject" =~ ^([a-zA-Z]+)(\(([^\)]*)\))?(!)?:[[:space:]]+(.*)$ ]]; then + type="$(printf '%s' "${BASH_REMATCH[1]}" | tr '[:upper:]' '[:lower:]')" + bang="${BASH_REMATCH[4]}" + rest="${BASH_REMATCH[5]}" + + if [[ "$type" =~ $SKIP_TYPE_RE ]]; then + continue + fi + + [[ -n "$bang" ]] && breaking="true" + + case "$type" in + feat|feature) category="feature" ;; + fix|bugfix) category="fix" ;; + perf|refactor) category="improvement" ;; + *) category="" ;; # unknown type: fall through to the verb rule + esac + + if [[ -n "$category" ]]; then + # Drop the scope. It duplicates information already obvious from the + # description in these repos (e.g. "emitter: wake emitter on signal"), + # and keeping it forces an awkward capitalisation of the scope token. + description="$rest" + fi + fi + + # --- Rule 2: leading imperative verb ----------------------------------- + # Covers the bare-subject style used throughout these repos' history. + if [[ -z "$category" ]]; then + # Bare chore commits (CI, docs, lint, test-suite upkeep) are not + # user-facing. Only applied here: an explicit "feat:"/"fix:" prefix in + # rule 1 always wins, so a genuine fix mentioning CI is never dropped. + if [[ "$subject" =~ $SKIP_BARE_RE ]]; then + continue + fi + + verb="$(printf '%s' "$subject" | awk '{print tolower($1)}')" + case "$verb" in + fix|fixes|fixed|resolve|resolves|correct|corrects|prevent|prevents|address|addresses|avoid|avoids|handle|handles|guard) + category="fix" ;; + add|adds|added|introduce|introduces|support|supports|expose|exposes|implement|implements|allow|allows|enable|enables|create|creates) + category="feature" ;; + improve|improves|update|updates|upgrade|upgrades|refactor|refactors|change|changes|make|makes|migrate|migrates|remove|removes|strip|strips|filter|filters|rename|renames|switch|switches|reduce|reduces|optimise|optimize|simplify|declare|deprecate|deprecates|move|moves|replace|replaces|drop|drops|adjust|adjusts|annotate|clean|unify|tidy|undeprecate|reintroduce) + category="improvement" ;; + *) + category="enhancement" ;; + esac + fi + + [[ "$breaking" == "true" ]] && category="breaking" + + # Extract a PR/issue reference to preserve at the end of the line. + # + # Subjects may carry two references: a trailing "(#NNN)" squash-merge marker + # added by GitHub, and an inline "(close #NNN)" issue link written by the + # author. Prefer the inline issue reference (it names the user-visible issue) + # and strip both markers so the formatters re-append exactly one. + pr_ref="" + if [[ "$description" =~ \((close[sd]?|fix(e[sd])?|resolve[sd]?)[[:space:]]+\#([0-9]+)\) ]]; then + # Preserve the "close" keyword: the existing CHANGELOGs write "(close #720)", + # and it keeps GitHub's issue-closing semantics visible in the notes. + pr_ref="${BASH_REMATCH[1]} #${BASH_REMATCH[3]}" + description="$(printf '%s' "$description" \ + | sed -E 's/[[:space:]]*\((close[sd]?|fix(e[sd])?|resolve[sd]?)[[:space:]]+#[0-9]+\)//I')" + # Drop a redundant trailing squash marker, e.g. "... (close #720) (#720)". + description="$(printf '%s' "$description" | sed -E 's/[[:space:]]*\(#[0-9]+\)[[:space:]]*$//')" + elif [[ "$description" =~ \(\#([0-9]+)\)[[:space:]]*$ ]]; then + pr_ref="#${BASH_REMATCH[1]}" + description="$(printf '%s' "$description" | sed -E 's/[[:space:]]*\(#[0-9]+\)[[:space:]]*$//')" + elif [[ "$description" =~ \#([0-9]+) ]]; then + pr_ref="#${BASH_REMATCH[1]}" + fi + + # Strip an inline BREAKING CHANGE marker; the category already conveys it. + description="$(printf '%s' "$description" \ + | sed -E 's/^BREAKING[ -]CHANGE:?[[:space:]]*//; s/[[:space:]]*BREAKING[ -]CHANGE:?[[:space:]]*/ /')" + + # Tidy whitespace and drop a trailing period for consistent list formatting. + description="$(printf '%s' "$description" | sed -E 's/[[:space:]]+/ /g; s/^ //; s/ $//; s/\.$//')" + [[ -z "$description" ]] && continue + + # Capitalise the first letter so bare conventional-commit bodies read as list items. + first="$(printf '%s' "${description:0:1}" | tr '[:lower:]' '[:upper:]')" + description="${first}${description:1}" + + # Empty fields are written as "-": bash's word splitting collapses runs of + # tabs, so a genuinely empty column would shift every later field left. + # The formatters translate "-" back to an empty string. + printf '%s\t%s\t%s\t%s\t%s\n' \ + "$category" "$description" "${pr_ref:--}" "${login:--}" "$external" +done diff --git a/.github/scripts/format-pr-body.sh b/.github/scripts/format-pr-body.sh new file mode 100755 index 000000000..016689db9 --- /dev/null +++ b/.github/scripts/format-pr-body.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash +# +# Format classified commits into a release PR body. +# +# Reads the TSV produced by classify-commits.sh on stdin and writes +# GitHub-flavoured markdown to stdout: bullets grouped under bold headers, +# with external contributors credited. +# +# Groups with no entries are omitted. If nothing at all is classifiable the +# script emits a short placeholder rather than an empty body, so the PR is +# never opened with a blank description. + +set -euo pipefail + +work="$(mktemp -d)" +trap 'rm -rf "$work"' EXIT + +# Bucket the incoming rows by category. +while IFS=$'\t' read -r category description pr_ref login external; do + [[ -z "${category:-}" ]] && continue + # classify-commits.sh writes "-" for empty columns; see the note there. + [[ "$pr_ref" == "-" ]] && pr_ref="" + [[ "$login" == "-" ]] && login="" + + line="- ${description}" + [[ -n "$pr_ref" ]] && line="${line} (${pr_ref})" + # Credit external contributors only; team members are not called out. + if [[ "$external" == "true" && -n "$login" ]]; then + line="${line} thanks to @${login}" + fi + printf '%s\n' "$line" >> "$work/$category" +done + +emit_group() { + local file="$1" header="$2" + [[ -s "$work/$file" ]] || return 0 + printf '%s\n' "$header" + cat "$work/$file" + printf '\n' +} + +{ + emit_group breaking '**Breaking changes:**' + emit_group feature '**New features:**' + emit_group improvement '**Improvements:**' + emit_group fix '**Bug fixes:**' + emit_group enhancement '**Enhancements:**' +} > "$work/body.md" + +if [[ -s "$work/body.md" ]]; then + # Trim the trailing blank line left by the last group. + awk 'NF || NR < prev_nonblank' prev_nonblank="$(awk 'NF{n=NR}END{print n}' "$work/body.md")" "$work/body.md" +else + printf '%s\n' 'No user-facing changes in this release.' +fi diff --git a/.github/scripts/prepare-release.js b/.github/scripts/prepare-release.js new file mode 100755 index 000000000..4cafe45e9 --- /dev/null +++ b/.github/scripts/prepare-release.js @@ -0,0 +1,76 @@ +#!/usr/bin/env node +/** + * Prepare for X.Y.Z release: set the `nextBump` field in + * common/config/rush/version-policies.json so that Rush will bump from the + * current version to the target version on the next publish. + * + * Usage: node .github/scripts/prepare-release.js + * + * The file uses JSON-with-comments, so we don't JSON.parse it — we read the + * current `version` with a regex and rewrite the `nextBump` line in place. + */ +'use strict'; + +const fs = require('fs'); +const path = require('path'); + +const target = process.argv[2]; +if (!target || !/^\d+\.\d+\.\d+$/.test(target)) { + console.error(`Usage: ${process.argv[1]} `); + process.exit(2); +} + +const repoRoot = path.resolve(__dirname, '..', '..'); +const policyPath = path.join(repoRoot, 'common/config/rush/version-policies.json'); +const original = fs.readFileSync(policyPath, 'utf8'); + +const versionMatch = original.match(/"version"\s*:\s*"(\d+\.\d+\.\d+)"/); +if (!versionMatch) { + console.error('Could not find "version" field in version-policies.json'); + process.exit(1); +} +const current = versionMatch[1]; +console.log(`Current version: ${current}`); +console.log(`Target version: ${target}`); + +if (current === target) { + console.error(`Current version is already ${target}; nothing to do.`); + process.exit(1); +} + +const [cMaj, cMin, cPatch] = current.split('.').map(Number); +const [tMaj, tMin, tPatch] = target.split('.').map(Number); + +let nextBump; +if (tMaj > cMaj && tMin === 0 && tPatch === 0) { + nextBump = 'major'; +} else if (tMaj === cMaj && tMin > cMin && tPatch === 0) { + nextBump = 'minor'; +} else if (tMaj === cMaj && tMin === cMin && tPatch > cPatch) { + nextBump = 'patch'; +} else { + console.error( + `Target ${target} is not a valid next semver bump from ${current}. ` + + `Expected one of: ${cMaj}.${cMin}.${cPatch + 1} (patch), ` + + `${cMaj}.${cMin + 1}.0 (minor), or ${cMaj + 1}.0.0 (major).` + ); + process.exit(1); +} +console.log(`Computed nextBump: ${nextBump}`); + +// Rewrite the "nextBump" line in place. Preserve indentation and trailing +// whitespace/newline exactly so the diff is the single intended change. +const nextBumpRegex = /(^\s*"nextBump"\s*:\s*")(prerelease|release|patch|minor|major)(")/m; +if (!nextBumpRegex.test(original)) { + console.error('Could not find "nextBump" field in version-policies.json'); + process.exit(1); +} +const updated = original.replace(nextBumpRegex, `$1${nextBump}$3`); + +if (updated === original) { + console.log(`nextBump is already "${nextBump}"; no change needed.`); + process.exit(0); +} + +fs.writeFileSync(policyPath, updated); +console.log(`Updated nextBump to "${nextBump}" in ${policyPath}`); diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 91b2d42c7..fc792e221 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,11 +7,12 @@ on: jobs: build: - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest env: SAUCE_USERNAME: ${{ secrets.SAUCE_USERNAME }} SAUCE_ACCESS_KEY: ${{ secrets.SAUCE_ACCESS_KEY }} + SAUCE_TUNNEL_NAME: sp-js-tracker-${{ github.run_id }}-${{ github.run_attempt }} BROWSERSLIST_IGNORE_OLD_DATA: true steps: @@ -21,7 +22,7 @@ jobs: - name: Use Node.js 18 uses: actions/setup-node@v3 with: - node-version: 18.x + node-version: 22.x - name: pnpm cache uses: actions/cache@v3 @@ -52,8 +53,18 @@ jobs: if: ${{ env.SAUCE_ACCESS_KEY != '' }} run: echo "127.0.0.1 snowplow-js-tracker.local" | sudo tee -a /etc/hosts + - name: Start Saucelabs Tunnel + if: ${{ env.SAUCE_ACCESS_KEY != '' }} + uses: saucelabs/sauce-connect-action@v3 + with: + username: ${{ secrets.SAUCE_USERNAME }} + accessKey: ${{ secrets.SAUCE_ACCESS_KEY }} + region: us + tunnelName: ${{ env.SAUCE_TUNNEL_NAME }} + - name: Run End to End Tests if: ${{ env.SAUCE_ACCESS_KEY != '' }} + timeout-minutes: 60 working-directory: ./trackers/javascript-tracker run: node ../../common/scripts/install-run-rushx.js test:e2e:sauce diff --git a/.github/workflows/change_check.yml b/.github/workflows/change_check.yml index 30b6acb9d..d4bda6f73 100644 --- a/.github/workflows/change_check.yml +++ b/.github/workflows/change_check.yml @@ -4,7 +4,12 @@ on: pull_request jobs: check: - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest + + permissions: + contents: read + pull-requests: write + checks: write env: BROWSERSLIST_IGNORE_OLD_DATA: true @@ -18,7 +23,7 @@ jobs: - name: Use Node.js 18 uses: actions/setup-node@v3 with: - node-version: 18.x + node-version: 22.x - name: pnpm cache uses: actions/cache@v3 @@ -50,8 +55,15 @@ jobs: working-directory: ./trackers/node-tracker run: api-extractor run + - name: Check for API changes to @snowplow/react-native-tracker + working-directory: ./trackers/react-native-tracker + run: api-extractor run + - name: Check bundle size using bundlemon - run: npx bundlemon@1.4.0 + if: github.event.pull_request.head.repo.full_name == github.repository + run: npx bundlemon@3 env: - BUNDLEMON_PROJECT_ID: 630fceda4ed824a9d3733ec0 - CI_COMMIT_SHA: ${{github.event.pull_request.head.sha || github.sha}} + BUNDLEMON_PROJECT_ID: 69e5e44cf67d5035af9fd1c0 + BUNDLEMON_PROJECT_APIKEY: ${{ secrets.BUNDLEMON_PROJECT_APIKEY }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + CI_COMMIT_SHA: ${{ github.event.pull_request.head.sha || github.sha }} diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index a0f49e65f..35b78acf4 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -16,7 +16,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 22 - name: Install dependencies working-directory: ./api-docs diff --git a/.github/workflows/prepare-release.yml b/.github/workflows/prepare-release.yml new file mode 100644 index 000000000..4fd04babf --- /dev/null +++ b/.github/workflows/prepare-release.yml @@ -0,0 +1,186 @@ +name: Prepare release PR + +on: + workflow_dispatch: + inputs: + release_branch: + description: 'Release branch (must already exist, format: release/X.Y.Z)' + required: true + type: string + dry_run: + description: 'Print the planned commit and PR body without pushing or opening a PR' + required: false + type: boolean + default: false + +permissions: + contents: write + pull-requests: write + +jobs: + prepare: + runs-on: ubuntu-latest + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + BASE_BRANCH: master + # Workflow inputs are exposed as environment variables and referenced as + # "$RELEASE_BRANCH" in run: blocks, never interpolated as ${{ }} into an + # inline script. Direct interpolation splices the raw value into the shell + # before it runs, which is a script-injection sink (see ST-482). + RELEASE_BRANCH: ${{ inputs.release_branch }} + DRY_RUN: ${{ inputs.dry_run }} + steps: + - name: Validate inputs + id: validate + run: | + set -euo pipefail + if [[ ! "$RELEASE_BRANCH" =~ ^release/([0-9]+\.[0-9]+\.[0-9]+)$ ]]; then + echo "::error::release_branch must match 'release/X.Y.Z' (got: $RELEASE_BRANCH)" + exit 1 + fi + version="${BASH_REMATCH[1]}" + echo "version=$version" >> "$GITHUB_OUTPUT" + echo "release_date=$(date -u +%Y-%m-%d)" >> "$GITHUB_OUTPUT" + + - name: Checkout release branch + uses: actions/checkout@v4 + with: + ref: ${{ inputs.release_branch }} + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Use Node.js 22 + uses: actions/setup-node@v4 + with: + node-version: 22 + + - name: Configure git + run: | + git config user.name 'snowplow-ci' + git config user.email 'ci@snowplowanalytics.com' + + - name: Verify branch state + id: state + env: + VERSION: ${{ steps.validate.outputs.version }} + run: | + set -euo pipefail + git fetch origin "$BASE_BRANCH" + + # Idempotent re-run: if HEAD is already "Prepare for X.Y.Z release", + # skip the bump+commit and only refresh the PR body. + head_subject="$(git log -1 --pretty=%s)" + if [[ "$head_subject" == "Prepare for $VERSION release" ]]; then + echo "Branch HEAD is already the prepare-release commit; will skip bump+commit and only refresh the PR." + echo "already_prepared=true" >> "$GITHUB_OUTPUT" + else + echo "already_prepared=false" >> "$GITHUB_OUTPUT" + fi + + - name: Collect commits since previous release + id: commits + run: | + set -euo pipefail + # Previous tag = highest semver tag reachable from BASE_BRANCH. + prev_tag="$(git tag --merged "origin/$BASE_BRANCH" | grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' | sort -V | tail -1 || true)" + if [[ -z "$prev_tag" ]]; then + echo "::error::Could not determine previous release tag" + exit 1 + fi + echo "prev_tag=$prev_tag" >> "$GITHUB_OUTPUT" + + # Commits on the release branch since prev_tag. classify-commits.sh + # drops the commits the JS publish pipeline creates automatically + # ("Bump versions [skip ci]", "Update changelogs [skip ci]", + # "Applying documentation updates.") along with other chores. + git log --no-merges "$prev_tag..HEAD" --pretty='%h %s' > commits-raw.txt || true + git log --merges "$prev_tag..HEAD" --pretty='%h %s' >> commits-raw.txt || true + + # De-dup by short sha, preserve order + awk '!seen[$1]++' commits-raw.txt > commits.txt + echo "Commits since $prev_tag:" + cat commits.txt + + - name: Annotate commits with author + external flag + env: + REPOSITORY: ${{ github.repository }} + run: | + set -euo pipefail + : > commits-annotated.txt + while read -r line; do + [[ -z "$line" ]] && continue + sha="$(echo "$line" | awk '{print $1}')" + subject="$(echo "$line" | cut -d' ' -f2-)" + pr_num="$(echo "$subject" | grep -oE '#[0-9]+' | head -1 | tr -d '#' || true)" + login="" + external="false" + if [[ -n "$pr_num" ]]; then + if json="$(gh api "repos/$REPOSITORY/pulls/$pr_num" 2>/dev/null)"; then + login="$(echo "$json" | jq -r '.user.login // ""')" + assoc="$(echo "$json" | jq -r '.author_association // ""')" + case "$assoc" in + MEMBER|OWNER|COLLABORATOR) external="false" ;; + *) external="true" ;; + esac + fi + fi + echo "$sha $subject -- author=$login external=$external" >> commits-annotated.txt + done < commits.txt + echo "Annotated commits:" + cat commits-annotated.txt + + - name: Set nextBump in version-policies.json + if: steps.state.outputs.already_prepared == 'false' + env: + VERSION: ${{ steps.validate.outputs.version }} + run: node .github/scripts/prepare-release.js "$VERSION" + + - name: Commit "Prepare for release" + if: steps.state.outputs.already_prepared == 'false' && inputs.dry_run == false + env: + VERSION: ${{ steps.validate.outputs.version }} + run: | + set -euo pipefail + git add common/config/rush/version-policies.json + # If the script was a no-op (nextBump already correct), skip the commit. + if git diff --cached --quiet; then + echo "No staged changes; nextBump was already set correctly. Skipping commit." + else + git commit -m "Prepare for $VERSION release" + git push origin "$RELEASE_BRANCH" + fi + + - name: Show planned changes (dry run) + if: inputs.dry_run == true + run: | + echo "=== Diff that would be committed ===" + git --no-pager diff + echo "====================================" + + - name: Generate PR body + run: | + set -euo pipefail + ./.github/scripts/classify-commits.sh < commits-annotated.txt > classified.tsv + ./.github/scripts/format-pr-body.sh < classified.tsv > pr-body.md + + echo "=== Generated PR body ===" + cat pr-body.md + echo "=========================" + + - name: Open or update release PR + if: inputs.dry_run == false + env: + VERSION: ${{ steps.validate.outputs.version }} + run: | + set -euo pipefail + existing="$(gh pr list --head "$RELEASE_BRANCH" --base "$BASE_BRANCH" --state open --json number --jq '.[0].number' || true)" + if [[ -n "$existing" ]]; then + gh pr edit "$existing" --title "Release/$VERSION" --body-file pr-body.md + echo "Updated existing PR #$existing" + else + gh pr create \ + --base "$BASE_BRANCH" \ + --head "$RELEASE_BRANCH" \ + --title "Release/$VERSION" \ + --body-file pr-body.md + fi diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 7cf6259de..26ec022ab 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -9,7 +9,7 @@ on: jobs: deploy: - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest env: NPM_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} @@ -22,7 +22,7 @@ jobs: - name: Use Node.js 18 uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 22 - name: pnpm cache uses: actions/cache@v3 @@ -75,10 +75,17 @@ jobs: api-extractor run api-documenter markdown --input-folder temp --output-folder ../../api-docs/docs/node-tracker/markdown + - name: Create API documentation for @snowplow/react-native-tracker + working-directory: ./trackers/react-native-tracker + run: | + api-extractor run + api-documenter markdown --input-folder temp --output-folder ../../api-docs/docs/react-native-tracker/markdown + - name: Apply API documentation updates run: | git add api-docs/docs/browser-tracker git add api-docs/docs/node-tracker + git add api-docs/docs/react-native-tracker git commit --no-verify --allow-empty -m "Applying documentation updates." git push diff --git a/.github/workflows/publish_branch.yml b/.github/workflows/publish_branch.yml index ef758c568..09af511d7 100644 --- a/.github/workflows/publish_branch.yml +++ b/.github/workflows/publish_branch.yml @@ -4,7 +4,7 @@ on: workflow_dispatch jobs: deploy: - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest env: NPM_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} @@ -17,7 +17,7 @@ jobs: - name: Use Node.js 18 uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 22 - name: Get dist-tag from branch name env: diff --git a/.github/workflows/publish_prerelease.yml b/.github/workflows/publish_prerelease.yml index c6b53ec1c..5f238358c 100644 --- a/.github/workflows/publish_prerelease.yml +++ b/.github/workflows/publish_prerelease.yml @@ -9,7 +9,7 @@ on: jobs: deploy: - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest env: NPM_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} @@ -22,7 +22,7 @@ jobs: - name: Use Node.js 18 uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 22 - name: pnpm cache uses: actions/cache@v3 @@ -75,6 +75,12 @@ jobs: api-extractor run api-documenter markdown --input-folder temp --output-folder docs/markdown + - name: Create API documentation for @snowplow/react-native-tracker + working-directory: ./trackers/react-native-tracker + run: | + api-extractor run + api-documenter markdown --input-folder temp --output-folder docs/markdown + - name: Rush Publish run: node common/scripts/install-run-rush.js publish --apply --include-all --publish --tag next --set-access-level public --ignore-git-hooks diff --git a/.github/workflows/snyk.yml b/.github/workflows/snyk.yml deleted file mode 100644 index e70899ee0..000000000 --- a/.github/workflows/snyk.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: Snyk -on: - push: - branches: [master] -jobs: - security: - runs-on: ubuntu-20.04 - steps: - - uses: actions/checkout@v3 - - name: Use Node.js 18 - uses: actions/setup-node@v3 - with: - node-version: 18 - - - name: pnpm cache - uses: actions/cache@v3 - with: - path: ./common/temp/pnpm-store - key: ${{ runner.os }}-pnpm-${{ hashFiles('common/config/rush/pnpm-lock.yaml') }} - restore-keys: ${{ runner.os }}-pnpm- - - - name: Install - run: node common/scripts/install-run-rush.js install - - - name: Run Snyk to check for vulnerabilities - uses: snyk/actions/node@master - with: - command: monitor - args: --all-projects --exclude=common - env: - SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} diff --git a/.gitignore b/.gitignore index cd06b3379..a0bdc3180 100644 --- a/.gitignore +++ b/.gitignore @@ -67,6 +67,7 @@ common/autoinstallers/*/.npmrc # API Extractor trackers/browser-tracker/temp/ trackers/node-tracker/temp/ +trackers/react-native-tracker/temp/ # Distribution files dist @@ -80,4 +81,4 @@ trackers/javascript-tracker/test/local/serve/ .DS_Store # gitleaks file -findings.json \ No newline at end of file +findings.json diff --git a/.nvmrc b/.nvmrc index 3c032078a..2bd5a0a98 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -18 +22 diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 000000000..a04310f6b --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,554 @@ +# Snowplow JavaScript Tracker - CLAUDE.md + +## Project Overview + +The Snowplow JavaScript Tracker is a comprehensive analytics tracking library for web, browser, and React Native applications. It provides event tracking capabilities for sending data to Snowplow collectors. The project uses a monorepo structure managed by Rush.js with TypeScript as the primary language. + +### Key Technologies +- **Language**: TypeScript/JavaScript +- **Build System**: Rush.js (monorepo) + Rollup +- **Package Manager**: pnpm (v9.7.1) +- **Testing**: Jest with jsdom +- **Target Environments**: Browser, Node.js, React Native + +## Development Commands + +```bash +# Install dependencies and build all packages +rush install +rush build + +# Run tests +rush test # Run all tests +rush test:unit # Unit tests only +rush test:e2e # E2E tests + +# Build specific package +cd trackers/browser-tracker && rushx build + +# Quality checks +rush lint # ESLint +rush format # Prettier +``` + +## Architecture + +### System Design +The tracker follows a **layered plugin architecture** with core libraries providing fundamental tracking capabilities and plugins extending functionality for specific use cases. + +``` +┌─────────────────────────────────────────┐ +│ Trackers Layer │ +│ (browser, javascript, node, react-native) │ +├─────────────────────────────────────────┤ +│ Plugins Layer │ +│ (30+ browser plugins for features) │ +├─────────────────────────────────────────┤ +│ Core Libraries Layer │ +│ (tracker-core, browser-tracker-core) │ +└─────────────────────────────────────────┘ +``` + +### Module Organization +- **libraries/**: Core tracking functionality + - `tracker-core`: Platform-agnostic tracking logic + - `browser-tracker-core`: Browser-specific core features +- **trackers/**: Platform-specific tracker implementations +- **plugins/**: Feature-specific plugins (ad tracking, media, ecommerce, etc.) +- **common/**: Shared Rush.js configuration and scripts + +## Core Architectural Principles + +### 1. Plugin-Based Architecture +```typescript +// ✅ Correct: Plugin pattern with activation lifecycle +export function MyPlugin(): BrowserPlugin { + return { + activateBrowserPlugin: (tracker) => { + _trackers[tracker.id] = tracker; + } + }; +} + +// ❌ Wrong: Direct tracker manipulation +export function myFeature(tracker) { + tracker.someMethod(); // Breaks encapsulation +} +``` + +### 2. Event Builder Pattern +```typescript +// ✅ Correct: Use builder functions for events +import { buildSelfDescribingEvent } from '@snowplow/tracker-core'; +const event = buildSelfDescribingEvent({ schema, data }); + +// ❌ Wrong: Manual event construction +const event = { e: 'ue', ue_pr: {...} }; // Don't construct manually +``` + +### 3. Type-Safe Self-Describing JSON +```typescript +// ✅ Correct: Typed SelfDescribingJson +export type MyEventData = { + field: string; + value: number; +}; +const event: SelfDescribingJson = { + schema: 'iglu:com.example/event/jsonschema/1-0-0', + data: { field: 'test', value: 42 } +}; + +// ❌ Wrong: Untyped data objects +const event = { schema: '...', data: someData }; +``` + +### 4. Workspace Dependencies +```typescript +// ✅ Correct: Use workspace protocol for internal deps +"dependencies": { + "@snowplow/tracker-core": "workspace:*" +} + +// ❌ Wrong: Version-specific internal dependencies +"dependencies": { + "@snowplow/tracker-core": "^3.0.0" +} +``` + +## Layer Organization & Responsibilities + +### Core Libraries (`libraries/`) +- **tracker-core**: Event building, payload construction, emitter logic +- **browser-tracker-core**: Browser APIs, storage, cookies, DOM helpers + +### Trackers (`trackers/`) +- **browser-tracker**: Modern browser tracking API +- **javascript-tracker**: Legacy SP.js compatible tracker +- **node-tracker**: Server-side Node.js tracking +- **react-native-tracker**: Mobile app tracking + +### Plugins (`plugins/`) +Each plugin follows the standard structure: +``` +browser-plugin-*/ +├── src/ +│ ├── index.ts # Plugin export & registration +│ ├── api.ts # Public API functions +│ ├── types.ts # TypeScript definitions +│ └── schemata.ts # Event schemas +├── test/ +├── package.json +└── rollup.config.js +``` + +## Critical Import Patterns + +### 1. Core Imports +```typescript +// ✅ Correct: Import from package roots +import { BrowserPlugin } from '@snowplow/browser-tracker-core'; +import { buildSelfDescribingEvent } from '@snowplow/tracker-core'; + +// ❌ Wrong: Deep imports into src +import { something } from '@snowplow/browser-tracker-core/src/helpers'; +``` + +### 2. Plugin Registration +```typescript +// ✅ Correct: Plugin initialization pattern +import { AdTrackingPlugin } from '@snowplow/browser-plugin-ad-tracking'; + +newTracker('sp', 'collector.example.com', { + plugins: [AdTrackingPlugin()] +}); + +// ❌ Wrong: Direct plugin function calls +AdTrackingPlugin.trackAdClick(); // Plugins need registration +``` + +### 3. Type Exports +```typescript +// ✅ Correct: Re-export types with functions +export { AdClickEvent, trackAdClick } from './api'; + +// ❌ Wrong: Forget to export event types +export { trackAdClick } from './api'; // Missing type export +``` + +## Essential Library Patterns + +### Event Tracking Pattern +```typescript +// Standard event tracking with context +export function trackMyEvent( + event: MyEvent & CommonEventProperties, + trackers: Array = Object.keys(_trackers) +) { + dispatchToTrackersInCollection(trackers, _trackers, (t) => { + t.core.track(buildMyEvent(event), event.context, event.timestamp); + }); +} +``` + +### Plugin State Management +```typescript +// Plugin-scoped tracker registry +const _trackers: Record = {}; + +export function MyPlugin(): BrowserPlugin { + return { + activateBrowserPlugin: (tracker) => { + _trackers[tracker.id] = tracker; + } + }; +} +``` + +### Schema Definition Pattern +```typescript +// schemata.ts - Centralized schema constants +export const MY_SCHEMA = 'iglu:com.snowplowanalytics.snowplow/my_event/jsonschema/1-0-0'; + +// Usage in event builders +const event: SelfDescribingJson = { + schema: MY_SCHEMA, + data: eventData +}; +``` + +## Model Organization Pattern + +### Event Type Definitions +```typescript +// types.ts - Event data interfaces +export interface MediaPlayerEvent { + currentTime: number; + duration?: number; + ended: boolean; + loop: boolean; + // ... other fields +} + +// Composite types for API +export type MediaTrackEvent = MediaPlayerEvent & { + eventType: MediaEventType; + label?: string; +}; +``` + +### Context Builders +```typescript +// Context creation pattern +export function buildMediaContext(player: MediaPlayer): SelfDescribingJson { + return { + schema: MEDIA_PLAYER_SCHEMA, + data: { + currentTime: player.currentTime, + duration: player.duration, + // ... map player state + } + }; +} +``` + +## Common Pitfalls & Solutions + +### 1. Forgetting Plugin Registration +```typescript +// ❌ Wrong: Using plugin API without registration +import { trackAdClick } from '@snowplow/browser-plugin-ad-tracking'; +trackAdClick(event); // Error: _trackers is empty + +// ✅ Correct: Register plugin first +import { AdTrackingPlugin, trackAdClick } from '@snowplow/browser-plugin-ad-tracking'; +newTracker('sp', 'collector.example.com', { + plugins: [AdTrackingPlugin()] +}); +trackAdClick(event); // Works correctly +``` + +### 2. Incorrect Timestamp Types +```typescript +// ❌ Wrong: String timestamps +event.timestamp = '2024-01-01T00:00:00Z'; + +// ✅ Correct: Use Timestamp ADT +event.timestamp = { type: 'ttm', value: Date.now() }; +// or just number for device timestamp +event.timestamp = Date.now(); +``` + +### 3. Manual Payload Construction +```typescript +// ❌ Wrong: Building payloads manually +const payload = { + e: 'se', + se_ca: 'category', + se_ac: 'action' +}; + +// ✅ Correct: Use builder functions +const payload = buildStructEvent({ + category: 'category', + action: 'action' +}); +``` + +## File Structure Template + +### New Plugin Structure +``` +plugins/browser-plugin-[feature]/ +├── src/ +│ ├── index.ts # Plugin export +│ ├── api.ts # Public tracking functions +│ ├── types.ts # TypeScript interfaces +│ ├── schemata.ts # Schema constants +│ └── contexts.ts # Context builders +├── test/ +│ └── [feature].test.ts # Jest tests +├── package.json # Workspace package +├── tsconfig.json # TypeScript config +├── rollup.config.js # Build configuration +└── README.md # Documentation +``` + +## Testing Patterns + +### Test Directory Structure +Each package maintains its own `test/` directory with TypeScript test files: +``` +package/ +├── test/ +│ ├── *.test.ts # Unit tests +│ ├── integration/ # Integration tests +│ ├── functional/ # E2E/browser tests +│ └── __snapshots__/ # Jest snapshots +``` + +### Test File Naming Conventions +```typescript +// ✅ Correct: Descriptive test file names +events.test.ts // Testing event functions +contexts.test.ts // Testing context builders +browser_props.test.ts // Testing browser properties + +// ❌ Wrong: Generic or unclear names +test.test.ts // Too generic +unit.test.ts // Not descriptive +``` + +### Test Suite Structure +```typescript +// ✅ Correct: Nested describe blocks with clear naming +describe('AdTrackingPlugin', () => { + describe('#trackAdClick', () => { + it('tracks click event with correct schema', () => {}); + it('includes required fields in payload', () => {}); + }); +}); + +// ❌ Wrong: Flat structure without context +describe('tests', () => { + it('test1', () => {}); + it('test2', () => {}); +}); +``` + +### Common Test Utilities +```typescript +// Using lodash/fp for test data extraction +import F from 'lodash/fp'; + +const getUEEvents = F.compose(F.filter(F.compose(F.eq('ue'), F.get('e')))); +const extractEventProperties = F.map(F.compose( + F.get('data'), + (cx: string) => JSON.parse(cx), + F.get('ue_pr') +)); +``` + +### Mock Setup Pattern +```typescript +// Standard mock configuration in tests +beforeAll(() => { + jest.spyOn(document, 'title', 'get').mockReturnValue('Test Title'); +}); + +beforeEach(() => { + jest.clearAllMocks(); + // Reset tracker state between tests +}); +``` + +### Snapshot Testing +```typescript +// ✅ Correct: Snapshot for complex objects +expect(buildMediaContext(player)).toMatchSnapshot(); + +// ❌ Wrong: Snapshot for simple values +expect(event.id).toMatchSnapshot(); // Use toBe() instead +``` + +### Test Categories & Best Practices + +#### 1. Unit Tests +Test individual functions and modules in isolation: +```typescript +// ✅ Correct: Testing pure functions +it('makeDimension correctly floors dimension type values', () => { + expect(makeDimension(800.5)).toBe(800); + expect(makeDimension('not-a-number')).toBe(0); +}); +``` + +#### 2. Integration Tests +Test multi-component interactions: +```typescript +// ✅ Correct: Testing plugin integration with tracker +it('registers plugin and tracks events', () => { + const tracker = createTracker({ plugins: [MyPlugin()] }); + trackMyEvent({ data: 'test' }); + expect(eventStore.getEvents()).toHaveLength(1); +}); +``` + +#### 3. Functional/E2E Tests +Browser automation tests for full tracker behavior: +```typescript +// Located in test/functional/ +it('persists session across page reloads', async () => { + await browser.url('/test-page'); + const sessionId = await browser.execute(() => tracker.getSessionId()); + await browser.refresh(); + const newSessionId = await browser.execute(() => tracker.getSessionId()); + expect(sessionId).toBe(newSessionId); +}); +``` + +### Testing Configuration + +#### Jest Configuration Pattern +```javascript +// jest.config.js - Standard config for packages +module.exports = { + preset: 'ts-jest', + testEnvironment: 'jsdom', + setupFilesAfterEnv: ['../../setupTestGlobals.ts'], + reporters: ['jest-standard-reporter'] +}; +``` + +#### Global Test Setup +```typescript +// setupTestGlobals.ts - Shared test utilities +import 'whatwg-fetch'; +global.crypto = { + getRandomValues: (buffer) => nodeCrypto.randomFillSync(buffer) +}; +``` + +### Event Store Testing Pattern +```typescript +// ✅ Correct: Using in-memory event store for tests +import { newInMemoryEventStore } from '@snowplow/tracker-core'; + +const eventStore = newInMemoryEventStore(); +const tracker = createTracker({ eventStore }); +// Verify events: eventStore.getEvents() +``` + +### Testing Async Behavior +```typescript +// ✅ Correct: Testing timer-based functionality +it('sends ping event after interval', async () => { + jest.useFakeTimers(); + startPingInterval(player, 30); + jest.advanceTimersByTime(30000); + await Promise.resolve(); // Allow async operations + expect(trackMediaPing).toHaveBeenCalled(); + jest.useRealTimers(); +}); +``` + +## Quick Reference + +### Import Checklist +- [ ] Import from package root, not `/src` +- [ ] Include type exports with functions +- [ ] Use `workspace:*` for internal dependencies +- [ ] Import builders from `@snowplow/tracker-core` +- [ ] Import browser utils from `@snowplow/browser-tracker-core` + +### Common Tasks + +```typescript +// Create new tracker +import { newTracker } from '@snowplow/browser-tracker'; +newTracker('sp', 'collector.example.com', { + appId: 'my-app', + plugins: [/* plugins */] +}); + +// Track custom event +import { trackSelfDescribingEvent } from '@snowplow/browser-tracker'; +trackSelfDescribingEvent({ + event: { + schema: 'iglu:com.example/event/jsonschema/1-0-0', + data: { /* event data */ } + } +}); + +// Add global context +import { addGlobalContexts } from '@snowplow/browser-tracker'; +addGlobalContexts([{ + schema: 'iglu:com.example/context/jsonschema/1-0-0', + data: { /* context data */ } +}]); + +// Test a tracker with in-memory event store +import { createTracker } from '../helpers'; +import { newInMemoryEventStore } from '@snowplow/tracker-core'; +const eventStore = newInMemoryEventStore(); +const tracker = createTracker({ eventStore }); +``` + +## Contributing to CLAUDE.md + +When adding or updating content in this document, please follow these guidelines: + +### File Size Limit +- **CLAUDE.md must not exceed 40KB** (currently ~11KB) +- Check file size after updates: `wc -c CLAUDE.md` +- Remove outdated content if approaching the limit + +### Code Examples +- Keep all code examples **4 lines or fewer** +- Focus on the essential pattern, not complete implementations +- Use `// ❌` and `// ✅` to clearly show wrong vs right approaches + +### Content Organization +- Add new patterns to existing sections when possible +- Create new sections sparingly to maintain structure +- Update the architectural principles section for major changes +- Ensure examples follow current codebase conventions + +### Quality Standards +- Test any new patterns in actual code before documenting +- Verify imports and syntax are correct for the codebase +- Keep language concise and actionable +- Focus on "what" and "how", minimize "why" explanations + +### Multiple CLAUDE.md Files +- **Directory-specific CLAUDE.md files** can be created for specialized modules +- Follow the same structure and guidelines as this root CLAUDE.md +- Keep them focused on directory-specific patterns and conventions +- Maximum 20KB per directory-specific CLAUDE.md file + +### Instructions for LLMs +When editing files in this repository, **always check for CLAUDE.md guidance**: + +1. **Look for CLAUDE.md in the same directory** as the file being edited +2. **If not found, check parent directories** recursively up to project root +3. **Follow the patterns and conventions** described in the applicable CLAUDE.md +4. **Prioritize directory-specific guidance** over root-level guidance when conflicts exist \ No newline at end of file diff --git a/api-docs/docs/browser-tracker/browser-tracker.api.md b/api-docs/docs/browser-tracker/browser-tracker.api.md index e571532a5..00e3908cd 100644 --- a/api-docs/docs/browser-tracker/browser-tracker.api.md +++ b/api-docs/docs/browser-tracker/browser-tracker.api.md @@ -15,10 +15,21 @@ export type ActivityCallbackData = { minYOffset: number; maxXOffset: number; maxYOffset: number; + activityMetrics?: ActivityMetrics; +}; + +// @public +export type ActivityMetrics = { + mouseDistance: number; + scrollDistance: number; + keyPresses: number; + clicks: number; + touches: number; }; // @public export interface ActivityTrackingConfiguration { + activityMetrics?: boolean; heartbeatDelay: number; minimumVisitLength: number; } @@ -68,6 +79,7 @@ export interface BrowserTracker { enableAnonymousTracking: (configuration?: EnableAnonymousTrackingConfiguration) => void; flushBuffer: (configuration?: FlushBufferConfiguration) => void; getCookieName: (basename: string) => string; + getDomainSessionId: () => string; getDomainSessionIndex: () => number; getDomainUserId: () => string; getDomainUserInfo: () => ParsedIdCookie; @@ -170,6 +182,7 @@ export interface CorePlugin { afterTrack?: (payload: Payload) => void; beforeTrack?: (payloadBuilder: PayloadBuilder) => void; contexts?: () => SelfDescribingJson[]; + deactivatePlugin?: (core: TrackerCore) => void; filter?: (payload: Payload) => boolean; logger?: (logger: Logger) => void; } @@ -218,12 +231,14 @@ export function discardHashTag(enable: boolean, trackers?: Array): void; export interface EmitterConfigurationBase { bufferSize?: number; connectionTimeout?: number; + cookieExtensionService?: string; credentials?: "omit" | "same-origin" | "include"; customFetch?: (input: Request, options?: RequestInit) => Promise; customHeaders?: Record; dontRetryStatusCodes?: number[]; eventMethod?: EventMethod; eventStore?: EventStore; + // @deprecated (undocumented) idService?: string; keepalive?: boolean; maxGetBytes?: number; @@ -327,6 +342,9 @@ export interface FlushBufferConfiguration { newBufferSize?: number; } +// @public +export function getDomainSessionId(trackerId?: string): string | undefined; + // @public export type JsonProcessor = (payloadBuilder: PayloadBuilder, jsonForProcessing: EventJson, contextEntitiesForProcessing: SelfDescribingJson[]) => void; @@ -523,6 +541,7 @@ export type TrackerConfiguration = { cookieLifetime?: number; sessionCookieTimeout?: number; appId?: string; + appVersion?: string; platform?: Platform; respectDoNotTrack?: boolean; crossDomainLinker?: (elt: HTMLAnchorElement | HTMLAreaElement) => boolean; @@ -535,7 +554,9 @@ export type TrackerConfiguration = { plugins?: Array; onSessionUpdateCallback?: (updatedSession: ClientSession) => void; preservePageViewIdForUrl?: PreservePageViewIdForUrl; + preserveOriginalReferrer?: boolean; synchronousCookieWrite?: boolean; + disableSessionContextWithinWebView?: boolean; } & EmitterConfigurationBase & LocalStorageEventStoreConfigurationBase; // @public @@ -545,6 +566,7 @@ export interface TrackerCore { addPayloadPair: (key: string, value: unknown) => void; addPlugin(configuration: CorePluginConfiguration): void; clearGlobalContexts(): void; + deactivate(): void; getBase64Encoding(): boolean; removeGlobalContexts(contexts: Array): void; resetPayloadPairs(dict: Payload): void; diff --git a/api-docs/docs/browser-tracker/markdown/browser-tracker.activitycallbackdata.md b/api-docs/docs/browser-tracker/markdown/browser-tracker.activitycallbackdata.md index 99a37d953..b146d8477 100644 --- a/api-docs/docs/browser-tracker/markdown/browser-tracker.activitycallbackdata.md +++ b/api-docs/docs/browser-tracker/markdown/browser-tracker.activitycallbackdata.md @@ -16,5 +16,6 @@ type ActivityCallbackData = { minYOffset: number; maxXOffset: number; maxYOffset: number; + activityMetrics?: ActivityMetrics; }; ``` diff --git a/api-docs/docs/browser-tracker/markdown/browser-tracker.activitymetrics.md b/api-docs/docs/browser-tracker/markdown/browser-tracker.activitymetrics.md new file mode 100644 index 000000000..6f461105c --- /dev/null +++ b/api-docs/docs/browser-tracker/markdown/browser-tracker.activitymetrics.md @@ -0,0 +1,19 @@ + + +[Home](./index.md) > [@snowplow/browser-tracker](./browser-tracker.md) > [ActivityMetrics](./browser-tracker.activitymetrics.md) + +## ActivityMetrics type + +Quantitative activity metrics accumulated between page pings. Attached as a context entity when activityMetrics is enabled. + +Signature: + +```typescript +type ActivityMetrics = { + mouseDistance: number; + scrollDistance: number; + keyPresses: number; + clicks: number; + touches: number; +}; +``` diff --git a/api-docs/docs/browser-tracker/markdown/browser-tracker.activitytrackingconfiguration.activitymetrics.md b/api-docs/docs/browser-tracker/markdown/browser-tracker.activitytrackingconfiguration.activitymetrics.md new file mode 100644 index 000000000..af2a96371 --- /dev/null +++ b/api-docs/docs/browser-tracker/markdown/browser-tracker.activitytrackingconfiguration.activitymetrics.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/browser-tracker](./browser-tracker.md) > [ActivityTrackingConfiguration](./browser-tracker.activitytrackingconfiguration.md) > [activityMetrics](./browser-tracker.activitytrackingconfiguration.activitymetrics.md) + +## ActivityTrackingConfiguration.activityMetrics property + +Enable activity metrics to attach an activity\_metrics entity to each page ping + +Signature: + +```typescript +activityMetrics?: boolean; +``` diff --git a/api-docs/docs/browser-tracker/markdown/browser-tracker.activitytrackingconfiguration.md b/api-docs/docs/browser-tracker/markdown/browser-tracker.activitytrackingconfiguration.md index fc634fbf0..cb4cf5be3 100644 --- a/api-docs/docs/browser-tracker/markdown/browser-tracker.activitytrackingconfiguration.md +++ b/api-docs/docs/browser-tracker/markdown/browser-tracker.activitytrackingconfiguration.md @@ -16,6 +16,7 @@ interface ActivityTrackingConfiguration | Property | Type | Description | | --- | --- | --- | +| [activityMetrics?](./browser-tracker.activitytrackingconfiguration.activitymetrics.md) | boolean | (Optional) Enable activity metrics to attach an activity\_metrics entity to each page ping | | [heartbeatDelay](./browser-tracker.activitytrackingconfiguration.heartbeatdelay.md) | number | The interval at which the callback will be fired | | [minimumVisitLength](./browser-tracker.activitytrackingconfiguration.minimumvisitlength.md) | number | The minimum time that must have elapsed before first heartbeat | diff --git a/api-docs/docs/browser-tracker/markdown/browser-tracker.browsertracker.getdomainsessionid.md b/api-docs/docs/browser-tracker/markdown/browser-tracker.browsertracker.getdomainsessionid.md new file mode 100644 index 000000000..0ba75df76 --- /dev/null +++ b/api-docs/docs/browser-tracker/markdown/browser-tracker.browsertracker.getdomainsessionid.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/browser-tracker](./browser-tracker.md) > [BrowserTracker](./browser-tracker.browsertracker.md) > [getDomainSessionId](./browser-tracker.browsertracker.getdomainsessionid.md) + +## BrowserTracker.getDomainSessionId property + +Get the current domain session ID (from first party cookie) + +Signature: + +```typescript +getDomainSessionId: () => string; +``` diff --git a/api-docs/docs/browser-tracker/markdown/browser-tracker.browsertracker.md b/api-docs/docs/browser-tracker/markdown/browser-tracker.browsertracker.md index 151168e3b..a08c031d1 100644 --- a/api-docs/docs/browser-tracker/markdown/browser-tracker.browsertracker.md +++ b/api-docs/docs/browser-tracker/markdown/browser-tracker.browsertracker.md @@ -30,6 +30,7 @@ interface BrowserTracker | [enableAnonymousTracking](./browser-tracker.browsertracker.enableanonymoustracking.md) | (configuration?: EnableAnonymousTrackingConfiguration) => void | Enables anonymous tracking (ie. tracker initialized without anonymousTracking) | | [flushBuffer](./browser-tracker.browsertracker.flushbuffer.md) | (configuration?: FlushBufferConfiguration) => void | Send all events in the outQueue Only need to use this when sending events with a bufferSize of at least 2 | | [getCookieName](./browser-tracker.browsertracker.getcookiename.md) | (basename: string) => string | Get the cookie name as cookieNamePrefix + basename + . + domain. | +| [getDomainSessionId](./browser-tracker.browsertracker.getdomainsessionid.md) | () => string | Get the current domain session ID (from first party cookie) | | [getDomainSessionIndex](./browser-tracker.browsertracker.getdomainsessionindex.md) | () => number | Get the domain session index also known as current memorized visit count. | | [getDomainUserId](./browser-tracker.browsertracker.getdomainuserid.md) | () => string | Get visitor ID (from first party cookie) | | [getDomainUserInfo](./browser-tracker.browsertracker.getdomainuserinfo.md) | () => ParsedIdCookie | Get the visitor information (from first party cookie) | diff --git a/api-docs/docs/browser-tracker/markdown/browser-tracker.coreplugin.deactivateplugin.md b/api-docs/docs/browser-tracker/markdown/browser-tracker.coreplugin.deactivateplugin.md new file mode 100644 index 000000000..bf29e5d18 --- /dev/null +++ b/api-docs/docs/browser-tracker/markdown/browser-tracker.coreplugin.deactivateplugin.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/browser-tracker](./browser-tracker.md) > [CorePlugin](./browser-tracker.coreplugin.md) > [deactivatePlugin](./browser-tracker.coreplugin.deactivateplugin.md) + +## CorePlugin.deactivatePlugin property + +Called when the tracker is being destroyed. Should be used to clean up any resources or listeners that the plugin has created. + +Signature: + +```typescript +deactivatePlugin?: (core: TrackerCore) => void; +``` diff --git a/api-docs/docs/browser-tracker/markdown/browser-tracker.coreplugin.md b/api-docs/docs/browser-tracker/markdown/browser-tracker.coreplugin.md index 52b891986..a224db7cc 100644 --- a/api-docs/docs/browser-tracker/markdown/browser-tracker.coreplugin.md +++ b/api-docs/docs/browser-tracker/markdown/browser-tracker.coreplugin.md @@ -20,6 +20,7 @@ interface CorePlugin | [afterTrack?](./browser-tracker.coreplugin.aftertrack.md) | (payload: Payload) => void | (Optional) Called just after the trackerCore callback fires | | [beforeTrack?](./browser-tracker.coreplugin.beforetrack.md) | (payloadBuilder: PayloadBuilder) => void | (Optional) Called before the filter method is called and before the trackerCore callback fires (if the filter passes) | | [contexts?](./browser-tracker.coreplugin.contexts.md) | () => SelfDescribingJson\[\] | (Optional) Called when constructing the context for each event Useful for adding additional context to events | +| [deactivatePlugin?](./browser-tracker.coreplugin.deactivateplugin.md) | (core: TrackerCore) => void | (Optional) Called when the tracker is being destroyed. Should be used to clean up any resources or listeners that the plugin has created. | | [filter?](./browser-tracker.coreplugin.filter.md) | (payload: Payload) => boolean | (Optional) Called before the payload is sent to the callback to decide whether to send the payload or skip it | | [logger?](./browser-tracker.coreplugin.logger.md) | (logger: Logger) => void | (Optional) Passed a logger instance which can be used to send log information to the active logger | diff --git a/api-docs/docs/browser-tracker/markdown/browser-tracker.emitterconfigurationbase.cookieextensionservice.md b/api-docs/docs/browser-tracker/markdown/browser-tracker.emitterconfigurationbase.cookieextensionservice.md new file mode 100644 index 000000000..2bb4f496c --- /dev/null +++ b/api-docs/docs/browser-tracker/markdown/browser-tracker.emitterconfigurationbase.cookieextensionservice.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [@snowplow/browser-tracker](./browser-tracker.md) > [EmitterConfigurationBase](./browser-tracker.emitterconfigurationbase.md) > [cookieExtensionService](./browser-tracker.emitterconfigurationbase.cookieextensionservice.md) + +## EmitterConfigurationBase.cookieExtensionService property + +Cookie extension service full URL. This URL will be added to the queue and will be called using a GET method. This option is there to allow the service URL to be called in order to set any required identifiers e.g. extra cookies. + +The request respects the `anonymousTracking` option, including the SP-Anonymous header if needed, and any additional custom headers from the customHeaders option. + +Signature: + +```typescript +cookieExtensionService?: string; +``` diff --git a/api-docs/docs/browser-tracker/markdown/browser-tracker.emitterconfigurationbase.idservice.md b/api-docs/docs/browser-tracker/markdown/browser-tracker.emitterconfigurationbase.idservice.md index 1c805e74b..699c4a7e6 100644 --- a/api-docs/docs/browser-tracker/markdown/browser-tracker.emitterconfigurationbase.idservice.md +++ b/api-docs/docs/browser-tracker/markdown/browser-tracker.emitterconfigurationbase.idservice.md @@ -4,9 +4,10 @@ ## EmitterConfigurationBase.idService property -Id service full URL. This URL will be added to the queue and will be called using a GET method. This option is there to allow the service URL to be called in order to set any required identifiers e.g. extra cookies. - -The request respects the `anonymousTracking` option, including the SP-Anonymous header if needed, and any additional custom headers from the customHeaders option. +> Warning: This API is now obsolete. +> +> Use `cookieExtensionService` instead. +> Signature: diff --git a/api-docs/docs/browser-tracker/markdown/browser-tracker.emitterconfigurationbase.md b/api-docs/docs/browser-tracker/markdown/browser-tracker.emitterconfigurationbase.md index 6999663b6..8ec405334 100644 --- a/api-docs/docs/browser-tracker/markdown/browser-tracker.emitterconfigurationbase.md +++ b/api-docs/docs/browser-tracker/markdown/browser-tracker.emitterconfigurationbase.md @@ -16,13 +16,14 @@ interface EmitterConfigurationBase | --- | --- | --- | | [bufferSize?](./browser-tracker.emitterconfigurationbase.buffersize.md) | number | (Optional) The amount of events that should be buffered before sending Recommended to leave as 1 to reduce change of losing events | | [connectionTimeout?](./browser-tracker.emitterconfigurationbase.connectiontimeout.md) | number | (Optional) How long to wait before aborting requests to the collector | +| [cookieExtensionService?](./browser-tracker.emitterconfigurationbase.cookieextensionservice.md) | string | (Optional) Cookie extension service full URL. This URL will be added to the queue and will be called using a GET method. This option is there to allow the service URL to be called in order to set any required identifiers e.g. extra cookies.The request respects the anonymousTracking option, including the SP-Anonymous header if needed, and any additional custom headers from the customHeaders option. | | [credentials?](./browser-tracker.emitterconfigurationbase.credentials.md) | "omit" \| "same-origin" \| "include" | (Optional) Controls whether or not the browser sends credentials (defaults to 'include') | | [customFetch?](./browser-tracker.emitterconfigurationbase.customfetch.md) | (input: Request, options?: RequestInit) => Promise<Response> | (Optional) Enables overriding the default fetch function with a custom implementation. | | [customHeaders?](./browser-tracker.emitterconfigurationbase.customheaders.md) | Record<string, string> | (Optional) An object of key value pairs which represent headers to attach when sending a POST request, only works for POST | | [dontRetryStatusCodes?](./browser-tracker.emitterconfigurationbase.dontretrystatuscodes.md) | number\[\] | (Optional) List of HTTP response status codes for which events sent to Collector should not be retried in future request. Only non-success status codes are considered (greater or equal to 300). The don't retry codes are only considered for GET and POST requests. By default, the tracker retries on all non-success status codes except for 400, 401, 403, 410, and 422 (these don't retry codes will remain even if you set your own dontRetryStatusCodes but can be changed using the retryStatusCodes). | | [eventMethod?](./browser-tracker.emitterconfigurationbase.eventmethod.md) | EventMethod | (Optional) The preferred technique to use to send events | | [eventStore?](./browser-tracker.emitterconfigurationbase.eventstore.md) | EventStore | (Optional) Enables providing a custom EventStore implementation to store events before sending them to the collector. | -| [idService?](./browser-tracker.emitterconfigurationbase.idservice.md) | string | (Optional) Id service full URL. This URL will be added to the queue and will be called using a GET method. This option is there to allow the service URL to be called in order to set any required identifiers e.g. extra cookies.The request respects the anonymousTracking option, including the SP-Anonymous header if needed, and any additional custom headers from the customHeaders option. | +| [idService?](./browser-tracker.emitterconfigurationbase.idservice.md) | string | (Optional) | | [keepalive?](./browser-tracker.emitterconfigurationbase.keepalive.md) | boolean | (Optional) Indicates that the request should be allowed to outlive the webpage that initiated it. Enables collector requests to complete even if the page is closed or navigated away from. Note: Browsers put a limit on keepalive requests of 64KB. In case of multiple keepalive requests in parallel (may happen in case of multiple trackers), the limit is shared. | | [maxGetBytes?](./browser-tracker.emitterconfigurationbase.maxgetbytes.md) | number | (Optional) The max size a GET request (its complete URL) can be. Requests over this size will be tried as a POST request. | | [maxPostBytes?](./browser-tracker.emitterconfigurationbase.maxpostbytes.md) | number | (Optional) The max size a POST request can be before the tracker will force send it Also dictates the max size of a POST request before a batch of events is split into multiple requests | diff --git a/api-docs/docs/browser-tracker/markdown/browser-tracker.getdomainsessionid.md b/api-docs/docs/browser-tracker/markdown/browser-tracker.getdomainsessionid.md new file mode 100644 index 000000000..bb8adc275 --- /dev/null +++ b/api-docs/docs/browser-tracker/markdown/browser-tracker.getdomainsessionid.md @@ -0,0 +1,26 @@ + + +[Home](./index.md) > [@snowplow/browser-tracker](./browser-tracker.md) > [getDomainSessionId](./browser-tracker.getdomainsessionid.md) + +## getDomainSessionId() function + +Get the domain session ID (from the first-party cookie) for a tracker. + +Signature: + +```typescript +declare function getDomainSessionId(trackerId?: string): string | undefined; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| trackerId | string | The tracker identifier which the domain session ID will be retrieved from. Defaults to the first initialised tracker. | + +Returns: + +string \| undefined + +The domain session ID, or undefined if no matching tracker is found + diff --git a/api-docs/docs/browser-tracker/markdown/browser-tracker.md b/api-docs/docs/browser-tracker/markdown/browser-tracker.md index 9671fbced..71c0e88b7 100644 --- a/api-docs/docs/browser-tracker/markdown/browser-tracker.md +++ b/api-docs/docs/browser-tracker/markdown/browser-tracker.md @@ -28,6 +28,7 @@ | [enableActivityTrackingCallback(configuration, trackers)](./browser-tracker.enableactivitytrackingcallback.md) | Enables page activity tracking (replaces collector ping with callback). | | [enableAnonymousTracking(configuration, trackers)](./browser-tracker.enableanonymoustracking.md) | Enables anonymous tracking (ie. tracker initialized without anonymousTracking) | | [flushBuffer(configuration, trackers)](./browser-tracker.flushbuffer.md) | Send all events in the outQueue Only need to use this when sending events with a bufferSize of at least 2 | +| [getDomainSessionId(trackerId)](./browser-tracker.getdomainsessionid.md) | Get the domain session ID (from the first-party cookie) for a tracker. | | [newSession(trackers)](./browser-tracker.newsession.md) | Expires current session and starts a new session. | | [newTracker(trackerId, endpoint, configuration)](./browser-tracker.newtracker.md) | Initialise a new tracker | | [preservePageViewId(trackers)](./browser-tracker.preservepageviewid.md) | Stop regenerating pageViewId (available from web_page context) | @@ -96,6 +97,7 @@ | --- | --- | | [ActivityCallback](./browser-tracker.activitycallback.md) | The callback for enableActivityTrackingCallback | | [ActivityCallbackData](./browser-tracker.activitycallbackdata.md) | The data which is passed to the Activity Tracking callback | +| [ActivityMetrics](./browser-tracker.activitymetrics.md) | Quantitative activity metrics accumulated between page pings. Attached as a context entity when activityMetrics is enabled. | | [AnonymousTrackingOptions](./browser-tracker.anonymoustrackingoptions.md) | | | [BuiltInContexts](./browser-tracker.builtincontexts.md) | | | [ConditionalContextProvider](./browser-tracker.conditionalcontextprovider.md) | Conditional context providers are two element arrays used to decide when to attach contexts, where: - the first element is some conditional criterion - the second element is any number of context primitives | diff --git a/api-docs/docs/browser-tracker/markdown/browser-tracker.trackerconfiguration.md b/api-docs/docs/browser-tracker/markdown/browser-tracker.trackerconfiguration.md index 89fb83857..1bd565422 100644 --- a/api-docs/docs/browser-tracker/markdown/browser-tracker.trackerconfiguration.md +++ b/api-docs/docs/browser-tracker/markdown/browser-tracker.trackerconfiguration.md @@ -18,6 +18,7 @@ type TrackerConfiguration = { cookieLifetime?: number; sessionCookieTimeout?: number; appId?: string; + appVersion?: string; platform?: Platform; respectDoNotTrack?: boolean; crossDomainLinker?: (elt: HTMLAnchorElement | HTMLAreaElement) => boolean; @@ -30,7 +31,9 @@ type TrackerConfiguration = { plugins?: Array; onSessionUpdateCallback?: (updatedSession: ClientSession) => void; preservePageViewIdForUrl?: PreservePageViewIdForUrl; + preserveOriginalReferrer?: boolean; synchronousCookieWrite?: boolean; + disableSessionContextWithinWebView?: boolean; } & EmitterConfigurationBase & LocalStorageEventStoreConfigurationBase; ``` diff --git a/api-docs/docs/browser-tracker/markdown/browser-tracker.trackercore.deactivate.md b/api-docs/docs/browser-tracker/markdown/browser-tracker.trackercore.deactivate.md new file mode 100644 index 000000000..3a86b5b43 --- /dev/null +++ b/api-docs/docs/browser-tracker/markdown/browser-tracker.trackercore.deactivate.md @@ -0,0 +1,17 @@ + + +[Home](./index.md) > [@snowplow/browser-tracker](./browser-tracker.md) > [TrackerCore](./browser-tracker.trackercore.md) > [deactivate](./browser-tracker.trackercore.deactivate.md) + +## TrackerCore.deactivate() method + +Deactivate tracker core including all plugins. This is useful for cleaning up resources or listeners that have been created. Once deactivated, the tracker won't be able to track any events. + +Signature: + +```typescript +deactivate(): void; +``` +Returns: + +void + diff --git a/api-docs/docs/browser-tracker/markdown/browser-tracker.trackercore.md b/api-docs/docs/browser-tracker/markdown/browser-tracker.trackercore.md index 48a955801..f61d52fb9 100644 --- a/api-docs/docs/browser-tracker/markdown/browser-tracker.trackercore.md +++ b/api-docs/docs/browser-tracker/markdown/browser-tracker.trackercore.md @@ -27,6 +27,7 @@ interface TrackerCore | [addPayloadDict(dict)](./browser-tracker.trackercore.addpayloaddict.md) | Merges a dictionary into payloadPairs | | [addPlugin(configuration)](./browser-tracker.trackercore.addplugin.md) | Add a plugin into the plugin collection after Core has already been initialised | | [clearGlobalContexts()](./browser-tracker.trackercore.clearglobalcontexts.md) | Removes all global contexts | +| [deactivate()](./browser-tracker.trackercore.deactivate.md) | Deactivate tracker core including all plugins. This is useful for cleaning up resources or listeners that have been created. Once deactivated, the tracker won't be able to track any events. | | [getBase64Encoding()](./browser-tracker.trackercore.getbase64encoding.md) | Get current base64 encoding state | | [removeGlobalContexts(contexts)](./browser-tracker.trackercore.removeglobalcontexts.md) | Removes previously added global context, performs a deep comparison of the contexts or conditional contexts | | [resetPayloadPairs(dict)](./browser-tracker.trackercore.resetpayloadpairs.md) | Replace payloadPairs with a new dictionary | diff --git a/api-docs/docs/index.md b/api-docs/docs/index.md index e2d694363..8bf9f9e93 100644 --- a/api-docs/docs/index.md +++ b/api-docs/docs/index.md @@ -2,21 +2,25 @@ sidebar_position: 1 --- -# JavaScript Trackers -The Snowplow JavaScript Trackers support being used in a number of environments. There are three versions of the tracker. +# JavaScript trackers +The Snowplow JavaScript trackers support being used in a number of environments. ## Web tracking We have two flavours of web tracker: JavaScript and Browser. -- JavaScript Tracker (v2 and v3) for loading via tags, by adding code snippets to your website or Tag Manager solution. -- Browser Tracker (v3) for installation into web apps via npm. Popular when natively integrating tracking into React, Angular and Vue applications. +- JavaScript tracker (v2, v3, and v4) for loading via tags, by adding code snippets to your website or Tag Manager solution. +- Browser tracker (v3 and v4) for installation into web apps via npm. Popular when natively integrating tracking into React, Angular and Vue applications. -Find the documentation for both in the [Web trackers](https://docs.snowplow.io/docs/collecting-data/collecting-from-own-applications/javascript-trackers/web-tracker/) section. +From v3 onwards, the JavaScript tracker is implemented as a wrapper around the Browser tracker. +Find high-level documentation for both in the [Web trackers](https://docs.snowplow.io/docs/sources/trackers/web-trackers/) section. ## Server-side tracking -Track events in server-side Node.js environments using the Node.js Tracker (v3). Used via npm. +Track events in server-side Node.js environments using the Node.js tracker (v3 and v4). Used via npm. -Find the documentation in the [Node.js tracker](https://docs.snowplow.io/docs/collecting-data/collecting-from-own-applications/javascript-trackers/node-js-tracker) section. +Find high-level documentation in the [Node.js tracker](https://docs.snowplow.io/docs/sources/trackers/node-js-tracker/) section. +## App tracking +Track events in React Native environments including mobile applications with the React Native tracker. +Find high-level documentation in the [React Native tracker](https://docs.snowplow.io/docs/sources/trackers/react-native-tracker/) section. diff --git a/api-docs/docs/node-tracker/markdown/node-tracker.coreplugin.deactivateplugin.md b/api-docs/docs/node-tracker/markdown/node-tracker.coreplugin.deactivateplugin.md new file mode 100644 index 000000000..ea93f1c66 --- /dev/null +++ b/api-docs/docs/node-tracker/markdown/node-tracker.coreplugin.deactivateplugin.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/node-tracker](./node-tracker.md) > [CorePlugin](./node-tracker.coreplugin.md) > [deactivatePlugin](./node-tracker.coreplugin.deactivateplugin.md) + +## CorePlugin.deactivatePlugin property + +Called when the tracker is being destroyed. Should be used to clean up any resources or listeners that the plugin has created. + +Signature: + +```typescript +deactivatePlugin?: (core: TrackerCore) => void; +``` diff --git a/api-docs/docs/node-tracker/markdown/node-tracker.coreplugin.md b/api-docs/docs/node-tracker/markdown/node-tracker.coreplugin.md index 37513de7d..65e4f9ae4 100644 --- a/api-docs/docs/node-tracker/markdown/node-tracker.coreplugin.md +++ b/api-docs/docs/node-tracker/markdown/node-tracker.coreplugin.md @@ -20,6 +20,7 @@ interface CorePlugin | [afterTrack?](./node-tracker.coreplugin.aftertrack.md) | (payload: Payload) => void | (Optional) Called just after the trackerCore callback fires | | [beforeTrack?](./node-tracker.coreplugin.beforetrack.md) | (payloadBuilder: PayloadBuilder) => void | (Optional) Called before the filter method is called and before the trackerCore callback fires (if the filter passes) | | [contexts?](./node-tracker.coreplugin.contexts.md) | () => SelfDescribingJson\[\] | (Optional) Called when constructing the context for each event Useful for adding additional context to events | +| [deactivatePlugin?](./node-tracker.coreplugin.deactivateplugin.md) | (core: TrackerCore) => void | (Optional) Called when the tracker is being destroyed. Should be used to clean up any resources or listeners that the plugin has created. | | [filter?](./node-tracker.coreplugin.filter.md) | (payload: Payload) => boolean | (Optional) Called before the payload is sent to the callback to decide whether to send the payload or skip it | | [logger?](./node-tracker.coreplugin.logger.md) | (logger: Logger) => void | (Optional) Passed a logger instance which can be used to send log information to the active logger | diff --git a/api-docs/docs/node-tracker/markdown/node-tracker.emitterconfigurationbase.cookieextensionservice.md b/api-docs/docs/node-tracker/markdown/node-tracker.emitterconfigurationbase.cookieextensionservice.md new file mode 100644 index 000000000..4031cdaa4 --- /dev/null +++ b/api-docs/docs/node-tracker/markdown/node-tracker.emitterconfigurationbase.cookieextensionservice.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [@snowplow/node-tracker](./node-tracker.md) > [EmitterConfigurationBase](./node-tracker.emitterconfigurationbase.md) > [cookieExtensionService](./node-tracker.emitterconfigurationbase.cookieextensionservice.md) + +## EmitterConfigurationBase.cookieExtensionService property + +Cookie extension service full URL. This URL will be added to the queue and will be called using a GET method. This option is there to allow the service URL to be called in order to set any required identifiers e.g. extra cookies. + +The request respects the `anonymousTracking` option, including the SP-Anonymous header if needed, and any additional custom headers from the customHeaders option. + +Signature: + +```typescript +cookieExtensionService?: string; +``` diff --git a/api-docs/docs/node-tracker/markdown/node-tracker.emitterconfigurationbase.idservice.md b/api-docs/docs/node-tracker/markdown/node-tracker.emitterconfigurationbase.idservice.md index 353726343..8eee6aa69 100644 --- a/api-docs/docs/node-tracker/markdown/node-tracker.emitterconfigurationbase.idservice.md +++ b/api-docs/docs/node-tracker/markdown/node-tracker.emitterconfigurationbase.idservice.md @@ -4,9 +4,10 @@ ## EmitterConfigurationBase.idService property -Id service full URL. This URL will be added to the queue and will be called using a GET method. This option is there to allow the service URL to be called in order to set any required identifiers e.g. extra cookies. - -The request respects the `anonymousTracking` option, including the SP-Anonymous header if needed, and any additional custom headers from the customHeaders option. +> Warning: This API is now obsolete. +> +> Use `cookieExtensionService` instead. +> Signature: diff --git a/api-docs/docs/node-tracker/markdown/node-tracker.emitterconfigurationbase.md b/api-docs/docs/node-tracker/markdown/node-tracker.emitterconfigurationbase.md index 4936a5559..637112285 100644 --- a/api-docs/docs/node-tracker/markdown/node-tracker.emitterconfigurationbase.md +++ b/api-docs/docs/node-tracker/markdown/node-tracker.emitterconfigurationbase.md @@ -16,13 +16,14 @@ interface EmitterConfigurationBase | --- | --- | --- | | [bufferSize?](./node-tracker.emitterconfigurationbase.buffersize.md) | number | (Optional) The amount of events that should be buffered before sending Recommended to leave as 1 to reduce change of losing events | | [connectionTimeout?](./node-tracker.emitterconfigurationbase.connectiontimeout.md) | number | (Optional) How long to wait before aborting requests to the collector | +| [cookieExtensionService?](./node-tracker.emitterconfigurationbase.cookieextensionservice.md) | string | (Optional) Cookie extension service full URL. This URL will be added to the queue and will be called using a GET method. This option is there to allow the service URL to be called in order to set any required identifiers e.g. extra cookies.The request respects the anonymousTracking option, including the SP-Anonymous header if needed, and any additional custom headers from the customHeaders option. | | [credentials?](./node-tracker.emitterconfigurationbase.credentials.md) | "omit" \| "same-origin" \| "include" | (Optional) Controls whether or not the browser sends credentials (defaults to 'include') | | [customFetch?](./node-tracker.emitterconfigurationbase.customfetch.md) | (input: Request, options?: RequestInit) => Promise<Response> | (Optional) Enables overriding the default fetch function with a custom implementation. | | [customHeaders?](./node-tracker.emitterconfigurationbase.customheaders.md) | Record<string, string> | (Optional) An object of key value pairs which represent headers to attach when sending a POST request, only works for POST | | [dontRetryStatusCodes?](./node-tracker.emitterconfigurationbase.dontretrystatuscodes.md) | number\[\] | (Optional) List of HTTP response status codes for which events sent to Collector should not be retried in future request. Only non-success status codes are considered (greater or equal to 300). The don't retry codes are only considered for GET and POST requests. By default, the tracker retries on all non-success status codes except for 400, 401, 403, 410, and 422 (these don't retry codes will remain even if you set your own dontRetryStatusCodes but can be changed using the retryStatusCodes). | | [eventMethod?](./node-tracker.emitterconfigurationbase.eventmethod.md) | EventMethod | (Optional) The preferred technique to use to send events | | [eventStore?](./node-tracker.emitterconfigurationbase.eventstore.md) | EventStore | (Optional) Enables providing a custom EventStore implementation to store events before sending them to the collector. | -| [idService?](./node-tracker.emitterconfigurationbase.idservice.md) | string | (Optional) Id service full URL. This URL will be added to the queue and will be called using a GET method. This option is there to allow the service URL to be called in order to set any required identifiers e.g. extra cookies.The request respects the anonymousTracking option, including the SP-Anonymous header if needed, and any additional custom headers from the customHeaders option. | +| [idService?](./node-tracker.emitterconfigurationbase.idservice.md) | string | (Optional) | | [keepalive?](./node-tracker.emitterconfigurationbase.keepalive.md) | boolean | (Optional) Indicates that the request should be allowed to outlive the webpage that initiated it. Enables collector requests to complete even if the page is closed or navigated away from. Note: Browsers put a limit on keepalive requests of 64KB. In case of multiple keepalive requests in parallel (may happen in case of multiple trackers), the limit is shared. | | [maxGetBytes?](./node-tracker.emitterconfigurationbase.maxgetbytes.md) | number | (Optional) The max size a GET request (its complete URL) can be. Requests over this size will be tried as a POST request. | | [maxPostBytes?](./node-tracker.emitterconfigurationbase.maxpostbytes.md) | number | (Optional) The max size a POST request can be before the tracker will force send it Also dictates the max size of a POST request before a batch of events is split into multiple requests | diff --git a/api-docs/docs/node-tracker/markdown/node-tracker.trackercore.deactivate.md b/api-docs/docs/node-tracker/markdown/node-tracker.trackercore.deactivate.md new file mode 100644 index 000000000..2d2babccd --- /dev/null +++ b/api-docs/docs/node-tracker/markdown/node-tracker.trackercore.deactivate.md @@ -0,0 +1,17 @@ + + +[Home](./index.md) > [@snowplow/node-tracker](./node-tracker.md) > [TrackerCore](./node-tracker.trackercore.md) > [deactivate](./node-tracker.trackercore.deactivate.md) + +## TrackerCore.deactivate() method + +Deactivate tracker core including all plugins. This is useful for cleaning up resources or listeners that have been created. Once deactivated, the tracker won't be able to track any events. + +Signature: + +```typescript +deactivate(): void; +``` +Returns: + +void + diff --git a/api-docs/docs/node-tracker/markdown/node-tracker.trackercore.md b/api-docs/docs/node-tracker/markdown/node-tracker.trackercore.md index be6ea7a79..d63fc8419 100644 --- a/api-docs/docs/node-tracker/markdown/node-tracker.trackercore.md +++ b/api-docs/docs/node-tracker/markdown/node-tracker.trackercore.md @@ -27,6 +27,7 @@ interface TrackerCore | [addPayloadDict(dict)](./node-tracker.trackercore.addpayloaddict.md) | Merges a dictionary into payloadPairs | | [addPlugin(configuration)](./node-tracker.trackercore.addplugin.md) | Add a plugin into the plugin collection after Core has already been initialised | | [clearGlobalContexts()](./node-tracker.trackercore.clearglobalcontexts.md) | Removes all global contexts | +| [deactivate()](./node-tracker.trackercore.deactivate.md) | Deactivate tracker core including all plugins. This is useful for cleaning up resources or listeners that have been created. Once deactivated, the tracker won't be able to track any events. | | [getBase64Encoding()](./node-tracker.trackercore.getbase64encoding.md) | Get current base64 encoding state | | [removeGlobalContexts(contexts)](./node-tracker.trackercore.removeglobalcontexts.md) | Removes previously added global context, performs a deep comparison of the contexts or conditional contexts | | [resetPayloadPairs(dict)](./node-tracker.trackercore.resetpayloadpairs.md) | Replace payloadPairs with a new dictionary | diff --git a/api-docs/docs/node-tracker/node-tracker.api.md b/api-docs/docs/node-tracker/node-tracker.api.md index e8df083bf..40280aaea 100644 --- a/api-docs/docs/node-tracker/node-tracker.api.md +++ b/api-docs/docs/node-tracker/node-tracker.api.md @@ -165,6 +165,7 @@ export interface CorePlugin { afterTrack?: (payload: Payload) => void; beforeTrack?: (payloadBuilder: PayloadBuilder) => void; contexts?: () => SelfDescribingJson[]; + deactivatePlugin?: (core: TrackerCore) => void; filter?: (payload: Payload) => boolean; logger?: (logger: Logger) => void; } @@ -243,12 +244,14 @@ export interface EmitterConfiguration extends EmitterConfigurationBase { export interface EmitterConfigurationBase { bufferSize?: number; connectionTimeout?: number; + cookieExtensionService?: string; credentials?: "omit" | "same-origin" | "include"; customFetch?: (input: Request, options?: RequestInit) => Promise; customHeaders?: Record; dontRetryStatusCodes?: number[]; eventMethod?: EventMethod; eventStore?: EventStore; + // @deprecated (undocumented) idService?: string; keepalive?: boolean; maxGetBytes?: number; @@ -527,6 +530,7 @@ export interface TrackerCore { addPayloadPair: (key: string, value: unknown) => void; addPlugin(configuration: CorePluginConfiguration): void; clearGlobalContexts(): void; + deactivate(): void; getBase64Encoding(): boolean; removeGlobalContexts(contexts: Array): void; resetPayloadPairs(dict: Payload): void; diff --git a/api-docs/docs/react-native-tracker/markdown/index.md b/api-docs/docs/react-native-tracker/markdown/index.md new file mode 100644 index 000000000..58bc37403 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/index.md @@ -0,0 +1,12 @@ + + +[Home](./index.md) + +## API Reference + +## Packages + +| Package | Description | +| --- | --- | +| [@snowplow/react-native-tracker](./react-native-tracker.md) | | + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.applifecycleconfiguration.appbuild.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.applifecycleconfiguration.appbuild.md new file mode 100644 index 000000000..03a2ecbd5 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.applifecycleconfiguration.appbuild.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [AppLifecycleConfiguration](./react-native-tracker.applifecycleconfiguration.md) > [appBuild](./react-native-tracker.applifecycleconfiguration.appbuild.md) + +## AppLifecycleConfiguration.appBuild property + +Build name of the application e.g s9f2k2d or 1.1.0 beta + +Entity schema: `iglu:com.snowplowanalytics.mobile/application/jsonschema/1-0-0` + +Signature: + +```typescript +appBuild?: string; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.applifecycleconfiguration.appversion.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.applifecycleconfiguration.appversion.md new file mode 100644 index 000000000..06a720972 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.applifecycleconfiguration.appversion.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [AppLifecycleConfiguration](./react-native-tracker.applifecycleconfiguration.md) > [appVersion](./react-native-tracker.applifecycleconfiguration.appversion.md) + +## AppLifecycleConfiguration.appVersion property + +Version number of the application e.g 1.1.0 (semver or git commit hash). + +Entity schema if `appBuild` property is set: `iglu:com.snowplowanalytics.mobile/application/jsonschema/1-0-0` Entity schema if `appBuild` property is not set: `iglu:com.snowplowanalytics.snowplow/application/jsonschema/1-0-0` + +Signature: + +```typescript +appVersion?: string; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.applifecycleconfiguration.installautotracking.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.applifecycleconfiguration.installautotracking.md new file mode 100644 index 000000000..d052ad96e --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.applifecycleconfiguration.installautotracking.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [AppLifecycleConfiguration](./react-native-tracker.applifecycleconfiguration.md) > [installAutotracking](./react-native-tracker.applifecycleconfiguration.installautotracking.md) + +## AppLifecycleConfiguration.installAutotracking property + +Whether to automatically track app install event on first run. + +Schema: `iglu:com.snowplowanalytics.mobile/application_install/jsonschema/1-0-0` + +Signature: + +```typescript +installAutotracking?: boolean; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.applifecycleconfiguration.lifecycleautotracking.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.applifecycleconfiguration.lifecycleautotracking.md new file mode 100644 index 000000000..47c7faf07 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.applifecycleconfiguration.lifecycleautotracking.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [AppLifecycleConfiguration](./react-native-tracker.applifecycleconfiguration.md) > [lifecycleAutotracking](./react-native-tracker.applifecycleconfiguration.lifecycleautotracking.md) + +## AppLifecycleConfiguration.lifecycleAutotracking property + +Whether to automatically track app lifecycle events (app foreground and background events). Also adds a lifecycle context entity to all events. + +Foreground event schema: `iglu:com.snowplowanalytics.snowplow/application_foreground/jsonschema/1-0-0` Background event schema: `iglu:com.snowplowanalytics.snowplow/application_background/jsonschema/1-0-0` Context entity schema: `iglu:com.snowplowanalytics.mobile/application_lifecycle/jsonschema/1-0-0` + +Signature: + +```typescript +lifecycleAutotracking?: boolean; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.applifecycleconfiguration.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.applifecycleconfiguration.md new file mode 100644 index 000000000..bc402d9b3 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.applifecycleconfiguration.md @@ -0,0 +1,23 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [AppLifecycleConfiguration](./react-native-tracker.applifecycleconfiguration.md) + +## AppLifecycleConfiguration interface + +Configuration for app lifecycle tracking + +Signature: + +```typescript +export interface AppLifecycleConfiguration +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [appBuild?](./react-native-tracker.applifecycleconfiguration.appbuild.md) | string | (Optional) Build name of the application e.g s9f2k2d or 1.1.0 betaEntity schema: iglu:com.snowplowanalytics.mobile/application/jsonschema/1-0-0 | +| [appVersion?](./react-native-tracker.applifecycleconfiguration.appversion.md) | string | (Optional) Version number of the application e.g 1.1.0 (semver or git commit hash).Entity schema if appBuild property is set: iglu:com.snowplowanalytics.mobile/application/jsonschema/1-0-0 Entity schema if appBuild property is not set: iglu:com.snowplowanalytics.snowplow/application/jsonschema/1-0-0 | +| [installAutotracking?](./react-native-tracker.applifecycleconfiguration.installautotracking.md) | boolean | (Optional) Whether to automatically track app install event on first run.Schema: iglu:com.snowplowanalytics.mobile/application_install/jsonschema/1-0-0 | +| [lifecycleAutotracking?](./react-native-tracker.applifecycleconfiguration.lifecycleautotracking.md) | boolean | (Optional) Whether to automatically track app lifecycle events (app foreground and background events). Also adds a lifecycle context entity to all events.Foreground event schema: iglu:com.snowplowanalytics.snowplow/application_foreground/jsonschema/1-0-0 Background event schema: iglu:com.snowplowanalytics.snowplow/application_background/jsonschema/1-0-0 Context entity schema: iglu:com.snowplowanalytics.mobile/application_lifecycle/jsonschema/1-0-0 | + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.asyncstorage.getitem.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.asyncstorage.getitem.md new file mode 100644 index 000000000..1fcf3de87 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.asyncstorage.getitem.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [AsyncStorage](./react-native-tracker.asyncstorage.md) > [getItem](./react-native-tracker.asyncstorage.getitem.md) + +## AsyncStorage.getItem property + +Signature: + +```typescript +getItem: (key: string) => Promise; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.asyncstorage.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.asyncstorage.md new file mode 100644 index 000000000..ad1c77a88 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.asyncstorage.md @@ -0,0 +1,19 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [AsyncStorage](./react-native-tracker.asyncstorage.md) + +## AsyncStorage interface + +Signature: + +```typescript +export interface AsyncStorage +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [getItem](./react-native-tracker.asyncstorage.getitem.md) | (key: string) => Promise<string \| null> | | +| [setItem](./react-native-tracker.asyncstorage.setitem.md) | (key: string, value: string) => Promise<void> | | + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.asyncstorage.setitem.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.asyncstorage.setitem.md new file mode 100644 index 000000000..5d3b79d9d --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.asyncstorage.setitem.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [AsyncStorage](./react-native-tracker.asyncstorage.md) > [setItem](./react-native-tracker.asyncstorage.setitem.md) + +## AsyncStorage.setItem property + +Signature: + +```typescript +setItem: (key: string, value: string) => Promise; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.conditionalcontextprovider.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.conditionalcontextprovider.md new file mode 100644 index 000000000..ae264a7a2 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.conditionalcontextprovider.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [ConditionalContextProvider](./react-native-tracker.conditionalcontextprovider.md) + +## ConditionalContextProvider type + +Conditional context providers are two element arrays used to decide when to attach contexts, where: - the first element is some conditional criterion - the second element is any number of context primitives + +Signature: + +```typescript +type ConditionalContextProvider = FilterProvider | RuleSetProvider; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.contextfilter.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.contextfilter.md new file mode 100644 index 000000000..b458e6646 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.contextfilter.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [ContextFilter](./react-native-tracker.contextfilter.md) + +## ContextFilter type + +A context filter is a user-supplied callback that is evaluated for each event to determine if the context associated with the filter should be attached to the event + +Signature: + +```typescript +type ContextFilter = (args?: ContextEvent) => boolean; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.contextgenerator.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.contextgenerator.md new file mode 100644 index 000000000..0cbf292e9 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.contextgenerator.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [ContextGenerator](./react-native-tracker.contextgenerator.md) + +## ContextGenerator type + +A context generator is a user-supplied callback that is evaluated for each event to allow an additional context to be dynamically attached to the event + +Signature: + +```typescript +type ContextGenerator = (args?: ContextEvent) => SelfDescribingJson | SelfDescribingJson[] | undefined; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.contextprimitive.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.contextprimitive.md new file mode 100644 index 000000000..e2fe51369 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.contextprimitive.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [ContextPrimitive](./react-native-tracker.contextprimitive.md) + +## ContextPrimitive type + +A context primitive is either a self-describing JSON or a context generator + +Signature: + +```typescript +type ContextPrimitive = SelfDescribingJson | ContextGenerator; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.coreconfiguration.base64.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.coreconfiguration.base64.md new file mode 100644 index 000000000..0bceab7f6 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.coreconfiguration.base64.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [CoreConfiguration](./react-native-tracker.coreconfiguration.md) > [base64](./react-native-tracker.coreconfiguration.base64.md) + +## CoreConfiguration.base64 property + +Signature: + +```typescript +base64?: boolean; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.coreconfiguration.callback.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.coreconfiguration.callback.md new file mode 100644 index 000000000..1e771a210 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.coreconfiguration.callback.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [CoreConfiguration](./react-native-tracker.coreconfiguration.md) > [callback](./react-native-tracker.coreconfiguration.callback.md) + +## CoreConfiguration.callback property + +Signature: + +```typescript +callback?: (PayloadData: PayloadBuilder) => void; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.coreconfiguration.coreplugins.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.coreconfiguration.coreplugins.md new file mode 100644 index 000000000..01cb1e158 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.coreconfiguration.coreplugins.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [CoreConfiguration](./react-native-tracker.coreconfiguration.md) > [corePlugins](./react-native-tracker.coreconfiguration.coreplugins.md) + +## CoreConfiguration.corePlugins property + +Signature: + +```typescript +corePlugins?: Array; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.coreconfiguration.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.coreconfiguration.md new file mode 100644 index 000000000..1b3a10636 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.coreconfiguration.md @@ -0,0 +1,22 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [CoreConfiguration](./react-native-tracker.coreconfiguration.md) + +## CoreConfiguration interface + +The configuration object for the tracker core library + +Signature: + +```typescript +interface CoreConfiguration +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [base64?](./react-native-tracker.coreconfiguration.base64.md) | boolean | (Optional) | +| [callback?](./react-native-tracker.coreconfiguration.callback.md) | (PayloadData: PayloadBuilder) => void | (Optional) | +| [corePlugins?](./react-native-tracker.coreconfiguration.coreplugins.md) | Array<CorePlugin> | (Optional) | + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.coreplugin.activatecoreplugin.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.coreplugin.activatecoreplugin.md new file mode 100644 index 000000000..90d55d741 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.coreplugin.activatecoreplugin.md @@ -0,0 +1,18 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [CorePlugin](./react-native-tracker.coreplugin.md) > [activateCorePlugin](./react-native-tracker.coreplugin.activatecoreplugin.md) + +## CorePlugin.activateCorePlugin property + +Called when the plugin is initialised during the trackerCore construction + +Signature: + +```typescript +activateCorePlugin?: (core: TrackerCore) => void; +``` + +## Remarks + +Use to capture the specific core instance for each instance of a core plugin + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.coreplugin.aftertrack.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.coreplugin.aftertrack.md new file mode 100644 index 000000000..d50881781 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.coreplugin.aftertrack.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [CorePlugin](./react-native-tracker.coreplugin.md) > [afterTrack](./react-native-tracker.coreplugin.aftertrack.md) + +## CorePlugin.afterTrack property + +Called just after the trackerCore callback fires + +Signature: + +```typescript +afterTrack?: (payload: Payload) => void; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.coreplugin.beforetrack.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.coreplugin.beforetrack.md new file mode 100644 index 000000000..a172901cf --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.coreplugin.beforetrack.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [CorePlugin](./react-native-tracker.coreplugin.md) > [beforeTrack](./react-native-tracker.coreplugin.beforetrack.md) + +## CorePlugin.beforeTrack property + +Called before the `filter` method is called and before the trackerCore callback fires (if the filter passes) + +Signature: + +```typescript +beforeTrack?: (payloadBuilder: PayloadBuilder) => void; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.coreplugin.contexts.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.coreplugin.contexts.md new file mode 100644 index 000000000..015b3117c --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.coreplugin.contexts.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [CorePlugin](./react-native-tracker.coreplugin.md) > [contexts](./react-native-tracker.coreplugin.contexts.md) + +## CorePlugin.contexts property + +Called when constructing the context for each event Useful for adding additional context to events + +Signature: + +```typescript +contexts?: () => SelfDescribingJson[]; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.coreplugin.deactivateplugin.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.coreplugin.deactivateplugin.md new file mode 100644 index 000000000..edbdd11ce --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.coreplugin.deactivateplugin.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [CorePlugin](./react-native-tracker.coreplugin.md) > [deactivatePlugin](./react-native-tracker.coreplugin.deactivateplugin.md) + +## CorePlugin.deactivatePlugin property + +Called when the tracker is being destroyed. Should be used to clean up any resources or listeners that the plugin has created. + +Signature: + +```typescript +deactivatePlugin?: (core: TrackerCore) => void; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.coreplugin.filter.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.coreplugin.filter.md new file mode 100644 index 000000000..7c621722c --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.coreplugin.filter.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [CorePlugin](./react-native-tracker.coreplugin.md) > [filter](./react-native-tracker.coreplugin.filter.md) + +## CorePlugin.filter property + +Called before the payload is sent to the callback to decide whether to send the payload or skip it + +Signature: + +```typescript +filter?: (payload: Payload) => boolean; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.coreplugin.logger.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.coreplugin.logger.md new file mode 100644 index 000000000..65ad62785 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.coreplugin.logger.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [CorePlugin](./react-native-tracker.coreplugin.md) > [logger](./react-native-tracker.coreplugin.logger.md) + +## CorePlugin.logger property + +Passed a logger instance which can be used to send log information to the active logger + +Signature: + +```typescript +logger?: (logger: Logger) => void; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.coreplugin.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.coreplugin.md new file mode 100644 index 000000000..85529ca8c --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.coreplugin.md @@ -0,0 +1,26 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [CorePlugin](./react-native-tracker.coreplugin.md) + +## CorePlugin interface + +Interface which defines Core Plugins + +Signature: + +```typescript +interface CorePlugin +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [activateCorePlugin?](./react-native-tracker.coreplugin.activatecoreplugin.md) | (core: TrackerCore) => void | (Optional) Called when the plugin is initialised during the trackerCore construction | +| [afterTrack?](./react-native-tracker.coreplugin.aftertrack.md) | (payload: Payload) => void | (Optional) Called just after the trackerCore callback fires | +| [beforeTrack?](./react-native-tracker.coreplugin.beforetrack.md) | (payloadBuilder: PayloadBuilder) => void | (Optional) Called before the filter method is called and before the trackerCore callback fires (if the filter passes) | +| [contexts?](./react-native-tracker.coreplugin.contexts.md) | () => SelfDescribingJson\[\] | (Optional) Called when constructing the context for each event Useful for adding additional context to events | +| [deactivatePlugin?](./react-native-tracker.coreplugin.deactivateplugin.md) | (core: TrackerCore) => void | (Optional) Called when the tracker is being destroyed. Should be used to clean up any resources or listeners that the plugin has created. | +| [filter?](./react-native-tracker.coreplugin.filter.md) | (payload: Payload) => boolean | (Optional) Called before the payload is sent to the callback to decide whether to send the payload or skip it | +| [logger?](./react-native-tracker.coreplugin.logger.md) | (logger: Logger) => void | (Optional) Passed a logger instance which can be used to send log information to the active logger | + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.corepluginconfiguration.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.corepluginconfiguration.md new file mode 100644 index 000000000..e14a922ec --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.corepluginconfiguration.md @@ -0,0 +1,20 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [CorePluginConfiguration](./react-native-tracker.corepluginconfiguration.md) + +## CorePluginConfiguration interface + +The configuration of the plugin to add + +Signature: + +```typescript +interface CorePluginConfiguration +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [plugin](./react-native-tracker.corepluginconfiguration.plugin.md) | CorePlugin | | + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.corepluginconfiguration.plugin.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.corepluginconfiguration.plugin.md new file mode 100644 index 000000000..6ab300b27 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.corepluginconfiguration.plugin.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [CorePluginConfiguration](./react-native-tracker.corepluginconfiguration.md) > [plugin](./react-native-tracker.corepluginconfiguration.plugin.md) + +## CorePluginConfiguration.plugin property + +Signature: + +```typescript +plugin: CorePlugin; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.deeplinkconfiguration.deeplinkcontext.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.deeplinkconfiguration.deeplinkcontext.md new file mode 100644 index 000000000..ad1dc7387 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.deeplinkconfiguration.deeplinkcontext.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [DeepLinkConfiguration](./react-native-tracker.deeplinkconfiguration.md) > [deepLinkContext](./react-native-tracker.deeplinkconfiguration.deeplinkcontext.md) + +## DeepLinkConfiguration.deepLinkContext property + +Whether to track the deep link context entity with information from the deep link received event on the first screen view event. + +Signature: + +```typescript +deepLinkContext?: boolean; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.deeplinkconfiguration.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.deeplinkconfiguration.md new file mode 100644 index 000000000..506c7ed7a --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.deeplinkconfiguration.md @@ -0,0 +1,20 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [DeepLinkConfiguration](./react-native-tracker.deeplinkconfiguration.md) + +## DeepLinkConfiguration interface + +Configuration for deep link tracking + +Signature: + +```typescript +export interface DeepLinkConfiguration +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [deepLinkContext?](./react-native-tracker.deeplinkconfiguration.deeplinkcontext.md) | boolean | (Optional) Whether to track the deep link context entity with information from the deep link received event on the first screen view event. | + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.deeplinkreceivedprops.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.deeplinkreceivedprops.md new file mode 100644 index 000000000..6a10e920c --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.deeplinkreceivedprops.md @@ -0,0 +1,16 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [DeepLinkReceivedProps](./react-native-tracker.deeplinkreceivedprops.md) + +## DeepLinkReceivedProps type + +DeepLinkReceived event properties schema: iglu:com.snowplowanalytics.mobile/deep\_link\_received/jsonschema/1-0-0 + +Signature: + +```typescript +export declare type DeepLinkReceivedProps = { + url: string; + referrer?: string; +}; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.devicetimestamp.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.devicetimestamp.md new file mode 100644 index 000000000..22804fc75 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.devicetimestamp.md @@ -0,0 +1,21 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [DeviceTimestamp](./react-native-tracker.devicetimestamp.md) + +## DeviceTimestamp interface + +A representation of a Device Timestamp (dtm) + +Signature: + +```typescript +interface DeviceTimestamp +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [type](./react-native-tracker.devicetimestamp.type.md) | "dtm" | | +| [value](./react-native-tracker.devicetimestamp.value.md) | number | | + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.devicetimestamp.type.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.devicetimestamp.type.md new file mode 100644 index 000000000..b02eee053 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.devicetimestamp.type.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [DeviceTimestamp](./react-native-tracker.devicetimestamp.md) > [type](./react-native-tracker.devicetimestamp.type.md) + +## DeviceTimestamp.type property + +Signature: + +```typescript +readonly type: "dtm"; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.devicetimestamp.value.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.devicetimestamp.value.md new file mode 100644 index 000000000..2b5a2fb23 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.devicetimestamp.value.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [DeviceTimestamp](./react-native-tracker.devicetimestamp.md) > [value](./react-native-tracker.devicetimestamp.value.md) + +## DeviceTimestamp.value property + +Signature: + +```typescript +readonly value: number; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitter.flush.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitter.flush.md new file mode 100644 index 000000000..351d0e37e --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitter.flush.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [Emitter](./react-native-tracker.emitter.md) > [flush](./react-native-tracker.emitter.flush.md) + +## Emitter.flush property + +Forces the emitter to send all events in the event store to the collector. + +Signature: + +```typescript +flush: () => Promise; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitter.input.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitter.input.md new file mode 100644 index 000000000..5f22e9b5c --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitter.input.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [Emitter](./react-native-tracker.emitter.md) > [input](./react-native-tracker.emitter.input.md) + +## Emitter.input property + +Adds a payload to the event store or sends it to the collector. + +Signature: + +```typescript +input: (payload: Payload) => Promise; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitter.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitter.md new file mode 100644 index 000000000..24f95cde0 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitter.md @@ -0,0 +1,24 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [Emitter](./react-native-tracker.emitter.md) + +## Emitter interface + +Emitter is responsible for sending events to the collector. It manages the event queue and sends events in batches depending on configuration. + +Signature: + +```typescript +interface Emitter +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [flush](./react-native-tracker.emitter.flush.md) | () => Promise<void> | Forces the emitter to send all events in the event store to the collector. | +| [input](./react-native-tracker.emitter.input.md) | (payload: Payload) => Promise<void> | Adds a payload to the event store or sends it to the collector. | +| [setAnonymousTracking](./react-native-tracker.emitter.setanonymoustracking.md) | (anonymous: boolean) => void | Sets the server anonymization flag. | +| [setBufferSize](./react-native-tracker.emitter.setbuffersize.md) | (bufferSize: number) => void | Updates the buffer size of the emitter. | +| [setCollectorUrl](./react-native-tracker.emitter.setcollectorurl.md) | (url: string) => void | Updates the collector URL to which events will be sent. | + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitter.setanonymoustracking.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitter.setanonymoustracking.md new file mode 100644 index 000000000..7de2afba3 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitter.setanonymoustracking.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [Emitter](./react-native-tracker.emitter.md) > [setAnonymousTracking](./react-native-tracker.emitter.setanonymoustracking.md) + +## Emitter.setAnonymousTracking property + +Sets the server anonymization flag. + +Signature: + +```typescript +setAnonymousTracking: (anonymous: boolean) => void; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitter.setbuffersize.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitter.setbuffersize.md new file mode 100644 index 000000000..630e81e5e --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitter.setbuffersize.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [Emitter](./react-native-tracker.emitter.md) > [setBufferSize](./react-native-tracker.emitter.setbuffersize.md) + +## Emitter.setBufferSize property + +Updates the buffer size of the emitter. + +Signature: + +```typescript +setBufferSize: (bufferSize: number) => void; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitter.setcollectorurl.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitter.setcollectorurl.md new file mode 100644 index 000000000..2d170a707 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitter.setcollectorurl.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [Emitter](./react-native-tracker.emitter.md) > [setCollectorUrl](./react-native-tracker.emitter.setcollectorurl.md) + +## Emitter.setCollectorUrl property + +Updates the collector URL to which events will be sent. + +Signature: + +```typescript +setCollectorUrl: (url: string) => void; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfiguration.endpoint.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfiguration.endpoint.md new file mode 100644 index 000000000..6e3c59555 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfiguration.endpoint.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EmitterConfiguration](./react-native-tracker.emitterconfiguration.md) > [endpoint](./react-native-tracker.emitterconfiguration.endpoint.md) + +## EmitterConfiguration.endpoint property + +Signature: + +```typescript +endpoint: string; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfiguration.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfiguration.md new file mode 100644 index 000000000..e8f5c3fc3 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfiguration.md @@ -0,0 +1,22 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EmitterConfiguration](./react-native-tracker.emitterconfiguration.md) + +## EmitterConfiguration interface + +Signature: + +```typescript +interface EmitterConfiguration extends EmitterConfigurationBase +``` +Extends: EmitterConfigurationBase + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [endpoint](./react-native-tracker.emitterconfiguration.endpoint.md) | string | | +| [port?](./react-native-tracker.emitterconfiguration.port.md) | number | (Optional) | +| [protocol?](./react-native-tracker.emitterconfiguration.protocol.md) | "http" \| "https" | (Optional) | +| [serverAnonymization?](./react-native-tracker.emitterconfiguration.serveranonymization.md) | boolean | (Optional) | + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfiguration.port.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfiguration.port.md new file mode 100644 index 000000000..082b7ac51 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfiguration.port.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EmitterConfiguration](./react-native-tracker.emitterconfiguration.md) > [port](./react-native-tracker.emitterconfiguration.port.md) + +## EmitterConfiguration.port property + +Signature: + +```typescript +port?: number; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfiguration.protocol.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfiguration.protocol.md new file mode 100644 index 000000000..8a3715d36 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfiguration.protocol.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EmitterConfiguration](./react-native-tracker.emitterconfiguration.md) > [protocol](./react-native-tracker.emitterconfiguration.protocol.md) + +## EmitterConfiguration.protocol property + +Signature: + +```typescript +protocol?: "http" | "https"; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfiguration.serveranonymization.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfiguration.serveranonymization.md new file mode 100644 index 000000000..74628321b --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfiguration.serveranonymization.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EmitterConfiguration](./react-native-tracker.emitterconfiguration.md) > [serverAnonymization](./react-native-tracker.emitterconfiguration.serveranonymization.md) + +## EmitterConfiguration.serverAnonymization property + +Signature: + +```typescript +serverAnonymization?: boolean; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.buffersize.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.buffersize.md new file mode 100644 index 000000000..5141933a2 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.buffersize.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EmitterConfigurationBase](./react-native-tracker.emitterconfigurationbase.md) > [bufferSize](./react-native-tracker.emitterconfigurationbase.buffersize.md) + +## EmitterConfigurationBase.bufferSize property + +The amount of events that should be buffered before sending Recommended to leave as 1 to reduce change of losing events + +Signature: + +```typescript +bufferSize?: number; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.connectiontimeout.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.connectiontimeout.md new file mode 100644 index 000000000..01c13b8bc --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.connectiontimeout.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EmitterConfigurationBase](./react-native-tracker.emitterconfigurationbase.md) > [connectionTimeout](./react-native-tracker.emitterconfigurationbase.connectiontimeout.md) + +## EmitterConfigurationBase.connectionTimeout property + +How long to wait before aborting requests to the collector + +Signature: + +```typescript +connectionTimeout?: number; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.cookieextensionservice.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.cookieextensionservice.md new file mode 100644 index 000000000..86cabc539 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.cookieextensionservice.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EmitterConfigurationBase](./react-native-tracker.emitterconfigurationbase.md) > [cookieExtensionService](./react-native-tracker.emitterconfigurationbase.cookieextensionservice.md) + +## EmitterConfigurationBase.cookieExtensionService property + +Cookie extension service full URL. This URL will be added to the queue and will be called using a GET method. This option is there to allow the service URL to be called in order to set any required identifiers e.g. extra cookies. + +The request respects the `anonymousTracking` option, including the SP-Anonymous header if needed, and any additional custom headers from the customHeaders option. + +Signature: + +```typescript +cookieExtensionService?: string; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.credentials.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.credentials.md new file mode 100644 index 000000000..1219ad5b7 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.credentials.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EmitterConfigurationBase](./react-native-tracker.emitterconfigurationbase.md) > [credentials](./react-native-tracker.emitterconfigurationbase.credentials.md) + +## EmitterConfigurationBase.credentials property + +Controls whether or not the browser sends credentials (defaults to 'include') + +Signature: + +```typescript +credentials?: "omit" | "same-origin" | "include"; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.customfetch.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.customfetch.md new file mode 100644 index 000000000..3831bffeb --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.customfetch.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EmitterConfigurationBase](./react-native-tracker.emitterconfigurationbase.md) > [customFetch](./react-native-tracker.emitterconfigurationbase.customfetch.md) + +## EmitterConfigurationBase.customFetch property + +Enables overriding the default fetch function with a custom implementation. + +Signature: + +```typescript +customFetch?: (input: Request, options?: RequestInit) => Promise; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.customheaders.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.customheaders.md new file mode 100644 index 000000000..19bb72078 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.customheaders.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EmitterConfigurationBase](./react-native-tracker.emitterconfigurationbase.md) > [customHeaders](./react-native-tracker.emitterconfigurationbase.customheaders.md) + +## EmitterConfigurationBase.customHeaders property + +An object of key value pairs which represent headers to attach when sending a POST request, only works for POST + +Signature: + +```typescript +customHeaders?: Record; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.dontretrystatuscodes.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.dontretrystatuscodes.md new file mode 100644 index 000000000..899a420d2 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.dontretrystatuscodes.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EmitterConfigurationBase](./react-native-tracker.emitterconfigurationbase.md) > [dontRetryStatusCodes](./react-native-tracker.emitterconfigurationbase.dontretrystatuscodes.md) + +## EmitterConfigurationBase.dontRetryStatusCodes property + +List of HTTP response status codes for which events sent to Collector should not be retried in future request. Only non-success status codes are considered (greater or equal to 300). The don't retry codes are only considered for GET and POST requests. By default, the tracker retries on all non-success status codes except for 400, 401, 403, 410, and 422 (these don't retry codes will remain even if you set your own `dontRetryStatusCodes` but can be changed using the `retryStatusCodes`). + +Signature: + +```typescript +dontRetryStatusCodes?: number[]; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.eventmethod.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.eventmethod.md new file mode 100644 index 000000000..dfb2be7e8 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.eventmethod.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EmitterConfigurationBase](./react-native-tracker.emitterconfigurationbase.md) > [eventMethod](./react-native-tracker.emitterconfigurationbase.eventmethod.md) + +## EmitterConfigurationBase.eventMethod property + +The preferred technique to use to send events + +Signature: + +```typescript +eventMethod?: EventMethod; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.eventstore.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.eventstore.md new file mode 100644 index 000000000..8c872a534 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.eventstore.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EmitterConfigurationBase](./react-native-tracker.emitterconfigurationbase.md) > [eventStore](./react-native-tracker.emitterconfigurationbase.eventstore.md) + +## EmitterConfigurationBase.eventStore property + +Enables providing a custom EventStore implementation to store events before sending them to the collector. + +Signature: + +```typescript +eventStore?: EventStore; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.idservice.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.idservice.md new file mode 100644 index 000000000..63952083d --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.idservice.md @@ -0,0 +1,16 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EmitterConfigurationBase](./react-native-tracker.emitterconfigurationbase.md) > [idService](./react-native-tracker.emitterconfigurationbase.idservice.md) + +## EmitterConfigurationBase.idService property + +> Warning: This API is now obsolete. +> +> Use `cookieExtensionService` instead. +> + +Signature: + +```typescript +idService?: string; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.keepalive.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.keepalive.md new file mode 100644 index 000000000..01c8c2818 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.keepalive.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EmitterConfigurationBase](./react-native-tracker.emitterconfigurationbase.md) > [keepalive](./react-native-tracker.emitterconfigurationbase.keepalive.md) + +## EmitterConfigurationBase.keepalive property + +Indicates that the request should be allowed to outlive the webpage that initiated it. Enables collector requests to complete even if the page is closed or navigated away from. Note: Browsers put a limit on keepalive requests of 64KB. In case of multiple keepalive requests in parallel (may happen in case of multiple trackers), the limit is shared. + +Signature: + +```typescript +keepalive?: boolean; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.maxgetbytes.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.maxgetbytes.md new file mode 100644 index 000000000..f9dfdedc5 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.maxgetbytes.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EmitterConfigurationBase](./react-native-tracker.emitterconfigurationbase.md) > [maxGetBytes](./react-native-tracker.emitterconfigurationbase.maxgetbytes.md) + +## EmitterConfigurationBase.maxGetBytes property + +The max size a GET request (its complete URL) can be. Requests over this size will be tried as a POST request. + +Signature: + +```typescript +maxGetBytes?: number; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.maxpostbytes.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.maxpostbytes.md new file mode 100644 index 000000000..1933473d1 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.maxpostbytes.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EmitterConfigurationBase](./react-native-tracker.emitterconfigurationbase.md) > [maxPostBytes](./react-native-tracker.emitterconfigurationbase.maxpostbytes.md) + +## EmitterConfigurationBase.maxPostBytes property + +The max size a POST request can be before the tracker will force send it Also dictates the max size of a POST request before a batch of events is split into multiple requests + +Signature: + +```typescript +maxPostBytes?: number; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.md new file mode 100644 index 000000000..d30a00963 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.md @@ -0,0 +1,36 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EmitterConfigurationBase](./react-native-tracker.emitterconfigurationbase.md) + +## EmitterConfigurationBase interface + +Signature: + +```typescript +interface EmitterConfigurationBase +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [bufferSize?](./react-native-tracker.emitterconfigurationbase.buffersize.md) | number | (Optional) The amount of events that should be buffered before sending Recommended to leave as 1 to reduce change of losing events | +| [connectionTimeout?](./react-native-tracker.emitterconfigurationbase.connectiontimeout.md) | number | (Optional) How long to wait before aborting requests to the collector | +| [cookieExtensionService?](./react-native-tracker.emitterconfigurationbase.cookieextensionservice.md) | string | (Optional) Cookie extension service full URL. This URL will be added to the queue and will be called using a GET method. This option is there to allow the service URL to be called in order to set any required identifiers e.g. extra cookies.The request respects the anonymousTracking option, including the SP-Anonymous header if needed, and any additional custom headers from the customHeaders option. | +| [credentials?](./react-native-tracker.emitterconfigurationbase.credentials.md) | "omit" \| "same-origin" \| "include" | (Optional) Controls whether or not the browser sends credentials (defaults to 'include') | +| [customFetch?](./react-native-tracker.emitterconfigurationbase.customfetch.md) | (input: Request, options?: RequestInit) => Promise<Response> | (Optional) Enables overriding the default fetch function with a custom implementation. | +| [customHeaders?](./react-native-tracker.emitterconfigurationbase.customheaders.md) | Record<string, string> | (Optional) An object of key value pairs which represent headers to attach when sending a POST request, only works for POST | +| [dontRetryStatusCodes?](./react-native-tracker.emitterconfigurationbase.dontretrystatuscodes.md) | number\[\] | (Optional) List of HTTP response status codes for which events sent to Collector should not be retried in future request. Only non-success status codes are considered (greater or equal to 300). The don't retry codes are only considered for GET and POST requests. By default, the tracker retries on all non-success status codes except for 400, 401, 403, 410, and 422 (these don't retry codes will remain even if you set your own dontRetryStatusCodes but can be changed using the retryStatusCodes). | +| [eventMethod?](./react-native-tracker.emitterconfigurationbase.eventmethod.md) | EventMethod | (Optional) The preferred technique to use to send events | +| [eventStore?](./react-native-tracker.emitterconfigurationbase.eventstore.md) | EventStore | (Optional) Enables providing a custom EventStore implementation to store events before sending them to the collector. | +| [idService?](./react-native-tracker.emitterconfigurationbase.idservice.md) | string | (Optional) | +| [keepalive?](./react-native-tracker.emitterconfigurationbase.keepalive.md) | boolean | (Optional) Indicates that the request should be allowed to outlive the webpage that initiated it. Enables collector requests to complete even if the page is closed or navigated away from. Note: Browsers put a limit on keepalive requests of 64KB. In case of multiple keepalive requests in parallel (may happen in case of multiple trackers), the limit is shared. | +| [maxGetBytes?](./react-native-tracker.emitterconfigurationbase.maxgetbytes.md) | number | (Optional) The max size a GET request (its complete URL) can be. Requests over this size will be tried as a POST request. | +| [maxPostBytes?](./react-native-tracker.emitterconfigurationbase.maxpostbytes.md) | number | (Optional) The max size a POST request can be before the tracker will force send it Also dictates the max size of a POST request before a batch of events is split into multiple requests | +| [onRequestFailure?](./react-native-tracker.emitterconfigurationbase.onrequestfailure.md) | (data: RequestFailure, response?: Response) => void | (Optional) A callback function to be executed whenever a request fails to be sent to the collector. This is the inverse of the onRequestSuccess callback, so any non 2xx status code will trigger this callback. | +| [onRequestSuccess?](./react-native-tracker.emitterconfigurationbase.onrequestsuccess.md) | (data: EventBatch, response: Response) => void | (Optional) A callback function to be executed whenever a request is successfully sent to the collector. In practice this means any request which returns a 2xx status code will trigger this callback. | +| [postPath?](./react-native-tracker.emitterconfigurationbase.postpath.md) | string | (Optional) The post path which events will be sent to. Ensure your collector is configured to accept events on this post path | +| [retryFailedRequests?](./react-native-tracker.emitterconfigurationbase.retryfailedrequests.md) | boolean | (Optional) Whether to retry failed requests to the collector.Failed requests are requests that failed due to \[timeouts\](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/timeout\_event), \[network errors\](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/error\_event), and \[abort events\](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/abort\_event).Takes precedent over retryStatusCodes and dontRetryStatusCodes. | +| [retryStatusCodes?](./react-native-tracker.emitterconfigurationbase.retrystatuscodes.md) | number\[\] | (Optional) List of HTTP response status codes for which events sent to Collector should be retried in future requests. Only non-success status codes are considered (greater or equal to 300). The retry codes are only considered for GET and POST requests. They take priority over the dontRetryStatusCodes option. By default, the tracker retries on all non-success status codes except for 400, 401, 403, 410, and 422. | +| [useStm?](./react-native-tracker.emitterconfigurationbase.usestm.md) | boolean | (Optional) Should the Sent Timestamp be attached to events. Only applies for GET events. | + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.onrequestfailure.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.onrequestfailure.md new file mode 100644 index 000000000..966c194ad --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.onrequestfailure.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EmitterConfigurationBase](./react-native-tracker.emitterconfigurationbase.md) > [onRequestFailure](./react-native-tracker.emitterconfigurationbase.onrequestfailure.md) + +## EmitterConfigurationBase.onRequestFailure property + +A callback function to be executed whenever a request fails to be sent to the collector. This is the inverse of the onRequestSuccess callback, so any non 2xx status code will trigger this callback. + +Signature: + +```typescript +onRequestFailure?: (data: RequestFailure, response?: Response) => void; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.onrequestsuccess.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.onrequestsuccess.md new file mode 100644 index 000000000..aa3a00827 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.onrequestsuccess.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EmitterConfigurationBase](./react-native-tracker.emitterconfigurationbase.md) > [onRequestSuccess](./react-native-tracker.emitterconfigurationbase.onrequestsuccess.md) + +## EmitterConfigurationBase.onRequestSuccess property + +A callback function to be executed whenever a request is successfully sent to the collector. In practice this means any request which returns a 2xx status code will trigger this callback. + +Signature: + +```typescript +onRequestSuccess?: (data: EventBatch, response: Response) => void; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.postpath.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.postpath.md new file mode 100644 index 000000000..f12cdb29b --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.postpath.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EmitterConfigurationBase](./react-native-tracker.emitterconfigurationbase.md) > [postPath](./react-native-tracker.emitterconfigurationbase.postpath.md) + +## EmitterConfigurationBase.postPath property + +The post path which events will be sent to. Ensure your collector is configured to accept events on this post path + +Signature: + +```typescript +postPath?: string; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.retryfailedrequests.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.retryfailedrequests.md new file mode 100644 index 000000000..133d36e9d --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.retryfailedrequests.md @@ -0,0 +1,17 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EmitterConfigurationBase](./react-native-tracker.emitterconfigurationbase.md) > [retryFailedRequests](./react-native-tracker.emitterconfigurationbase.retryfailedrequests.md) + +## EmitterConfigurationBase.retryFailedRequests property + +Whether to retry failed requests to the collector. + +Failed requests are requests that failed due to \[timeouts\](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/timeout\_event), \[network errors\](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/error\_event), and \[abort events\](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/abort\_event). + +Takes precedent over `retryStatusCodes` and `dontRetryStatusCodes`. + +Signature: + +```typescript +retryFailedRequests?: boolean; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.retrystatuscodes.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.retrystatuscodes.md new file mode 100644 index 000000000..2e275eb64 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.retrystatuscodes.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EmitterConfigurationBase](./react-native-tracker.emitterconfigurationbase.md) > [retryStatusCodes](./react-native-tracker.emitterconfigurationbase.retrystatuscodes.md) + +## EmitterConfigurationBase.retryStatusCodes property + +List of HTTP response status codes for which events sent to Collector should be retried in future requests. Only non-success status codes are considered (greater or equal to 300). The retry codes are only considered for GET and POST requests. They take priority over the `dontRetryStatusCodes` option. By default, the tracker retries on all non-success status codes except for 400, 401, 403, 410, and 422. + +Signature: + +```typescript +retryStatusCodes?: number[]; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.usestm.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.usestm.md new file mode 100644 index 000000000..357628928 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.emitterconfigurationbase.usestm.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EmitterConfigurationBase](./react-native-tracker.emitterconfigurationbase.md) > [useStm](./react-native-tracker.emitterconfigurationbase.usestm.md) + +## EmitterConfigurationBase.useStm property + +Should the Sent Timestamp be attached to events. Only applies for GET events. + +Signature: + +```typescript +useStm?: boolean; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventbatch.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventbatch.md new file mode 100644 index 000000000..3eda10ed8 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventbatch.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EventBatch](./react-native-tracker.eventbatch.md) + +## EventBatch type + +A collection of event payloads which are sent to the collector. + +Signature: + +```typescript +type EventBatch = Payload[]; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventcontext.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventcontext.md new file mode 100644 index 000000000..9e3cbe32b --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventcontext.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EventContext](./react-native-tracker.eventcontext.md) + +## EventContext type + +EventContext type + +Signature: + +```typescript +export declare type EventContext = SelfDescribingJson; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventjson.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventjson.md new file mode 100644 index 000000000..6772b5486 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventjson.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EventJson](./react-native-tracker.eventjson.md) + +## EventJson type + +An array of tuples which represents the unprocessed JSON to be added to the Payload + +Signature: + +```typescript +type EventJson = Array; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventjsonwithkeys.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventjsonwithkeys.md new file mode 100644 index 000000000..025ecd9e2 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventjsonwithkeys.md @@ -0,0 +1,17 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EventJsonWithKeys](./react-native-tracker.eventjsonwithkeys.md) + +## EventJsonWithKeys type + +A tuple which represents the unprocessed JSON to be added to the Payload + +Signature: + +```typescript +type EventJsonWithKeys = { + keyIfEncoded: string; + keyIfNotEncoded: string; + json: Record; +}; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventmethod.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventmethod.md new file mode 100644 index 000000000..c76297fad --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventmethod.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EventMethod](./react-native-tracker.eventmethod.md) + +## EventMethod type + +Signature: + +```typescript +type EventMethod = "post" | "get"; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventpayloadandcontext.context.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventpayloadandcontext.context.md new file mode 100644 index 000000000..e4dfd9d8a --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventpayloadandcontext.context.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EventPayloadAndContext](./react-native-tracker.eventpayloadandcontext.md) > [context](./react-native-tracker.eventpayloadandcontext.context.md) + +## EventPayloadAndContext.context property + +List of context entities to track along with the event + +Signature: + +```typescript +context: Array; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventpayloadandcontext.event.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventpayloadandcontext.event.md new file mode 100644 index 000000000..4046b70a7 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventpayloadandcontext.event.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EventPayloadAndContext](./react-native-tracker.eventpayloadandcontext.md) > [event](./react-native-tracker.eventpayloadandcontext.event.md) + +## EventPayloadAndContext.event property + +Tracker payload for the event data + +Signature: + +```typescript +event: PayloadBuilder; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventpayloadandcontext.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventpayloadandcontext.md new file mode 100644 index 000000000..2d62a8d95 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventpayloadandcontext.md @@ -0,0 +1,21 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EventPayloadAndContext](./react-native-tracker.eventpayloadandcontext.md) + +## EventPayloadAndContext interface + +Interface for returning a built event (PayloadBuilder) and context (Array of SelfDescribingJson). + +Signature: + +```typescript +interface EventPayloadAndContext +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [context](./react-native-tracker.eventpayloadandcontext.context.md) | Array<SelfDescribingJson> | List of context entities to track along with the event | +| [event](./react-native-tracker.eventpayloadandcontext.event.md) | PayloadBuilder | Tracker payload for the event data | + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventstoreconfiguration.asyncstorage.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventstoreconfiguration.asyncstorage.md new file mode 100644 index 000000000..980c7f6c9 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventstoreconfiguration.asyncstorage.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EventStoreConfiguration](./react-native-tracker.eventstoreconfiguration.md) > [asyncStorage](./react-native-tracker.eventstoreconfiguration.asyncstorage.md) + +## EventStoreConfiguration.asyncStorage property + +The Async storage implementation. In environments where AsyncStorage is not available or where another kind of storage is used, you can provide a custom implementation. + +Signature: + +```typescript +asyncStorage?: AsyncStorage; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventstoreconfiguration.maxeventstoresize.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventstoreconfiguration.maxeventstoresize.md new file mode 100644 index 000000000..ccc4debe4 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventstoreconfiguration.maxeventstoresize.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EventStoreConfiguration](./react-native-tracker.eventstoreconfiguration.md) > [maxEventStoreSize](./react-native-tracker.eventstoreconfiguration.maxeventstoresize.md) + +## EventStoreConfiguration.maxEventStoreSize property + +The maximum amount of events that will be buffered in the event store + +Will drop events once the limit is hit + +Signature: + +```typescript +maxEventStoreSize?: number; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventstoreconfiguration.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventstoreconfiguration.md new file mode 100644 index 000000000..deee2aeca --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventstoreconfiguration.md @@ -0,0 +1,22 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EventStoreConfiguration](./react-native-tracker.eventstoreconfiguration.md) + +## EventStoreConfiguration interface + +Configuration for the event store + +Signature: + +```typescript +export interface EventStoreConfiguration +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [asyncStorage?](./react-native-tracker.eventstoreconfiguration.asyncstorage.md) | [AsyncStorage](./react-native-tracker.asyncstorage.md) | (Optional) The Async storage implementation. In environments where AsyncStorage is not available or where another kind of storage is used, you can provide a custom implementation. | +| [maxEventStoreSize?](./react-native-tracker.eventstoreconfiguration.maxeventstoresize.md) | number | (Optional) The maximum amount of events that will be buffered in the event storeWill drop events once the limit is hit | +| [useAsyncStorageForEventStore?](./react-native-tracker.eventstoreconfiguration.useasyncstorageforeventstore.md) | boolean | (Optional) Whether to use the AsyncStorage library as the persistent event store for the event store | + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventstoreconfiguration.useasyncstorageforeventstore.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventstoreconfiguration.useasyncstorageforeventstore.md new file mode 100644 index 000000000..275e64ede --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventstoreconfiguration.useasyncstorageforeventstore.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EventStoreConfiguration](./react-native-tracker.eventstoreconfiguration.md) > [useAsyncStorageForEventStore](./react-native-tracker.eventstoreconfiguration.useasyncstorageforeventstore.md) + +## EventStoreConfiguration.useAsyncStorageForEventStore property + +Whether to use the AsyncStorage library as the persistent event store for the event store + +Signature: + +```typescript +useAsyncStorageForEventStore?: boolean; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventstoreiterator.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventstoreiterator.md new file mode 100644 index 000000000..4b9d4e13b --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventstoreiterator.md @@ -0,0 +1,20 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EventStoreIterator](./react-native-tracker.eventstoreiterator.md) + +## EventStoreIterator interface + +EventStoreIterator allows iterating over all events in the store. + +Signature: + +```typescript +interface EventStoreIterator +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [next](./react-native-tracker.eventstoreiterator.next.md) | () => Promise<EventStoreIteratorNextResult> | Retrieve the next event in the store | + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventstoreiterator.next.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventstoreiterator.next.md new file mode 100644 index 000000000..c2e95a935 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventstoreiterator.next.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EventStoreIterator](./react-native-tracker.eventstoreiterator.md) > [next](./react-native-tracker.eventstoreiterator.next.md) + +## EventStoreIterator.next property + +Retrieve the next event in the store + +Signature: + +```typescript +next: () => Promise; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventstorepayload.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventstorepayload.md new file mode 100644 index 000000000..472ba6f8f --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventstorepayload.md @@ -0,0 +1,19 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EventStorePayload](./react-native-tracker.eventstorepayload.md) + +## EventStorePayload interface + +Signature: + +```typescript +interface EventStorePayload +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [payload](./react-native-tracker.eventstorepayload.payload.md) | Payload | The event payload to be stored | +| [svrAnon?](./react-native-tracker.eventstorepayload.svranon.md) | boolean | (Optional) If the request should undergo server anonymization. | + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventstorepayload.payload.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventstorepayload.payload.md new file mode 100644 index 000000000..76807caf0 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventstorepayload.payload.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EventStorePayload](./react-native-tracker.eventstorepayload.md) > [payload](./react-native-tracker.eventstorepayload.payload.md) + +## EventStorePayload.payload property + +The event payload to be stored + +Signature: + +```typescript +payload: Payload; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventstorepayload.svranon.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventstorepayload.svranon.md new file mode 100644 index 000000000..5db52ecfc --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.eventstorepayload.svranon.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [EventStorePayload](./react-native-tracker.eventstorepayload.md) > [svrAnon](./react-native-tracker.eventstorepayload.svranon.md) + +## EventStorePayload.svrAnon property + +If the request should undergo server anonymization. + +Signature: + +```typescript +svrAnon?: boolean; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.filterprovider.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.filterprovider.md new file mode 100644 index 000000000..a58d155e1 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.filterprovider.md @@ -0,0 +1,16 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [FilterProvider](./react-native-tracker.filterprovider.md) + +## FilterProvider type + +A filter provider is a tuple that has two parts: a context filter and the context primitive(s) If the context filter evaluates to true, the tracker will attach the context primitive(s) + +Signature: + +```typescript +type FilterProvider = [ + ContextFilter, + Array | ContextPrimitive +]; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.formfocusorchangeevent.elementclasses.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.formfocusorchangeevent.elementclasses.md new file mode 100644 index 000000000..f5fcd4679 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.formfocusorchangeevent.elementclasses.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [FormFocusOrChangeEvent](./react-native-tracker.formfocusorchangeevent.md) > [elementClasses](./react-native-tracker.formfocusorchangeevent.elementclasses.md) + +## FormFocusOrChangeEvent.elementClasses property + +The class names on the element + +Signature: + +```typescript +elementClasses?: Array | null; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.formfocusorchangeevent.elementid.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.formfocusorchangeevent.elementid.md new file mode 100644 index 000000000..b0432e03b --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.formfocusorchangeevent.elementid.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [FormFocusOrChangeEvent](./react-native-tracker.formfocusorchangeevent.md) > [elementId](./react-native-tracker.formfocusorchangeevent.elementid.md) + +## FormFocusOrChangeEvent.elementId property + +The element ID which the user is interacting with + +Signature: + +```typescript +elementId: string; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.formfocusorchangeevent.formid.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.formfocusorchangeevent.formid.md new file mode 100644 index 000000000..2d90c18ee --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.formfocusorchangeevent.formid.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [FormFocusOrChangeEvent](./react-native-tracker.formfocusorchangeevent.md) > [formId](./react-native-tracker.formfocusorchangeevent.formid.md) + +## FormFocusOrChangeEvent.formId property + +The ID of the form which the element belongs to + +Signature: + +```typescript +formId: string; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.formfocusorchangeevent.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.formfocusorchangeevent.md new file mode 100644 index 000000000..534758912 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.formfocusorchangeevent.md @@ -0,0 +1,26 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [FormFocusOrChangeEvent](./react-native-tracker.formfocusorchangeevent.md) + +## FormFocusOrChangeEvent interface + +Represents either a Form Focus or Form Change event When a user focuses on a form element or when a user makes a change to a form element. + +Signature: + +```typescript +interface FormFocusOrChangeEvent +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [elementClasses?](./react-native-tracker.formfocusorchangeevent.elementclasses.md) | Array<string> \| null | (Optional) The class names on the element | +| [elementId](./react-native-tracker.formfocusorchangeevent.elementid.md) | string | The element ID which the user is interacting with | +| [formId](./react-native-tracker.formfocusorchangeevent.formid.md) | string | The ID of the form which the element belongs to | +| [nodeName](./react-native-tracker.formfocusorchangeevent.nodename.md) | string | The name of the node ("INPUT", "TEXTAREA", "SELECT") | +| [schema](./react-native-tracker.formfocusorchangeevent.schema.md) | "change\_form" \| "focus\_form" | The schema which will be used for the event | +| [type?](./react-native-tracker.formfocusorchangeevent.type.md) | string \| null | (Optional) The type of element (e.g. "datetime", "text", "radio", etc.) | +| [value](./react-native-tracker.formfocusorchangeevent.value.md) | string \| null | The value of the element at the time of the event firing | + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.formfocusorchangeevent.nodename.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.formfocusorchangeevent.nodename.md new file mode 100644 index 000000000..ee9f369ae --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.formfocusorchangeevent.nodename.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [FormFocusOrChangeEvent](./react-native-tracker.formfocusorchangeevent.md) > [nodeName](./react-native-tracker.formfocusorchangeevent.nodename.md) + +## FormFocusOrChangeEvent.nodeName property + +The name of the node ("INPUT", "TEXTAREA", "SELECT") + +Signature: + +```typescript +nodeName: string; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.formfocusorchangeevent.schema.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.formfocusorchangeevent.schema.md new file mode 100644 index 000000000..474e39187 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.formfocusorchangeevent.schema.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [FormFocusOrChangeEvent](./react-native-tracker.formfocusorchangeevent.md) > [schema](./react-native-tracker.formfocusorchangeevent.schema.md) + +## FormFocusOrChangeEvent.schema property + +The schema which will be used for the event + +Signature: + +```typescript +schema: "change_form" | "focus_form"; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.formfocusorchangeevent.type.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.formfocusorchangeevent.type.md new file mode 100644 index 000000000..da56b8396 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.formfocusorchangeevent.type.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [FormFocusOrChangeEvent](./react-native-tracker.formfocusorchangeevent.md) > [type](./react-native-tracker.formfocusorchangeevent.type.md) + +## FormFocusOrChangeEvent.type property + +The type of element (e.g. "datetime", "text", "radio", etc.) + +Signature: + +```typescript +type?: string | null; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.formfocusorchangeevent.value.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.formfocusorchangeevent.value.md new file mode 100644 index 000000000..9af73bad8 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.formfocusorchangeevent.value.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [FormFocusOrChangeEvent](./react-native-tracker.formfocusorchangeevent.md) > [value](./react-native-tracker.formfocusorchangeevent.value.md) + +## FormFocusOrChangeEvent.value property + +The value of the element at the time of the event firing + +Signature: + +```typescript +value: string | null; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.getalltrackers.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.getalltrackers.md new file mode 100644 index 000000000..2d148726e --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.getalltrackers.md @@ -0,0 +1,19 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [getAllTrackers](./react-native-tracker.getalltrackers.md) + +## getAllTrackers() function + +Retrieves all initialized trackers + +Signature: + +```typescript +export declare function getAllTrackers(): ReactNativeTracker[]; +``` +Returns: + +[ReactNativeTracker](./react-native-tracker.reactnativetracker.md)\[\] + +All initialized trackers + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.gettracker.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.gettracker.md new file mode 100644 index 000000000..7a3376ae2 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.gettracker.md @@ -0,0 +1,26 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [getTracker](./react-native-tracker.gettracker.md) + +## getTracker() function + +Retrieves an initialized tracker given its namespace + +Signature: + +```typescript +export declare function getTracker(trackerNamespace: string): ReactNativeTracker | undefined; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| trackerNamespace | string | Tracker namespace | + +Returns: + +[ReactNativeTracker](./react-native-tracker.reactnativetracker.md) \| undefined + +Tracker instance if exists + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.getwebviewcallback.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.getwebviewcallback.md new file mode 100644 index 000000000..cf17e1b19 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.getwebviewcallback.md @@ -0,0 +1,21 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [getWebViewCallback](./react-native-tracker.getwebviewcallback.md) + +## getWebViewCallback() function + +Enables tracking events from apps rendered in react-native-webview components. The apps need to use the Snowplow WebView tracker to track the events. + +To subscribe for the events, use as the `onMessage` prop for a `WebView` component. + +Signature: + +```typescript +export declare function getWebViewCallback(): WebViewMessageHandler; +``` +Returns: + +[WebViewMessageHandler](./react-native-tracker.webviewmessagehandler.md) + +Callback to subscribe for events from Web views tracked using the Snowplow WebView tracker. + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.jsonprocessor.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.jsonprocessor.md new file mode 100644 index 000000000..35d77f46d --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.jsonprocessor.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [JsonProcessor](./react-native-tracker.jsonprocessor.md) + +## JsonProcessor type + +A function which will processor the Json onto the injected PayloadBuilder + +Signature: + +```typescript +type JsonProcessor = (payloadBuilder: PayloadBuilder, jsonForProcessing: EventJson, contextEntitiesForProcessing: SelfDescribingJson[]) => void; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.listitemviewprops.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.listitemviewprops.md new file mode 100644 index 000000000..70e90a10f --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.listitemviewprops.md @@ -0,0 +1,18 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [ListItemViewProps](./react-native-tracker.listitemviewprops.md) + +## ListItemViewProps type + +Event tracking the view of an item in a list. If screen engagement tracking is enabled, the list item view events will be aggregated into a `screen_summary` entity. + +Schema: `iglu:com.snowplowanalytics.mobile/list_item_view/jsonschema/1-0-0` + +Signature: + +```typescript +export declare type ListItemViewProps = { + index: number; + itemsCount?: number; +}; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.log_level.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.log_level.md new file mode 100644 index 000000000..820f56307 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.log_level.md @@ -0,0 +1,22 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [LOG\_LEVEL](./react-native-tracker.log_level.md) + +## LOG\_LEVEL enum + +Signature: + +```typescript +declare enum LOG_LEVEL +``` + +## Enumeration Members + +| Member | Value | Description | +| --- | --- | --- | +| debug | 3 | | +| error | 1 | | +| info | 4 | | +| none | 0 | | +| warn | 2 | | + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.logger.debug.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.logger.debug.md new file mode 100644 index 000000000..a5470c124 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.logger.debug.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [Logger](./react-native-tracker.logger.md) > [debug](./react-native-tracker.logger.debug.md) + +## Logger.debug property + +Signature: + +```typescript +debug: (message: string, ...extraParams: unknown[]) => void; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.logger.error.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.logger.error.md new file mode 100644 index 000000000..b13733fc3 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.logger.error.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [Logger](./react-native-tracker.logger.md) > [error](./react-native-tracker.logger.error.md) + +## Logger.error property + +Signature: + +```typescript +error: (message: string, error?: unknown, ...extraParams: unknown[]) => void; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.logger.info.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.logger.info.md new file mode 100644 index 000000000..27b3239e6 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.logger.info.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [Logger](./react-native-tracker.logger.md) > [info](./react-native-tracker.logger.info.md) + +## Logger.info property + +Signature: + +```typescript +info: (message: string, ...extraParams: unknown[]) => void; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.logger.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.logger.md new file mode 100644 index 000000000..edbfd7edd --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.logger.md @@ -0,0 +1,22 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [Logger](./react-native-tracker.logger.md) + +## Logger interface + +Signature: + +```typescript +interface Logger +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [debug](./react-native-tracker.logger.debug.md) | (message: string, ...extraParams: unknown\[\]) => void | | +| [error](./react-native-tracker.logger.error.md) | (message: string, error?: unknown, ...extraParams: unknown\[\]) => void | | +| [info](./react-native-tracker.logger.info.md) | (message: string, ...extraParams: unknown\[\]) => void | | +| [setLogLevel](./react-native-tracker.logger.setloglevel.md) | (level: LOG\_LEVEL) => void | | +| [warn](./react-native-tracker.logger.warn.md) | (message: string, error?: unknown, ...extraParams: unknown\[\]) => void | | + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.logger.setloglevel.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.logger.setloglevel.md new file mode 100644 index 000000000..700d5b330 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.logger.setloglevel.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [Logger](./react-native-tracker.logger.md) > [setLogLevel](./react-native-tracker.logger.setloglevel.md) + +## Logger.setLogLevel property + +Signature: + +```typescript +setLogLevel: (level: LOG_LEVEL) => void; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.logger.warn.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.logger.warn.md new file mode 100644 index 000000000..07bd67498 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.logger.warn.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [Logger](./react-native-tracker.logger.md) > [warn](./react-native-tracker.logger.warn.md) + +## Logger.warn property + +Signature: + +```typescript +warn: (message: string, error?: unknown, ...extraParams: unknown[]) => void; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.md new file mode 100644 index 000000000..22ecb8b29 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.md @@ -0,0 +1,95 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) + +## react-native-tracker package + +## Enumerations + +| Enumeration | Description | +| --- | --- | +| [LOG\_LEVEL](./react-native-tracker.log_level.md) | | +| [PlatformContextProperty](./react-native-tracker.platformcontextproperty.md) | | + +## Functions + +| Function | Description | +| --- | --- | +| [getAllTrackers()](./react-native-tracker.getalltrackers.md) | Retrieves all initialized trackers | +| [getTracker(trackerNamespace)](./react-native-tracker.gettracker.md) | Retrieves an initialized tracker given its namespace | +| [getWebViewCallback()](./react-native-tracker.getwebviewcallback.md) | Enables tracking events from apps rendered in react-native-webview components. The apps need to use the Snowplow WebView tracker to track the events.To subscribe for the events, use as the onMessage prop for a WebView component. | +| [newTracker(configuration)](./react-native-tracker.newtracker.md) | Creates a new tracker instance with the given configuration | +| [removeAllTrackers()](./react-native-tracker.removealltrackers.md) | Removes all initialized trackers | +| [removeTracker(trackerNamespace)](./react-native-tracker.removetracker.md) | Removes a tracker given its namespace | + +## Interfaces + +| Interface | Description | +| --- | --- | +| [AppLifecycleConfiguration](./react-native-tracker.applifecycleconfiguration.md) | Configuration for app lifecycle tracking | +| [AsyncStorage](./react-native-tracker.asyncstorage.md) | | +| [CoreConfiguration](./react-native-tracker.coreconfiguration.md) | The configuration object for the tracker core library | +| [CorePlugin](./react-native-tracker.coreplugin.md) | Interface which defines Core Plugins | +| [CorePluginConfiguration](./react-native-tracker.corepluginconfiguration.md) | The configuration of the plugin to add | +| [DeepLinkConfiguration](./react-native-tracker.deeplinkconfiguration.md) | Configuration for deep link tracking | +| [DeviceTimestamp](./react-native-tracker.devicetimestamp.md) | A representation of a Device Timestamp (dtm) | +| [Emitter](./react-native-tracker.emitter.md) | Emitter is responsible for sending events to the collector. It manages the event queue and sends events in batches depending on configuration. | +| [EmitterConfiguration](./react-native-tracker.emitterconfiguration.md) | | +| [EmitterConfigurationBase](./react-native-tracker.emitterconfigurationbase.md) | | +| [EventPayloadAndContext](./react-native-tracker.eventpayloadandcontext.md) | Interface for returning a built event (PayloadBuilder) and context (Array of SelfDescribingJson). | +| [EventStoreConfiguration](./react-native-tracker.eventstoreconfiguration.md) | Configuration for the event store | +| [EventStoreIterator](./react-native-tracker.eventstoreiterator.md) | EventStoreIterator allows iterating over all events in the store. | +| [EventStorePayload](./react-native-tracker.eventstorepayload.md) | | +| [FormFocusOrChangeEvent](./react-native-tracker.formfocusorchangeevent.md) | Represents either a Form Focus or Form Change event When a user focuses on a form element or when a user makes a change to a form element. | +| [Logger](./react-native-tracker.logger.md) | | +| [PageViewEvent](./react-native-tracker.pageviewevent.md) | A Page View Event Represents a Page View, which is typically fired as soon as possible when a web page is loaded within the users browser. Often also fired on "virtual page views" within Single Page Applications (SPA). | +| [PayloadBuilder](./react-native-tracker.payloadbuilder.md) | Interface for mutable object encapsulating tracker payload | +| [PlatformContextConfiguration](./react-native-tracker.platformcontextconfiguration.md) | | +| [PlatformContextRetriever](./react-native-tracker.platformcontextretriever.md) | Overrides for the values for properties of the platform context. | +| [RuleSet](./react-native-tracker.ruleset.md) | A ruleset has accept or reject properties that contain rules for matching Iglu schema URIs | +| [SessionConfiguration](./react-native-tracker.sessionconfiguration.md) | Configuration for session tracking | +| [SessionState](./react-native-tracker.sessionstate.md) | Current session state that is tracked in events. | +| [SubjectConfiguration](./react-native-tracker.subjectconfiguration.md) | Configuration of subject properties tracked with events | +| [TrackerConfiguration](./react-native-tracker.trackerconfiguration.md) | The configuration object for initialising the tracker | +| [TrackerCore](./react-native-tracker.trackercore.md) | Export interface containing all Core functions | +| [TrueTimestamp](./react-native-tracker.truetimestamp.md) | A representation of a True Timestamp (ttm) | + +## Variables + +| Variable | Description | +| --- | --- | +| [version](./react-native-tracker.version.md) | | + +## Type Aliases + +| Type Alias | Description | +| --- | --- | +| [ConditionalContextProvider](./react-native-tracker.conditionalcontextprovider.md) | Conditional context providers are two element arrays used to decide when to attach contexts, where: - the first element is some conditional criterion - the second element is any number of context primitives | +| [ContextFilter](./react-native-tracker.contextfilter.md) | A context filter is a user-supplied callback that is evaluated for each event to determine if the context associated with the filter should be attached to the event | +| [ContextGenerator](./react-native-tracker.contextgenerator.md) | A context generator is a user-supplied callback that is evaluated for each event to allow an additional context to be dynamically attached to the event | +| [ContextPrimitive](./react-native-tracker.contextprimitive.md) | A context primitive is either a self-describing JSON or a context generator | +| [DeepLinkReceivedProps](./react-native-tracker.deeplinkreceivedprops.md) | DeepLinkReceived event properties schema: iglu:com.snowplowanalytics.mobile/deep\_link\_received/jsonschema/1-0-0 | +| [EventBatch](./react-native-tracker.eventbatch.md) | A collection of event payloads which are sent to the collector. | +| [EventContext](./react-native-tracker.eventcontext.md) | EventContext type | +| [EventJson](./react-native-tracker.eventjson.md) | An array of tuples which represents the unprocessed JSON to be added to the Payload | +| [EventJsonWithKeys](./react-native-tracker.eventjsonwithkeys.md) | A tuple which represents the unprocessed JSON to be added to the Payload | +| [EventMethod](./react-native-tracker.eventmethod.md) | | +| [FilterProvider](./react-native-tracker.filterprovider.md) | A filter provider is a tuple that has two parts: a context filter and the context primitive(s) If the context filter evaluates to true, the tracker will attach the context primitive(s) | +| [JsonProcessor](./react-native-tracker.jsonprocessor.md) | A function which will processor the Json onto the injected PayloadBuilder | +| [ListItemViewProps](./react-native-tracker.listitemviewprops.md) | Event tracking the view of an item in a list. If screen engagement tracking is enabled, the list item view events will be aggregated into a screen_summary entity.Schema: iglu:com.snowplowanalytics.mobile/list_item_view/jsonschema/1-0-0 | +| [MessageNotificationAttachmentProps](./react-native-tracker.messagenotificationattachmentprops.md) | Attachment object that identify an attachment in the MessageNotification. | +| [MessageNotificationProps](./react-native-tracker.messagenotificationprops.md) | MessageNotification event properties schema: iglu:com.snowplowanalytics.mobile/message\_notification/jsonschema/1-0-0 | +| [Payload](./react-native-tracker.payload.md) | Type for a Payload dictionary | +| [ReactNativeTracker](./react-native-tracker.reactnativetracker.md) | The ReactNativeTracker type | +| [RequestFailure](./react-native-tracker.requestfailure.md) | The data that will be available to the onRequestFailure callback | +| [RuleSetProvider](./react-native-tracker.rulesetprovider.md) | A ruleset provider is aa tuple that has two parts: a ruleset and the context primitive(s) If the ruleset allows the current event schema URI, the tracker will attach the context primitive(s) | +| [ScreenSize](./react-native-tracker.screensize.md) | Screen size in pixels | +| [ScreenViewProps](./react-native-tracker.screenviewprops.md) | ScreenView event properties schema: iglu:com.snowplowanalytics.mobile/screen\_view/jsonschema/1-0-0 | +| [ScrollChangedProps](./react-native-tracker.scrollchangedprops.md) | Event tracked when a scroll view's scroll position changes. If screen engagement tracking is enabled, the scroll changed events will be aggregated into a screen_summary entity.Schema: iglu:com.snowplowanalytics.mobile/scroll_changed/jsonschema/1-0-0 | +| [SelfDescribing](./react-native-tracker.selfdescribing.md) | Interface for any self-describing JSON such as context entities or self-describing events | +| [StructuredProps](./react-native-tracker.structuredprops.md) | Properties for a structured event. A classic style of event tracking, allows for easier movement between analytics systems. Self-describing events are preferred for their schema validation. | +| [Timestamp](./react-native-tracker.timestamp.md) | Algebraic datatype representing possible timestamp type choice | +| [TimingProps](./react-native-tracker.timingprops.md) | Timing event properties | +| [Trigger](./react-native-tracker.trigger.md) | Trigger for MessageNotification event | +| [WebViewMessageHandler](./react-native-tracker.webviewmessagehandler.md) | A callback to be used for the onMessage prop of a WebView component. | + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.messagenotificationattachmentprops.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.messagenotificationattachmentprops.md new file mode 100644 index 000000000..fe7d17288 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.messagenotificationattachmentprops.md @@ -0,0 +1,17 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [MessageNotificationAttachmentProps](./react-native-tracker.messagenotificationattachmentprops.md) + +## MessageNotificationAttachmentProps type + +Attachment object that identify an attachment in the MessageNotification. + +Signature: + +```typescript +export declare type MessageNotificationAttachmentProps = { + identifier: string; + type: string; + url: string; +}; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.messagenotificationprops.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.messagenotificationprops.md new file mode 100644 index 000000000..392fe4a38 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.messagenotificationprops.md @@ -0,0 +1,35 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [MessageNotificationProps](./react-native-tracker.messagenotificationprops.md) + +## MessageNotificationProps type + +MessageNotification event properties schema: iglu:com.snowplowanalytics.mobile/message\_notification/jsonschema/1-0-0 + +Signature: + +```typescript +export declare type MessageNotificationProps = { + action?: string; + attachments?: MessageNotificationAttachmentProps[]; + body: string; + bodyLocArgs?: string[]; + bodyLocKey?: string; + category?: string; + contentAvailable?: boolean; + group?: string; + icon?: string; + notificationCount?: number; + notificationTimestamp?: string; + sound?: string; + subtitle?: string; + tag?: string; + threadIdentifier?: string; + title: string; + titleLocArgs?: string[]; + titleLocKey?: string; + trigger: Trigger; +}; +``` +References: [MessageNotificationAttachmentProps](./react-native-tracker.messagenotificationattachmentprops.md), [Trigger](./react-native-tracker.trigger.md) + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.newtracker.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.newtracker.md new file mode 100644 index 000000000..8859e9070 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.newtracker.md @@ -0,0 +1,26 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [newTracker](./react-native-tracker.newtracker.md) + +## newTracker() function + +Creates a new tracker instance with the given configuration + +Signature: + +```typescript +export declare function newTracker(configuration: Configuration): Promise; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| configuration | Configuration | Configuration for the tracker | + +Returns: + +Promise<[ReactNativeTracker](./react-native-tracker.reactnativetracker.md)> + +Tracker instance + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.pageviewevent.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.pageviewevent.md new file mode 100644 index 000000000..87f820cf5 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.pageviewevent.md @@ -0,0 +1,22 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PageViewEvent](./react-native-tracker.pageviewevent.md) + +## PageViewEvent interface + +A Page View Event Represents a Page View, which is typically fired as soon as possible when a web page is loaded within the users browser. Often also fired on "virtual page views" within Single Page Applications (SPA). + +Signature: + +```typescript +interface PageViewEvent +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [pageTitle?](./react-native-tracker.pageviewevent.pagetitle.md) | string \| null | (Optional) The current page title in the users browser | +| [pageUrl?](./react-native-tracker.pageviewevent.pageurl.md) | string \| null | (Optional) The current URL visible in the users browser | +| [referrer?](./react-native-tracker.pageviewevent.referrer.md) | string \| null | (Optional) The URL of the referring page | + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.pageviewevent.pagetitle.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.pageviewevent.pagetitle.md new file mode 100644 index 000000000..b7bf7a9e9 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.pageviewevent.pagetitle.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PageViewEvent](./react-native-tracker.pageviewevent.md) > [pageTitle](./react-native-tracker.pageviewevent.pagetitle.md) + +## PageViewEvent.pageTitle property + +The current page title in the users browser + +Signature: + +```typescript +pageTitle?: string | null; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.pageviewevent.pageurl.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.pageviewevent.pageurl.md new file mode 100644 index 000000000..048e84af6 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.pageviewevent.pageurl.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PageViewEvent](./react-native-tracker.pageviewevent.md) > [pageUrl](./react-native-tracker.pageviewevent.pageurl.md) + +## PageViewEvent.pageUrl property + +The current URL visible in the users browser + +Signature: + +```typescript +pageUrl?: string | null; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.pageviewevent.referrer.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.pageviewevent.referrer.md new file mode 100644 index 000000000..9796c0cd6 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.pageviewevent.referrer.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PageViewEvent](./react-native-tracker.pageviewevent.md) > [referrer](./react-native-tracker.pageviewevent.referrer.md) + +## PageViewEvent.referrer property + +The URL of the referring page + +Signature: + +```typescript +referrer?: string | null; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.payload.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.payload.md new file mode 100644 index 000000000..37d76b5ad --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.payload.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [Payload](./react-native-tracker.payload.md) + +## Payload type + +Type for a Payload dictionary + +Signature: + +```typescript +type Payload = Record; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.payloadbuilder.add.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.payloadbuilder.add.md new file mode 100644 index 000000000..74190086a --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.payloadbuilder.add.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PayloadBuilder](./react-native-tracker.payloadbuilder.md) > [add](./react-native-tracker.payloadbuilder.add.md) + +## PayloadBuilder.add property + +Adds an entry to the Payload + +Signature: + +```typescript +add: (key: string, value: unknown) => void; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.payloadbuilder.addcontextentity.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.payloadbuilder.addcontextentity.md new file mode 100644 index 000000000..4b6346ea6 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.payloadbuilder.addcontextentity.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PayloadBuilder](./react-native-tracker.payloadbuilder.md) > [addContextEntity](./react-native-tracker.payloadbuilder.addcontextentity.md) + +## PayloadBuilder.addContextEntity property + +Caches a context entity to be added to payload on build + +Signature: + +```typescript +addContextEntity: (entity: SelfDescribingJson) => void; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.payloadbuilder.adddict.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.payloadbuilder.adddict.md new file mode 100644 index 000000000..720e5fbea --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.payloadbuilder.adddict.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PayloadBuilder](./react-native-tracker.payloadbuilder.md) > [addDict](./react-native-tracker.payloadbuilder.adddict.md) + +## PayloadBuilder.addDict property + +Merges a payload into the existing payload + +Signature: + +```typescript +addDict: (dict: Payload) => void; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.payloadbuilder.addjson.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.payloadbuilder.addjson.md new file mode 100644 index 000000000..fb29f5c20 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.payloadbuilder.addjson.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PayloadBuilder](./react-native-tracker.payloadbuilder.md) > [addJson](./react-native-tracker.payloadbuilder.addjson.md) + +## PayloadBuilder.addJson property + +Caches a JSON object to be added to payload on build + +Signature: + +```typescript +addJson: (keyIfEncoded: string, keyIfNotEncoded: string, json: Record) => void; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.payloadbuilder.build.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.payloadbuilder.build.md new file mode 100644 index 000000000..473ffa6d9 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.payloadbuilder.build.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PayloadBuilder](./react-native-tracker.payloadbuilder.md) > [build](./react-native-tracker.payloadbuilder.build.md) + +## PayloadBuilder.build property + +Builds and returns the Payload + +Signature: + +```typescript +build: () => Payload; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.payloadbuilder.getjson.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.payloadbuilder.getjson.md new file mode 100644 index 000000000..0007e17f7 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.payloadbuilder.getjson.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PayloadBuilder](./react-native-tracker.payloadbuilder.md) > [getJson](./react-native-tracker.payloadbuilder.getjson.md) + +## PayloadBuilder.getJson property + +Gets all JSON objects added to payload + +Signature: + +```typescript +getJson: () => EventJson; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.payloadbuilder.getpayload.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.payloadbuilder.getpayload.md new file mode 100644 index 000000000..f76229127 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.payloadbuilder.getpayload.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PayloadBuilder](./react-native-tracker.payloadbuilder.md) > [getPayload](./react-native-tracker.payloadbuilder.getpayload.md) + +## PayloadBuilder.getPayload property + +Gets the current payload, before cached JSON is processed + +Signature: + +```typescript +getPayload: () => Payload; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.payloadbuilder.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.payloadbuilder.md new file mode 100644 index 000000000..656667e94 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.payloadbuilder.md @@ -0,0 +1,27 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PayloadBuilder](./react-native-tracker.payloadbuilder.md) + +## PayloadBuilder interface + +Interface for mutable object encapsulating tracker payload + +Signature: + +```typescript +interface PayloadBuilder +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [add](./react-native-tracker.payloadbuilder.add.md) | (key: string, value: unknown) => void | Adds an entry to the Payload | +| [addContextEntity](./react-native-tracker.payloadbuilder.addcontextentity.md) | (entity: SelfDescribingJson) => void | Caches a context entity to be added to payload on build | +| [addDict](./react-native-tracker.payloadbuilder.adddict.md) | (dict: Payload) => void | Merges a payload into the existing payload | +| [addJson](./react-native-tracker.payloadbuilder.addjson.md) | (keyIfEncoded: string, keyIfNotEncoded: string, json: Record<string, unknown>) => void | Caches a JSON object to be added to payload on build | +| [build](./react-native-tracker.payloadbuilder.build.md) | () => Payload | Builds and returns the Payload | +| [getJson](./react-native-tracker.payloadbuilder.getjson.md) | () => EventJson | Gets all JSON objects added to payload | +| [getPayload](./react-native-tracker.payloadbuilder.getpayload.md) | () => Payload | Gets the current payload, before cached JSON is processed | +| [withJsonProcessor](./react-native-tracker.payloadbuilder.withjsonprocessor.md) | (jsonProcessor: JsonProcessor) => void | Adds a function which will be executed when building the payload to process the JSON which has been added to this payload | + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.payloadbuilder.withjsonprocessor.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.payloadbuilder.withjsonprocessor.md new file mode 100644 index 000000000..247963bea --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.payloadbuilder.withjsonprocessor.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PayloadBuilder](./react-native-tracker.payloadbuilder.md) > [withJsonProcessor](./react-native-tracker.payloadbuilder.withjsonprocessor.md) + +## PayloadBuilder.withJsonProcessor property + +Adds a function which will be executed when building the payload to process the JSON which has been added to this payload + +Signature: + +```typescript +withJsonProcessor: (jsonProcessor: JsonProcessor) => void; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextconfiguration.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextconfiguration.md new file mode 100644 index 000000000..dbcbbbe9e --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextconfiguration.md @@ -0,0 +1,20 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PlatformContextConfiguration](./react-native-tracker.platformcontextconfiguration.md) + +## PlatformContextConfiguration interface + +Signature: + +```typescript +export interface PlatformContextConfiguration +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [platformContext?](./react-native-tracker.platformcontextconfiguration.platformcontext.md) | boolean | (Optional) Whether to track the mobile context with information about the device. Note: Only some properties (osType, osVersion, deviceManufacturer, deviceModel, resolution, language, scale) will be tracked by default. Other properties can be assigned using the PlatformContextRetriever. | +| [platformContextProperties?](./react-native-tracker.platformcontextconfiguration.platformcontextproperties.md) | [PlatformContextProperty](./react-native-tracker.platformcontextproperty.md)\[\] | (Optional) List of properties of the platform context to track. If not passed and platformContext is enabled, all available properties will be tracked. The required osType, osVersion, deviceManufacturer, and deviceModel properties will be tracked in the entity regardless of this setting. | +| [platformContextRetriever?](./react-native-tracker.platformcontextconfiguration.platformcontextretriever.md) | [PlatformContextRetriever](./react-native-tracker.platformcontextretriever.md) | (Optional) Set of callbacks to be used to retrieve properties of the platform context. Overrides the tracker implementation for setting the properties. | + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextconfiguration.platformcontext.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextconfiguration.platformcontext.md new file mode 100644 index 000000000..1bd9ded23 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextconfiguration.platformcontext.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PlatformContextConfiguration](./react-native-tracker.platformcontextconfiguration.md) > [platformContext](./react-native-tracker.platformcontextconfiguration.platformcontext.md) + +## PlatformContextConfiguration.platformContext property + +Whether to track the mobile context with information about the device. Note: Only some properties (osType, osVersion, deviceManufacturer, deviceModel, resolution, language, scale) will be tracked by default. Other properties can be assigned using the PlatformContextRetriever. + +Signature: + +```typescript +platformContext?: boolean; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextconfiguration.platformcontextproperties.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextconfiguration.platformcontextproperties.md new file mode 100644 index 000000000..c8b5a4c0a --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextconfiguration.platformcontextproperties.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PlatformContextConfiguration](./react-native-tracker.platformcontextconfiguration.md) > [platformContextProperties](./react-native-tracker.platformcontextconfiguration.platformcontextproperties.md) + +## PlatformContextConfiguration.platformContextProperties property + +List of properties of the platform context to track. If not passed and `platformContext` is enabled, all available properties will be tracked. The required `osType`, `osVersion`, `deviceManufacturer`, and `deviceModel` properties will be tracked in the entity regardless of this setting. + +Signature: + +```typescript +platformContextProperties?: PlatformContextProperty[]; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextconfiguration.platformcontextretriever.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextconfiguration.platformcontextretriever.md new file mode 100644 index 000000000..5200d1c37 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextconfiguration.platformcontextretriever.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PlatformContextConfiguration](./react-native-tracker.platformcontextconfiguration.md) > [platformContextRetriever](./react-native-tracker.platformcontextconfiguration.platformcontextretriever.md) + +## PlatformContextConfiguration.platformContextRetriever property + +Set of callbacks to be used to retrieve properties of the platform context. Overrides the tracker implementation for setting the properties. + +Signature: + +```typescript +platformContextRetriever?: PlatformContextRetriever; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextproperty.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextproperty.md new file mode 100644 index 000000000..ecab1bfd9 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextproperty.md @@ -0,0 +1,37 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PlatformContextProperty](./react-native-tracker.platformcontextproperty.md) + +## PlatformContextProperty enum + +Signature: + +```typescript +export declare enum PlatformContextProperty +``` + +## Enumeration Members + +| Member | Value | Description | +| --- | --- | --- | +| AndroidIdfa | "androidIdfa" | Advertising identifier on Android. Note: This is not automatically assigned by the tracker as it may be considered as fingerprinting. You can assign it using the PlatformContextRetriever. | +| AppAvailableMemory | "appAvailableMemory" | Amount of memory in bytes available to the current app. The property is not tracked in the current version of the tracker due to the tracker not being able to access the API, see the issue here: https://github.com/snowplow/snowplow-ios-tracker/issues/772 Note: this property is not automatically assigned but can be assigned using the PlatformContextRetriever. | +| AppleIdfa | "appleIdfa" | Advertising identifier on iOS. Note: this property is not automatically assigned but can be assigned using the PlatformContextRetriever. | +| AppleIdfv | "appleIdfv" | UUID identifier for vendors on iOS. Note: this property is not automatically assigned but can be assigned using the PlatformContextRetriever. | +| AppSetId | "appSetId" | Android vendor ID scoped to the set of apps published under the same Google Play developer account (see https://developer.android.com/training/articles/app-set-id). Note: This is not automatically assigned by the tracker as it may be considered as fingerprinting. You can assign it using the PlatformContextRetriever. | +| AppSetIdScope | "appSetIdScope" | Scope of the appSetId. Can be scoped to the app or to a developer account on an app store (all apps from the same developer on the same device will have the same ID). Note: This is not automatically assigned by the tracker as it may be considered as fingerprinting. You can assign it using the PlatformContextRetriever. | +| AvailableStorage | "availableStorage" | Bytes of storage remaining. Note: This is not automatically assigned by the tracker as it may be considered as fingerprinting. You can assign it using the PlatformContextRetriever. | +| BatteryLevel | "batteryLevel" | Remaining battery level as an integer percentage of total battery capacity. Note: this property is not automatically assigned but can be assigned using the PlatformContextRetriever. | +| BatteryState | "batteryState" | Battery state for the device. Note: this property is not automatically assigned but can be assigned using the PlatformContextRetriever. | +| Carrier | "carrier" | The carrier of the SIM inserted in the device. Note: this property is not automatically assigned but can be assigned using the PlatformContextRetriever. | +| IsPortrait | "isPortrait" | A Boolean indicating whether the device orientation is portrait (either upright or upside down). Note: This is not automatically assigned by the tracker as it may be considered as fingerprinting. You can assign it using the PlatformContextRetriever. | +| Language | "language" | System language currently used on the device (ISO 639). | +| LowPowerMode | "lowPowerMode" | A Boolean indicating whether Low Power Mode is enabled. | +| NetworkTechnology | "networkTechnology" | Radio access technology that the device is using. Note: this property is not automatically assigned but can be assigned using the PlatformContextRetriever. | +| NetworkType | "networkType" | Type of network the device is connected to. Note: this property is not automatically assigned but can be assigned using the PlatformContextRetriever. | +| PhysicalMemory | "physicalMemory" | Total physical system memory in bytes. Note: this property is not automatically assigned but can be assigned using the PlatformContextRetriever. | +| Resolution | "resolution" | Screen resolution in pixels. Arrives in the form of WIDTHxHEIGHT (e.g., 1200x900). Doesn't change when device orientation changes. Note: This is not automatically assigned by the tracker as it may be considered as fingerprinting. You can assign it using the PlatformContextRetriever. | +| Scale | "scale" | Scale factor used to convert logical coordinates to device coordinates of the screen (uses UIScreen.scale on iOS). | +| SystemAvailableMemory | "systemAvailableMemory" | Available memory on the system in bytes (Android only). Note: This is not automatically assigned by the tracker as it may be considered as fingerprinting. You can assign it using the PlatformContextRetriever. | +| TotalStorage | "totalStorage" | Total size of storage in bytes. Note: This is not automatically assigned by the tracker as it may be considered as fingerprinting. You can assign it using the PlatformContextRetriever. | + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getandroididfa.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getandroididfa.md new file mode 100644 index 000000000..ddb929aba --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getandroididfa.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PlatformContextRetriever](./react-native-tracker.platformcontextretriever.md) > [getAndroidIdfa](./react-native-tracker.platformcontextretriever.getandroididfa.md) + +## PlatformContextRetriever.getAndroidIdfa property + +Advertising identifier on Android. + +Signature: + +```typescript +getAndroidIdfa?: () => Promise; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getappavailablememory.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getappavailablememory.md new file mode 100644 index 000000000..b3d16dd2c --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getappavailablememory.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PlatformContextRetriever](./react-native-tracker.platformcontextretriever.md) > [getAppAvailableMemory](./react-native-tracker.platformcontextretriever.getappavailablememory.md) + +## PlatformContextRetriever.getAppAvailableMemory property + +Amount of memory in bytes available to the current app + +Signature: + +```typescript +getAppAvailableMemory?: () => Promise; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getappleidfa.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getappleidfa.md new file mode 100644 index 000000000..d7df9689b --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getappleidfa.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PlatformContextRetriever](./react-native-tracker.platformcontextretriever.md) > [getAppleIdfa](./react-native-tracker.platformcontextretriever.getappleidfa.md) + +## PlatformContextRetriever.getAppleIdfa property + +Advertising identifier on iOS (UUID formatted string) + +Signature: + +```typescript +getAppleIdfa?: () => Promise; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getappleidfv.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getappleidfv.md new file mode 100644 index 000000000..708c2fab8 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getappleidfv.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PlatformContextRetriever](./react-native-tracker.platformcontextretriever.md) > [getAppleIdfv](./react-native-tracker.platformcontextretriever.getappleidfv.md) + +## PlatformContextRetriever.getAppleIdfv property + +UUID identifier for vendors on iOS + +Signature: + +```typescript +getAppleIdfv?: () => Promise; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getappsetid.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getappsetid.md new file mode 100644 index 000000000..26883e060 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getappsetid.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PlatformContextRetriever](./react-native-tracker.platformcontextretriever.md) > [getAppSetId](./react-native-tracker.platformcontextretriever.getappsetid.md) + +## PlatformContextRetriever.getAppSetId property + +Android vendor ID scoped to the set of apps published under the same Google Play developer account (see https://developer.android.com/training/articles/app-set-id). + +Signature: + +```typescript +getAppSetId?: () => Promise; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getappsetidscope.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getappsetidscope.md new file mode 100644 index 000000000..ba739a067 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getappsetidscope.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PlatformContextRetriever](./react-native-tracker.platformcontextretriever.md) > [getAppSetIdScope](./react-native-tracker.platformcontextretriever.getappsetidscope.md) + +## PlatformContextRetriever.getAppSetIdScope property + +Scope of the `appSetId`. Can be scoped to the app or to a developer account on an app store (all apps from the same developer on the same device will have the same ID). + +Signature: + +```typescript +getAppSetIdScope?: () => Promise; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getavailablestorage.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getavailablestorage.md new file mode 100644 index 000000000..3e272c06d --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getavailablestorage.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PlatformContextRetriever](./react-native-tracker.platformcontextretriever.md) > [getAvailableStorage](./react-native-tracker.platformcontextretriever.getavailablestorage.md) + +## PlatformContextRetriever.getAvailableStorage property + +Bytes of storage remaining + +Signature: + +```typescript +getAvailableStorage?: () => Promise; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getbatterylevel.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getbatterylevel.md new file mode 100644 index 000000000..903119131 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getbatterylevel.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PlatformContextRetriever](./react-native-tracker.platformcontextretriever.md) > [getBatteryLevel](./react-native-tracker.platformcontextretriever.getbatterylevel.md) + +## PlatformContextRetriever.getBatteryLevel property + +Remaining battery level as an integer percentage of total battery capacity + +Signature: + +```typescript +getBatteryLevel?: () => Promise; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getbatterystate.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getbatterystate.md new file mode 100644 index 000000000..572cf8433 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getbatterystate.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PlatformContextRetriever](./react-native-tracker.platformcontextretriever.md) > [getBatteryState](./react-native-tracker.platformcontextretriever.getbatterystate.md) + +## PlatformContextRetriever.getBatteryState property + +Battery state for the device + +Signature: + +```typescript +getBatteryState?: () => Promise<'unplugged' | 'charging' | 'full' | undefined>; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getcarrier.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getcarrier.md new file mode 100644 index 000000000..1e585d9e3 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getcarrier.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PlatformContextRetriever](./react-native-tracker.platformcontextretriever.md) > [getCarrier](./react-native-tracker.platformcontextretriever.getcarrier.md) + +## PlatformContextRetriever.getCarrier property + +The carrier of the SIM inserted in the device + +Signature: + +```typescript +getCarrier?: () => Promise; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getdevicemanufacturer.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getdevicemanufacturer.md new file mode 100644 index 000000000..fd01882c8 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getdevicemanufacturer.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PlatformContextRetriever](./react-native-tracker.platformcontextretriever.md) > [getDeviceManufacturer](./react-native-tracker.platformcontextretriever.getdevicemanufacturer.md) + +## PlatformContextRetriever.getDeviceManufacturer property + +The manufacturer of the product/hardware + +Signature: + +```typescript +getDeviceManufacturer?: () => Promise; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getdevicemodel.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getdevicemodel.md new file mode 100644 index 000000000..d4e678e30 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getdevicemodel.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PlatformContextRetriever](./react-native-tracker.platformcontextretriever.md) > [getDeviceModel](./react-native-tracker.platformcontextretriever.getdevicemodel.md) + +## PlatformContextRetriever.getDeviceModel property + +The end-user-visible name for the end product + +Signature: + +```typescript +getDeviceModel?: () => Promise; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getlanguage.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getlanguage.md new file mode 100644 index 000000000..f898f2ee3 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getlanguage.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PlatformContextRetriever](./react-native-tracker.platformcontextretriever.md) > [getLanguage](./react-native-tracker.platformcontextretriever.getlanguage.md) + +## PlatformContextRetriever.getLanguage property + +System language currently used on the device (ISO 639) + +Signature: + +```typescript +getLanguage?: () => Promise; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getlowpowermode.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getlowpowermode.md new file mode 100644 index 000000000..a977aee13 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getlowpowermode.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PlatformContextRetriever](./react-native-tracker.platformcontextretriever.md) > [getLowPowerMode](./react-native-tracker.platformcontextretriever.getlowpowermode.md) + +## PlatformContextRetriever.getLowPowerMode property + +A Boolean indicating whether Low Power Mode is enabled + +Signature: + +```typescript +getLowPowerMode?: () => Promise; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getnetworktechnology.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getnetworktechnology.md new file mode 100644 index 000000000..aaea92c69 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getnetworktechnology.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PlatformContextRetriever](./react-native-tracker.platformcontextretriever.md) > [getNetworkTechnology](./react-native-tracker.platformcontextretriever.getnetworktechnology.md) + +## PlatformContextRetriever.getNetworkTechnology property + +Radio access technology that the device is using + +Signature: + +```typescript +getNetworkTechnology?: () => Promise; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getnetworktype.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getnetworktype.md new file mode 100644 index 000000000..1890e85a6 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getnetworktype.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PlatformContextRetriever](./react-native-tracker.platformcontextretriever.md) > [getNetworkType](./react-native-tracker.platformcontextretriever.getnetworktype.md) + +## PlatformContextRetriever.getNetworkType property + +Type of network the device is connected to + +Signature: + +```typescript +getNetworkType?: () => Promise<'mobile' | 'wifi' | 'offline' | undefined>; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getostype.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getostype.md new file mode 100644 index 000000000..3c2904a26 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getostype.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PlatformContextRetriever](./react-native-tracker.platformcontextretriever.md) > [getOsType](./react-native-tracker.platformcontextretriever.getostype.md) + +## PlatformContextRetriever.getOsType property + +Operating system type (e.g., ios, tvos, watchos, osx, android) + +Signature: + +```typescript +getOsType?: () => Promise; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getosversion.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getosversion.md new file mode 100644 index 000000000..204cf64b2 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getosversion.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PlatformContextRetriever](./react-native-tracker.platformcontextretriever.md) > [getOsVersion](./react-native-tracker.platformcontextretriever.getosversion.md) + +## PlatformContextRetriever.getOsVersion property + +The current version of the operating system + +Signature: + +```typescript +getOsVersion?: () => Promise; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getphysicalmemory.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getphysicalmemory.md new file mode 100644 index 000000000..333e960da --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getphysicalmemory.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PlatformContextRetriever](./react-native-tracker.platformcontextretriever.md) > [getPhysicalMemory](./react-native-tracker.platformcontextretriever.getphysicalmemory.md) + +## PlatformContextRetriever.getPhysicalMemory property + +Total physical system memory in bytes + +Signature: + +```typescript +getPhysicalMemory?: () => Promise; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getresolution.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getresolution.md new file mode 100644 index 000000000..12ea40cc5 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getresolution.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PlatformContextRetriever](./react-native-tracker.platformcontextretriever.md) > [getResolution](./react-native-tracker.platformcontextretriever.getresolution.md) + +## PlatformContextRetriever.getResolution property + +Screen resolution in pixels. Arrives in the form of WIDTHxHEIGHT (e.g., 1200x900). Doesn't change when device orientation changes + +Signature: + +```typescript +getResolution?: () => Promise; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getscale.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getscale.md new file mode 100644 index 000000000..3a4f0351a --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getscale.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PlatformContextRetriever](./react-native-tracker.platformcontextretriever.md) > [getScale](./react-native-tracker.platformcontextretriever.getscale.md) + +## PlatformContextRetriever.getScale property + +Scale factor used to convert logical coordinates to device coordinates of the screen (uses UIScreen.scale on iOS) + +Signature: + +```typescript +getScale?: () => Promise; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getsystemavailablememory.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getsystemavailablememory.md new file mode 100644 index 000000000..43e158abc --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.getsystemavailablememory.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PlatformContextRetriever](./react-native-tracker.platformcontextretriever.md) > [getSystemAvailableMemory](./react-native-tracker.platformcontextretriever.getsystemavailablememory.md) + +## PlatformContextRetriever.getSystemAvailableMemory property + +Available memory on the system in bytes (Android only). + +Signature: + +```typescript +getSystemAvailableMemory?: () => Promise; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.gettotalstorage.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.gettotalstorage.md new file mode 100644 index 000000000..af2f197c9 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.gettotalstorage.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PlatformContextRetriever](./react-native-tracker.platformcontextretriever.md) > [getTotalStorage](./react-native-tracker.platformcontextretriever.gettotalstorage.md) + +## PlatformContextRetriever.getTotalStorage property + +Total size of storage in bytes + +Signature: + +```typescript +getTotalStorage?: () => Promise; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.isportrait.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.isportrait.md new file mode 100644 index 000000000..dcbcf2877 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.isportrait.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PlatformContextRetriever](./react-native-tracker.platformcontextretriever.md) > [isPortrait](./react-native-tracker.platformcontextretriever.isportrait.md) + +## PlatformContextRetriever.isPortrait property + +A Boolean indicating whether the device orientation is portrait (either upright or upside down) + +Signature: + +```typescript +isPortrait?: () => Promise; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.md new file mode 100644 index 000000000..cbaea8df5 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.platformcontextretriever.md @@ -0,0 +1,43 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [PlatformContextRetriever](./react-native-tracker.platformcontextretriever.md) + +## PlatformContextRetriever interface + +Overrides for the values for properties of the platform context. + +Signature: + +```typescript +export interface PlatformContextRetriever +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [getAndroidIdfa?](./react-native-tracker.platformcontextretriever.getandroididfa.md) | () => Promise<string \| undefined> | (Optional) Advertising identifier on Android. | +| [getAppAvailableMemory?](./react-native-tracker.platformcontextretriever.getappavailablememory.md) | () => Promise<number \| undefined> | (Optional) Amount of memory in bytes available to the current app | +| [getAppleIdfa?](./react-native-tracker.platformcontextretriever.getappleidfa.md) | () => Promise<string \| undefined> | (Optional) Advertising identifier on iOS (UUID formatted string) | +| [getAppleIdfv?](./react-native-tracker.platformcontextretriever.getappleidfv.md) | () => Promise<string \| undefined> | (Optional) UUID identifier for vendors on iOS | +| [getAppSetId?](./react-native-tracker.platformcontextretriever.getappsetid.md) | () => Promise<string \| undefined> | (Optional) Android vendor ID scoped to the set of apps published under the same Google Play developer account (see https://developer.android.com/training/articles/app-set-id). | +| [getAppSetIdScope?](./react-native-tracker.platformcontextretriever.getappsetidscope.md) | () => Promise<string \| undefined> | (Optional) Scope of the appSetId. Can be scoped to the app or to a developer account on an app store (all apps from the same developer on the same device will have the same ID). | +| [getAvailableStorage?](./react-native-tracker.platformcontextretriever.getavailablestorage.md) | () => Promise<number \| undefined> | (Optional) Bytes of storage remaining | +| [getBatteryLevel?](./react-native-tracker.platformcontextretriever.getbatterylevel.md) | () => Promise<number \| undefined> | (Optional) Remaining battery level as an integer percentage of total battery capacity | +| [getBatteryState?](./react-native-tracker.platformcontextretriever.getbatterystate.md) | () => Promise<'unplugged' \| 'charging' \| 'full' \| undefined> | (Optional) Battery state for the device | +| [getCarrier?](./react-native-tracker.platformcontextretriever.getcarrier.md) | () => Promise<string \| undefined> | (Optional) The carrier of the SIM inserted in the device | +| [getDeviceManufacturer?](./react-native-tracker.platformcontextretriever.getdevicemanufacturer.md) | () => Promise<string> | (Optional) The manufacturer of the product/hardware | +| [getDeviceModel?](./react-native-tracker.platformcontextretriever.getdevicemodel.md) | () => Promise<string> | (Optional) The end-user-visible name for the end product | +| [getLanguage?](./react-native-tracker.platformcontextretriever.getlanguage.md) | () => Promise<string \| undefined> | (Optional) System language currently used on the device (ISO 639) | +| [getLowPowerMode?](./react-native-tracker.platformcontextretriever.getlowpowermode.md) | () => Promise<boolean \| undefined> | (Optional) A Boolean indicating whether Low Power Mode is enabled | +| [getNetworkTechnology?](./react-native-tracker.platformcontextretriever.getnetworktechnology.md) | () => Promise<string \| undefined> | (Optional) Radio access technology that the device is using | +| [getNetworkType?](./react-native-tracker.platformcontextretriever.getnetworktype.md) | () => Promise<'mobile' \| 'wifi' \| 'offline' \| undefined> | (Optional) Type of network the device is connected to | +| [getOsType?](./react-native-tracker.platformcontextretriever.getostype.md) | () => Promise<string> | (Optional) Operating system type (e.g., ios, tvos, watchos, osx, android) | +| [getOsVersion?](./react-native-tracker.platformcontextretriever.getosversion.md) | () => Promise<string> | (Optional) The current version of the operating system | +| [getPhysicalMemory?](./react-native-tracker.platformcontextretriever.getphysicalmemory.md) | () => Promise<number \| undefined> | (Optional) Total physical system memory in bytes | +| [getResolution?](./react-native-tracker.platformcontextretriever.getresolution.md) | () => Promise<string \| undefined> | (Optional) Screen resolution in pixels. Arrives in the form of WIDTHxHEIGHT (e.g., 1200x900). Doesn't change when device orientation changes | +| [getScale?](./react-native-tracker.platformcontextretriever.getscale.md) | () => Promise<number \| undefined> | (Optional) Scale factor used to convert logical coordinates to device coordinates of the screen (uses UIScreen.scale on iOS) | +| [getSystemAvailableMemory?](./react-native-tracker.platformcontextretriever.getsystemavailablememory.md) | () => Promise<number \| undefined> | (Optional) Available memory on the system in bytes (Android only). | +| [getTotalStorage?](./react-native-tracker.platformcontextretriever.gettotalstorage.md) | () => Promise<number \| undefined> | (Optional) Total size of storage in bytes | +| [isPortrait?](./react-native-tracker.platformcontextretriever.isportrait.md) | () => Promise<boolean \| undefined> | (Optional) A Boolean indicating whether the device orientation is portrait (either upright or upside down) | + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.reactnativetracker.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.reactnativetracker.md new file mode 100644 index 000000000..c6354bb03 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.reactnativetracker.md @@ -0,0 +1,54 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [ReactNativeTracker](./react-native-tracker.reactnativetracker.md) + +## ReactNativeTracker type + +The ReactNativeTracker type + +Signature: + +```typescript +export declare type ReactNativeTracker = { + namespace: string; + readonly trackSelfDescribingEvent: = Record>(argmap: SelfDescribing, contexts?: EventContext[]) => void; + readonly trackScreenViewEvent: (argmap: ScreenViewProps, contexts?: EventContext[]) => void; + readonly trackScrollChangedEvent: (argmap: ScrollChangedProps, contexts?: EventContext[]) => void; + readonly trackListItemViewEvent: (argmap: ListItemViewProps, contexts?: EventContext[]) => void; + readonly trackStructuredEvent: (argmap: StructuredProps, contexts?: EventContext[]) => void; + readonly trackPageViewEvent: (argmap: PageViewEvent, contexts?: EventContext[]) => void; + readonly trackTimingEvent: (argmap: TimingProps, contexts?: EventContext[]) => void; + readonly trackDeepLinkReceivedEvent: (argmap: DeepLinkReceivedProps, contexts?: EventContext[]) => void; + readonly trackMessageNotificationEvent: (argmap: MessageNotificationProps, contexts?: EventContext[]) => void; + addGlobalContexts(contexts: Array | Record): void; + clearGlobalContexts(): void; + removeGlobalContexts(contexts: Array): void; + addPlugin(configuration: BrowserPluginConfiguration): void; + flush: () => Promise; + readonly setAppId: (appId: string) => void; + readonly setPlatform: (value: string) => void; + readonly setUserId: (newUid: string) => void; + readonly setNetworkUserId: (newNuid: string | undefined) => void; + readonly setDomainUserId: (newDuid: string | undefined) => void; + readonly setIpAddress: (newIp: string) => void; + readonly setUseragent: (newUagent: string) => void; + readonly setTimezone: (newTz: string) => void; + readonly setLanguage: (newLang: string) => void; + readonly setScreenResolution: (newRes: ScreenSize) => void; + readonly setScreenViewport: (newView: ScreenSize) => void; + readonly setColorDepth: (newLang: number) => void; + readonly setSubjectData: (config: SubjectConfiguration) => void; + readonly getSessionUserId: () => Promise; + readonly getSessionId: () => Promise; + readonly getSessionIndex: () => Promise; + readonly getSessionState: () => Promise; + readonly getIsInBackground: () => boolean | undefined; + readonly getBackgroundIndex: () => number | undefined; + readonly getForegroundIndex: () => number | undefined; + readonly enablePlatformContext: () => Promise; + readonly disablePlatformContext: () => void; + readonly refreshPlatformContext: () => Promise; +}; +``` +References: [SelfDescribing](./react-native-tracker.selfdescribing.md), [EventContext](./react-native-tracker.eventcontext.md), [ScreenViewProps](./react-native-tracker.screenviewprops.md), [ScrollChangedProps](./react-native-tracker.scrollchangedprops.md), [ListItemViewProps](./react-native-tracker.listitemviewprops.md), [StructuredProps](./react-native-tracker.structuredprops.md), [TimingProps](./react-native-tracker.timingprops.md), [DeepLinkReceivedProps](./react-native-tracker.deeplinkreceivedprops.md), [MessageNotificationProps](./react-native-tracker.messagenotificationprops.md), [ScreenSize](./react-native-tracker.screensize.md), [SubjectConfiguration](./react-native-tracker.subjectconfiguration.md), [SessionState](./react-native-tracker.sessionstate.md) + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.removealltrackers.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.removealltrackers.md new file mode 100644 index 000000000..f89c21a42 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.removealltrackers.md @@ -0,0 +1,19 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [removeAllTrackers](./react-native-tracker.removealltrackers.md) + +## removeAllTrackers() function + +Removes all initialized trackers + +Signature: + +```typescript +export declare function removeAllTrackers(): void; +``` +Returns: + +void + +- A boolean promise + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.removetracker.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.removetracker.md new file mode 100644 index 000000000..fd63a38eb --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.removetracker.md @@ -0,0 +1,24 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [removeTracker](./react-native-tracker.removetracker.md) + +## removeTracker() function + +Removes a tracker given its namespace + +Signature: + +```typescript +export declare function removeTracker(trackerNamespace: string): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| trackerNamespace | string | Tracker namespace | + +Returns: + +void + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.requestfailure.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.requestfailure.md new file mode 100644 index 000000000..063d363fc --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.requestfailure.md @@ -0,0 +1,18 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [RequestFailure](./react-native-tracker.requestfailure.md) + +## RequestFailure type + +The data that will be available to the `onRequestFailure` callback + +Signature: + +```typescript +type RequestFailure = { + events: EventBatch; + status?: number; + message?: string; + willRetry: boolean; +}; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.ruleset.accept.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.ruleset.accept.md new file mode 100644 index 000000000..d47792084 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.ruleset.accept.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [RuleSet](./react-native-tracker.ruleset.md) > [accept](./react-native-tracker.ruleset.accept.md) + +## RuleSet.accept property + +Signature: + +```typescript +accept?: Array | string; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.ruleset.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.ruleset.md new file mode 100644 index 000000000..157720f6c --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.ruleset.md @@ -0,0 +1,21 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [RuleSet](./react-native-tracker.ruleset.md) + +## RuleSet interface + +A ruleset has accept or reject properties that contain rules for matching Iglu schema URIs + +Signature: + +```typescript +interface RuleSet +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [accept?](./react-native-tracker.ruleset.accept.md) | Array<string> \| string | (Optional) | +| [reject?](./react-native-tracker.ruleset.reject.md) | Array<string> \| string | (Optional) | + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.ruleset.reject.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.ruleset.reject.md new file mode 100644 index 000000000..a3b017794 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.ruleset.reject.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [RuleSet](./react-native-tracker.ruleset.md) > [reject](./react-native-tracker.ruleset.reject.md) + +## RuleSet.reject property + +Signature: + +```typescript +reject?: Array | string; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.rulesetprovider.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.rulesetprovider.md new file mode 100644 index 000000000..a9798a553 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.rulesetprovider.md @@ -0,0 +1,16 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [RuleSetProvider](./react-native-tracker.rulesetprovider.md) + +## RuleSetProvider type + +A ruleset provider is aa tuple that has two parts: a ruleset and the context primitive(s) If the ruleset allows the current event schema URI, the tracker will attach the context primitive(s) + +Signature: + +```typescript +type RuleSetProvider = [ + RuleSet, + Array | ContextPrimitive +]; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.screensize.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.screensize.md new file mode 100644 index 000000000..fb7a11e45 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.screensize.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [ScreenSize](./react-native-tracker.screensize.md) + +## ScreenSize type + +Screen size in pixels + +Signature: + +```typescript +export declare type ScreenSize = [number, number]; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.screenviewprops.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.screenviewprops.md new file mode 100644 index 000000000..22ed34862 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.screenviewprops.md @@ -0,0 +1,21 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [ScreenViewProps](./react-native-tracker.screenviewprops.md) + +## ScreenViewProps type + +ScreenView event properties schema: iglu:com.snowplowanalytics.mobile/screen\_view/jsonschema/1-0-0 + +Signature: + +```typescript +export declare type ScreenViewProps = { + name: string; + id?: string; + type?: string; + previousName?: string; + previousId?: string; + previousType?: string; + transitionType?: string; +}; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.scrollchangedprops.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.scrollchangedprops.md new file mode 100644 index 000000000..32d3980b5 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.scrollchangedprops.md @@ -0,0 +1,22 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [ScrollChangedProps](./react-native-tracker.scrollchangedprops.md) + +## ScrollChangedProps type + +Event tracked when a scroll view's scroll position changes. If screen engagement tracking is enabled, the scroll changed events will be aggregated into a `screen_summary` entity. + +Schema: `iglu:com.snowplowanalytics.mobile/scroll_changed/jsonschema/1-0-0` + +Signature: + +```typescript +export declare type ScrollChangedProps = { + yOffset?: number; + xOffset?: number; + viewHeight?: number; + viewWidth?: number; + contentHeight?: number; + contentWidth?: number; +}; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.selfdescribing.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.selfdescribing.md new file mode 100644 index 000000000..35c03afef --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.selfdescribing.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [SelfDescribing](./react-native-tracker.selfdescribing.md) + +## SelfDescribing type + +Interface for any self-describing JSON such as context entities or self-describing events + +Signature: + +```typescript +export declare type SelfDescribing> = SelfDescribingJson; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionconfiguration.backgroundsessiontimeout.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionconfiguration.backgroundsessiontimeout.md new file mode 100644 index 000000000..823f3e277 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionconfiguration.backgroundsessiontimeout.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [SessionConfiguration](./react-native-tracker.sessionconfiguration.md) > [backgroundSessionTimeout](./react-native-tracker.sessionconfiguration.backgroundsessiontimeout.md) + +## SessionConfiguration.backgroundSessionTimeout property + +The amount of time in seconds before the session id is updated while the app is in the background + +Signature: + +```typescript +backgroundSessionTimeout?: number; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionconfiguration.foregroundsessiontimeout.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionconfiguration.foregroundsessiontimeout.md new file mode 100644 index 000000000..5282a3ef2 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionconfiguration.foregroundsessiontimeout.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [SessionConfiguration](./react-native-tracker.sessionconfiguration.md) > [foregroundSessionTimeout](./react-native-tracker.sessionconfiguration.foregroundsessiontimeout.md) + +## SessionConfiguration.foregroundSessionTimeout property + +The amount of time in seconds before the session id is updated while the app is in the foreground + +Signature: + +```typescript +foregroundSessionTimeout?: number; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionconfiguration.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionconfiguration.md new file mode 100644 index 000000000..1123c753c --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionconfiguration.md @@ -0,0 +1,22 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [SessionConfiguration](./react-native-tracker.sessionconfiguration.md) + +## SessionConfiguration interface + +Configuration for session tracking + +Signature: + +```typescript +export interface SessionConfiguration +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [backgroundSessionTimeout?](./react-native-tracker.sessionconfiguration.backgroundsessiontimeout.md) | number | (Optional) The amount of time in seconds before the session id is updated while the app is in the background | +| [foregroundSessionTimeout?](./react-native-tracker.sessionconfiguration.foregroundsessiontimeout.md) | number | (Optional) The amount of time in seconds before the session id is updated while the app is in the foreground | +| [sessionContext?](./react-native-tracker.sessionconfiguration.sessioncontext.md) | boolean | (Optional) Whether session context is attached to tracked events. | + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionconfiguration.sessioncontext.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionconfiguration.sessioncontext.md new file mode 100644 index 000000000..080fd7c72 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionconfiguration.sessioncontext.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [SessionConfiguration](./react-native-tracker.sessionconfiguration.md) > [sessionContext](./react-native-tracker.sessionconfiguration.sessioncontext.md) + +## SessionConfiguration.sessionContext property + +Whether session context is attached to tracked events. + +Signature: + +```typescript +sessionContext?: boolean; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionstate.eventindex.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionstate.eventindex.md new file mode 100644 index 000000000..2fcff3c89 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionstate.eventindex.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [SessionState](./react-native-tracker.sessionstate.md) > [eventIndex](./react-native-tracker.sessionstate.eventindex.md) + +## SessionState.eventIndex property + +Optional index of the current event in the session + +Signature: + +```typescript +eventIndex?: number; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionstate.firsteventid.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionstate.firsteventid.md new file mode 100644 index 000000000..8cb3eb771 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionstate.firsteventid.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [SessionState](./react-native-tracker.sessionstate.md) > [firstEventId](./react-native-tracker.sessionstate.firsteventid.md) + +## SessionState.firstEventId property + +The optional identifier of the first event for this session + +Signature: + +```typescript +firstEventId?: string; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionstate.firsteventtimestamp.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionstate.firsteventtimestamp.md new file mode 100644 index 000000000..8277b59f8 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionstate.firsteventtimestamp.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [SessionState](./react-native-tracker.sessionstate.md) > [firstEventTimestamp](./react-native-tracker.sessionstate.firsteventtimestamp.md) + +## SessionState.firstEventTimestamp property + +Optional date-time timestamp of when the first event in the session was tracked + +Signature: + +```typescript +firstEventTimestamp?: string; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionstate.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionstate.md new file mode 100644 index 000000000..a0a5ec91c --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionstate.md @@ -0,0 +1,27 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [SessionState](./react-native-tracker.sessionstate.md) + +## SessionState interface + +Current session state that is tracked in events. + +Signature: + +```typescript +export interface SessionState +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [eventIndex?](./react-native-tracker.sessionstate.eventindex.md) | number | (Optional) Optional index of the current event in the session | +| [firstEventId?](./react-native-tracker.sessionstate.firsteventid.md) | string | (Optional) The optional identifier of the first event for this session | +| [firstEventTimestamp?](./react-native-tracker.sessionstate.firsteventtimestamp.md) | string | (Optional) Optional date-time timestamp of when the first event in the session was tracked | +| [previousSessionId?](./react-native-tracker.sessionstate.previoussessionid.md) | string | (Optional) The previous session identifier for this user | +| [sessionId](./react-native-tracker.sessionstate.sessionid.md) | string | An identifier for the session | +| [sessionIndex](./react-native-tracker.sessionstate.sessionindex.md) | number | The index of the current session for this user | +| [storageMechanism](./react-native-tracker.sessionstate.storagemechanism.md) | string | The mechanism that the session information has been stored on the device | +| [userId](./react-native-tracker.sessionstate.userid.md) | string | An identifier for the user of the session | + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionstate.previoussessionid.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionstate.previoussessionid.md new file mode 100644 index 000000000..bd7063348 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionstate.previoussessionid.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [SessionState](./react-native-tracker.sessionstate.md) > [previousSessionId](./react-native-tracker.sessionstate.previoussessionid.md) + +## SessionState.previousSessionId property + +The previous session identifier for this user + +Signature: + +```typescript +previousSessionId?: string; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionstate.sessionid.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionstate.sessionid.md new file mode 100644 index 000000000..2a5411f66 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionstate.sessionid.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [SessionState](./react-native-tracker.sessionstate.md) > [sessionId](./react-native-tracker.sessionstate.sessionid.md) + +## SessionState.sessionId property + +An identifier for the session + +Signature: + +```typescript +sessionId: string; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionstate.sessionindex.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionstate.sessionindex.md new file mode 100644 index 000000000..132af44a1 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionstate.sessionindex.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [SessionState](./react-native-tracker.sessionstate.md) > [sessionIndex](./react-native-tracker.sessionstate.sessionindex.md) + +## SessionState.sessionIndex property + +The index of the current session for this user + +Signature: + +```typescript +sessionIndex: number; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionstate.storagemechanism.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionstate.storagemechanism.md new file mode 100644 index 000000000..be6f76270 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionstate.storagemechanism.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [SessionState](./react-native-tracker.sessionstate.md) > [storageMechanism](./react-native-tracker.sessionstate.storagemechanism.md) + +## SessionState.storageMechanism property + +The mechanism that the session information has been stored on the device + +Signature: + +```typescript +storageMechanism: string; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionstate.userid.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionstate.userid.md new file mode 100644 index 000000000..9fd0de69e --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.sessionstate.userid.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [SessionState](./react-native-tracker.sessionstate.md) > [userId](./react-native-tracker.sessionstate.userid.md) + +## SessionState.userId property + +An identifier for the user of the session + +Signature: + +```typescript +userId: string; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.structuredprops.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.structuredprops.md new file mode 100644 index 000000000..4d0ea6262 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.structuredprops.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [StructuredProps](./react-native-tracker.structuredprops.md) + +## StructuredProps type + +Properties for a structured event. A classic style of event tracking, allows for easier movement between analytics systems. Self-describing events are preferred for their schema validation. + +Signature: + +```typescript +export declare type StructuredProps = StructuredEvent; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.subjectconfiguration.colordepth.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.subjectconfiguration.colordepth.md new file mode 100644 index 000000000..293d0019e --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.subjectconfiguration.colordepth.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [SubjectConfiguration](./react-native-tracker.subjectconfiguration.md) > [colorDepth](./react-native-tracker.subjectconfiguration.colordepth.md) + +## SubjectConfiguration.colorDepth property + +Color depth (integer) + +Signature: + +```typescript +colorDepth?: number; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.subjectconfiguration.domainuserid.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.subjectconfiguration.domainuserid.md new file mode 100644 index 000000000..ae25b158c --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.subjectconfiguration.domainuserid.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [SubjectConfiguration](./react-native-tracker.subjectconfiguration.md) > [domainUserId](./react-native-tracker.subjectconfiguration.domainuserid.md) + +## SubjectConfiguration.domainUserId property + +The domain user id (DUID) is a generated identifier that is stored in a first party cookie on Web. The React Native tracker does not assign it automatically. + +Signature: + +```typescript +domainUserId?: string; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.subjectconfiguration.ipaddress.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.subjectconfiguration.ipaddress.md new file mode 100644 index 000000000..9e2dbe11d --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.subjectconfiguration.ipaddress.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [SubjectConfiguration](./react-native-tracker.subjectconfiguration.md) > [ipAddress](./react-native-tracker.subjectconfiguration.ipaddress.md) + +## SubjectConfiguration.ipAddress property + +Override the IP address of the device + +Signature: + +```typescript +ipAddress?: string; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.subjectconfiguration.language.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.subjectconfiguration.language.md new file mode 100644 index 000000000..381bc4ec0 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.subjectconfiguration.language.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [SubjectConfiguration](./react-native-tracker.subjectconfiguration.md) > [language](./react-native-tracker.subjectconfiguration.language.md) + +## SubjectConfiguration.language property + +The language set in the device + +Signature: + +```typescript +language?: string; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.subjectconfiguration.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.subjectconfiguration.md new file mode 100644 index 000000000..142bbc301 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.subjectconfiguration.md @@ -0,0 +1,29 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [SubjectConfiguration](./react-native-tracker.subjectconfiguration.md) + +## SubjectConfiguration interface + +Configuration of subject properties tracked with events + +Signature: + +```typescript +export interface SubjectConfiguration +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [colorDepth?](./react-native-tracker.subjectconfiguration.colordepth.md) | number | (Optional) Color depth (integer) | +| [domainUserId?](./react-native-tracker.subjectconfiguration.domainuserid.md) | string | (Optional) The domain user id (DUID) is a generated identifier that is stored in a first party cookie on Web. The React Native tracker does not assign it automatically. | +| [ipAddress?](./react-native-tracker.subjectconfiguration.ipaddress.md) | string | (Optional) Override the IP address of the device | +| [language?](./react-native-tracker.subjectconfiguration.language.md) | string | (Optional) The language set in the device | +| [networkUserId?](./react-native-tracker.subjectconfiguration.networkuserid.md) | string | (Optional) Override the network user id (UUIDv4) that is assigned by the collector and stored in cookies | +| [screenResolution?](./react-native-tracker.subjectconfiguration.screenresolution.md) | [ScreenSize](./react-native-tracker.screensize.md) | (Optional) The screen resolution | +| [screenViewport?](./react-native-tracker.subjectconfiguration.screenviewport.md) | [ScreenSize](./react-native-tracker.screensize.md) | (Optional) The screen viewport size | +| [timezone?](./react-native-tracker.subjectconfiguration.timezone.md) | string | (Optional) The timezone label | +| [useragent?](./react-native-tracker.subjectconfiguration.useragent.md) | string | (Optional) The custom user-agent. It overrides the user-agent used by default. | +| [userId?](./react-native-tracker.subjectconfiguration.userid.md) | string | (Optional) Business-defined user ID for this user | + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.subjectconfiguration.networkuserid.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.subjectconfiguration.networkuserid.md new file mode 100644 index 000000000..94be46858 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.subjectconfiguration.networkuserid.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [SubjectConfiguration](./react-native-tracker.subjectconfiguration.md) > [networkUserId](./react-native-tracker.subjectconfiguration.networkuserid.md) + +## SubjectConfiguration.networkUserId property + +Override the network user id (UUIDv4) that is assigned by the collector and stored in cookies + +Signature: + +```typescript +networkUserId?: string; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.subjectconfiguration.screenresolution.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.subjectconfiguration.screenresolution.md new file mode 100644 index 000000000..54cead3b9 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.subjectconfiguration.screenresolution.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [SubjectConfiguration](./react-native-tracker.subjectconfiguration.md) > [screenResolution](./react-native-tracker.subjectconfiguration.screenresolution.md) + +## SubjectConfiguration.screenResolution property + +The screen resolution + +Signature: + +```typescript +screenResolution?: ScreenSize; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.subjectconfiguration.screenviewport.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.subjectconfiguration.screenviewport.md new file mode 100644 index 000000000..76e8df0ac --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.subjectconfiguration.screenviewport.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [SubjectConfiguration](./react-native-tracker.subjectconfiguration.md) > [screenViewport](./react-native-tracker.subjectconfiguration.screenviewport.md) + +## SubjectConfiguration.screenViewport property + +The screen viewport size + +Signature: + +```typescript +screenViewport?: ScreenSize; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.subjectconfiguration.timezone.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.subjectconfiguration.timezone.md new file mode 100644 index 000000000..7e49640c4 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.subjectconfiguration.timezone.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [SubjectConfiguration](./react-native-tracker.subjectconfiguration.md) > [timezone](./react-native-tracker.subjectconfiguration.timezone.md) + +## SubjectConfiguration.timezone property + +The timezone label + +Signature: + +```typescript +timezone?: string; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.subjectconfiguration.useragent.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.subjectconfiguration.useragent.md new file mode 100644 index 000000000..cca9bdc93 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.subjectconfiguration.useragent.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [SubjectConfiguration](./react-native-tracker.subjectconfiguration.md) > [useragent](./react-native-tracker.subjectconfiguration.useragent.md) + +## SubjectConfiguration.useragent property + +The custom user-agent. It overrides the user-agent used by default. + +Signature: + +```typescript +useragent?: string; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.subjectconfiguration.userid.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.subjectconfiguration.userid.md new file mode 100644 index 000000000..6a64efa57 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.subjectconfiguration.userid.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [SubjectConfiguration](./react-native-tracker.subjectconfiguration.md) > [userId](./react-native-tracker.subjectconfiguration.userid.md) + +## SubjectConfiguration.userId property + +Business-defined user ID for this user + +Signature: + +```typescript +userId?: string; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.timestamp.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.timestamp.md new file mode 100644 index 000000000..015586490 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.timestamp.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [Timestamp](./react-native-tracker.timestamp.md) + +## Timestamp type + +Algebraic datatype representing possible timestamp type choice + +Signature: + +```typescript +type Timestamp = TrueTimestamp | DeviceTimestamp | number; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.timingprops.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.timingprops.md new file mode 100644 index 000000000..6aaee34f7 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.timingprops.md @@ -0,0 +1,18 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [TimingProps](./react-native-tracker.timingprops.md) + +## TimingProps type + +Timing event properties + +Signature: + +```typescript +export declare type TimingProps = { + category: string; + variable: string; + timing: number; + label?: string; +}; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackerconfiguration.appid.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackerconfiguration.appid.md new file mode 100644 index 000000000..fe9ce9c7b --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackerconfiguration.appid.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [TrackerConfiguration](./react-native-tracker.trackerconfiguration.md) > [appId](./react-native-tracker.trackerconfiguration.appid.md) + +## TrackerConfiguration.appId property + +The application ID + +Signature: + +```typescript +appId?: string; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackerconfiguration.deviceplatform.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackerconfiguration.deviceplatform.md new file mode 100644 index 000000000..524068eb4 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackerconfiguration.deviceplatform.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [TrackerConfiguration](./react-native-tracker.trackerconfiguration.md) > [devicePlatform](./react-native-tracker.trackerconfiguration.deviceplatform.md) + +## TrackerConfiguration.devicePlatform property + +The device platform the tracker runs on. + +Signature: + +```typescript +devicePlatform?: Platform; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackerconfiguration.encodebase64.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackerconfiguration.encodebase64.md new file mode 100644 index 000000000..9e2fcafe8 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackerconfiguration.encodebase64.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [TrackerConfiguration](./react-native-tracker.trackerconfiguration.md) > [encodeBase64](./react-native-tracker.trackerconfiguration.encodebase64.md) + +## TrackerConfiguration.encodeBase64 property + +Whether unstructured events and custom contexts should be base64 encoded. + +Signature: + +```typescript +encodeBase64?: boolean; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackerconfiguration.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackerconfiguration.md new file mode 100644 index 000000000..957545535 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackerconfiguration.md @@ -0,0 +1,24 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [TrackerConfiguration](./react-native-tracker.trackerconfiguration.md) + +## TrackerConfiguration interface + +The configuration object for initialising the tracker + +Signature: + +```typescript +export interface TrackerConfiguration +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [appId?](./react-native-tracker.trackerconfiguration.appid.md) | string | (Optional) The application ID | +| [devicePlatform?](./react-native-tracker.trackerconfiguration.deviceplatform.md) | Platform | (Optional) The device platform the tracker runs on. | +| [encodeBase64?](./react-native-tracker.trackerconfiguration.encodebase64.md) | boolean | (Optional) Whether unstructured events and custom contexts should be base64 encoded. | +| [namespace](./react-native-tracker.trackerconfiguration.namespace.md) | string | The namespace of the tracker | +| [plugins?](./react-native-tracker.trackerconfiguration.plugins.md) | BrowserPlugin\[\] | (Optional) Inject plugins which will be evaluated for each event | + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackerconfiguration.namespace.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackerconfiguration.namespace.md new file mode 100644 index 000000000..dc1b7c27b --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackerconfiguration.namespace.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [TrackerConfiguration](./react-native-tracker.trackerconfiguration.md) > [namespace](./react-native-tracker.trackerconfiguration.namespace.md) + +## TrackerConfiguration.namespace property + +The namespace of the tracker + +Signature: + +```typescript +namespace: string; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackerconfiguration.plugins.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackerconfiguration.plugins.md new file mode 100644 index 000000000..747583695 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackerconfiguration.plugins.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [TrackerConfiguration](./react-native-tracker.trackerconfiguration.md) > [plugins](./react-native-tracker.trackerconfiguration.plugins.md) + +## TrackerConfiguration.plugins property + +Inject plugins which will be evaluated for each event + +Signature: + +```typescript +plugins?: BrowserPlugin[]; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.addglobalcontexts.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.addglobalcontexts.md new file mode 100644 index 000000000..4d7ef62ba --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.addglobalcontexts.md @@ -0,0 +1,24 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [TrackerCore](./react-native-tracker.trackercore.md) > [addGlobalContexts](./react-native-tracker.trackercore.addglobalcontexts.md) + +## TrackerCore.addGlobalContexts() method + +Adds contexts globally, contexts added here will be attached to all applicable events + +Signature: + +```typescript +addGlobalContexts(contexts: Array | Record): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| contexts | Array<ConditionalContextProvider \| ContextPrimitive> \| Record<string, ConditionalContextProvider \| ContextPrimitive> | An array containing either contexts or a conditional contexts | + +Returns: + +void + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.addpayloaddict.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.addpayloaddict.md new file mode 100644 index 000000000..5c5affebf --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.addpayloaddict.md @@ -0,0 +1,24 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [TrackerCore](./react-native-tracker.trackercore.md) > [addPayloadDict](./react-native-tracker.trackercore.addpayloaddict.md) + +## TrackerCore.addPayloadDict() method + +Merges a dictionary into payloadPairs + +Signature: + +```typescript +addPayloadDict(dict: Payload): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| dict | Payload | Adds a new payload dictionary to the existing one | + +Returns: + +void + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.addpayloadpair.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.addpayloadpair.md new file mode 100644 index 000000000..9de08f3da --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.addpayloadpair.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [TrackerCore](./react-native-tracker.trackercore.md) > [addPayloadPair](./react-native-tracker.trackercore.addpayloadpair.md) + +## TrackerCore.addPayloadPair property + +Set a persistent key-value pair to be added to every payload + +Signature: + +```typescript +addPayloadPair: (key: string, value: unknown) => void; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.addplugin.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.addplugin.md new file mode 100644 index 000000000..1df2fa1a7 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.addplugin.md @@ -0,0 +1,24 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [TrackerCore](./react-native-tracker.trackercore.md) > [addPlugin](./react-native-tracker.trackercore.addplugin.md) + +## TrackerCore.addPlugin() method + +Add a plugin into the plugin collection after Core has already been initialised + +Signature: + +```typescript +addPlugin(configuration: CorePluginConfiguration): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| configuration | CorePluginConfiguration | The plugin to add | + +Returns: + +void + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.clearglobalcontexts.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.clearglobalcontexts.md new file mode 100644 index 000000000..35a7fce36 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.clearglobalcontexts.md @@ -0,0 +1,17 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [TrackerCore](./react-native-tracker.trackercore.md) > [clearGlobalContexts](./react-native-tracker.trackercore.clearglobalcontexts.md) + +## TrackerCore.clearGlobalContexts() method + +Removes all global contexts + +Signature: + +```typescript +clearGlobalContexts(): void; +``` +Returns: + +void + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.deactivate.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.deactivate.md new file mode 100644 index 000000000..cb5771396 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.deactivate.md @@ -0,0 +1,17 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [TrackerCore](./react-native-tracker.trackercore.md) > [deactivate](./react-native-tracker.trackercore.deactivate.md) + +## TrackerCore.deactivate() method + +Deactivate tracker core including all plugins. This is useful for cleaning up resources or listeners that have been created. Once deactivated, the tracker won't be able to track any events. + +Signature: + +```typescript +deactivate(): void; +``` +Returns: + +void + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.getbase64encoding.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.getbase64encoding.md new file mode 100644 index 000000000..6398bf5b1 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.getbase64encoding.md @@ -0,0 +1,17 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [TrackerCore](./react-native-tracker.trackercore.md) > [getBase64Encoding](./react-native-tracker.trackercore.getbase64encoding.md) + +## TrackerCore.getBase64Encoding() method + +Get current base64 encoding state + +Signature: + +```typescript +getBase64Encoding(): boolean; +``` +Returns: + +boolean + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.md new file mode 100644 index 000000000..d2e490b5c --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.md @@ -0,0 +1,47 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [TrackerCore](./react-native-tracker.trackercore.md) + +## TrackerCore interface + +Export interface containing all Core functions + +Signature: + +```typescript +interface TrackerCore +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [addPayloadPair](./react-native-tracker.trackercore.addpayloadpair.md) | (key: string, value: unknown) => void | Set a persistent key-value pair to be added to every payload | +| [track](./react-native-tracker.trackercore.track.md) | (pb: PayloadBuilder, context?: Array<SelfDescribingJson> \| null, timestamp?: Timestamp \| null) => Payload \| undefined | Call with a payload from a buildX function Adds context and payloadPairs name-value pairs to the payload Applies the callback to the built payload | + +## Methods + +| Method | Description | +| --- | --- | +| [addGlobalContexts(contexts)](./react-native-tracker.trackercore.addglobalcontexts.md) | Adds contexts globally, contexts added here will be attached to all applicable events | +| [addPayloadDict(dict)](./react-native-tracker.trackercore.addpayloaddict.md) | Merges a dictionary into payloadPairs | +| [addPlugin(configuration)](./react-native-tracker.trackercore.addplugin.md) | Add a plugin into the plugin collection after Core has already been initialised | +| [clearGlobalContexts()](./react-native-tracker.trackercore.clearglobalcontexts.md) | Removes all global contexts | +| [deactivate()](./react-native-tracker.trackercore.deactivate.md) | Deactivate tracker core including all plugins. This is useful for cleaning up resources or listeners that have been created. Once deactivated, the tracker won't be able to track any events. | +| [getBase64Encoding()](./react-native-tracker.trackercore.getbase64encoding.md) | Get current base64 encoding state | +| [removeGlobalContexts(contexts)](./react-native-tracker.trackercore.removeglobalcontexts.md) | Removes previously added global context, performs a deep comparison of the contexts or conditional contexts | +| [resetPayloadPairs(dict)](./react-native-tracker.trackercore.resetpayloadpairs.md) | Replace payloadPairs with a new dictionary | +| [setAppId(appId)](./react-native-tracker.trackercore.setappid.md) | Set the application ID | +| [setBase64Encoding(encode)](./react-native-tracker.trackercore.setbase64encoding.md) | Turn base 64 encoding on or off | +| [setColorDepth(depth)](./react-native-tracker.trackercore.setcolordepth.md) | Set the color depth | +| [setIpAddress(ip)](./react-native-tracker.trackercore.setipaddress.md) | Set the IP address | +| [setLang(lang)](./react-native-tracker.trackercore.setlang.md) | Set the language | +| [setPlatform(value)](./react-native-tracker.trackercore.setplatform.md) | Set the platform | +| [setScreenResolution(width, height)](./react-native-tracker.trackercore.setscreenresolution.md) | Set the screen resolution | +| [setTimezone(timezone)](./react-native-tracker.trackercore.settimezone.md) | Set the timezone | +| [setTrackerNamespace(name)](./react-native-tracker.trackercore.settrackernamespace.md) | Set the tracker namespace | +| [setTrackerVersion(version)](./react-native-tracker.trackercore.settrackerversion.md) | Set the tracker version | +| [setUseragent(useragent)](./react-native-tracker.trackercore.setuseragent.md) | Set the Useragent | +| [setUserId(userId)](./react-native-tracker.trackercore.setuserid.md) | Set the user ID | +| [setViewport(width, height)](./react-native-tracker.trackercore.setviewport.md) | Set the viewport dimensions | + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.removeglobalcontexts.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.removeglobalcontexts.md new file mode 100644 index 000000000..c34c36ae9 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.removeglobalcontexts.md @@ -0,0 +1,24 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [TrackerCore](./react-native-tracker.trackercore.md) > [removeGlobalContexts](./react-native-tracker.trackercore.removeglobalcontexts.md) + +## TrackerCore.removeGlobalContexts() method + +Removes previously added global context, performs a deep comparison of the contexts or conditional contexts + +Signature: + +```typescript +removeGlobalContexts(contexts: Array): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| contexts | Array<ConditionalContextProvider \| ContextPrimitive \| string> | An array containing either contexts or a conditional contexts | + +Returns: + +void + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.resetpayloadpairs.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.resetpayloadpairs.md new file mode 100644 index 000000000..7aa688a02 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.resetpayloadpairs.md @@ -0,0 +1,24 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [TrackerCore](./react-native-tracker.trackercore.md) > [resetPayloadPairs](./react-native-tracker.trackercore.resetpayloadpairs.md) + +## TrackerCore.resetPayloadPairs() method + +Replace payloadPairs with a new dictionary + +Signature: + +```typescript +resetPayloadPairs(dict: Payload): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| dict | Payload | Resets all current payload pairs with a new dictionary of pairs | + +Returns: + +void + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.setappid.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.setappid.md new file mode 100644 index 000000000..abd0a93a1 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.setappid.md @@ -0,0 +1,24 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [TrackerCore](./react-native-tracker.trackercore.md) > [setAppId](./react-native-tracker.trackercore.setappid.md) + +## TrackerCore.setAppId() method + +Set the application ID + +Signature: + +```typescript +setAppId(appId: string): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| appId | string | An application ID which identifies the current application | + +Returns: + +void + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.setbase64encoding.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.setbase64encoding.md new file mode 100644 index 000000000..dba55d738 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.setbase64encoding.md @@ -0,0 +1,24 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [TrackerCore](./react-native-tracker.trackercore.md) > [setBase64Encoding](./react-native-tracker.trackercore.setbase64encoding.md) + +## TrackerCore.setBase64Encoding() method + +Turn base 64 encoding on or off + +Signature: + +```typescript +setBase64Encoding(encode: boolean): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| encode | boolean | Whether to encode payload | + +Returns: + +void + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.setcolordepth.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.setcolordepth.md new file mode 100644 index 000000000..112999575 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.setcolordepth.md @@ -0,0 +1,24 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [TrackerCore](./react-native-tracker.trackercore.md) > [setColorDepth](./react-native-tracker.trackercore.setcolordepth.md) + +## TrackerCore.setColorDepth() method + +Set the color depth + +Signature: + +```typescript +setColorDepth(depth: string): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| depth | string | A color depth value as string | + +Returns: + +void + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.setipaddress.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.setipaddress.md new file mode 100644 index 000000000..31498859f --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.setipaddress.md @@ -0,0 +1,24 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [TrackerCore](./react-native-tracker.trackercore.md) > [setIpAddress](./react-native-tracker.trackercore.setipaddress.md) + +## TrackerCore.setIpAddress() method + +Set the IP address + +Signature: + +```typescript +setIpAddress(ip: string): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| ip | string | An IP Address string | + +Returns: + +void + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.setlang.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.setlang.md new file mode 100644 index 000000000..7100dc2ee --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.setlang.md @@ -0,0 +1,24 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [TrackerCore](./react-native-tracker.trackercore.md) > [setLang](./react-native-tracker.trackercore.setlang.md) + +## TrackerCore.setLang() method + +Set the language + +Signature: + +```typescript +setLang(lang: string): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| lang | string | A language string e.g. 'en-UK' | + +Returns: + +void + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.setplatform.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.setplatform.md new file mode 100644 index 000000000..6c1ba1297 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.setplatform.md @@ -0,0 +1,24 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [TrackerCore](./react-native-tracker.trackercore.md) > [setPlatform](./react-native-tracker.trackercore.setplatform.md) + +## TrackerCore.setPlatform() method + +Set the platform + +Signature: + +```typescript +setPlatform(value: string): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| value | string | A valid Snowplow platform value | + +Returns: + +void + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.setscreenresolution.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.setscreenresolution.md new file mode 100644 index 000000000..b24ab49f7 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.setscreenresolution.md @@ -0,0 +1,25 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [TrackerCore](./react-native-tracker.trackercore.md) > [setScreenResolution](./react-native-tracker.trackercore.setscreenresolution.md) + +## TrackerCore.setScreenResolution() method + +Set the screen resolution + +Signature: + +```typescript +setScreenResolution(width: string, height: string): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| width | string | screen resolution width | +| height | string | screen resolution height | + +Returns: + +void + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.settimezone.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.settimezone.md new file mode 100644 index 000000000..3268c1374 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.settimezone.md @@ -0,0 +1,24 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [TrackerCore](./react-native-tracker.trackercore.md) > [setTimezone](./react-native-tracker.trackercore.settimezone.md) + +## TrackerCore.setTimezone() method + +Set the timezone + +Signature: + +```typescript +setTimezone(timezone: string): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| timezone | string | A timezone string | + +Returns: + +void + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.settrackernamespace.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.settrackernamespace.md new file mode 100644 index 000000000..a07eb93af --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.settrackernamespace.md @@ -0,0 +1,24 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [TrackerCore](./react-native-tracker.trackercore.md) > [setTrackerNamespace](./react-native-tracker.trackercore.settrackernamespace.md) + +## TrackerCore.setTrackerNamespace() method + +Set the tracker namespace + +Signature: + +```typescript +setTrackerNamespace(name: string): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| name | string | The trackers namespace | + +Returns: + +void + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.settrackerversion.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.settrackerversion.md new file mode 100644 index 000000000..a2abc9b95 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.settrackerversion.md @@ -0,0 +1,24 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [TrackerCore](./react-native-tracker.trackercore.md) > [setTrackerVersion](./react-native-tracker.trackercore.settrackerversion.md) + +## TrackerCore.setTrackerVersion() method + +Set the tracker version + +Signature: + +```typescript +setTrackerVersion(version: string): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| version | string | The version of the current tracker | + +Returns: + +void + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.setuseragent.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.setuseragent.md new file mode 100644 index 000000000..eb86f389d --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.setuseragent.md @@ -0,0 +1,24 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [TrackerCore](./react-native-tracker.trackercore.md) > [setUseragent](./react-native-tracker.trackercore.setuseragent.md) + +## TrackerCore.setUseragent() method + +Set the Useragent + +Signature: + +```typescript +setUseragent(useragent: string): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| useragent | string | A useragent string | + +Returns: + +void + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.setuserid.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.setuserid.md new file mode 100644 index 000000000..e0b1a998c --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.setuserid.md @@ -0,0 +1,24 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [TrackerCore](./react-native-tracker.trackercore.md) > [setUserId](./react-native-tracker.trackercore.setuserid.md) + +## TrackerCore.setUserId() method + +Set the user ID + +Signature: + +```typescript +setUserId(userId: string): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| userId | string | The custom user id | + +Returns: + +void + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.setviewport.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.setviewport.md new file mode 100644 index 000000000..b7fffbf25 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.setviewport.md @@ -0,0 +1,25 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [TrackerCore](./react-native-tracker.trackercore.md) > [setViewport](./react-native-tracker.trackercore.setviewport.md) + +## TrackerCore.setViewport() method + +Set the viewport dimensions + +Signature: + +```typescript +setViewport(width: string, height: string): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| width | string | viewport width | +| height | string | viewport height | + +Returns: + +void + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.track.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.track.md new file mode 100644 index 000000000..c6787defc --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trackercore.track.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [TrackerCore](./react-native-tracker.trackercore.md) > [track](./react-native-tracker.trackercore.track.md) + +## TrackerCore.track property + +Call with a payload from a buildX function Adds context and payloadPairs name-value pairs to the payload Applies the callback to the built payload + +Signature: + +```typescript +track: (pb: PayloadBuilder, context?: Array | null, timestamp?: Timestamp | null) => Payload | undefined; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trigger.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trigger.md new file mode 100644 index 000000000..649a12dbe --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.trigger.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [Trigger](./react-native-tracker.trigger.md) + +## Trigger type + +Trigger for MessageNotification event + +Signature: + +```typescript +export declare type Trigger = 'push' | 'location' | 'calendar' | 'timeInterval' | 'other'; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.truetimestamp.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.truetimestamp.md new file mode 100644 index 000000000..5f72c3dc2 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.truetimestamp.md @@ -0,0 +1,21 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [TrueTimestamp](./react-native-tracker.truetimestamp.md) + +## TrueTimestamp interface + +A representation of a True Timestamp (ttm) + +Signature: + +```typescript +interface TrueTimestamp +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [type](./react-native-tracker.truetimestamp.type.md) | "ttm" | | +| [value](./react-native-tracker.truetimestamp.value.md) | number | | + diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.truetimestamp.type.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.truetimestamp.type.md new file mode 100644 index 000000000..0c5f08f1d --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.truetimestamp.type.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [TrueTimestamp](./react-native-tracker.truetimestamp.md) > [type](./react-native-tracker.truetimestamp.type.md) + +## TrueTimestamp.type property + +Signature: + +```typescript +readonly type: "ttm"; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.truetimestamp.value.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.truetimestamp.value.md new file mode 100644 index 000000000..0adbe9cae --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.truetimestamp.value.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [TrueTimestamp](./react-native-tracker.truetimestamp.md) > [value](./react-native-tracker.truetimestamp.value.md) + +## TrueTimestamp.value property + +Signature: + +```typescript +readonly value: number; +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.version.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.version.md new file mode 100644 index 000000000..2614e08f0 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.version.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [version](./react-native-tracker.version.md) + +## version variable + +Signature: + +```typescript +version: string +``` diff --git a/api-docs/docs/react-native-tracker/markdown/react-native-tracker.webviewmessagehandler.md b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.webviewmessagehandler.md new file mode 100644 index 000000000..3d556a1b0 --- /dev/null +++ b/api-docs/docs/react-native-tracker/markdown/react-native-tracker.webviewmessagehandler.md @@ -0,0 +1,17 @@ + + +[Home](./index.md) > [@snowplow/react-native-tracker](./react-native-tracker.md) > [WebViewMessageHandler](./react-native-tracker.webviewmessagehandler.md) + +## WebViewMessageHandler type + +A callback to be used for the `onMessage` prop of a `WebView` component. + +Signature: + +```typescript +export declare type WebViewMessageHandler = (message: { + nativeEvent: { + data: string; + }; +}) => void; +``` diff --git a/api-docs/docs/react-native-tracker/react-native-tracker.api.md b/api-docs/docs/react-native-tracker/react-native-tracker.api.md new file mode 100644 index 000000000..f362c5679 --- /dev/null +++ b/api-docs/docs/react-native-tracker/react-native-tracker.api.md @@ -0,0 +1,572 @@ +## API Report File for "@snowplow/react-native-tracker" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts + +import { BrowserPlugin } from '@snowplow/browser-tracker-core'; +import { BrowserPluginConfiguration } from '@snowplow/browser-tracker-core'; +import { Platform } from '@snowplow/browser-tracker-core'; +import { ScreenTrackingConfiguration } from '@snowplow/browser-plugin-screen-tracking'; + +// @public +export interface AppLifecycleConfiguration { + appBuild?: string; + appVersion?: string; + installAutotracking?: boolean; + lifecycleAutotracking?: boolean; +} + +// @public (undocumented) +export interface AsyncStorage { + // (undocumented) + getItem: (key: string) => Promise; + // (undocumented) + setItem: (key: string, value: string) => Promise; +} + +// @public +export type ConditionalContextProvider = FilterProvider | RuleSetProvider; + +// Warning: (ae-forgotten-export) The symbol "ContextEvent" needs to be exported by the entry point index.d.ts +// +// @public +export type ContextFilter = (args?: ContextEvent) => boolean; + +// Warning: (ae-forgotten-export) The symbol "SelfDescribingJson" needs to be exported by the entry point index.d.ts +// +// @public +export type ContextGenerator = (args?: ContextEvent) => SelfDescribingJson | SelfDescribingJson[] | undefined; + +// @public +export type ContextPrimitive = SelfDescribingJson | ContextGenerator; + +// @public +export interface CoreConfiguration { + /* Should payloads be base64 encoded when built */ + // (undocumented) + base64?: boolean; + /* A list of all the plugins to include at load */ + // (undocumented) + callback?: (PayloadData: PayloadBuilder) => void; + /* A list of all the plugins to include at load */ + // (undocumented) + corePlugins?: Array; +} + +// @public +export interface CorePlugin { + activateCorePlugin?: (core: TrackerCore) => void; + afterTrack?: (payload: Payload) => void; + beforeTrack?: (payloadBuilder: PayloadBuilder) => void; + contexts?: () => SelfDescribingJson[]; + deactivatePlugin?: (core: TrackerCore) => void; + filter?: (payload: Payload) => boolean; + logger?: (logger: Logger) => void; +} + +// @public +export interface CorePluginConfiguration { + /* The plugin to add */ + // (undocumented) + plugin: CorePlugin; +} + +// @public +export interface DeepLinkConfiguration { + deepLinkContext?: boolean; +} + +// @public +export type DeepLinkReceivedProps = { + url: string; + referrer?: string; +}; + +// @public +export interface DeviceTimestamp { + // (undocumented) + readonly type: "dtm"; + // (undocumented) + readonly value: number; +} + +// @public +export interface Emitter { + flush: () => Promise; + input: (payload: Payload) => Promise; + setAnonymousTracking: (anonymous: boolean) => void; + setBufferSize: (bufferSize: number) => void; + setCollectorUrl: (url: string) => void; +} + +// @public (undocumented) +export interface EmitterConfiguration extends EmitterConfigurationBase { + /* The collector URL to which events will be sent */ + // (undocumented) + endpoint: string; + /* http or https. Defaults to https */ + // (undocumented) + port?: number; + /* http or https. Defaults to https */ + // (undocumented) + protocol?: "http" | "https"; + /* http or https. Defaults to https */ + // (undocumented) + serverAnonymization?: boolean; +} + +// @public (undocumented) +export interface EmitterConfigurationBase { + bufferSize?: number; + connectionTimeout?: number; + cookieExtensionService?: string; + credentials?: "omit" | "same-origin" | "include"; + customFetch?: (input: Request, options?: RequestInit) => Promise; + customHeaders?: Record; + dontRetryStatusCodes?: number[]; + eventMethod?: EventMethod; + // Warning: (ae-forgotten-export) The symbol "EventStore" needs to be exported by the entry point index.d.ts + eventStore?: EventStore; + // @deprecated (undocumented) + idService?: string; + keepalive?: boolean; + maxGetBytes?: number; + maxPostBytes?: number; + onRequestFailure?: (data: RequestFailure, response?: Response) => void; + onRequestSuccess?: (data: EventBatch, response: Response) => void; + postPath?: string; + retryFailedRequests?: boolean; + retryStatusCodes?: number[]; + useStm?: boolean; +} + +// @public +export type EventBatch = Payload[]; + +// @public +export type EventContext = SelfDescribingJson; + +// @public +export type EventJson = Array; + +// @public +export type EventJsonWithKeys = { + keyIfEncoded: string; + keyIfNotEncoded: string; + json: Record; +}; + +// @public (undocumented) +export type EventMethod = "post" | "get"; + +// @public +export interface EventPayloadAndContext { + context: Array; + event: PayloadBuilder; +} + +// @public +export interface EventStoreConfiguration { + asyncStorage?: AsyncStorage; + maxEventStoreSize?: number; + useAsyncStorageForEventStore?: boolean; +} + +// @public +export interface EventStoreIterator { + // Warning: (ae-forgotten-export) The symbol "EventStoreIteratorNextResult" needs to be exported by the entry point index.d.ts + next: () => Promise; +} + +// @public (undocumented) +export interface EventStorePayload { + payload: Payload; + svrAnon?: boolean; +} + +// @public +export type FilterProvider = [ +ContextFilter, +Array | ContextPrimitive +]; + +// @public +export interface FormFocusOrChangeEvent { + elementClasses?: Array | null; + elementId: string; + formId: string; + nodeName: string; + schema: "change_form" | "focus_form"; + type?: string | null; + value: string | null; +} + +// @public +export function getAllTrackers(): ReactNativeTracker[]; + +// @public +export function getTracker(trackerNamespace: string): ReactNativeTracker | undefined; + +// @public +export function getWebViewCallback(): WebViewMessageHandler; + +// @public +export type JsonProcessor = (payloadBuilder: PayloadBuilder, jsonForProcessing: EventJson, contextEntitiesForProcessing: SelfDescribingJson[]) => void; + +// @public +export type ListItemViewProps = { + index: number; + itemsCount?: number; +}; + +// @public (undocumented) +export enum LOG_LEVEL { + // (undocumented) + debug = 3, + // (undocumented) + error = 1, + // (undocumented) + info = 4, + // (undocumented) + none = 0, + // (undocumented) + warn = 2 +} + +// @public (undocumented) +export interface Logger { + // (undocumented) + debug: (message: string, ...extraParams: unknown[]) => void; + // (undocumented) + error: (message: string, error?: unknown, ...extraParams: unknown[]) => void; + // (undocumented) + info: (message: string, ...extraParams: unknown[]) => void; + // (undocumented) + setLogLevel: (level: LOG_LEVEL) => void; + // (undocumented) + warn: (message: string, error?: unknown, ...extraParams: unknown[]) => void; +} + +// @public +export type MessageNotificationAttachmentProps = { + identifier: string; + type: string; + url: string; +}; + +// @public +export type MessageNotificationProps = { + action?: string; + attachments?: MessageNotificationAttachmentProps[]; + body: string; + bodyLocArgs?: string[]; + bodyLocKey?: string; + category?: string; + contentAvailable?: boolean; + group?: string; + icon?: string; + notificationCount?: number; + notificationTimestamp?: string; + sound?: string; + subtitle?: string; + tag?: string; + threadIdentifier?: string; + title: string; + titleLocArgs?: string[]; + titleLocKey?: string; + trigger: Trigger; +}; + +// Warning: (ae-forgotten-export) The symbol "Configuration" needs to be exported by the entry point index.d.ts +// +// @public +export function newTracker(configuration: Configuration): Promise; + +// @public +export interface PageViewEvent { + pageTitle?: string | null; + pageUrl?: string | null; + referrer?: string | null; +} + +// @public +export type Payload = Record; + +// @public +export interface PayloadBuilder { + add: (key: string, value: unknown) => void; + addContextEntity: (entity: SelfDescribingJson) => void; + addDict: (dict: Payload) => void; + addJson: (keyIfEncoded: string, keyIfNotEncoded: string, json: Record) => void; + build: () => Payload; + getJson: () => EventJson; + getPayload: () => Payload; + withJsonProcessor: (jsonProcessor: JsonProcessor) => void; +} + +// @public (undocumented) +export interface PlatformContextConfiguration { + platformContext?: boolean; + platformContextProperties?: PlatformContextProperty[]; + platformContextRetriever?: PlatformContextRetriever; +} + +// @public (undocumented) +export enum PlatformContextProperty { + AndroidIdfa = "androidIdfa", + AppAvailableMemory = "appAvailableMemory", + AppleIdfa = "appleIdfa", + AppleIdfv = "appleIdfv", + AppSetId = "appSetId", + AppSetIdScope = "appSetIdScope", + AvailableStorage = "availableStorage", + BatteryLevel = "batteryLevel", + BatteryState = "batteryState", + Carrier = "carrier", + IsPortrait = "isPortrait", + Language = "language", + LowPowerMode = "lowPowerMode", + NetworkTechnology = "networkTechnology", + NetworkType = "networkType", + PhysicalMemory = "physicalMemory", + Resolution = "resolution", + Scale = "scale", + SystemAvailableMemory = "systemAvailableMemory", + TotalStorage = "totalStorage" +} + +// @public +export interface PlatformContextRetriever { + getAndroidIdfa?: () => Promise; + getAppAvailableMemory?: () => Promise; + getAppleIdfa?: () => Promise; + getAppleIdfv?: () => Promise; + getAppSetId?: () => Promise; + getAppSetIdScope?: () => Promise; + getAvailableStorage?: () => Promise; + getBatteryLevel?: () => Promise; + getBatteryState?: () => Promise<'unplugged' | 'charging' | 'full' | undefined>; + getCarrier?: () => Promise; + getDeviceManufacturer?: () => Promise; + getDeviceModel?: () => Promise; + getLanguage?: () => Promise; + getLowPowerMode?: () => Promise; + getNetworkTechnology?: () => Promise; + getNetworkType?: () => Promise<'mobile' | 'wifi' | 'offline' | undefined>; + getOsType?: () => Promise; + getOsVersion?: () => Promise; + getPhysicalMemory?: () => Promise; + getResolution?: () => Promise; + getScale?: () => Promise; + getSystemAvailableMemory?: () => Promise; + getTotalStorage?: () => Promise; + isPortrait?: () => Promise; +} + +// @public +export type ReactNativeTracker = { + namespace: string; + readonly trackSelfDescribingEvent: = Record>(argmap: SelfDescribing, contexts?: EventContext[]) => void; + readonly trackScreenViewEvent: (argmap: ScreenViewProps, contexts?: EventContext[]) => void; + readonly trackScrollChangedEvent: (argmap: ScrollChangedProps, contexts?: EventContext[]) => void; + readonly trackListItemViewEvent: (argmap: ListItemViewProps, contexts?: EventContext[]) => void; + readonly trackStructuredEvent: (argmap: StructuredProps, contexts?: EventContext[]) => void; + readonly trackPageViewEvent: (argmap: PageViewEvent, contexts?: EventContext[]) => void; + readonly trackTimingEvent: (argmap: TimingProps, contexts?: EventContext[]) => void; + readonly trackDeepLinkReceivedEvent: (argmap: DeepLinkReceivedProps, contexts?: EventContext[]) => void; + readonly trackMessageNotificationEvent: (argmap: MessageNotificationProps, contexts?: EventContext[]) => void; + addGlobalContexts(contexts: Array | Record): void; + clearGlobalContexts(): void; + removeGlobalContexts(contexts: Array): void; + addPlugin(configuration: BrowserPluginConfiguration): void; + flush: () => Promise; + readonly setAppId: (appId: string) => void; + readonly setPlatform: (value: string) => void; + readonly setUserId: (newUid: string) => void; + readonly setNetworkUserId: (newNuid: string | undefined) => void; + readonly setDomainUserId: (newDuid: string | undefined) => void; + readonly setIpAddress: (newIp: string) => void; + readonly setUseragent: (newUagent: string) => void; + readonly setTimezone: (newTz: string) => void; + readonly setLanguage: (newLang: string) => void; + readonly setScreenResolution: (newRes: ScreenSize) => void; + readonly setScreenViewport: (newView: ScreenSize) => void; + readonly setColorDepth: (newLang: number) => void; + readonly setSubjectData: (config: SubjectConfiguration) => void; + readonly getSessionUserId: () => Promise; + readonly getSessionId: () => Promise; + readonly getSessionIndex: () => Promise; + readonly getSessionState: () => Promise; + readonly getIsInBackground: () => boolean | undefined; + readonly getBackgroundIndex: () => number | undefined; + readonly getForegroundIndex: () => number | undefined; + readonly enablePlatformContext: () => Promise; + readonly disablePlatformContext: () => void; + readonly refreshPlatformContext: () => Promise; +}; + +// @public +export function removeAllTrackers(): void; + +// @public +export function removeTracker(trackerNamespace: string): void; + +// @public +export type RequestFailure = { + events: EventBatch; + status?: number; + message?: string; + willRetry: boolean; +}; + +// @public +export interface RuleSet { + // (undocumented) + accept?: Array | string; + // (undocumented) + reject?: Array | string; +} + +// @public +export type RuleSetProvider = [ +RuleSet, +Array | ContextPrimitive +]; + +// @public +export type ScreenSize = [number, number]; + +// @public +export type ScreenViewProps = { + name: string; + id?: string; + type?: string; + previousName?: string; + previousId?: string; + previousType?: string; + transitionType?: string; +}; + +// @public +export type ScrollChangedProps = { + yOffset?: number; + xOffset?: number; + viewHeight?: number; + viewWidth?: number; + contentHeight?: number; + contentWidth?: number; +}; + +// @public +export type SelfDescribing> = SelfDescribingJson; + +// @public +export interface SessionConfiguration { + backgroundSessionTimeout?: number; + foregroundSessionTimeout?: number; + sessionContext?: boolean; +} + +// @public +export interface SessionState { + eventIndex?: number; + firstEventId?: string; + firstEventTimestamp?: string; + previousSessionId?: string; + sessionId: string; + sessionIndex: number; + storageMechanism: string; + userId: string; +} + +// Warning: (ae-forgotten-export) The symbol "StructuredEvent" needs to be exported by the entry point index.d.ts +// +// @public +export type StructuredProps = StructuredEvent; + +// @public +export interface SubjectConfiguration { + colorDepth?: number; + domainUserId?: string; + ipAddress?: string; + language?: string; + networkUserId?: string; + screenResolution?: ScreenSize; + screenViewport?: ScreenSize; + timezone?: string; + useragent?: string; + userId?: string; +} + +// @public +export type Timestamp = TrueTimestamp | DeviceTimestamp | number; + +// @public +export type TimingProps = { + category: string; + variable: string; + timing: number; + label?: string; +}; + +// @public +export interface TrackerConfiguration { + appId?: string; + devicePlatform?: Platform; + encodeBase64?: boolean; + namespace: string; + plugins?: BrowserPlugin[]; +} + +// @public +export interface TrackerCore { + addGlobalContexts(contexts: Array | Record): void; + addPayloadDict(dict: Payload): void; + addPayloadPair: (key: string, value: unknown) => void; + addPlugin(configuration: CorePluginConfiguration): void; + clearGlobalContexts(): void; + deactivate(): void; + getBase64Encoding(): boolean; + removeGlobalContexts(contexts: Array): void; + resetPayloadPairs(dict: Payload): void; + setAppId(appId: string): void; + setBase64Encoding(encode: boolean): void; + setColorDepth(depth: string): void; + setIpAddress(ip: string): void; + setLang(lang: string): void; + setPlatform(value: string): void; + setScreenResolution(width: string, height: string): void; + setTimezone(timezone: string): void; + setTrackerNamespace(name: string): void; + setTrackerVersion(version: string): void; + setUseragent(useragent: string): void; + setUserId(userId: string): void; + setViewport(width: string, height: string): void; + track: (pb: PayloadBuilder, context?: Array | null, timestamp?: Timestamp | null) => Payload | undefined; +} + +// @public +export type Trigger = 'push' | 'location' | 'calendar' | 'timeInterval' | 'other'; + +// @public +export interface TrueTimestamp { + // (undocumented) + readonly type: "ttm"; + // (undocumented) + readonly value: number; +} + +// @public (undocumented) +export const version: string; + +// @public +export type WebViewMessageHandler = (message: { + nativeEvent: { + data: string; + }; +}) => void; + +// (No @packageDocumentation comment for this package) + +``` diff --git a/api-docs/docusaurus.config.js b/api-docs/docusaurus.config.js index 3c37c193c..7573216a1 100644 --- a/api-docs/docusaurus.config.js +++ b/api-docs/docusaurus.config.js @@ -10,7 +10,7 @@ import { themes as prismThemes } from 'prism-react-renderer'; const config = { title: 'Snowplow Javascript API Docs', favicon: 'img/favicon.ico', - url: 'http://snowplow.github.io/', + url: 'http://snowplow.github.io', baseUrl: '/snowplow-javascript-tracker/', organizationName: 'snowplow', projectName: 'snowplow-javascript-tracker', @@ -62,7 +62,7 @@ const config = { items: [ { label: 'Snowplow JS Docs', - to: 'https://docs.snowplow.io/docs/collecting-data/collecting-from-own-applications/javascript-trackers/', + to: 'https://docs.snowplow.io/docs/sources/trackers/web-trackers/', }, ], }, @@ -70,8 +70,8 @@ const config = { title: 'Community', items: [ { - label: 'Discourse', - href: 'https://discourse.snowplow.io/', + label: 'Community', + href: 'https://community.snowplow.io/', }, { label: 'Website', diff --git a/api-docs/package-lock.json b/api-docs/package-lock.json index 90f710db5..694fffc0e 100644 --- a/api-docs/package-lock.json +++ b/api-docs/package-lock.json @@ -9,8 +9,8 @@ "version": "0.0.0", "license": "ISC", "dependencies": { - "@docusaurus/core": "3.4.0", - "@docusaurus/preset-classic": "3.4.0", + "@docusaurus/core": "3.10.0", + "@docusaurus/preset-classic": "3.10.0", "@mdx-js/react": "^3.0.1", "clsx": "^1.2.1", "prism-react-renderer": "^2.3.1", @@ -18,303 +18,285 @@ "react-dom": "^18.3.1" }, "devDependencies": { - "@docusaurus/module-type-aliases": "3.4.0", - "@docusaurus/types": "3.4.0" + "@docusaurus/module-type-aliases": "3.10.0", + "@docusaurus/types": "3.10.0" }, "engines": { "node": ">=18.0" } }, - "node_modules/@algolia/autocomplete-core": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", - "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", + "node_modules/@algolia/abtesting": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.16.2.tgz", + "integrity": "sha512-n9s6bEV6imdtIEd+BGP7WkA4pEZ5YTdgQ05JQhHwWawHg3hyjpNwC0TShGz6zWhv+jfLDGA/6FFNbySFS0P9cw==", + "license": "MIT", "dependencies": { - "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", - "@algolia/autocomplete-shared": "1.9.3" + "@algolia/client-common": "5.50.2", + "@algolia/requester-browser-xhr": "5.50.2", + "@algolia/requester-fetch": "5.50.2", + "@algolia/requester-node-http": "5.50.2" + }, + "engines": { + "node": ">= 14.0.0" } }, - "node_modules/@algolia/autocomplete-plugin-algolia-insights": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", - "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", + "node_modules/@algolia/autocomplete-core": { + "version": "1.19.8", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.8.tgz", + "integrity": "sha512-3YEorYg44niXcm7gkft3nXYItHd44e8tmh4D33CTszPgP0QWkaLEaFywiNyJBo7UL/mqObA/G9RYuU7R8tN1IA==", + "license": "MIT", "dependencies": { - "@algolia/autocomplete-shared": "1.9.3" - }, - "peerDependencies": { - "search-insights": ">= 1 < 3" + "@algolia/autocomplete-plugin-algolia-insights": "1.19.8", + "@algolia/autocomplete-shared": "1.19.8" } }, - "node_modules/@algolia/autocomplete-preset-algolia": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", - "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.19.8", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.8.tgz", + "integrity": "sha512-ZvJWO8ZZJDpc1LNM2TTBdmQsZBLMR4rU5iNR2OYvEeFBiaf/0ESnRSSLQbryarJY4SVxtoz6A2ZtDMNM+iQEAA==", + "license": "MIT", "dependencies": { - "@algolia/autocomplete-shared": "1.9.3" + "@algolia/autocomplete-shared": "1.19.8" }, "peerDependencies": { - "@algolia/client-search": ">= 4.9.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" + "search-insights": ">= 1 < 3" } }, "node_modules/@algolia/autocomplete-shared": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", - "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", + "version": "1.19.8", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.8.tgz", + "integrity": "sha512-h5hf2t8ejF6vlOgvLaZzQbWs5SyH2z4PAWygNAvvD/2RI29hdQ54ldUGwqVuj9Srs+n8XUKTPUqb7fvhBhQrnQ==", + "license": "MIT", "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", "algoliasearch": ">= 4.9.1 < 6" } }, - "node_modules/@algolia/cache-browser-local-storage": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.24.0.tgz", - "integrity": "sha512-t63W9BnoXVrGy9iYHBgObNXqYXM3tYXCjDSHeNwnsc324r4o5UiVKUiAB4THQ5z9U5hTj6qUvwg/Ez43ZD85ww==", + "node_modules/@algolia/client-abtesting": { + "version": "5.50.2", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.50.2.tgz", + "integrity": "sha512-52iq0vHy1sphgnwoZyx5PmbEt8hsh+m7jD123LmBs6qy4GK7LbYZIeKd+nSnSipN2zvKRZ2zScS6h9PW3J7SXg==", + "license": "MIT", "dependencies": { - "@algolia/cache-common": "4.24.0" + "@algolia/client-common": "5.50.2", + "@algolia/requester-browser-xhr": "5.50.2", + "@algolia/requester-fetch": "5.50.2", + "@algolia/requester-node-http": "5.50.2" + }, + "engines": { + "node": ">= 14.0.0" } }, - "node_modules/@algolia/cache-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.24.0.tgz", - "integrity": "sha512-emi+v+DmVLpMGhp0V9q9h5CdkURsNmFC+cOS6uK9ndeJm9J4TiqSvPYVu+THUP8P/S08rxf5x2P+p3CfID0Y4g==" - }, - "node_modules/@algolia/cache-in-memory": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.24.0.tgz", - "integrity": "sha512-gDrt2so19jW26jY3/MkFg5mEypFIPbPoXsQGQWAi6TrCPsNOSEYepBMPlucqWigsmEy/prp5ug2jy/N3PVG/8w==", + "node_modules/@algolia/client-analytics": { + "version": "5.50.2", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.50.2.tgz", + "integrity": "sha512-WpPIUg+cSG2aPUG0gS8Ko9DwRgbRPUZxJkolhL2aCsmSlcEEZT65dILrfg5ovcxtx0Kvr+xtBVsTMtsQWRtPDQ==", + "license": "MIT", "dependencies": { - "@algolia/cache-common": "4.24.0" + "@algolia/client-common": "5.50.2", + "@algolia/requester-browser-xhr": "5.50.2", + "@algolia/requester-fetch": "5.50.2", + "@algolia/requester-node-http": "5.50.2" + }, + "engines": { + "node": ">= 14.0.0" } }, - "node_modules/@algolia/client-account": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.24.0.tgz", - "integrity": "sha512-adcvyJ3KjPZFDybxlqnf+5KgxJtBjwTPTeyG2aOyoJvx0Y8dUQAEOEVOJ/GBxX0WWNbmaSrhDURMhc+QeevDsA==", - "dependencies": { - "@algolia/client-common": "4.24.0", - "@algolia/client-search": "4.24.0", - "@algolia/transporter": "4.24.0" + "node_modules/@algolia/client-common": { + "version": "5.50.2", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.50.2.tgz", + "integrity": "sha512-Gj2MgtArGcsr82kIqRlo6/dCAFjrs2gLByEqyRENuT7ugrSMFuqg1vDzeBjRL1t3EJEJCFtT0PLX3gB8A6Hq4Q==", + "license": "MIT", + "engines": { + "node": ">= 14.0.0" } }, - "node_modules/@algolia/client-analytics": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.24.0.tgz", - "integrity": "sha512-y8jOZt1OjwWU4N2qr8G4AxXAzaa8DBvyHTWlHzX/7Me1LX8OayfgHexqrsL4vSBcoMmVw2XnVW9MhL+Y2ZDJXg==", + "node_modules/@algolia/client-insights": { + "version": "5.50.2", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.50.2.tgz", + "integrity": "sha512-CUqoid5jDpmrc0oK3/xuZXFt6kwT0P9Lw7/nsM14YTr6puvmi+OUKmURpmebQF22S2vCG8L1DAoXXujxQUi/ug==", + "license": "MIT", "dependencies": { - "@algolia/client-common": "4.24.0", - "@algolia/client-search": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" + "@algolia/client-common": "5.50.2", + "@algolia/requester-browser-xhr": "5.50.2", + "@algolia/requester-fetch": "5.50.2", + "@algolia/requester-node-http": "5.50.2" + }, + "engines": { + "node": ">= 14.0.0" } }, - "node_modules/@algolia/client-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", - "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", + "node_modules/@algolia/client-personalization": { + "version": "5.50.2", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.50.2.tgz", + "integrity": "sha512-AndZWFoc0gbP5901OeQJ73BazgGgSGiBEba4ohdoJuZwHTO2Gio8Q4L1VLmytMBYcviVigB0iICToMvEJxI4ug==", + "license": "MIT", "dependencies": { - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" + "@algolia/client-common": "5.50.2", + "@algolia/requester-browser-xhr": "5.50.2", + "@algolia/requester-fetch": "5.50.2", + "@algolia/requester-node-http": "5.50.2" + }, + "engines": { + "node": ">= 14.0.0" } }, - "node_modules/@algolia/client-personalization": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.24.0.tgz", - "integrity": "sha512-l5FRFm/yngztweU0HdUzz1rC4yoWCFo3IF+dVIVTfEPg906eZg5BOd1k0K6rZx5JzyyoP4LdmOikfkfGsKVE9w==", + "node_modules/@algolia/client-query-suggestions": { + "version": "5.50.2", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.50.2.tgz", + "integrity": "sha512-NWoL+psEkz5dIzweaByVXuEB45wS8/rk0E0AhMMnaVJdVs7TcACPH2/OURm+N0xRDITkTHqCna823rd6Uqntdg==", + "license": "MIT", "dependencies": { - "@algolia/client-common": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" + "@algolia/client-common": "5.50.2", + "@algolia/requester-browser-xhr": "5.50.2", + "@algolia/requester-fetch": "5.50.2", + "@algolia/requester-node-http": "5.50.2" + }, + "engines": { + "node": ">= 14.0.0" } }, "node_modules/@algolia/client-search": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", - "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", + "version": "5.50.2", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.50.2.tgz", + "integrity": "sha512-ypSboUJ3XJoQz5DeDo82hCnrRuwq3q9ZdFhVKAik9TnZh1DvLqoQsrbBjXg7C7zQOtV/Qbge/HmyoV6V5L7MhQ==", + "license": "MIT", "dependencies": { - "@algolia/client-common": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" + "@algolia/client-common": "5.50.2", + "@algolia/requester-browser-xhr": "5.50.2", + "@algolia/requester-fetch": "5.50.2", + "@algolia/requester-node-http": "5.50.2" + }, + "engines": { + "node": ">= 14.0.0" } }, "node_modules/@algolia/events": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", - "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" - }, - "node_modules/@algolia/logger-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.24.0.tgz", - "integrity": "sha512-LLUNjkahj9KtKYrQhFKCzMx0BY3RnNP4FEtO+sBybCjJ73E8jNdaKJ/Dd8A/VA4imVHP5tADZ8pn5B8Ga/wTMA==" - }, - "node_modules/@algolia/logger-console": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.24.0.tgz", - "integrity": "sha512-X4C8IoHgHfiUROfoRCV+lzSy+LHMgkoEEU1BbKcsfnV0i0S20zyy0NLww9dwVHUWNfPPxdMU+/wKmLGYf96yTg==", - "dependencies": { - "@algolia/logger-common": "4.24.0" - } - }, - "node_modules/@algolia/recommend": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.24.0.tgz", - "integrity": "sha512-P9kcgerfVBpfYHDfVZDvvdJv0lEoCvzNlOy2nykyt5bK8TyieYyiD0lguIJdRZZYGre03WIAFf14pgE+V+IBlw==", - "dependencies": { - "@algolia/cache-browser-local-storage": "4.24.0", - "@algolia/cache-common": "4.24.0", - "@algolia/cache-in-memory": "4.24.0", - "@algolia/client-common": "4.24.0", - "@algolia/client-search": "4.24.0", - "@algolia/logger-common": "4.24.0", - "@algolia/logger-console": "4.24.0", - "@algolia/requester-browser-xhr": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/requester-node-http": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "node_modules/@algolia/requester-browser-xhr": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.24.0.tgz", - "integrity": "sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==", - "dependencies": { - "@algolia/requester-common": "4.24.0" - } - }, - "node_modules/@algolia/requester-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.24.0.tgz", - "integrity": "sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA==" - }, - "node_modules/@algolia/requester-node-http": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz", - "integrity": "sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==", - "dependencies": { - "@algolia/requester-common": "4.24.0" - } - }, - "node_modules/@algolia/transporter": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.24.0.tgz", - "integrity": "sha512-86nI7w6NzWxd1Zp9q3413dRshDqAzSbsQjhcDhPIatEFiZrL1/TjnHL8S7jVKFePlIMzDsZWXAXwXzcok9c5oA==", - "dependencies": { - "@algolia/cache-common": "4.24.0", - "@algolia/logger-common": "4.24.0", - "@algolia/requester-common": "4.24.0" - } + "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==", + "license": "MIT" }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "node_modules/@algolia/ingestion": { + "version": "1.50.2", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.50.2.tgz", + "integrity": "sha512-VlR2FRXLw2bCB94SQo6zxg/Qi+547aOji6Pb+dKE7h1DMCCY317St+OpjpmgzE+bT2O9ALIc0V4nVIBOd7Gy+Q==", + "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@algolia/client-common": "5.50.2", + "@algolia/requester-browser-xhr": "5.50.2", + "@algolia/requester-fetch": "5.50.2", + "@algolia/requester-node-http": "5.50.2" }, "engines": { - "node": ">=6.0.0" + "node": ">= 14.0.0" } }, - "node_modules/@babel/code-frame": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.4.tgz", - "integrity": "sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==", + "node_modules/@algolia/monitoring": { + "version": "1.50.2", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.50.2.tgz", + "integrity": "sha512-Cmvfp2+qopzQt8OilU97rhLhosq7ZrB6uieok3EwFUqG/aalPg6DgfCmu0yJMrYe+KMC1qRVt1MTRAUwLknUMQ==", + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@algolia/client-common": "5.50.2", + "@algolia/requester-browser-xhr": "5.50.2", + "@algolia/requester-fetch": "5.50.2", + "@algolia/requester-node-http": "5.50.2" }, "engines": { - "node": ">=6.9.0" + "node": ">= 14.0.0" } }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@algolia/recommend": { + "version": "5.50.2", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.50.2.tgz", + "integrity": "sha512-jrkuyKoOM7dFWQ/6Y4hQAse2SC3L/RldG6GnPjMvAj65h+7Ubb51S0pKk4ofSStF0xm4LCNe0C4T6XX4nOFDiQ==", + "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "@algolia/client-common": "5.50.2", + "@algolia/requester-browser-xhr": "5.50.2", + "@algolia/requester-fetch": "5.50.2", + "@algolia/requester-node-http": "5.50.2" }, "engines": { - "node": ">=4" + "node": ">= 14.0.0" } }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.50.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.50.2.tgz", + "integrity": "sha512-4107YLJqCudPiBUlwnk6oTSUVwU7ab+qL1SfQGEDYI8DZH5gsf1ekPt9JykXRKYXf2IfouFL5GiCY/PHTFIjYw==", + "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@algolia/client-common": "5.50.2" }, "engines": { - "node": ">=4" + "node": ">= 14.0.0" } }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/@algolia/requester-fetch": { + "version": "5.50.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.50.2.tgz", + "integrity": "sha512-vOrd3MQpLgmf6wXAueTuZ/cA0W4uRwIHHaxNy3h+a6YcNn6bCV/gFdZuv3F13v593zRU2k5R75NmvRWLenvMrw==", + "license": "MIT", "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "@algolia/client-common": "5.50.2" + }, "engines": { - "node": ">=0.8.0" + "node": ">= 14.0.0" } }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/@algolia/requester-node-http": { + "version": "5.50.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.50.2.tgz", + "integrity": "sha512-Mu9BFtgzGqDUy5Bcs2nMyoILIFSN13GKQaklKAFIsd0K3/9CpNyfeBc+/+Qs6mFZLlxG9qzullO7h+bjcTBuGQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.50.2" + }, "engines": { - "node": ">=4" + "node": ">= 14.0.0" } }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", - "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", - "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.3", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.3", - "@babel/types": "^7.23.3", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -333,54 +315,48 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.4.tgz", - "integrity": "sha512-esuS49Cga3HcThFNebGhlgsrVLkvhqvYDTzgjfFFlHJcIfLe5jFmRRfCQ1KuBfc4Jrtn3ndLgKWAKjBE+IraYQ==", + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.23.4", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.27.3" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -392,23 +368,23 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", - "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", + "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.6", "semver": "^6.3.1" }, "engines": { @@ -422,17 +398,19 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", + "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", "semver": "^6.3.1" }, "engines": { @@ -446,88 +424,71 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", - "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz", + "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "debug": "^4.4.3", "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" + "resolve": "^1.22.11" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dependencies": { - "@babel/types": "^7.22.5" - }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.23.0" + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -537,32 +498,35 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", - "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -572,13 +536,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5" + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -587,183 +552,126 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", + "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", + "license": "MIT", "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.4.tgz", - "integrity": "sha512-HfcMizYz10cr3h29VqyfGL6ZWIjTwWfvYBMsBVGwpcbhNGe3wQ1ZXZRPzZoAHhd9OqHadHqjQ89iVKINXnbzuw==", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "license": "MIT", "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.4", - "@babel/types": "^7.23.4" + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "@babel/types": "^7.29.0" }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": ">=4" + "node": ">=6.0.0" } }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", + "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", + "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" }, "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.4.tgz", - "integrity": "sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==", - "bin": { - "parser": "bin/babel-parser.js" + "node": ">=6.9.0" }, - "engines": { - "node": ">=6.0.0" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", - "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -773,13 +681,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", - "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.23.3" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -789,12 +698,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz", - "integrity": "sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz", + "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==", + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -807,6 +717,7 @@ "version": "7.21.0-placeholder-for-preset-env.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "license": "MIT", "engines": { "node": ">=6.9.0" }, @@ -814,10 +725,11 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -825,23 +737,28 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", + "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -850,34 +767,28 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.28.6" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", - "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -886,48 +797,63 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", - "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz", + "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", + "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -936,78 +862,112 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", + "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", + "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", + "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.12.0" } }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", + "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", + "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/template": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -1016,12 +976,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz", + "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1030,12 +992,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", - "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1044,13 +1007,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==", + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1059,12 +1023,13 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", - "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1073,15 +1038,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.4.tgz", - "integrity": "sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==", + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz", + "integrity": "sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==", + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -1090,14 +1054,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", - "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz", + "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==", + "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1106,12 +1069,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", - "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1120,182 +1084,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", - "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", - "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", - "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.3.tgz", - "integrity": "sha512-FGEQmugvAEu2QtgtU0uTASXevfLMFfBeVCIIdcQhn/uBQsMTjBajdnAtanQlOcuihWh10PZ7+HWvc7NtBwP74w==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", - "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", - "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", - "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", - "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", - "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", - "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", - "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.3.tgz", - "integrity": "sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1305,13 +1101,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", - "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1321,12 +1118,12 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", - "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz", + "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1336,11 +1133,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", - "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1350,12 +1148,12 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", - "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", + "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1365,11 +1163,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", - "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1379,12 +1178,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", - "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1394,13 +1194,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", - "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", + "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1410,14 +1210,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", - "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.0.tgz", + "integrity": "sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==", + "license": "MIT", "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.29.0" }, "engines": { "node": ">=6.9.0" @@ -1427,12 +1228,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", - "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1442,12 +1244,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==", + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1457,11 +1260,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", - "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1471,12 +1275,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", - "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", + "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1486,12 +1290,12 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", - "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", + "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1501,15 +1305,16 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", - "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", + "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.23.3" + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1519,12 +1324,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", - "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1534,12 +1340,12 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", - "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", + "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1549,13 +1355,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", - "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", + "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1565,11 +1371,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", - "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1579,12 +1386,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", - "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", + "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1594,14 +1402,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", - "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", + "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1611,11 +1419,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", - "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1625,11 +1434,12 @@ } }, "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.24.7.tgz", - "integrity": "sha512-7LidzZfUXyfZ8/buRW6qIIHBY8wAZ1OrY9c/wTr8YhZ6vMPo+Uc/CVFLYY1spZrEQlD4w5u8wjqk5NQ3OVqQKA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz", + "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1639,11 +1449,12 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz", - "integrity": "sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1653,15 +1464,16 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", - "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.28.6.tgz", + "integrity": "sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/types": "^7.23.4" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-syntax-jsx": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1671,11 +1483,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", - "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", + "license": "MIT", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.22.5" + "@babel/plugin-transform-react-jsx": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1685,12 +1498,13 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz", - "integrity": "sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1700,12 +1514,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", - "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz", + "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.2" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1714,12 +1528,29 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz", + "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", - "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1729,15 +1560,16 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.4.tgz", - "integrity": "sha512-ITwqpb6V4btwUG0YJR82o2QvmWrLgDnx/p2A3CTPYGaRgULkDiC0DRA2C4jlRB9uXGUEfaSS/IGHfVW+ohzYDw==", - "dependencies": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.6", - "babel-plugin-polyfill-corejs3": "^0.8.5", - "babel-plugin-polyfill-regenerator": "^0.5.3", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.0.tgz", + "integrity": "sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", "semver": "^6.3.1" }, "engines": { @@ -1751,16 +1583,18 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", - "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1770,12 +1604,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", - "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", + "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1785,11 +1620,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", - "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1799,11 +1635,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", - "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1813,11 +1650,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", - "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1827,14 +1665,16 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.4.tgz", - "integrity": "sha512-39hCCOl+YUAyMOu6B9SmUTiHUU0t/CxJNUmY3qRdJujbqi+lrQcL11ysYUsAvFWPBdhihrv1z0oRG84Yr3dODQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz", + "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-typescript": "^7.23.3" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1844,11 +1684,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", - "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1858,12 +1699,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", - "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz", + "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==", + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1873,12 +1715,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", - "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1888,12 +1731,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", - "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz", + "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==", + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1903,89 +1747,80 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.3.tgz", - "integrity": "sha512-ovzGc2uuyNfNAs/jyjIGxS8arOHS5FENZaNn4rtE7UdKMMkqHCvboHfcuhWLZNX5cB44QfcGNWjaevxMzzMf+Q==", - "dependencies": { - "@babel/compat-data": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.3", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.2.tgz", + "integrity": "sha512-DYD23veRYGvBFhcTY1iUvJnDNpuqNd/BzBwCvzOTKUnJjKg5kpUBh3/u9585Agdkgj+QuygG7jLfOPWMa2KVNw==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.23.3", - "@babel/plugin-syntax-import-attributes": "^7.23.3", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-import-assertions": "^7.28.6", + "@babel/plugin-syntax-import-attributes": "^7.28.6", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.3", - "@babel/plugin-transform-async-to-generator": "^7.23.3", - "@babel/plugin-transform-block-scoped-functions": "^7.23.3", - "@babel/plugin-transform-block-scoping": "^7.23.3", - "@babel/plugin-transform-class-properties": "^7.23.3", - "@babel/plugin-transform-class-static-block": "^7.23.3", - "@babel/plugin-transform-classes": "^7.23.3", - "@babel/plugin-transform-computed-properties": "^7.23.3", - "@babel/plugin-transform-destructuring": "^7.23.3", - "@babel/plugin-transform-dotall-regex": "^7.23.3", - "@babel/plugin-transform-duplicate-keys": "^7.23.3", - "@babel/plugin-transform-dynamic-import": "^7.23.3", - "@babel/plugin-transform-exponentiation-operator": "^7.23.3", - "@babel/plugin-transform-export-namespace-from": "^7.23.3", - "@babel/plugin-transform-for-of": "^7.23.3", - "@babel/plugin-transform-function-name": "^7.23.3", - "@babel/plugin-transform-json-strings": "^7.23.3", - "@babel/plugin-transform-literals": "^7.23.3", - "@babel/plugin-transform-logical-assignment-operators": "^7.23.3", - "@babel/plugin-transform-member-expression-literals": "^7.23.3", - "@babel/plugin-transform-modules-amd": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-modules-systemjs": "^7.23.3", - "@babel/plugin-transform-modules-umd": "^7.23.3", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.23.3", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.3", - "@babel/plugin-transform-numeric-separator": "^7.23.3", - "@babel/plugin-transform-object-rest-spread": "^7.23.3", - "@babel/plugin-transform-object-super": "^7.23.3", - "@babel/plugin-transform-optional-catch-binding": "^7.23.3", - "@babel/plugin-transform-optional-chaining": "^7.23.3", - "@babel/plugin-transform-parameters": "^7.23.3", - "@babel/plugin-transform-private-methods": "^7.23.3", - "@babel/plugin-transform-private-property-in-object": "^7.23.3", - "@babel/plugin-transform-property-literals": "^7.23.3", - "@babel/plugin-transform-regenerator": "^7.23.3", - "@babel/plugin-transform-reserved-words": "^7.23.3", - "@babel/plugin-transform-shorthand-properties": "^7.23.3", - "@babel/plugin-transform-spread": "^7.23.3", - "@babel/plugin-transform-sticky-regex": "^7.23.3", - "@babel/plugin-transform-template-literals": "^7.23.3", - "@babel/plugin-transform-typeof-symbol": "^7.23.3", - "@babel/plugin-transform-unicode-escapes": "^7.23.3", - "@babel/plugin-transform-unicode-property-regex": "^7.23.3", - "@babel/plugin-transform-unicode-regex": "^7.23.3", - "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.29.0", + "@babel/plugin-transform-async-to-generator": "^7.28.6", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.6", + "@babel/plugin-transform-class-properties": "^7.28.6", + "@babel/plugin-transform-class-static-block": "^7.28.6", + "@babel/plugin-transform-classes": "^7.28.6", + "@babel/plugin-transform-computed-properties": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-dotall-regex": "^7.28.6", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.0", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.6", + "@babel/plugin-transform-exponentiation-operator": "^7.28.6", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.28.6", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.6", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.28.6", + "@babel/plugin-transform-modules-systemjs": "^7.29.0", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.0", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6", + "@babel/plugin-transform-numeric-separator": "^7.28.6", + "@babel/plugin-transform-object-rest-spread": "^7.28.6", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.28.6", + "@babel/plugin-transform-optional-chaining": "^7.28.6", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.28.6", + "@babel/plugin-transform-private-property-in-object": "^7.28.6", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.29.0", + "@babel/plugin-transform-regexp-modifiers": "^7.28.6", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.28.6", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.28.6", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.28.6", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.6", - "babel-plugin-polyfill-corejs3": "^0.8.5", - "babel-plugin-polyfill-regenerator": "^0.5.3", - "core-js-compat": "^3.31.0", + "babel-plugin-polyfill-corejs2": "^0.4.15", + "babel-plugin-polyfill-corejs3": "^0.14.0", + "babel-plugin-polyfill-regenerator": "^0.6.6", + "core-js-compat": "^3.48.0", "semver": "^6.3.1" }, "engines": { @@ -1995,10 +1830,24 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz", + "integrity": "sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.8", + "core-js-compat": "^3.48.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/@babel/preset-env/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -2007,6 +1856,7 @@ "version": "0.1.6-no-external-plugins", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/types": "^7.4.4", @@ -2017,16 +1867,17 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.23.3.tgz", - "integrity": "sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.28.5.tgz", + "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-transform-react-display-name": "^7.23.3", - "@babel/plugin-transform-react-jsx": "^7.22.15", - "@babel/plugin-transform-react-jsx-development": "^7.22.5", - "@babel/plugin-transform-react-pure-annotations": "^7.23.3" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.28.0", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2036,15 +1887,16 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz", - "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", + "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-typescript": "^7.23.3" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -2053,75 +1905,55 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" - }, "node_modules/@babel/runtime": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.4.tgz", - "integrity": "sha512-2Yv65nlWnWlSpe3fXEyX5i7fx5kIKo4Qbcj+hMO0odwaneFjfXw5fdum+4yL20O0QiaHpia0cYQ9xpNMqrBwHg==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.23.4.tgz", - "integrity": "sha512-zQyB4MJGM+rvd4pM58n26kf3xbiitw9MHzL8oLiBMKb8MCtVDfV5nDzzJWWzLMtbvKI9wN6XwJYl479qF4JluQ==", - "dependencies": { - "core-js-pure": "^3.30.2", - "regenerator-runtime": "^0.14.0" - }, + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.4.tgz", - "integrity": "sha512-IYM8wSUwunWTB6tFC2dkKZhxbIjHoWemdK+3f8/wq8aKhbUscxD5MX72ubd90fxvFknaLPeGw5ycU84V1obHJg==", - "dependencies": { - "@babel/code-frame": "^7.23.4", - "@babel/generator": "^7.23.4", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.4", - "@babel/types": "^7.23.4", - "debug": "^4.1.0", - "globals": "^11.1.0" + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.4.tgz", - "integrity": "sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -2131,181 +1963,1607 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "license": "MIT", "optional": true, "engines": { "node": ">=0.1.90" } }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "node_modules/@csstools/cascade-layer-name-parser": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz", + "integrity": "sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@docsearch/css": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.6.0.tgz", - "integrity": "sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==" - }, - "node_modules/@docsearch/react": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.6.0.tgz", - "integrity": "sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==", - "dependencies": { - "@algolia/autocomplete-core": "1.9.3", - "@algolia/autocomplete-preset-algolia": "1.9.3", - "@docsearch/css": "3.6.0", - "algoliasearch": "^4.19.1" + "node": ">=18" }, "peerDependencies": { - "@types/react": ">= 16.8.0 < 19.0.0", - "react": ">= 16.8.0 < 19.0.0", - "react-dom": ">= 16.8.0 < 19.0.0", - "search-insights": ">= 1 < 3" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" }, - "search-insights": { - "optional": true + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" } }, - "node_modules/@docusaurus/core": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.4.0.tgz", - "integrity": "sha512-g+0wwmN2UJsBqy2fQRQ6fhXruoEa62JDeEa5d8IdTJlMoaDaEDfHh7WjwGRn4opuTQWpjAwP/fbcgyHKlE+64w==", - "dependencies": { - "@babel/core": "^7.23.3", - "@babel/generator": "^7.23.3", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.22.9", - "@babel/preset-env": "^7.22.9", - "@babel/preset-react": "^7.22.5", - "@babel/preset-typescript": "^7.22.5", - "@babel/runtime": "^7.22.6", - "@babel/runtime-corejs3": "^7.22.6", - "@babel/traverse": "^7.22.8", - "@docusaurus/cssnano-preset": "3.4.0", - "@docusaurus/logger": "3.4.0", - "@docusaurus/mdx-loader": "3.4.0", - "@docusaurus/utils": "3.4.0", - "@docusaurus/utils-common": "3.4.0", - "@docusaurus/utils-validation": "3.4.0", - "autoprefixer": "^10.4.14", - "babel-loader": "^9.1.3", - "babel-plugin-dynamic-import-node": "^2.3.3", - "boxen": "^6.2.1", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "clean-css": "^5.3.2", - "cli-table3": "^0.6.3", - "combine-promises": "^1.1.0", - "commander": "^5.1.0", - "copy-webpack-plugin": "^11.0.0", - "core-js": "^3.31.1", - "css-loader": "^6.8.1", - "css-minimizer-webpack-plugin": "^5.0.1", - "cssnano": "^6.1.2", - "del": "^6.1.1", - "detect-port": "^1.5.1", - "escape-html": "^1.0.3", - "eta": "^2.2.0", - "eval": "^0.1.8", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "html-minifier-terser": "^7.2.0", - "html-tags": "^3.3.1", - "html-webpack-plugin": "^5.5.3", - "leven": "^3.1.0", - "lodash": "^4.17.21", - "mini-css-extract-plugin": "^2.7.6", - "p-map": "^4.0.0", - "postcss": "^8.4.26", - "postcss-loader": "^7.3.3", - "prompts": "^2.4.2", - "react-dev-utils": "^12.0.1", - "react-helmet-async": "^1.3.0", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", - "react-loadable-ssr-addon-v5-slorber": "^1.0.1", - "react-router": "^5.3.4", - "react-router-config": "^5.1.1", - "react-router-dom": "^5.3.4", - "rtl-detect": "^1.0.4", - "semver": "^7.5.4", - "serve-handler": "^6.1.5", - "shelljs": "^0.8.5", - "terser-webpack-plugin": "^5.3.9", - "tslib": "^2.6.0", - "update-notifier": "^6.0.2", - "url-loader": "^4.1.1", - "webpack": "^5.88.1", - "webpack-bundle-analyzer": "^4.9.0", - "webpack-dev-server": "^4.15.1", - "webpack-merge": "^5.9.0", - "webpackbar": "^5.0.2" - }, - "bin": { - "docusaurus": "bin/docusaurus.mjs" - }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", "engines": { - "node": ">=18.0" + "node": ">=18" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@docusaurus/cssnano-preset": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.4.0.tgz", - "integrity": "sha512-qwLFSz6v/pZHy/UP32IrprmH5ORce86BGtN0eBtG75PpzQJAzp9gefspox+s8IEOr0oZKuQ/nhzZ3xwyc3jYJQ==", + "node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", "dependencies": { - "cssnano-preset-advanced": "^6.1.2", - "postcss": "^8.4.38", - "postcss-sort-media-queries": "^5.2.0", - "tslib": "^2.6.0" + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" }, "engines": { - "node": ">=18.0" + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@docusaurus/logger": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.4.0.tgz", - "integrity": "sha512-bZwkX+9SJ8lB9kVRkXw+xvHYSMGG4bpYHKGXeXFvyVc79NMeeBSGgzd4TQLHH+DYeOJoCdl8flrFJVxlZ0wo/Q==", + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", + "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-alpha-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-alpha-function/-/postcss-alpha-function-1.0.1.tgz", + "integrity": "sha512-isfLLwksH3yHkFXfCI2Gcaqg7wGGHZZwunoJzEZk0yKYIokgre6hYVFibKL3SYAoR1kBXova8LB+JoO5vZzi9w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-cascade-layers": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz", + "integrity": "sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-cascade-layers/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@csstools/postcss-cascade-layers/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-color-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.12.tgz", + "integrity": "sha512-yx3cljQKRaSBc2hfh8rMZFZzChaFgwmO2JfFgFr1vMcF3C/uyy5I4RFIBOIWGq1D+XbKCG789CGkG6zzkLpagA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-function-display-p3-linear": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function-display-p3-linear/-/postcss-color-function-display-p3-linear-1.0.1.tgz", + "integrity": "sha512-E5qusdzhlmO1TztYzDIi8XPdPoYOjoTY6HBYBCYSj+Gn4gQRBlvjgPQXzfzuPQqt8EhkC/SzPKObg4Mbn8/xMg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-mix-function": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.12.tgz", + "integrity": "sha512-4STERZfCP5Jcs13P1U5pTvI9SkgLgfMUMhdXW8IlJWkzOOOqhZIjcNhWtNJZes2nkBDsIKJ0CJtFtuaZ00moag==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-mix-variadic-function-arguments": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.2.tgz", + "integrity": "sha512-rM67Gp9lRAkTo+X31DUqMEq+iK+EFqsidfecmhrteErxJZb6tUoJBVQca1Vn1GpDql1s1rD1pKcuYzMsg7Z1KQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-content-alt-text": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.8.tgz", + "integrity": "sha512-9SfEW9QCxEpTlNMnpSqFaHyzsiRpZ5J5+KqCu1u5/eEJAWsMhzT40qf0FIbeeglEvrGRMdDzAxMIz3wqoGSb+Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-contrast-color-function": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-contrast-color-function/-/postcss-contrast-color-function-2.0.12.tgz", + "integrity": "sha512-YbwWckjK3qwKjeYz/CijgcS7WDUCtKTd8ShLztm3/i5dhh4NaqzsbYnhm4bjrpFpnLZ31jVcbK8YL77z3GBPzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-exponential-functions": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.9.tgz", + "integrity": "sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-4.0.0.tgz", + "integrity": "sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-gamut-mapping": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.11.tgz", + "integrity": "sha512-fCpCUgZNE2piVJKC76zFsgVW1apF6dpYsqGyH8SIeCcM4pTEsRTWTLCaJIMKFEundsCKwY1rwfhtrio04RJ4Dw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-gradients-interpolation-method": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.12.tgz", + "integrity": "sha512-jugzjwkUY0wtNrZlFeyXzimUL3hN4xMvoPnIXxoZqxDvjZRiSh+itgHcVUWzJ2VwD/VAMEgCLvtaJHX+4Vj3Ow==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-hwb-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.12.tgz", + "integrity": "sha512-mL/+88Z53KrE4JdePYFJAQWFrcADEqsLprExCM04GDNgHIztwFzj0Mbhd/yxMBngq0NIlz58VVxjt5abNs1VhA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-ic-unit": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.4.tgz", + "integrity": "sha512-yQ4VmossuOAql65sCPppVO1yfb7hDscf4GseF0VCA/DTDaBc0Wtf8MTqVPfjGYlT5+2buokG0Gp7y0atYZpwjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-initial": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz", + "integrity": "sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.3.tgz", + "integrity": "sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-light-dark-function": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.11.tgz", + "integrity": "sha512-fNJcKXJdPM3Lyrbmgw2OBbaioU7yuKZtiXClf4sGdQttitijYlZMD5K7HrC/eF83VRWRrYq6OZ0Lx92leV2LFA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-float-and-clear": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-3.0.0.tgz", + "integrity": "sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overflow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-2.0.0.tgz", + "integrity": "sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overscroll-behavior": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-2.0.0.tgz", + "integrity": "sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-resize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-3.0.0.tgz", + "integrity": "sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-viewport-units": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.4.tgz", + "integrity": "sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-minmax": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.9.tgz", + "integrity": "sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.5.tgz", + "integrity": "sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-nested-calc": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-4.0.0.tgz", + "integrity": "sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.1.tgz", + "integrity": "sha512-TQUGBuRvxdc7TgNSTevYqrL8oItxiwPDixk20qCB5me/W8uF7BPbhRrAvFuhEoywQp/woRsUZ6SJ+sU5idZAIA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.12.tgz", + "integrity": "sha512-HhlSmnE1NKBhXsTnNGjxvhryKtO7tJd1w42DKOGFD6jSHtYOrsJTQDKPMwvOfrzUAk8t7GcpIfRyM7ssqHpFjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-position-area-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-position-area-property/-/postcss-position-area-property-1.0.0.tgz", + "integrity": "sha512-fUP6KR8qV2NuUZV3Cw8itx0Ep90aRjAZxAEzC3vrl6yjFv+pFsQbR18UuQctEKmA72K9O27CoYiKEgXxkqjg8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", + "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-property-rule-prelude-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-property-rule-prelude-list/-/postcss-property-rule-prelude-list-1.0.0.tgz", + "integrity": "sha512-IxuQjUXq19fobgmSSvUDO7fVwijDJaZMvWQugxfEUxmjBeDCVaDuMpsZ31MsTm5xbnhA+ElDi0+rQ7sQQGisFA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-random-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-2.0.1.tgz", + "integrity": "sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-relative-color-syntax": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.12.tgz", + "integrity": "sha512-0RLIeONxu/mtxRtf3o41Lq2ghLimw0w9ByLWnnEVuy89exmEEq8bynveBxNW3nyHqLAFEeNtVEmC1QK9MZ8Huw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-scope-pseudo-class": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-4.0.1.tgz", + "integrity": "sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-scope-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-sign-functions": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.4.tgz", + "integrity": "sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.9.tgz", + "integrity": "sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-syntax-descriptor-syntax-production": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-syntax-descriptor-syntax-production/-/postcss-syntax-descriptor-syntax-production-1.0.1.tgz", + "integrity": "sha512-GneqQWefjM//f4hJ/Kbox0C6f2T7+pi4/fqTqOFGTL3EjnvOReTqO1qUQ30CaUjkwjYq9qZ41hzarrAxCc4gow==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-system-ui-font-family": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-system-ui-font-family/-/postcss-system-ui-font-family-1.0.0.tgz", + "integrity": "sha512-s3xdBvfWYfoPSBsikDXbuorcMG1nN1M6GdU0qBsGfcmNR0A/qhloQZpTxjA3Xsyrk1VJvwb2pOfiOT3at/DuIQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-text-decoration-shorthand": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.3.tgz", + "integrity": "sha512-KSkGgZfx0kQjRIYnpsD7X2Om9BUXX/Kii77VBifQW9Ih929hK0KNjVngHDH0bFB9GmfWcR9vJYJJRvw/NQjkrA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.9.tgz", + "integrity": "sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-unset-value": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz", + "integrity": "sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/utilities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/utilities/-/utilities-2.0.0.tgz", + "integrity": "sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docsearch/core": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@docsearch/core/-/core-4.6.2.tgz", + "integrity": "sha512-/S0e6Dj7Zcm8m9Rru49YEX49dhU11be68c+S/BCyN8zQsTTgkKzXlhRbVL5mV6lOLC2+ZRRryaTdcm070Ug2oA==", + "license": "MIT", + "peerDependencies": { + "@types/react": ">= 16.8.0 < 20.0.0", + "react": ">= 16.8.0 < 20.0.0", + "react-dom": ">= 16.8.0 < 20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@docsearch/css": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.6.2.tgz", + "integrity": "sha512-fH/cn8BjEEdM2nJdjNMHIvOVYupG6AIDtFVDgIZrNzdCSj4KXr9kd+hsehqsNGYjpUjObeKYKvgy/IwCb1jZYQ==", + "license": "MIT" + }, + "node_modules/@docsearch/react": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-4.6.2.tgz", + "integrity": "sha512-/BbtGFtqVOGwZx0dw/UfhN/0/DmMQYnulY4iv0tPRhC2JCXv0ka/+izwt3Jzo1ZxXS/2eMvv9zHsBJOK1I9f/w==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "1.19.2", + "@docsearch/core": "4.6.2", + "@docsearch/css": "4.6.2" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 20.0.0", + "react": ">= 16.8.0 < 20.0.0", + "react-dom": ">= 16.8.0 < 20.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@docsearch/react/node_modules/@algolia/autocomplete-core": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.2.tgz", + "integrity": "sha512-mKv7RyuAzXvwmq+0XRK8HqZXt9iZ5Kkm2huLjgn5JoCPtDy+oh9yxUMfDDaVCw0oyzZ1isdJBc7l9nuCyyR7Nw==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.19.2", + "@algolia/autocomplete-shared": "1.19.2" + } + }, + "node_modules/@docsearch/react/node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.2.tgz", + "integrity": "sha512-TjxbcC/r4vwmnZaPwrHtkXNeqvlpdyR+oR9Wi2XyfORkiGkLTVhX2j+O9SaCCINbKoDfc+c2PB8NjfOnz7+oKg==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.19.2" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@docsearch/react/node_modules/@algolia/autocomplete-shared": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.2.tgz", + "integrity": "sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w==", + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@docusaurus/babel": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.10.0.tgz", + "integrity": "sha512-mqCJhCZNZUDg0zgDEaPTM4DnRsisa24HdqTy/qn/MQlbwhTb4WVaZg6ZyX6yIVKqTz8fS1hBMgM+98z+BeJJDg==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.25.9", + "@babel/preset-env": "^7.25.9", + "@babel/preset-react": "^7.25.9", + "@babel/preset-typescript": "^7.25.9", + "@babel/runtime": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@docusaurus/logger": "3.10.0", + "@docusaurus/utils": "3.10.0", + "babel-plugin-dynamic-import-node": "^2.3.3", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/bundler": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.10.0.tgz", + "integrity": "sha512-iONUGZGgp+lAkw/cJZH6irONcF4p8+278IsdRlq8lYhxGjkoNUs0w7F4gVXBYSNChq5KG5/JleTSsdJySShxow==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.9", + "@docusaurus/babel": "3.10.0", + "@docusaurus/cssnano-preset": "3.10.0", + "@docusaurus/logger": "3.10.0", + "@docusaurus/types": "3.10.0", + "@docusaurus/utils": "3.10.0", + "babel-loader": "^9.2.1", + "clean-css": "^5.3.3", + "copy-webpack-plugin": "^11.0.0", + "css-loader": "^6.11.0", + "css-minimizer-webpack-plugin": "^5.0.1", + "cssnano": "^6.1.2", + "file-loader": "^6.2.0", + "html-minifier-terser": "^7.2.0", + "mini-css-extract-plugin": "^2.9.2", + "null-loader": "^4.0.1", + "postcss": "^8.5.4", + "postcss-loader": "^7.3.4", + "postcss-preset-env": "^10.2.1", + "terser-webpack-plugin": "^5.3.9", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "webpack": "^5.95.0", + "webpackbar": "^6.0.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/faster": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/faster": { + "optional": true + } + } + }, + "node_modules/@docusaurus/core": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.10.0.tgz", + "integrity": "sha512-mgLdQsO8xppnQZc3LPi+Mf+PkPeyxJeIx11AXAq/14fsaMefInQiMEZUUmrc7J+956G/f7MwE7tn8KZgi3iRcA==", + "license": "MIT", + "dependencies": { + "@docusaurus/babel": "3.10.0", + "@docusaurus/bundler": "3.10.0", + "@docusaurus/logger": "3.10.0", + "@docusaurus/mdx-loader": "3.10.0", + "@docusaurus/utils": "3.10.0", + "@docusaurus/utils-common": "3.10.0", + "@docusaurus/utils-validation": "3.10.0", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cli-table3": "^0.6.3", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "core-js": "^3.31.1", + "detect-port": "^1.5.1", + "escape-html": "^1.0.3", + "eta": "^2.2.0", + "eval": "^0.1.8", + "execa": "^5.1.1", + "fs-extra": "^11.1.1", + "html-tags": "^3.3.1", + "html-webpack-plugin": "^5.6.0", + "leven": "^3.1.0", + "lodash": "^4.17.21", + "open": "^8.4.0", + "p-map": "^4.0.0", + "prompts": "^2.4.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", + "react-loadable-ssr-addon-v5-slorber": "^1.0.3", + "react-router": "^5.3.4", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.3.4", + "semver": "^7.5.4", + "serve-handler": "^6.1.7", + "tinypool": "^1.0.2", + "tslib": "^2.6.0", + "update-notifier": "^6.0.2", + "webpack": "^5.95.0", + "webpack-bundle-analyzer": "^4.10.2", + "webpack-dev-server": "^5.2.2", + "webpack-merge": "^6.0.1" + }, + "bin": { + "docusaurus": "bin/docusaurus.mjs" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/faster": "*", + "@mdx-js/react": "^3.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@docusaurus/faster": { + "optional": true + } + } + }, + "node_modules/@docusaurus/cssnano-preset": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.10.0.tgz", + "integrity": "sha512-qzSshTO1DB3TYW+dPUal5KHM7XPc5YQfzF3Kdb2NDACJUyGbNcFtw3tGkCJlYwhNCRKbZcmwraKUS1i5dcHdGg==", + "license": "MIT", + "dependencies": { + "cssnano-preset-advanced": "^6.1.2", + "postcss": "^8.5.4", + "postcss-sort-media-queries": "^5.2.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/logger": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.0.tgz", + "integrity": "sha512-9jrZzFuBH1LDRlZ7cznAhCLmAZ3HSDqgwdrSSZdGHq9SPUOQgXXu8mnxe2ZRB9NS1PCpMTIOVUqDtZPIhMafZg==", + "license": "MIT", "dependencies": { "chalk": "^4.1.2", "tslib": "^2.6.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" } }, "node_modules/@docusaurus/mdx-loader": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.4.0.tgz", - "integrity": "sha512-kSSbrrk4nTjf4d+wtBA9H+FGauf2gCax89kV8SUSJu3qaTdSIKdWERlngsiHaCFgZ7laTJ8a67UFf+xlFPtuTw==", - "dependencies": { - "@docusaurus/logger": "3.4.0", - "@docusaurus/utils": "3.4.0", - "@docusaurus/utils-validation": "3.4.0", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.10.0.tgz", + "integrity": "sha512-mQQV97080AH4PYNs087l202NMDqRopZA4mg5W76ZZyTFrmWhJ3mHg+8A+drJVENxw5/Q+wHMHLgsx+9z1nEs0A==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.10.0", + "@docusaurus/utils": "3.10.0", + "@docusaurus/utils-validation": "3.10.0", "@mdx-js/mdx": "^3.0.0", "@slorber/remark-comment": "^1.0.0", "escape-html": "^1.0.3", "estree-util-value-to-estree": "^3.0.1", "file-loader": "^6.2.0", "fs-extra": "^11.1.1", - "image-size": "^1.0.2", + "image-size": "^2.0.2", "mdast-util-mdx": "^3.0.0", "mdast-util-to-string": "^4.0.0", "rehype-raw": "^7.0.0", @@ -2322,24 +3580,25 @@ "webpack": "^5.88.1" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, "node_modules/@docusaurus/module-type-aliases": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.4.0.tgz", - "integrity": "sha512-A1AyS8WF5Bkjnb8s+guTDuYmUiwJzNrtchebBHpc0gz0PyHJNMaybUlSrmJjHVcGrya0LKI4YcR3lBDQfXRYLw==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.10.0.tgz", + "integrity": "sha512-/1O0Zg8w3DFrYX/I6Fbss7OJrtZw1QoyjDhegiFNHVi9A9Y0gQ3jUAytVxF6ywpAWpLyLxch8nN8H/V3XfzdJQ==", + "license": "MIT", "dependencies": { - "@docusaurus/types": "3.4.0", + "@docusaurus/types": "3.10.0", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", "@types/react-router-dom": "*", - "react-helmet-async": "*", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" }, "peerDependencies": { @@ -2348,22 +3607,25 @@ } }, "node_modules/@docusaurus/plugin-content-blog": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.4.0.tgz", - "integrity": "sha512-vv6ZAj78ibR5Jh7XBUT4ndIjmlAxkijM3Sx5MAAzC1gyv0vupDQNhzuFg1USQmQVj3P5I6bquk12etPV3LJ+Xw==", - "dependencies": { - "@docusaurus/core": "3.4.0", - "@docusaurus/logger": "3.4.0", - "@docusaurus/mdx-loader": "3.4.0", - "@docusaurus/types": "3.4.0", - "@docusaurus/utils": "3.4.0", - "@docusaurus/utils-common": "3.4.0", - "@docusaurus/utils-validation": "3.4.0", - "cheerio": "^1.0.0-rc.12", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.10.0.tgz", + "integrity": "sha512-RuTz68DhB7CL96QO5UsFbciD7GPYq6QV+YMfF9V0+N4ZgLhJIBgpVAr8GobrKF6NRe5cyWWETU5z5T834piG9g==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.0", + "@docusaurus/logger": "3.10.0", + "@docusaurus/mdx-loader": "3.10.0", + "@docusaurus/theme-common": "3.10.0", + "@docusaurus/types": "3.10.0", + "@docusaurus/utils": "3.10.0", + "@docusaurus/utils-common": "3.10.0", + "@docusaurus/utils-validation": "3.10.0", + "cheerio": "1.0.0-rc.12", + "combine-promises": "^1.1.0", "feed": "^4.2.2", "fs-extra": "^11.1.1", "lodash": "^4.17.21", - "reading-time": "^1.5.0", + "schema-dts": "^1.1.2", "srcset": "^4.0.0", "tslib": "^2.6.0", "unist-util-visit": "^5.0.0", @@ -2371,214 +3633,268 @@ "webpack": "^5.88.1" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, "node_modules/@docusaurus/plugin-content-docs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.4.0.tgz", - "integrity": "sha512-HkUCZffhBo7ocYheD9oZvMcDloRnGhBMOZRyVcAQRFmZPmNqSyISlXA1tQCIxW+r478fty97XXAGjNYzBjpCsg==", - "dependencies": { - "@docusaurus/core": "3.4.0", - "@docusaurus/logger": "3.4.0", - "@docusaurus/mdx-loader": "3.4.0", - "@docusaurus/module-type-aliases": "3.4.0", - "@docusaurus/types": "3.4.0", - "@docusaurus/utils": "3.4.0", - "@docusaurus/utils-common": "3.4.0", - "@docusaurus/utils-validation": "3.4.0", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.10.0.tgz", + "integrity": "sha512-9BjHhf15ct8Z7TThTC0xRndKDVvMKmVsAGAN7W9FpNRzfMdScOGcXtLmcCWtJGvAezjOJIm6CxOYCy3Io5+RnQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.0", + "@docusaurus/logger": "3.10.0", + "@docusaurus/mdx-loader": "3.10.0", + "@docusaurus/module-type-aliases": "3.10.0", + "@docusaurus/theme-common": "3.10.0", + "@docusaurus/types": "3.10.0", + "@docusaurus/utils": "3.10.0", + "@docusaurus/utils-common": "3.10.0", + "@docusaurus/utils-validation": "3.10.0", "@types/react-router-config": "^5.0.7", "combine-promises": "^1.1.0", "fs-extra": "^11.1.1", "js-yaml": "^4.1.0", "lodash": "^4.17.21", + "schema-dts": "^1.1.2", "tslib": "^2.6.0", "utility-types": "^3.10.0", "webpack": "^5.88.1" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, "node_modules/@docusaurus/plugin-content-pages": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.4.0.tgz", - "integrity": "sha512-h2+VN/0JjpR8fIkDEAoadNjfR3oLzB+v1qSXbIAKjQ46JAHx3X22n9nqS+BWSQnTnp1AjkjSvZyJMekmcwxzxg==", - "dependencies": { - "@docusaurus/core": "3.4.0", - "@docusaurus/mdx-loader": "3.4.0", - "@docusaurus/types": "3.4.0", - "@docusaurus/utils": "3.4.0", - "@docusaurus/utils-validation": "3.4.0", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.10.0.tgz", + "integrity": "sha512-5amX8kEJI+nIGtuLVjYk59Y5utEJ3CHETFOPEE4cooIRLA4xM4iBsA6zFgu4ljcopeYwvBzFEWf5g2I6Yb9SkA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.0", + "@docusaurus/mdx-loader": "3.10.0", + "@docusaurus/types": "3.10.0", + "@docusaurus/utils": "3.10.0", + "@docusaurus/utils-validation": "3.10.0", "fs-extra": "^11.1.1", "tslib": "^2.6.0", "webpack": "^5.88.1" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/plugin-debug": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.4.0.tgz", - "integrity": "sha512-uV7FDUNXGyDSD3PwUaf5YijX91T5/H9SX4ErEcshzwgzWwBtK37nUWPU3ZLJfeTavX3fycTOqk9TglpOLaWkCg==", + "node_modules/@docusaurus/plugin-css-cascade-layers": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.10.0.tgz", + "integrity": "sha512-6q1vtt5FJcg5osgkHeM1euErECNqEZ5Z1j69yiNx2luEBIso+nxCkS9nqj8w+MK5X7rvKEToGhFfOFWncs51pQ==", + "license": "MIT", "dependencies": { - "@docusaurus/core": "3.4.0", - "@docusaurus/types": "3.4.0", - "@docusaurus/utils": "3.4.0", + "@docusaurus/core": "3.10.0", + "@docusaurus/types": "3.10.0", + "@docusaurus/utils": "3.10.0", + "@docusaurus/utils-validation": "3.10.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/plugin-debug": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.10.0.tgz", + "integrity": "sha512-XcljKN+G+nmmK69uQA1d9BlYU3ZftG3T3zpK8/7Hf/wrOlV7TA4Ampdrdwkg0jElKdKAoSnPhCO0/U3bQGsVQQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.0", + "@docusaurus/types": "3.10.0", + "@docusaurus/utils": "3.10.0", "fs-extra": "^11.1.1", - "react-json-view-lite": "^1.2.0", + "react-json-view-lite": "^2.3.0", "tslib": "^2.6.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, "node_modules/@docusaurus/plugin-google-analytics": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.4.0.tgz", - "integrity": "sha512-mCArluxEGi3cmYHqsgpGGt3IyLCrFBxPsxNZ56Mpur0xSlInnIHoeLDH7FvVVcPJRPSQ9/MfRqLsainRw+BojA==", - "dependencies": { - "@docusaurus/core": "3.4.0", - "@docusaurus/types": "3.4.0", - "@docusaurus/utils-validation": "3.4.0", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.10.0.tgz", + "integrity": "sha512-hTEoodatpBZnUat5nFExbuTGA1lhWGy7vZGuTew5Q3QDtGKFpSJLYmZJhdTjvCFwv1+qQ67hgAVlKdJOB8TXow==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.0", + "@docusaurus/types": "3.10.0", + "@docusaurus/utils-validation": "3.10.0", "tslib": "^2.6.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, "node_modules/@docusaurus/plugin-google-gtag": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.4.0.tgz", - "integrity": "sha512-Dsgg6PLAqzZw5wZ4QjUYc8Z2KqJqXxHxq3vIoyoBWiLEEfigIs7wHR+oiWUQy3Zk9MIk6JTYj7tMoQU0Jm3nqA==", - "dependencies": { - "@docusaurus/core": "3.4.0", - "@docusaurus/types": "3.4.0", - "@docusaurus/utils-validation": "3.4.0", - "@types/gtag.js": "^0.0.12", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.10.0.tgz", + "integrity": "sha512-iB/Zzjv/eelJRbdULZqzWCbgMgJ7ht4ONVjXtN3+BI/muil6S87gQ1OJyPwlXD+ELdKkitC7bWv5eJdYOZLhrQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.0", + "@docusaurus/types": "3.10.0", + "@docusaurus/utils-validation": "3.10.0", + "@types/gtag.js": "^0.0.20", "tslib": "^2.6.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, "node_modules/@docusaurus/plugin-google-tag-manager": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.4.0.tgz", - "integrity": "sha512-O9tX1BTwxIhgXpOLpFDueYA9DWk69WCbDRrjYoMQtFHSkTyE7RhNgyjSPREUWJb9i+YUg3OrsvrBYRl64FCPCQ==", - "dependencies": { - "@docusaurus/core": "3.4.0", - "@docusaurus/types": "3.4.0", - "@docusaurus/utils-validation": "3.4.0", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.10.0.tgz", + "integrity": "sha512-FEjZxqKgLHa+Wez/EgKxRwvArNCWIScfyEQD95rot7jkxp6nonjI5XIbGfO/iYhM5Qinwe8aIEQHP2KZtpqVuA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.0", + "@docusaurus/types": "3.10.0", + "@docusaurus/utils-validation": "3.10.0", "tslib": "^2.6.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, "node_modules/@docusaurus/plugin-sitemap": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.4.0.tgz", - "integrity": "sha512-+0VDvx9SmNrFNgwPoeoCha+tRoAjopwT0+pYO1xAbyLcewXSemq+eLxEa46Q1/aoOaJQ0qqHELuQM7iS2gp33Q==", - "dependencies": { - "@docusaurus/core": "3.4.0", - "@docusaurus/logger": "3.4.0", - "@docusaurus/types": "3.4.0", - "@docusaurus/utils": "3.4.0", - "@docusaurus/utils-common": "3.4.0", - "@docusaurus/utils-validation": "3.4.0", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.10.0.tgz", + "integrity": "sha512-DVTSLjB97hIjmayGnGcBfognCeI7ZuUKgEnU7Oz81JYqXtVg94mVTthDjq3QHTylYNeCUbkaW8VF0FDLcc8pPw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.0", + "@docusaurus/logger": "3.10.0", + "@docusaurus/types": "3.10.0", + "@docusaurus/utils": "3.10.0", + "@docusaurus/utils-common": "3.10.0", + "@docusaurus/utils-validation": "3.10.0", "fs-extra": "^11.1.1", "sitemap": "^7.1.1", "tslib": "^2.6.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/preset-classic": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.4.0.tgz", - "integrity": "sha512-Ohj6KB7siKqZaQhNJVMBBUzT3Nnp6eTKqO+FXO3qu/n1hJl3YLwVKTWBg28LF7MWrKu46UuYavwMRxud0VyqHg==", - "dependencies": { - "@docusaurus/core": "3.4.0", - "@docusaurus/plugin-content-blog": "3.4.0", - "@docusaurus/plugin-content-docs": "3.4.0", - "@docusaurus/plugin-content-pages": "3.4.0", - "@docusaurus/plugin-debug": "3.4.0", - "@docusaurus/plugin-google-analytics": "3.4.0", - "@docusaurus/plugin-google-gtag": "3.4.0", - "@docusaurus/plugin-google-tag-manager": "3.4.0", - "@docusaurus/plugin-sitemap": "3.4.0", - "@docusaurus/theme-classic": "3.4.0", - "@docusaurus/theme-common": "3.4.0", - "@docusaurus/theme-search-algolia": "3.4.0", - "@docusaurus/types": "3.4.0" + "node_modules/@docusaurus/plugin-svgr": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.10.0.tgz", + "integrity": "sha512-lNljBESaETZqVBMPqkrGchr+UPT1eZzEPLmJhz8I76BxbjqgsUnRvrq6lQJ9sYjgmgX52KB7kkgczqd2yzoswQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.0", + "@docusaurus/types": "3.10.0", + "@docusaurus/utils": "3.10.0", + "@docusaurus/utils-validation": "3.10.0", + "@svgr/core": "8.1.0", + "@svgr/webpack": "^8.1.0", + "tslib": "^2.6.0", + "webpack": "^5.88.1" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/preset-classic": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.10.0.tgz", + "integrity": "sha512-kw/Ye02Hc6xP1OdTswy8yxQEHg0fdPpyWAQRxr5b2x3h7LlG2Zgbb5BDFROnXDDMpUxB7YejlocJIE5HIEfpNA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.0", + "@docusaurus/plugin-content-blog": "3.10.0", + "@docusaurus/plugin-content-docs": "3.10.0", + "@docusaurus/plugin-content-pages": "3.10.0", + "@docusaurus/plugin-css-cascade-layers": "3.10.0", + "@docusaurus/plugin-debug": "3.10.0", + "@docusaurus/plugin-google-analytics": "3.10.0", + "@docusaurus/plugin-google-gtag": "3.10.0", + "@docusaurus/plugin-google-tag-manager": "3.10.0", + "@docusaurus/plugin-sitemap": "3.10.0", + "@docusaurus/plugin-svgr": "3.10.0", + "@docusaurus/theme-classic": "3.10.0", + "@docusaurus/theme-common": "3.10.0", + "@docusaurus/theme-search-algolia": "3.10.0", + "@docusaurus/types": "3.10.0" + }, + "engines": { + "node": ">=20.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, "node_modules/@docusaurus/theme-classic": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.4.0.tgz", - "integrity": "sha512-0IPtmxsBYv2adr1GnZRdMkEQt1YW6tpzrUPj02YxNpvJ5+ju4E13J5tB4nfdaen/tfR1hmpSPlTFPvTf4kwy8Q==", - "dependencies": { - "@docusaurus/core": "3.4.0", - "@docusaurus/mdx-loader": "3.4.0", - "@docusaurus/module-type-aliases": "3.4.0", - "@docusaurus/plugin-content-blog": "3.4.0", - "@docusaurus/plugin-content-docs": "3.4.0", - "@docusaurus/plugin-content-pages": "3.4.0", - "@docusaurus/theme-common": "3.4.0", - "@docusaurus/theme-translations": "3.4.0", - "@docusaurus/types": "3.4.0", - "@docusaurus/utils": "3.4.0", - "@docusaurus/utils-common": "3.4.0", - "@docusaurus/utils-validation": "3.4.0", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.10.0.tgz", + "integrity": "sha512-9msCAsRdN+UG+RwPwCFb0uKy4tGoPh5YfBozXeGUtIeAgsMdn6f3G/oY861luZ3t8S2ET8S9Y/1GnpJAGWytww==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.0", + "@docusaurus/logger": "3.10.0", + "@docusaurus/mdx-loader": "3.10.0", + "@docusaurus/module-type-aliases": "3.10.0", + "@docusaurus/plugin-content-blog": "3.10.0", + "@docusaurus/plugin-content-docs": "3.10.0", + "@docusaurus/plugin-content-pages": "3.10.0", + "@docusaurus/theme-common": "3.10.0", + "@docusaurus/theme-translations": "3.10.0", + "@docusaurus/types": "3.10.0", + "@docusaurus/utils": "3.10.0", + "@docusaurus/utils-common": "3.10.0", + "@docusaurus/utils-validation": "3.10.0", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", "copy-text-to-clipboard": "^3.2.0", - "infima": "0.2.0-alpha.43", + "infima": "0.2.0-alpha.45", "lodash": "^4.17.21", "nprogress": "^0.2.0", - "postcss": "^8.4.26", + "postcss": "^8.5.4", "prism-react-renderer": "^2.3.0", "prismjs": "^1.29.0", "react-router-dom": "^5.3.4", @@ -2587,33 +3903,32 @@ "utility-types": "^3.10.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, "node_modules/@docusaurus/theme-classic/node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/@docusaurus/theme-common": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.4.0.tgz", - "integrity": "sha512-0A27alXuv7ZdCg28oPE8nH/Iz73/IUejVaCazqu9elS4ypjiLhK3KfzdSQBnL/g7YfHSlymZKdiOHEo8fJ0qMA==", - "dependencies": { - "@docusaurus/mdx-loader": "3.4.0", - "@docusaurus/module-type-aliases": "3.4.0", - "@docusaurus/plugin-content-blog": "3.4.0", - "@docusaurus/plugin-content-docs": "3.4.0", - "@docusaurus/plugin-content-pages": "3.4.0", - "@docusaurus/utils": "3.4.0", - "@docusaurus/utils-common": "3.4.0", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.10.0.tgz", + "integrity": "sha512-Dkp1YXKn16ByCJAdIjbDIOpVb4Z66MsVD694/ilX1vAAHaVEMrVsf/NPd9VgreyFx08rJ9GqV1MtzsbTcU73Kg==", + "license": "MIT", + "dependencies": { + "@docusaurus/mdx-loader": "3.10.0", + "@docusaurus/module-type-aliases": "3.10.0", + "@docusaurus/utils": "3.10.0", + "@docusaurus/utils-common": "3.10.0", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -2624,36 +3939,40 @@ "utility-types": "^3.10.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, "node_modules/@docusaurus/theme-common/node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/@docusaurus/theme-search-algolia": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.4.0.tgz", - "integrity": "sha512-aiHFx7OCw4Wck1z6IoShVdUWIjntC8FHCw9c5dR8r3q4Ynh+zkS8y2eFFunN/DL6RXPzpnvKCg3vhLQYJDmT9Q==", - "dependencies": { - "@docsearch/react": "^3.5.2", - "@docusaurus/core": "3.4.0", - "@docusaurus/logger": "3.4.0", - "@docusaurus/plugin-content-docs": "3.4.0", - "@docusaurus/theme-common": "3.4.0", - "@docusaurus/theme-translations": "3.4.0", - "@docusaurus/utils": "3.4.0", - "@docusaurus/utils-validation": "3.4.0", - "algoliasearch": "^4.18.0", - "algoliasearch-helper": "^3.13.3", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.10.0.tgz", + "integrity": "sha512-f5FPKI08e3JRG63vR/o4qeuUVHUHzFzM0nnF+AkB67soAZgNsKJRf2qmUZvlQkGwlV+QFkKe4D0ANMh1jToU3g==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "^1.19.2", + "@docsearch/react": "^3.9.0 || ^4.3.2", + "@docusaurus/core": "3.10.0", + "@docusaurus/logger": "3.10.0", + "@docusaurus/plugin-content-docs": "3.10.0", + "@docusaurus/theme-common": "3.10.0", + "@docusaurus/theme-translations": "3.10.0", + "@docusaurus/utils": "3.10.0", + "@docusaurus/utils-validation": "3.10.0", + "algoliasearch": "^5.37.0", + "algoliasearch-helper": "^3.26.0", "clsx": "^2.0.0", "eta": "^2.2.0", "fs-extra": "^11.1.1", @@ -2662,62 +3981,82 @@ "utility-types": "^3.10.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, "node_modules/@docusaurus/theme-search-algolia/node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/@docusaurus/theme-translations": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.4.0.tgz", - "integrity": "sha512-zSxCSpmQCCdQU5Q4CnX/ID8CSUUI3fvmq4hU/GNP/XoAWtXo9SAVnM3TzpU8Gb//H3WCsT8mJcTfyOk3d9ftNg==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.10.0.tgz", + "integrity": "sha512-L9IbFLwTc5+XdgH45iQYufLn0SVZd6BUNelDbKIFlH+E4hhjuj/XHWAFMX/w2K59rfy8wak9McOaei7BSUfRPA==", + "license": "MIT", "dependencies": { "fs-extra": "^11.1.1", "tslib": "^2.6.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" } }, "node_modules/@docusaurus/types": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.4.0.tgz", - "integrity": "sha512-4jcDO8kXi5Cf9TcyikB/yKmz14f2RZ2qTRerbHAsS+5InE9ZgSLBNLsewtFTcTOXSVcbU3FoGOzcNWAmU1TR0A==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.0.tgz", + "integrity": "sha512-F0dOt3FOoO20rRaFK7whGFQZ3ggyrWEdQc/c8/UiRuzhtg4y1w9FspXH5zpCT07uMnJKBPGh+qNazbNlCQqvSw==", + "license": "MIT", "dependencies": { "@mdx-js/mdx": "^3.0.0", "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", "@types/react": "*", "commander": "^5.1.0", "joi": "^17.9.2", - "react-helmet-async": "^1.3.0", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", "utility-types": "^3.10.0", - "webpack": "^5.88.1", + "webpack": "^5.95.0", "webpack-merge": "^5.9.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/utils": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.4.0.tgz", - "integrity": "sha512-fRwnu3L3nnWaXOgs88BVBmG1yGjcQqZNHG+vInhEa2Sz2oQB+ZjbEMO5Rh9ePFpZ0YDiDUhpaVjwmS+AU2F14g==", + "node_modules/@docusaurus/types/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.4.0", - "@docusaurus/utils-common": "3.4.0", - "@svgr/webpack": "^8.1.0", + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docusaurus/utils": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.0.tgz", + "integrity": "sha512-T3B0WTigsIthe0D4LQa2k+7bJY+c3WS+Wq2JhcznOSpn1lSN64yNtHQXboCj3QnUs1EuAZszQG1SHKu5w5ZrlA==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.10.0", + "@docusaurus/types": "3.10.0", + "@docusaurus/utils-common": "3.10.0", "escape-string-regexp": "^4.0.0", + "execa": "^5.1.1", "file-loader": "^6.2.0", "fs-extra": "^11.1.1", "github-slugger": "^1.5.0", @@ -2727,179 +4066,586 @@ "js-yaml": "^4.1.0", "lodash": "^4.17.21", "micromatch": "^4.0.5", + "p-queue": "^6.6.2", "prompts": "^2.4.2", "resolve-pathname": "^3.0.0", - "shelljs": "^0.8.5", "tslib": "^2.6.0", "url-loader": "^4.1.1", "utility-types": "^3.10.0", "webpack": "^5.88.1" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/utils-common": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.0.tgz", + "integrity": "sha512-JyL7sb9QVDgYvudIS81Dv0lsWm7le0vGZSDwsztxWam1SPBqrnkvBy9UYL/amh6pbybkyYTd3CMTkO24oMlCSw==", + "license": "MIT", + "dependencies": { + "@docusaurus/types": "3.10.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/utils-validation": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.0.tgz", + "integrity": "sha512-c+6n2+ZPOJtWWc8Bb/EYdpSDfjYEScdCu9fB/SNjOmSCf1IdVnGf2T53o0tsz0gDRtCL90tifTL0JE/oMuP1Mw==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.10.0", + "@docusaurus/utils": "3.10.0", + "@docusaurus/utils-common": "3.10.0", + "fs-extra": "^11.2.0", + "joi": "^17.9.2", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/buffers": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-17.67.0.tgz", + "integrity": "sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/codegen": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", + "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-core": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.57.2.tgz", + "integrity": "sha512-SVjwklkpIV5wrynpYtuYnfYH1QF4/nDuLBX7VXdb+3miglcAgBVZb/5y0cOsehRV/9Vb+3UqhkMq3/NR3ztdkQ==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-builtins": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.2", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-fsa": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.57.2.tgz", + "integrity": "sha512-fhO8+iR2I+OCw668ISDJdn1aArc9zx033sWejIyzQ8RBeXa9bDSaUeA3ix0poYOfrj1KdOzytmYNv2/uLDfV6g==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.57.2", + "@jsonjoy.com/fs-node-builtins": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.2", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.57.2.tgz", + "integrity": "sha512-nX2AdL6cOFwLdju9G4/nbRnYevmCJbh7N7hvR3gGm97Cs60uEjyd0rpR+YBS7cTg175zzl22pGKXR5USaQMvKg==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.57.2", + "@jsonjoy.com/fs-node-builtins": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.2", + "@jsonjoy.com/fs-print": "4.57.2", + "@jsonjoy.com/fs-snapshot": "4.57.2", + "glob-to-regex.js": "^1.0.0", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-builtins": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.57.2.tgz", + "integrity": "sha512-xhiegylRmhw43Ki2HO1ZBL7DQ5ja/qpRsL29VtQ2xuUHiuDGbgf2uD4p9Qd8hJI5P6RCtGYD50IXHXVq/Ocjcg==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-to-fsa": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.57.2.tgz", + "integrity": "sha512-18LmWTSONhoAPW+IWRuf8w/+zRolPFGPeGwMxlAhhfY11EKzX+5XHDBPAw67dBF5dxDErHJbl40U+3IXSDRXSQ==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-fsa": "4.57.2", + "@jsonjoy.com/fs-node-builtins": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.2" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-utils": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.57.2.tgz", + "integrity": "sha512-rsPSJgekz43IlNbLyAM/Ab+ouYLWGp5DDBfYBNNEqDaSpsbXfthBn29Q4muFA9L0F+Z3mKo+CWlgSCXrf+mOyQ==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-builtins": "4.57.2" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" }, "peerDependencies": { - "@docusaurus/types": "*" - }, - "peerDependenciesMeta": { - "@docusaurus/types": { - "optional": true - } + "tslib": "2" } }, - "node_modules/@docusaurus/utils-common": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.4.0.tgz", - "integrity": "sha512-NVx54Wr4rCEKsjOH5QEVvxIqVvm+9kh7q8aYTU5WzUU9/Hctd6aTrcZ3G0Id4zYJ+AeaG5K5qHA4CY5Kcm2iyQ==", + "node_modules/@jsonjoy.com/fs-print": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.57.2.tgz", + "integrity": "sha512-wK9NSow48i4DbDl9F1CQE5TqnyZOJ04elU3WFG5aJ76p+YxO/ulyBBQvKsessPxdo381Bc2pcEoyPujMOhcRqQ==", + "license": "Apache-2.0", "dependencies": { - "tslib": "^2.6.0" + "@jsonjoy.com/fs-node-utils": "4.57.2", + "tree-dump": "^1.1.0" }, "engines": { - "node": ">=18.0" + "node": ">=10.0" }, - "peerDependencies": { - "@docusaurus/types": "*" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" }, - "peerDependenciesMeta": { - "@docusaurus/types": { - "optional": true - } + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@docusaurus/utils-validation": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.4.0.tgz", - "integrity": "sha512-hYQ9fM+AXYVTWxJOT1EuNaRnrR2WGpRdLDQG07O8UOpsvCPWUVOeo26Rbm0JWY2sGLfzAb+tvJ62yF+8F+TV0g==", + "node_modules/@jsonjoy.com/fs-snapshot": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.57.2.tgz", + "integrity": "sha512-GdduDZuoP5V/QCgJkx9+BZ6SC0EZ/smXAdTS7PfMqgMTGXLlt/bH/FqMYaqB9JmLf05sJPtO0XRbAwwkEEPbVw==", + "license": "Apache-2.0", "dependencies": { - "@docusaurus/logger": "3.4.0", - "@docusaurus/utils": "3.4.0", - "@docusaurus/utils-common": "3.4.0", - "fs-extra": "^11.2.0", - "joi": "^17.9.2", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "tslib": "^2.6.0" + "@jsonjoy.com/buffers": "^17.65.0", + "@jsonjoy.com/fs-node-utils": "4.57.2", + "@jsonjoy.com/json-pack": "^17.65.0", + "@jsonjoy.com/util": "^17.65.0" }, "engines": { - "node": ">=18.0" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/base64": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-17.67.0.tgz", + "integrity": "sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "dependencies": { - "@hapi/hoek": "^9.0.0" + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/codegen": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-17.67.0.tgz", + "integrity": "sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pack": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-17.67.0.tgz", + "integrity": "sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w==", + "license": "Apache-2.0", "dependencies": { - "@sinclair/typebox": "^0.27.8" + "@jsonjoy.com/base64": "17.67.0", + "@jsonjoy.com/buffers": "17.67.0", + "@jsonjoy.com/codegen": "17.67.0", + "@jsonjoy.com/json-pointer": "17.67.0", + "@jsonjoy.com/util": "17.67.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pointer": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-17.67.0.tgz", + "integrity": "sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA==", + "license": "Apache-2.0", "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "@jsonjoy.com/util": "17.67.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/util": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-17.67.0.tgz", + "integrity": "sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew==", + "license": "Apache-2.0", "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jsonjoy.com/buffers": "17.67.0", + "@jsonjoy.com/codegen": "17.67.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", + "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "^1.1.2", + "@jsonjoy.com/buffers": "^1.2.0", + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/json-pointer": "^1.0.2", + "@jsonjoy.com/util": "^1.9.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" + }, "engines": { - "node": ">=6.0.0" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "node_modules/@jsonjoy.com/json-pack/node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", + "license": "Apache-2.0", "engines": { - "node": ">=6.0.0" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "node_modules/@jsonjoy.com/json-pointer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", + "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", + "license": "Apache-2.0", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/util": "^1.9.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "node_modules/@jsonjoy.com/util": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", + "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", + "license": "Apache-2.0", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/codegen": "^1.0.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util/node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "license": "MIT" }, "node_modules/@mdx-js/mdx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.1.tgz", - "integrity": "sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", + "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==", + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdx": "^2.0.0", + "acorn": "^8.0.0", "collapse-white-space": "^2.0.0", "devlop": "^1.0.0", - "estree-util-build-jsx": "^3.0.0", "estree-util-is-identifier-name": "^3.0.0", - "estree-util-to-js": "^2.0.0", + "estree-util-scope": "^1.0.0", "estree-walker": "^3.0.0", - "hast-util-to-estree": "^3.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "markdown-extensions": "^2.0.0", - "periscopic": "^3.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", "remark-mdx": "^3.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", @@ -2916,9 +4662,10 @@ } }, "node_modules/@mdx-js/react": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.0.1.tgz", - "integrity": "sha512-9ZrPIU4MGf6et1m1ov3zKf+q9+deetI51zprKB1D/z3NOb+rUxxtEl3mCjW5wTGh6VhRdwPueh1oRzi6ezkA8A==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", + "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", + "license": "MIT", "dependencies": { "@types/mdx": "^2.0.0" }, @@ -2931,10 +4678,23 @@ "react": ">=16" } }, + "node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -2947,6 +4707,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", "engines": { "node": ">= 8" } @@ -2955,6 +4716,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -2963,10 +4725,159 @@ "node": ">= 8" } }, + "node_modules/@peculiar/asn1-cms": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.6.1.tgz", + "integrity": "sha512-vdG4fBF6Lkirkcl53q6eOdn3XYKt+kJTG59edgRZORlg/3atWWEReRCx5rYE1ZzTTX6vLK5zDMjHh7vbrcXGtw==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "@peculiar/asn1-x509-attr": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-csr": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.6.1.tgz", + "integrity": "sha512-WRWnKfIocHyzFYQTka8O/tXCiBquAPSrRjXbOkHbO4qdmS6loffCEGs+rby6WxxGdJCuunnhS2duHURhjyio6w==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-ecc": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.6.1.tgz", + "integrity": "sha512-+Vqw8WFxrtDIN5ehUdvlN2m73exS2JVG0UAyfVB31gIfor3zWEAQPD+K9ydCxaj3MLen9k0JhKpu9LqviuCE1g==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pfx": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.6.1.tgz", + "integrity": "sha512-nB5jVQy3MAAWvq0KY0R2JUZG8bO/bTLpnwyOzXyEh/e54ynGTatAR+csOnXkkVD9AFZ2uL8Z7EV918+qB1qDvw==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.1", + "@peculiar/asn1-pkcs8": "^2.6.1", + "@peculiar/asn1-rsa": "^2.6.1", + "@peculiar/asn1-schema": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs8": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.6.1.tgz", + "integrity": "sha512-JB5iQ9Izn5yGMw3ZG4Nw3Xn/hb/G38GYF3lf7WmJb8JZUydhVGEjK/ZlFSWhnlB7K/4oqEs8HnfFIKklhR58Tw==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs9": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.6.1.tgz", + "integrity": "sha512-5EV8nZoMSxeWmcxWmmcolg22ojZRgJg+Y9MX2fnE2bGRo5KQLqV5IL9kdSQDZxlHz95tHvIq9F//bvL1OeNILw==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.1", + "@peculiar/asn1-pfx": "^2.6.1", + "@peculiar/asn1-pkcs8": "^2.6.1", + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "@peculiar/asn1-x509-attr": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-rsa": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.6.1.tgz", + "integrity": "sha512-1nVMEh46SElUt5CB3RUTV4EG/z7iYc7EoaDY5ECwganibQPkZ/Y2eMsTKB/LeyrUJ+W/tKoD9WUqIy8vB+CEdA==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.6.0.tgz", + "integrity": "sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==", + "license": "MIT", + "dependencies": { + "asn1js": "^3.0.6", + "pvtsutils": "^1.3.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-x509": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.6.1.tgz", + "integrity": "sha512-O9jT5F1A2+t3r7C4VT7LYGXqkGLK7Kj1xFpz7U0isPrubwU5PbDoyYtx6MiGst29yq7pXN5vZbQFKRCP+lLZlA==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "asn1js": "^3.0.6", + "pvtsutils": "^1.3.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-x509-attr": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.6.1.tgz", + "integrity": "sha512-tlW6cxoHwgcQghnJwv3YS+9OO1737zgPogZ+CgWRUK4roEwIPzRH4JEiG770xe5HX2ATfCpmX60gurfWIF9dcQ==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/x509": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.14.3.tgz", + "integrity": "sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.0", + "@peculiar/asn1-csr": "^2.6.0", + "@peculiar/asn1-ecc": "^2.6.0", + "@peculiar/asn1-pkcs9": "^2.6.0", + "@peculiar/asn1-rsa": "^2.6.0", + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "pvtsutils": "^1.3.6", + "reflect-metadata": "^0.2.2", + "tslib": "^2.8.1", + "tsyringe": "^4.10.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/@pnpm/config.env-replace": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "license": "MIT", "engines": { "node": ">=12.22.0" } @@ -2975,6 +4886,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "license": "MIT", "dependencies": { "graceful-fs": "4.2.10" }, @@ -2985,12 +4897,14 @@ "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "license": "ISC" }, "node_modules/@pnpm/npm-conf": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", - "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-3.0.2.tgz", + "integrity": "sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA==", + "license": "MIT", "dependencies": { "@pnpm/config.env-replace": "^1.1.0", "@pnpm/network.ca-file": "^1.0.1", @@ -3001,14 +4915,16 @@ } }, "node_modules/@polka/url": { - "version": "1.0.0-next.23", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.23.tgz", - "integrity": "sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==" + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "license": "MIT" }, "node_modules/@sideway/address": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^9.0.0" } @@ -3016,22 +4932,26 @@ "node_modules/@sideway/formula": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "license": "BSD-3-Clause" }, "node_modules/@sideway/pinpoint": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "license": "BSD-3-Clause" }, "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", + "license": "MIT" }, "node_modules/@sindresorhus/is": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -3043,6 +4963,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==", + "license": "MIT", "dependencies": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.1.0", @@ -3053,6 +4974,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "license": "MIT", "engines": { "node": ">=14" }, @@ -3068,6 +4990,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "license": "MIT", "engines": { "node": ">=14" }, @@ -3083,6 +5006,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "license": "MIT", "engines": { "node": ">=14" }, @@ -3098,6 +5022,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "license": "MIT", "engines": { "node": ">=14" }, @@ -3113,6 +5038,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "license": "MIT", "engines": { "node": ">=14" }, @@ -3128,6 +5054,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "license": "MIT", "engines": { "node": ">=14" }, @@ -3143,6 +5070,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "license": "MIT", "engines": { "node": ">=14" }, @@ -3158,6 +5086,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -3173,6 +5102,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "license": "MIT", "dependencies": { "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", @@ -3198,6 +5128,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "license": "MIT", "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -3217,6 +5148,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "license": "MIT", "dependencies": { "@babel/types": "^7.21.3", "entities": "^4.4.0" @@ -3233,6 +5165,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", + "license": "MIT", "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -3254,6 +5187,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", + "license": "MIT", "dependencies": { "cosmiconfig": "^8.1.3", "deepmerge": "^4.3.1", @@ -3274,6 +5208,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", + "license": "MIT", "dependencies": { "@babel/core": "^7.21.3", "@babel/plugin-transform-react-constant-elements": "^7.21.3", @@ -3296,6 +5231,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "license": "MIT", "dependencies": { "defer-to-connect": "^2.0.1" }, @@ -3303,26 +5239,11 @@ "node": ">=14.16" } }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@types/acorn": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", - "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", - "dependencies": { - "@types/estree": "*" - } - }, "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "license": "MIT", "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -3332,6 +5253,7 @@ "version": "3.5.13", "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -3340,6 +5262,7 @@ "version": "3.4.38", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -3348,23 +5271,26 @@ "version": "1.5.4", "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "license": "MIT", "dependencies": { "@types/express-serve-static-core": "*", "@types/node": "*" } }, "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "license": "MIT", "dependencies": { "@types/ms": "*" } }, "node_modules/@types/eslint": { - "version": "8.44.7", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.7.tgz", - "integrity": "sha512-f5ORu2hcBbKei97U73mf+l9t4zTGl74IqZ0GQk4oVea/VS8tQZYkUveSYojk+frraAVYId0V2WC9O4PTNru2FQ==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "license": "MIT", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -3374,39 +5300,44 @@ "version": "3.7.7", "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "license": "MIT", "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" }, "node_modules/@types/estree-jsx": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", "dependencies": { "@types/estree": "*" } }, "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", + "license": "MIT", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", - "@types/serve-static": "*" + "@types/serve-static": "^1" } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.41", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", - "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", + "version": "4.19.8", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", + "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", + "license": "MIT", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -3415,14 +5346,16 @@ } }, "node_modules/@types/gtag.js": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz", - "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==" + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.20.tgz", + "integrity": "sha512-wwAbk3SA2QeU67unN7zPxjEHmPmlXwZXZvQEpbEUQuMCRGgKyE1m6XDuTUA9b6pCGb/GqJmdfMOY5LuDjJSbbg==", + "license": "MIT" }, "node_modules/@types/hast": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", "dependencies": { "@types/unist": "*" } @@ -3430,27 +5363,32 @@ "node_modules/@types/history": { "version": "4.7.11", "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", + "license": "MIT" }, "node_modules/@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "license": "MIT" }, "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", + "license": "MIT" }, "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "license": "MIT" }, "node_modules/@types/http-proxy": { - "version": "1.17.14", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", - "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "version": "1.17.17", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.17.tgz", + "integrity": "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==", + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -3458,12 +5396,14 @@ "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "license": "MIT" }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "*" } @@ -3472,6 +5412,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "license": "MIT", "dependencies": { "@types/istanbul-lib-report": "*" } @@ -3479,12 +5420,14 @@ "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" }, "node_modules/@types/mdast": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", "dependencies": { "@types/unist": "*" } @@ -3492,82 +5435,72 @@ "node_modules/@types/mdx": { "version": "2.0.13", "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", - "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==" + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "license": "MIT" }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "license": "MIT" }, "node_modules/@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" }, "node_modules/@types/node": { - "version": "20.10.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.0.tgz", - "integrity": "sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ==", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/node-forge": { - "version": "1.3.10", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.10.tgz", - "integrity": "sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==", + "version": "25.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz", + "integrity": "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==", + "license": "MIT", "dependencies": { - "@types/node": "*" + "undici-types": "~7.19.0" } }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" - }, "node_modules/@types/prismjs": { - "version": "1.26.4", - "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.4.tgz", - "integrity": "sha512-rlAnzkW2sZOjbqZ743IHUhFcvzaGbqijwOu8QZnZCjfQzBqFE3s4lOTJEsxikImav9uzz/42I+O7YUs1mWgMlg==" - }, - "node_modules/@types/prop-types": { - "version": "15.7.11", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", - "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" + "version": "1.26.6", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.6.tgz", + "integrity": "sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw==", + "license": "MIT" }, "node_modules/@types/qs": { - "version": "6.9.10", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", - "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==" + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==", + "license": "MIT" }, "node_modules/@types/range-parser": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" }, "node_modules/@types/react": { - "version": "18.2.38", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.38.tgz", - "integrity": "sha512-cBBXHzuPtQK6wNthuVMV6IjHAFkdl/FOPFIlkd81/Cd1+IqkHu/A+w4g43kaQQoYHik/ruaQBDL72HyCy1vuMw==", + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "license": "MIT", "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" + "csstype": "^3.2.2" } }, "node_modules/@types/react-router": { "version": "5.1.20", "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "license": "MIT", "dependencies": { "@types/history": "^4.7.11", "@types/react": "*" } }, "node_modules/@types/react-router-config": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.10.tgz", - "integrity": "sha512-Wn6c/tXdEgi9adCMtDwx8Q2vGty6TsPTc/wCQQ9kAlye8UqFxj0vGFWWuhywNfkwqth+SOgJxQTLTZukrqDQmQ==", + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz", + "integrity": "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==", + "license": "MIT", "dependencies": { "@types/history": "^4.7.11", "@types/react": "*", @@ -3578,6 +5511,7 @@ "version": "5.3.3", "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "license": "MIT", "dependencies": { "@types/history": "^4.7.11", "@types/react": "*", @@ -3585,29 +5519,26 @@ } }, "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", + "license": "MIT" }, "node_modules/@types/sax": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, - "node_modules/@types/scheduler": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", - "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" - }, "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "license": "MIT", "dependencies": { - "@types/mime": "^1", "@types/node": "*" } }, @@ -3615,17 +5546,29 @@ "version": "1.9.4", "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "license": "MIT", "dependencies": { "@types/express": "*" } }, "node_modules/@types/serve-static": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", - "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", + "license": "MIT", "dependencies": { "@types/http-errors": "*", - "@types/mime": "*", + "@types/node": "*", + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", "@types/node": "*" } }, @@ -3633,27 +5576,31 @@ "version": "0.3.36", "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/unist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", - "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" }, "node_modules/@types/ws": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", - "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -3661,158 +5608,178 @@ "node_modules/@types/yargs-parser": { "version": "21.0.3", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "license": "MIT" }, "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "license": "MIT", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "license": "MIT", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -3825,6 +5792,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -3833,6 +5801,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -3840,10 +5809,20 @@ "node": ">= 0.6" } }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -3851,26 +5830,35 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, "peerDependencies": { - "acorn": "^8" + "acorn": "^8.14.0" } }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/acorn-walk": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", - "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, "engines": { "node": ">=0.4.0" } @@ -3879,6 +5867,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "license": "MIT", "engines": { "node": ">= 10.0.0" } @@ -3887,6 +5876,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -3896,14 +5886,15 @@ } }, "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -3914,6 +5905,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, @@ -3930,6 +5922,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -3938,31 +5931,35 @@ } }, "node_modules/algoliasearch": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.24.0.tgz", - "integrity": "sha512-bf0QV/9jVejssFBmz2HQLxUadxk574t4iwjCKp5E7NBzwKkrDEhKPISIIjAU/p6K5qDx3qoeh4+26zWN1jmw3g==", - "dependencies": { - "@algolia/cache-browser-local-storage": "4.24.0", - "@algolia/cache-common": "4.24.0", - "@algolia/cache-in-memory": "4.24.0", - "@algolia/client-account": "4.24.0", - "@algolia/client-analytics": "4.24.0", - "@algolia/client-common": "4.24.0", - "@algolia/client-personalization": "4.24.0", - "@algolia/client-search": "4.24.0", - "@algolia/logger-common": "4.24.0", - "@algolia/logger-console": "4.24.0", - "@algolia/recommend": "4.24.0", - "@algolia/requester-browser-xhr": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/requester-node-http": "4.24.0", - "@algolia/transporter": "4.24.0" + "version": "5.50.2", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.50.2.tgz", + "integrity": "sha512-Tfp26yoNWurUjfgK4GOrVJQhSNXu9tJtHfFFNosgT2YClG+vPyUjX/gbC8rG39qLncnZg8Fj34iarQWpMkqefw==", + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.16.2", + "@algolia/client-abtesting": "5.50.2", + "@algolia/client-analytics": "5.50.2", + "@algolia/client-common": "5.50.2", + "@algolia/client-insights": "5.50.2", + "@algolia/client-personalization": "5.50.2", + "@algolia/client-query-suggestions": "5.50.2", + "@algolia/client-search": "5.50.2", + "@algolia/ingestion": "1.50.2", + "@algolia/monitoring": "1.50.2", + "@algolia/recommend": "5.50.2", + "@algolia/requester-browser-xhr": "5.50.2", + "@algolia/requester-fetch": "5.50.2", + "@algolia/requester-node-http": "5.50.2" + }, + "engines": { + "node": ">= 14.0.0" } }, "node_modules/algoliasearch-helper": { - "version": "3.22.2", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.22.2.tgz", - "integrity": "sha512-3YQ6eo7uYOCHeQ2ZpD+OoT3aJJwMNKEnwtu8WMzm81XmBOSCwRjQditH9CeSOQ38qhHkuGw23pbq+kULkIJLcw==", + "version": "3.28.1", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.28.1.tgz", + "integrity": "sha512-6iXpbkkrAI5HFpCWXlNmIDSBuoN/U1XnEvb2yJAoWfqrZ+DrybI7MQ5P5mthFaprmocq+zbi6HxnR28xnZAYBw==", + "license": "MIT", "dependencies": { "@algolia/events": "^4.0.1" }, @@ -3974,6 +5971,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "license": "ISC", "dependencies": { "string-width": "^4.1.0" } @@ -3981,12 +5979,14 @@ "node_modules/ansi-align/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" }, "node_modules/ansi-align/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -4003,6 +6003,7 @@ "engines": [ "node >= 0.8.0" ], + "license": "Apache-2.0", "bin": { "ansi-html": "bin/ansi-html" } @@ -4011,6 +6012,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { "node": ">=8" } @@ -4019,6 +6021,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -4029,10 +6032,20 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/ansis": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.17.0.tgz", + "integrity": "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==", + "license": "ISC", + "engines": { + "node": ">=14" + } + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -4044,46 +6057,57 @@ "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" }, "node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/asn1js": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.9.tgz", + "integrity": "sha512-g35Ef4IMkE3mDaMAYd3GOJ/c41LKcaiJuuLZ9BF0EXkZwYc0tkFpmZqxWsKlmXS3Um42dAkyx//kibIETBjfqg==", + "license": "BSD-3-Clause", + "dependencies": { + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.5", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/astring": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.6.tgz", - "integrity": "sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "license": "MIT", "bin": { "astring": "bin/astring" } }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/autoprefixer": { - "version": "10.4.19", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", - "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz", + "integrity": "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==", "funding": [ { "type": "opencollective", @@ -4098,12 +6122,12 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001599", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", + "browserslist": "^4.28.2", + "caniuse-lite": "^1.0.30001787", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -4117,9 +6141,10 @@ } }, "node_modules/babel-loader": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", + "license": "MIT", "dependencies": { "find-cache-dir": "^4.0.0", "schema-utils": "^4.0.0" @@ -4136,17 +6161,19 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "license": "MIT", "dependencies": { "object.assign": "^4.1.0" } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", - "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", + "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==", + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.3", + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.8", "semver": "^6.3.1" }, "peerDependencies": { @@ -4157,28 +6184,31 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz", - "integrity": "sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", + "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.3", - "core-js-compat": "^3.33.1" + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", - "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz", + "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==", + "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.3" + "@babel/helper-define-polyfill-provider": "^0.6.8" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -4188,6 +6218,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -4196,46 +6227,66 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.20", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.20.tgz", + "integrity": "sha512-1AaXxEPfXT+GvTBJFuy4yXVHWJBXa4OdbIebGN/wX5DlsIkU0+wzGnd2lOzokSk51d5LUmqjgBLRLlypLUqInQ==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "license": "MIT" }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "license": "MIT", "engines": { "node": "*" } }, "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "license": "MIT", "dependencies": { - "bytes": "3.1.2", + "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", "type-is": "~1.6.18", - "unpipe": "1.0.0" + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8", @@ -4246,6 +6297,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -4254,6 +6306,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -4261,15 +6314,15 @@ "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, "node_modules/bonjour-service": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", - "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", + "license": "MIT", "dependencies": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", "fast-deep-equal": "^3.1.3", "multicast-dns": "^7.2.5" } @@ -4277,12 +6330,14 @@ "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" }, "node_modules/boxen": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", + "license": "MIT", "dependencies": { "ansi-align": "^3.0.1", "camelcase": "^6.2.0", @@ -4301,9 +6356,10 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4313,6 +6369,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -4321,9 +6378,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", - "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", "funding": [ { "type": "opencollective", @@ -4338,11 +6395,13 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001629", - "electron-to-chromium": "^1.4.796", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.16" + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" @@ -4354,20 +6413,47 @@ "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, + "node_modules/bytestreamjs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", + "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/cacheable-lookup": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "license": "MIT", "engines": { "node": ">=14.16" } @@ -4376,6 +6462,7 @@ "version": "10.2.14", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", + "license": "MIT", "dependencies": { "@types/http-cache-semantics": "^4.0.2", "get-stream": "^6.0.1", @@ -4389,27 +6476,45 @@ "node": ">=14.16" } }, - "node_modules/cacheable-request/node_modules/normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, "engines": { - "node": ">=14.16" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0", "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -4422,6 +6527,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", "engines": { "node": ">=6" } @@ -4430,6 +6536,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "license": "MIT", "dependencies": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" @@ -4439,6 +6546,7 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -4450,6 +6558,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "license": "MIT", "dependencies": { "browserslist": "^4.0.0", "caniuse-lite": "^1.0.0", @@ -4458,9 +6567,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001640", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001640.tgz", - "integrity": "sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA==", + "version": "1.0.30001788", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001788.tgz", + "integrity": "sha512-6q8HFp+lOQtcf7wBK+uEenxymVWkGKkjFpCvw5W25cmMwEDU45p1xQFBQv8JDlMMry7eNxyBaR+qxgmTUZkIRQ==", "funding": [ { "type": "opencollective", @@ -4474,12 +6583,14 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/ccount": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -4489,6 +6600,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4504,6 +6616,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "license": "MIT", "engines": { "node": ">=10" } @@ -4512,6 +6625,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -4521,6 +6635,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -4530,6 +6645,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -4539,6 +6655,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -4548,6 +6665,7 @@ "version": "1.0.0-rc.12", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "license": "MIT", "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", @@ -4568,6 +6686,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-select": "^5.1.0", @@ -4581,15 +6700,10 @@ } }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -4602,14 +6716,18 @@ "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "license": "MIT", "engines": { "node": ">=6.0" } @@ -4624,14 +6742,16 @@ "url": "https://github.com/sponsors/sibiraj-s" } ], + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/clean-css": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", - "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "license": "MIT", "dependencies": { "source-map": "~0.6.0" }, @@ -4643,6 +6763,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -4651,6 +6772,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "license": "MIT", "engines": { "node": ">=6" } @@ -4659,6 +6781,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -4667,9 +6790,10 @@ } }, "node_modules/cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "license": "MIT", "dependencies": { "string-width": "^4.2.0" }, @@ -4683,12 +6807,14 @@ "node_modules/cli-table3/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" }, "node_modules/cli-table3/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -4702,6 +6828,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -4711,21 +6838,11 @@ "node": ">=6" } }, - "node_modules/clone-deep/node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/clsx": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "license": "MIT", "engines": { "node": ">=6" } @@ -4734,6 +6851,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -4743,6 +6861,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -4753,22 +6872,26 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" }, "node_modules/colord": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "license": "MIT" }, "node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" }, "node_modules/combine-promises": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz", "integrity": "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==", + "license": "MIT", "engines": { "node": ">=10" } @@ -4777,6 +6900,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -4786,6 +6910,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "license": "MIT", "engines": { "node": ">= 6" } @@ -4793,12 +6918,14 @@ "node_modules/common-path-prefix": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "license": "ISC" }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "license": "MIT", "dependencies": { "mime-db": ">= 1.43.0 < 2" }, @@ -4807,34 +6934,46 @@ } }, "node_modules/compressible/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "license": "MIT", "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", + "bytes": "3.1.2", + "compressible": "~2.0.18", "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", "vary": "~1.1.2" }, "engines": { "node": ">= 0.8.0" } }, + "node_modules/compression/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/compression/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -4842,31 +6981,36 @@ "node_modules/compression/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" }, "node_modules/config-chain": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "license": "MIT", "dependencies": { "ini": "^1.3.4", "proto-list": "~1.2.1" } }, + "node_modules/config-chain/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, "node_modules/configstore": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", + "license": "BSD-2-Clause", "dependencies": { "dot-prop": "^6.0.1", "graceful-fs": "^4.2.6", @@ -4885,19 +7029,25 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "license": "MIT", "engines": { "node": ">=0.8" } }, "node_modules/consola": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } }, "node_modules/content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -4906,6 +7056,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -4913,25 +7064,29 @@ "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" }, "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" }, "node_modules/copy-text-to-clipboard": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz", - "integrity": "sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.2.tgz", + "integrity": "sha512-T6SqyLd1iLuqPA90J5N4cTalrtovCySh58iiZDGJ6FGznbclKh4UI+FGacQSgFzwKG77W7XT5gwbVEbd9cIH1A==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -4943,6 +7098,7 @@ "version": "11.0.0", "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "license": "MIT", "dependencies": { "fast-glob": "^3.2.11", "glob-parent": "^6.0.1", @@ -4966,6 +7122,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -4977,6 +7134,7 @@ "version": "13.2.2", "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "license": "MIT", "dependencies": { "dir-glob": "^3.0.1", "fast-glob": "^3.3.0", @@ -4995,6 +7153,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -5003,46 +7162,40 @@ } }, "node_modules/core-js": { - "version": "3.33.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.3.tgz", - "integrity": "sha512-lo0kOocUlLKmm6kv/FswQL8zbkH7mVsLJ/FULClOhv8WRVmKLVcs6XPNQAzstfeJTCHMyButEwG+z1kHxHoDZw==", + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.49.0.tgz", + "integrity": "sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==", "hasInstallScript": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, "node_modules/core-js-compat": { - "version": "3.33.3", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.3.tgz", - "integrity": "sha512-cNzGqFsh3Ot+529GIXacjTJ7kegdt5fPXxCBVS1G0iaZpuo/tBz399ymceLJveQhFFZ8qThHiP3fzuoQjKN2ow==", + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz", + "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==", + "license": "MIT", "dependencies": { - "browserslist": "^4.22.1" + "browserslist": "^4.28.1" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, - "node_modules/core-js-pure": { - "version": "3.33.3", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.33.3.tgz", - "integrity": "sha512-taJ00IDOP+XYQEA2dAe4ESkmHt1fL8wzYDo3mRWQey8uO9UojlBFMneA65kMyxfYP7106c6LzWaq7/haDT6BCQ==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" }, "node_modules/cosmiconfig": { "version": "8.3.6", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "license": "MIT", "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", @@ -5065,9 +7218,10 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -5081,6 +7235,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "license": "MIT", "dependencies": { "type-fest": "^1.0.1" }, @@ -5095,6 +7250,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -5102,10 +7258,49 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/css-blank-pseudo": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz", + "integrity": "sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-blank-pseudo/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/css-declaration-sorter": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", - "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.4.0.tgz", + "integrity": "sha512-LTuzjPoyA2vMGKKcaOqKSp7Ub2eGrNfKiZH4LpezxpNrsICGCSFvsQOI29psISxNZtaXibkC2CXzrQ5enMeGGw==", + "license": "ISC", "engines": { "node": "^14 || ^16 || >=18" }, @@ -5113,19 +7308,82 @@ "postcss": "^8.0.9" } }, + "node_modules/css-has-pseudo": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.3.tgz", + "integrity": "sha512-oG+vKuGyqe/xvEMoxAQrhi7uY16deJR3i7wwhBerVrGQKSqUC5GiOVxTpM9F9B9hw0J+eKeOWLH7E9gZ1Dr5rA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-has-pseudo/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/css-loader": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", - "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "license": "MIT", "dependencies": { "icss-utils": "^5.1.0", - "postcss": "^8.4.21", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.3", - "postcss-modules-scope": "^3.0.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" + "semver": "^7.5.4" }, "engines": { "node": ">= 12.13.0" @@ -5135,13 +7393,23 @@ "url": "https://opencollective.com/webpack" }, "peerDependencies": { + "@rspack/core": "0.x || 1.x", "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, "node_modules/css-minimizer-webpack-plugin": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", "cssnano": "^6.0.1", @@ -5181,10 +7449,33 @@ } } }, + "node_modules/css-prefers-color-scheme": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz", + "integrity": "sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", @@ -5200,6 +7491,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "license": "MIT", "dependencies": { "mdn-data": "2.0.30", "source-map-js": "^1.0.1" @@ -5209,9 +7501,10 @@ } }, "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", "engines": { "node": ">= 6" }, @@ -5219,10 +7512,27 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/cssdb": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.8.0.tgz", + "integrity": "sha512-QbLeyz2Bgso1iRlh7IpWk6OKa3lLNGXsujVjDMPl9rOZpxKeiG69icLpbLCFxeURwmcdIfZqQyhlooKJYM4f8Q==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ], + "license": "MIT-0" + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -5234,6 +7544,7 @@ "version": "6.1.2", "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", + "license": "MIT", "dependencies": { "cssnano-preset-default": "^6.1.2", "lilconfig": "^3.1.1" @@ -5253,6 +7564,7 @@ "version": "6.1.2", "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz", "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==", + "license": "MIT", "dependencies": { "autoprefixer": "^10.4.19", "browserslist": "^4.23.0", @@ -5273,6 +7585,7 @@ "version": "6.1.2", "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "css-declaration-sorter": "^7.2.0", @@ -5316,6 +7629,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -5327,6 +7641,7 @@ "version": "5.0.5", "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", "dependencies": { "css-tree": "~2.2.0" }, @@ -5339,6 +7654,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" @@ -5351,24 +7667,28 @@ "node_modules/csso/node_modules/mdn-data": { "version": "2.0.28", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==" + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" }, "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" }, "node_modules/debounce": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "license": "MIT" }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -5380,9 +7700,10 @@ } }, "node_modules/decode-named-character-reference": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", - "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "license": "MIT", "dependencies": { "character-entities": "^2.0.0" }, @@ -5395,6 +7716,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", "dependencies": { "mimic-response": "^3.1.0" }, @@ -5409,6 +7731,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -5420,6 +7743,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", "engines": { "node": ">=4.0.0" } @@ -5428,25 +7752,44 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "node_modules/default-browser": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", + "license": "MIT", "dependencies": { - "execa": "^5.0.0" + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" }, "engines": { - "node": ">= 10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/defer-to-connect": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "license": "MIT", "engines": { "node": ">=10" } @@ -5455,6 +7798,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -5471,6 +7815,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", "engines": { "node": ">=8" } @@ -5479,6 +7824,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -5491,31 +7837,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", - "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -5524,6 +7850,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", "engines": { "node": ">=6" } @@ -5532,6 +7859,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -5540,12 +7868,14 @@ "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT" }, "node_modules/detect-port": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", - "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", + "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", + "license": "MIT", "dependencies": { "address": "^1.0.1", "debug": "4" @@ -5553,41 +7883,16 @@ "bin": { "detect": "bin/detect-port.js", "detect-port": "bin/detect-port.js" - } - }, - "node_modules/detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", - "dependencies": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "bin": { - "detect": "bin/detect-port", - "detect-port": "bin/detect-port" }, "engines": { - "node": ">= 4.2.1" - } - }, - "node_modules/detect-port-alt/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" + "node": ">= 4.0.0" } }, - "node_modules/detect-port-alt/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, "node_modules/devlop": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", "dependencies": { "dequal": "^2.0.0" }, @@ -5600,6 +7905,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -5607,15 +7913,11 @@ "node": ">=8" } }, - "node_modules/dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" - }, "node_modules/dns-packet": { "version": "5.6.1", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "license": "MIT", "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" }, @@ -5627,6 +7929,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "license": "MIT", "dependencies": { "utila": "~0.4" } @@ -5635,6 +7938,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", @@ -5653,12 +7957,14 @@ "type": "github", "url": "https://github.com/sponsors/fb55" } - ] + ], + "license": "BSD-2-Clause" }, "node_modules/domhandler": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" }, @@ -5670,9 +7976,10 @@ } }, "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", @@ -5686,6 +7993,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -5695,6 +8003,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "license": "MIT", "dependencies": { "is-obj": "^2.0.0" }, @@ -5709,72 +8018,97 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "license": "MIT" }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.4.816", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.816.tgz", - "integrity": "sha512-EKH5X5oqC6hLmiS7/vYtZHZFTNdhsYG5NVPRN6Yn0kQHNBlT59+xSM8HBy66P5fxWpKgZbPqb+diC64ng295Jw==" + "version": "1.5.340", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.340.tgz", + "integrity": "sha512-908qahOGocRMinT2nM3ajCEM99H4iPdv84eagPP3FfZy/1ZGeOy2CZYzjhms81ckOPCXPlW7LkY4XpxD8r1DrA==", + "license": "ISC" }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" }, "node_modules/emojilib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", - "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==" + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", + "license": "MIT" }, "node_modules/emojis-list": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/emoticon": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.0.1.tgz", - "integrity": "sha512-dqx7eA9YaqyvYtUhJwT4rC1HIp82j5ybS1/vQ42ur+jBe17dJMwZE4+gvL1XadSFfxaPFFGt3Xsw+Y8akThDlw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz", + "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", + "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "tapable": "^2.3.0" }, "engines": { "node": ">=10.13.0" @@ -5784,6 +8118,7 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -5792,20 +8127,19 @@ } }, "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -5814,19 +8148,66 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esast-util-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", + "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esast-util-from-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", + "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "acorn": "^8.0.0", + "esast-util-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", "engines": { "node": ">=6" } @@ -5835,6 +8216,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -5845,12 +8227,14 @@ "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -5862,6 +8246,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -5874,6 +8259,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -5886,6 +8272,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -5897,6 +8284,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -5905,6 +8293,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -5913,6 +8302,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" }, @@ -5925,6 +8315,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", @@ -5940,6 +8331,21 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-scope": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", + "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0" + }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" @@ -5949,6 +8355,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "astring": "^1.8.0", @@ -5960,9 +8367,10 @@ } }, "node_modules/estree-util-value-to-estree": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.1.2.tgz", - "integrity": "sha512-S0gW2+XZkmsx00tU2uJ4L9hUT7IFabbml9pHh2WQqFmAbxit++YGZne0sKJbNwkj9Wvg9E4uqWl4nCIFQMmfag==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.5.0.tgz", + "integrity": "sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==", + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" }, @@ -5974,6 +8382,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/unist": "^3.0.0" @@ -5987,6 +8396,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" } @@ -5995,6 +8405,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -6003,6 +8414,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz", "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==", + "license": "MIT", "engines": { "node": ">=6.0.0" }, @@ -6014,6 +8426,7 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -6033,12 +8446,14 @@ "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", "engines": { "node": ">=0.8.x" } @@ -6047,6 +8462,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -6066,55 +8482,56 @@ } }, "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "~6.14.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "~0.19.0", + "serve-static": "~1.16.2", "setprototypeof": "1.2.0", - "statuses": "2.0.1", + "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" }, "engines": { "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/express/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, "node_modules/express/node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" }, @@ -6126,6 +8543,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -6133,17 +8551,20 @@ "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", + "license": "MIT" }, "node_modules/express/node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -6151,12 +8572,14 @@ "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" }, "node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", "dependencies": { "is-extendable": "^0.1.0" }, @@ -6167,18 +8590,20 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -6187,20 +8612,30 @@ "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" }, - "node_modules/fast-url-parser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", - "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", - "dependencies": { - "punycode": "^1.3.2" - } + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } @@ -6209,6 +8644,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "license": "MIT", "dependencies": { "format": "^0.2.0" }, @@ -6221,6 +8657,7 @@ "version": "0.11.4", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "license": "Apache-2.0", "dependencies": { "websocket-driver": ">=0.5.1" }, @@ -6232,6 +8669,7 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", + "license": "MIT", "dependencies": { "xml-js": "^1.6.11" }, @@ -6243,6 +8681,7 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" @@ -6259,9 +8698,10 @@ } }, "node_modules/file-loader/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -6277,6 +8717,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } @@ -6284,12 +8725,14 @@ "node_modules/file-loader/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" }, "node_modules/file-loader/node_modules/schema-utils": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -6303,18 +8746,11 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/filesize": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", - "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -6323,16 +8759,17 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "statuses": "2.0.1", + "statuses": "~2.0.2", "unpipe": "~1.0.0" }, "engines": { @@ -6343,6 +8780,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -6350,12 +8788,14 @@ "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, "node_modules/find-cache-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "license": "MIT", "dependencies": { "common-path-prefix": "^3.0.0", "pkg-dir": "^7.0.0" @@ -6371,6 +8811,7 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "license": "MIT", "dependencies": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" @@ -6386,20 +8827,22 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "license": "BSD-3-Clause", "bin": { "flat": "cli.js" } }, "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -6409,130 +8852,11 @@ } } }, - "node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", - "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", - "dependencies": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "memfs": "^3.1.2", - "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=10", - "yarn": ">=1.0.0" - }, - "peerDependencies": { - "eslint": ">= 6", - "typescript": ">= 2.7", - "vue-template-compiler": "*", - "webpack": ">= 4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - }, - "vue-template-compiler": { - "optional": true - } - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "dependencies": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "engines": { - "node": ">=6" - } - }, "node_modules/form-data-encoder": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "license": "MIT", "engines": { "node": ">= 14.17" } @@ -6549,19 +8873,21 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "license": "MIT", "engines": { "node": "*" }, "funding": { - "type": "patreon", + "type": "github", "url": "https://github.com/sponsors/rawify" } }, @@ -6569,14 +8895,16 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -6586,21 +8914,12 @@ "node": ">=14.14" } }, - "node_modules/fs-monkey": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", - "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -6613,6 +8932,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -6621,20 +8941,27 @@ "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -6646,12 +8973,27 @@ "node_modules/get-own-enumerable-property-symbols": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "license": "ISC" + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -6662,31 +9004,14 @@ "node_modules/github-slugger": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", - "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==" - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", + "license": "ISC" }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -6694,15 +9019,33 @@ "node": ">= 6" } }, + "node_modules/glob-to-regex.js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", + "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" }, "node_modules/global-dirs": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "license": "MIT", "dependencies": { "ini": "2.0.0" }, @@ -6713,61 +9056,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/global-dirs/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dependencies": { - "global-prefix": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -6784,11 +9077,12 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6798,6 +9092,7 @@ "version": "12.6.1", "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "license": "MIT", "dependencies": { "@sindresorhus/is": "^5.2.0", "@szmarczak/http-timer": "^5.0.1", @@ -6822,6 +9117,7 @@ "version": "5.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -6832,12 +9128,14 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" }, "node_modules/gray-matter": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "license": "MIT", "dependencies": { "js-yaml": "^3.13.1", "kind-of": "^6.0.2", @@ -6852,14 +9150,16 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/gray-matter/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -6872,6 +9172,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "license": "MIT", "dependencies": { "duplexer": "^0.1.2" }, @@ -6885,12 +9186,14 @@ "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "license": "MIT" }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { "node": ">=8" } @@ -6899,6 +9202,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -6906,21 +9210,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -6932,6 +9226,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -6940,9 +9235,10 @@ } }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -6951,15 +9247,16 @@ } }, "node_modules/hast-util-from-parse5": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", - "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", - "hastscript": "^8.0.0", - "property-information": "^6.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", "vfile": "^6.0.0", "vfile-location": "^5.0.0", "web-namespaces": "^2.0.0" @@ -6973,6 +9270,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0" }, @@ -6982,9 +9280,10 @@ } }, "node_modules/hast-util-raw": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.4.tgz", - "integrity": "sha512-LHE65TD2YiNsHD3YuXcKPHXPLuYh/gjp12mOfU8jxSrm1f/yJpsb0F/KKljS6U9LJoP0Ux+tCe8iJ2AsPzTdgA==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", @@ -7006,9 +9305,10 @@ } }, "node_modules/hast-util-to-estree": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz", - "integrity": "sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", + "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", @@ -7021,9 +9321,9 @@ "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^6.0.0", + "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", - "style-to-object": "^0.4.0", + "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "zwitch": "^2.0.0" }, @@ -7033,9 +9333,10 @@ } }, "node_modules/hast-util-to-jsx-runtime": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", - "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", @@ -7047,9 +9348,9 @@ "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^6.0.0", + "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", - "style-to-object": "^1.0.0", + "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "vfile-message": "^4.0.0" }, @@ -7058,28 +9359,16 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hast-util-to-jsx-runtime/node_modules/inline-style-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.3.tgz", - "integrity": "sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==" - }, - "node_modules/hast-util-to-jsx-runtime/node_modules/style-to-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.6.tgz", - "integrity": "sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==", - "dependencies": { - "inline-style-parser": "0.2.3" - } - }, "node_modules/hast-util-to-parse5": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", - "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", + "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", - "property-information": "^6.0.0", + "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" @@ -7093,6 +9382,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0" }, @@ -7102,14 +9392,15 @@ } }, "node_modules/hastscript": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", - "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", - "property-information": "^6.0.0", + "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" }, "funding": { @@ -7121,6 +9412,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", "bin": { "he": "bin/he" } @@ -7129,6 +9421,7 @@ "version": "4.10.1", "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.1.2", "loose-envify": "^1.2.0", @@ -7142,6 +9435,7 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", "dependencies": { "react-is": "^16.7.0" } @@ -7150,6 +9444,7 @@ "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "license": "MIT", "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -7160,12 +9455,14 @@ "node_modules/hpack.js/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" }, "node_modules/hpack.js/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -7179,40 +9476,29 @@ "node_modules/hpack.js/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" }, "node_modules/hpack.js/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } }, - "node_modules/html-entities": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", - "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ] - }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "license": "MIT" }, "node_modules/html-minifier-terser": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", + "license": "MIT", "dependencies": { "camel-case": "^4.1.2", "clean-css": "~5.3.2", @@ -7233,6 +9519,7 @@ "version": "10.0.1", "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "license": "MIT", "engines": { "node": ">=14" } @@ -7241,6 +9528,7 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "license": "MIT", "engines": { "node": ">=8" }, @@ -7252,15 +9540,17 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/html-webpack-plugin": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz", - "integrity": "sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg==", + "version": "5.6.7", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.7.tgz", + "integrity": "sha512-md+vXtdCAe60s1k6AU3dUyMJnDxUyQAwfwPKoLisvgUF1IXjtlLsk2se54+qfL9Mdm26bbwvjJybpNx48NKRLw==", + "license": "MIT", "dependencies": { "@types/html-minifier-terser": "^6.0.0", "html-minifier-terser": "^6.0.2", @@ -7276,13 +9566,23 @@ "url": "https://opencollective.com/html-webpack-plugin" }, "peerDependencies": { + "@rspack/core": "0.x || 1.x", "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, "node_modules/html-webpack-plugin/node_modules/commander": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", "engines": { "node": ">= 12" } @@ -7291,6 +9591,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "license": "MIT", "dependencies": { "camel-case": "^4.1.2", "clean-css": "^5.2.2", @@ -7318,6 +9619,7 @@ "url": "https://github.com/sponsors/fb55" } ], + "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", @@ -7326,39 +9628,48 @@ } }, "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" }, "node_modules/http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "license": "MIT" }, "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, "engines": { "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "license": "MIT" }, "node_modules/http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "license": "MIT", "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -7369,9 +9680,10 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", + "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -7395,6 +9707,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -7406,6 +9719,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "license": "MIT", "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" @@ -7418,14 +9732,25 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "license": "MIT", + "engines": { + "node": ">=10.18" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -7437,6 +9762,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -7445,20 +9771,19 @@ } }, "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/image-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", - "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", - "dependencies": { - "queue": "6.0.2" - }, + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", + "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", + "license": "MIT", "bin": { "image-size": "bin/image-size.js" }, @@ -7466,19 +9791,11 @@ "node": ">=16.x" } }, - "node_modules/immer": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", - "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -7494,6 +9811,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "license": "MIT", "engines": { "node": ">=8" } @@ -7502,6 +9820,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -7510,62 +9829,55 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/infima": { - "version": "0.2.0-alpha.43", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.43.tgz", - "integrity": "sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ==", + "version": "0.2.0-alpha.45", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.45.tgz", + "integrity": "sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw==", + "license": "MIT", "engines": { "node": ">=12" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" }, "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" - }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "license": "ISC", "engines": { - "node": ">= 0.10" + "node": ">=10" } }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "license": "MIT" + }, "node_modules/invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", "dependencies": { "loose-envify": "^1.0.0" } }, "node_modules/ipaddr.js": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", - "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz", + "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==", + "license": "MIT", "engines": { "node": ">= 10" } @@ -7574,6 +9886,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -7583,6 +9896,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" @@ -7595,12 +9909,14 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -7612,6 +9928,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "license": "MIT", "dependencies": { "ci-info": "^3.2.0" }, @@ -7620,11 +9937,15 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7634,6 +9955,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -7643,6 +9965,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -7657,6 +9980,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -7665,6 +9989,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -7673,6 +9998,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", "engines": { "node": ">=8" } @@ -7681,6 +10007,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -7692,15 +10019,50 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-installed-globally": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "license": "MIT", "dependencies": { "global-dirs": "^3.0.0", "is-path-inside": "^3.0.2" @@ -7712,10 +10074,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-network-error": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.1.tgz", + "integrity": "sha512-6QCxa49rQbmUWLfk0nuGqzql9U8uaV2H6279bRErPBHe/109hCzsLUBUHfbEtvLIHBd6hyXbgedBSHevm43Edw==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-npm": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", - "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.1.0.tgz", + "integrity": "sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA==", + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -7727,6 +10102,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -7735,22 +10111,16 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "engines": { - "node": ">=6" - } - }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "license": "MIT", "engines": { "node": ">=8" } @@ -7759,6 +10129,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -7767,41 +10138,31 @@ } }, "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/is-reference": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", - "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", - "dependencies": { - "@types/estree": "*" - } - }, "node_modules/is-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", - "engines": { - "node": ">=6" - } - }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", "engines": { "node": ">=8" }, @@ -7812,12 +10173,14 @@ "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "license": "MIT" }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", "dependencies": { "is-docker": "^2.0.0" }, @@ -7829,6 +10192,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", + "license": "MIT", "engines": { "node": ">=12" } @@ -7836,17 +10200,20 @@ "node_modules/isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" }, "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -7855,6 +10222,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -7871,6 +10239,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "license": "MIT", "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", @@ -7885,6 +10254,7 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -7896,9 +10266,10 @@ } }, "node_modules/jiti": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "license": "MIT", "bin": { "jiti": "bin/jiti.js" } @@ -7907,6 +10278,7 @@ "version": "17.13.3", "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^9.3.0", "@hapi/topo": "^5.1.0", @@ -7918,12 +10290,14 @@ "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -7932,35 +10306,40 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -7969,9 +10348,10 @@ } }, "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -7983,6 +10363,7 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -7991,6 +10372,7 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -7999,6 +10381,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", "engines": { "node": ">=6" } @@ -8007,6 +10390,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", + "license": "MIT", "dependencies": { "package-json": "^8.1.0" }, @@ -8018,26 +10402,29 @@ } }, "node_modules/launch-editor": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", - "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.13.2.tgz", + "integrity": "sha512-4VVDnbOpLXy/s8rdRCSXb+zfMeFR0WlJWpET1iA9CQdlZDfwyLjUuGQzXU4VeOoey6AicSAluWan7Etga6Kcmg==", + "license": "MIT", "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" + "picocolors": "^1.1.1", + "shell-quote": "^1.8.3" } }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/lilconfig": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", - "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", "engines": { "node": ">=14" }, @@ -8048,20 +10435,27 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" }, "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", + "license": "MIT", "engines": { "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/loader-utils": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -8075,6 +10469,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "license": "MIT", "dependencies": { "p-locate": "^6.0.0" }, @@ -8086,29 +10481,34 @@ } }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "license": "MIT" }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "license": "MIT" }, "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "license": "MIT" }, "node_modules/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -8118,6 +10518,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -8129,6 +10530,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "license": "MIT", "dependencies": { "tslib": "^2.0.3" } @@ -8137,6 +10539,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -8148,6 +10551,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", "dependencies": { "yallist": "^3.0.2" } @@ -8156,6 +10560,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "license": "MIT", "engines": { "node": ">=16" }, @@ -8164,21 +10569,33 @@ } }, "node_modules/markdown-table": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", - "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mdast-util-directive": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz", - "integrity": "sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", + "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", + "ccount": "^2.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", @@ -8192,9 +10609,10 @@ } }, "node_modules/mdast-util-find-and-replace": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", - "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", @@ -8210,6 +10628,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -8218,9 +10637,10 @@ } }, "node_modules/mdast-util-from-markdown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", - "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", @@ -8241,9 +10661,9 @@ } }, "node_modules/mdast-util-from-markdown/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -8253,12 +10673,14 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/mdast-util-frontmatter": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", @@ -8276,6 +10698,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -8284,9 +10707,10 @@ } }, "node_modules/mdast-util-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", - "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-gfm-autolink-literal": "^2.0.0", @@ -8302,9 +10726,10 @@ } }, "node_modules/mdast-util-gfm-autolink-literal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz", - "integrity": "sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "ccount": "^2.0.0", @@ -8318,9 +10743,9 @@ } }, "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -8331,15 +10756,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -8349,12 +10775,14 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/mdast-util-gfm-footnote": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", - "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.1.0", @@ -8371,6 +10799,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", @@ -8385,6 +10814,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", @@ -8401,6 +10831,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", @@ -8416,6 +10847,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "license": "MIT", "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-mdx-expression": "^2.0.0", @@ -8429,9 +10861,10 @@ } }, "node_modules/mdast-util-mdx-expression": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", - "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", @@ -8446,9 +10879,10 @@ } }, "node_modules/mdast-util-mdx-jsx": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz", - "integrity": "sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", @@ -8460,7 +10894,6 @@ "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", - "unist-util-remove-position": "^5.0.0", "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" }, @@ -8473,6 +10906,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", @@ -8490,6 +10924,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" @@ -8500,9 +10935,10 @@ } }, "node_modules/mdast-util-to-hast": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", - "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", @@ -8520,15 +10956,17 @@ } }, "node_modules/mdast-util-to-markdown": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", - "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" @@ -8542,6 +10980,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0" }, @@ -8553,41 +10992,67 @@ "node_modules/mdn-data": { "version": "2.0.30", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==" + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "license": "CC0-1.0" }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "dependencies": { - "fs-monkey": "^1.0.4" + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.57.2.tgz", + "integrity": "sha512-2nWzSsJzrukurSDna4Z0WywuScK4Id3tSKejgu74u8KCdW4uNrseKRSIDg75C6Yw5ZRqBe0F0EtMNlTbUq8bAQ==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.57.2", + "@jsonjoy.com/fs-fsa": "4.57.2", + "@jsonjoy.com/fs-node": "4.57.2", + "@jsonjoy.com/fs-node-builtins": "4.57.2", + "@jsonjoy.com/fs-node-to-fsa": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.2", + "@jsonjoy.com/fs-print": "4.57.2", + "@jsonjoy.com/fs-snapshot": "4.57.2", + "@jsonjoy.com/json-pack": "^1.11.0", + "@jsonjoy.com/util": "^1.9.0", + "glob-to-regex.js": "^1.0.1", + "thingies": "^2.5.0", + "tree-dump": "^1.0.3", + "tslib": "^2.0.0" }, - "engines": { - "node": ">= 4.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", "engines": { "node": ">= 8" } @@ -8596,14 +11061,15 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/micromark": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", - "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", "funding": [ { "type": "GitHub Sponsors", @@ -8614,6 +11080,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", @@ -8635,9 +11102,9 @@ } }, "node_modules/micromark-core-commonmark": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", - "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", "funding": [ { "type": "GitHub Sponsors", @@ -8648,6 +11115,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", @@ -8668,9 +11136,9 @@ } }, "node_modules/micromark-core-commonmark/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -8681,15 +11149,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-core-commonmark/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -8700,15 +11169,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-core-commonmark/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -8718,12 +11188,14 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-extension-directive": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.0.tgz", - "integrity": "sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz", + "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==", + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", @@ -8739,9 +11211,9 @@ } }, "node_modules/micromark-extension-directive/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -8752,15 +11224,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-extension-directive/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -8771,15 +11244,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-extension-directive/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -8789,12 +11263,14 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-extension-frontmatter": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", + "license": "MIT", "dependencies": { "fault": "^2.0.0", "micromark-util-character": "^2.0.0", @@ -8807,9 +11283,9 @@ } }, "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -8820,15 +11296,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -8838,12 +11315,14 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-extension-gfm": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", "dependencies": { "micromark-extension-gfm-autolink-literal": "^2.0.0", "micromark-extension-gfm-footnote": "^2.0.0", @@ -8860,9 +11339,10 @@ } }, "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.0.0.tgz", - "integrity": "sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", @@ -8875,9 +11355,9 @@ } }, "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -8888,15 +11368,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -8906,12 +11387,14 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-extension-gfm-footnote": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.0.0.tgz", - "integrity": "sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", @@ -8928,9 +11411,9 @@ } }, "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -8941,15 +11424,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -8960,15 +11444,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -8978,12 +11463,14 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-extension-gfm-strikethrough": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", @@ -8998,9 +11485,9 @@ } }, "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9010,12 +11497,14 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-extension-gfm-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.0.0.tgz", - "integrity": "sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", @@ -9029,9 +11518,9 @@ } }, "node_modules/micromark-extension-gfm-table/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -9042,15 +11531,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9061,15 +11551,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9079,12 +11570,14 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-extension-gfm-tagfilter": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", "dependencies": { "micromark-util-types": "^2.0.0" }, @@ -9094,9 +11587,10 @@ } }, "node_modules/micromark-extension-gfm-task-list-item": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.0.1.tgz", - "integrity": "sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", @@ -9110,9 +11604,9 @@ } }, "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -9123,15 +11617,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9142,15 +11637,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9160,12 +11656,13 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-extension-mdx-expression": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz", - "integrity": "sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", + "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9176,6 +11673,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", @@ -9188,9 +11686,9 @@ } }, "node_modules/micromark-extension-mdx-expression/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -9201,15 +11699,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9220,15 +11719,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9238,20 +11738,22 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-extension-mdx-jsx": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.0.tgz", - "integrity": "sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", + "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", + "license": "MIT", "dependencies": { - "@types/acorn": "^4.0.0", "@types/estree": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" @@ -9262,9 +11764,9 @@ } }, "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -9275,15 +11777,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9294,15 +11797,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9312,12 +11816,14 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-extension-mdx-md": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "license": "MIT", "dependencies": { "micromark-util-types": "^2.0.0" }, @@ -9330,6 +11836,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "license": "MIT", "dependencies": { "acorn": "^8.0.0", "acorn-jsx": "^5.0.0", @@ -9349,6 +11856,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", @@ -9366,9 +11874,9 @@ } }, "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9379,15 +11887,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9397,12 +11906,13 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-factory-destination": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", - "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", "funding": [ { "type": "GitHub Sponsors", @@ -9413,6 +11923,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", @@ -9420,9 +11931,9 @@ } }, "node_modules/micromark-factory-destination/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9433,15 +11944,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-factory-destination/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9451,12 +11963,13 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-factory-label": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", - "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", "funding": [ { "type": "GitHub Sponsors", @@ -9467,6 +11980,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", @@ -9475,9 +11989,9 @@ } }, "node_modules/micromark-factory-label/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9488,15 +12002,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-factory-label/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9506,12 +12021,13 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-factory-mdx-expression": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.1.tgz", - "integrity": "sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", + "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", "funding": [ { "type": "GitHub Sponsors", @@ -9522,9 +12038,11 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", @@ -9533,10 +12051,30 @@ "vfile-message": "^4.0.0" } }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9547,15 +12085,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9565,7 +12104,8 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-factory-space": { "version": "1.1.0", @@ -9581,6 +12121,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-types": "^1.0.0" @@ -9599,12 +12140,13 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-factory-title": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", - "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", "funding": [ { "type": "GitHub Sponsors", @@ -9615,6 +12157,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", @@ -9623,9 +12166,9 @@ } }, "node_modules/micromark-factory-title/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -9636,15 +12179,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-factory-title/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9655,15 +12199,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-factory-title/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9673,12 +12218,13 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-factory-whitespace": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", - "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", "funding": [ { "type": "GitHub Sponsors", @@ -9689,6 +12235,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", @@ -9697,9 +12244,9 @@ } }, "node_modules/micromark-factory-whitespace/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -9710,15 +12257,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-factory-whitespace/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9729,15 +12277,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-factory-whitespace/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9747,7 +12296,8 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-character": { "version": "1.2.0", @@ -9763,6 +12313,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0" @@ -9781,12 +12332,13 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-chunked": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", - "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", "funding": [ { "type": "GitHub Sponsors", @@ -9797,14 +12349,15 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "node_modules/micromark-util-chunked/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9814,12 +12367,13 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-classify-character": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", - "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9830,6 +12384,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", @@ -9837,9 +12392,9 @@ } }, "node_modules/micromark-util-classify-character/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9850,15 +12405,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-classify-character/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9868,12 +12424,13 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-combine-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", - "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", "funding": [ { "type": "GitHub Sponsors", @@ -9884,15 +12441,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", - "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", "funding": [ { "type": "GitHub Sponsors", @@ -9903,14 +12461,15 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "node_modules/micromark-util-decode-numeric-character-reference/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9920,12 +12479,13 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-decode-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", - "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", "funding": [ { "type": "GitHub Sponsors", @@ -9936,6 +12496,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", @@ -9944,9 +12505,9 @@ } }, "node_modules/micromark-util-decode-string/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9957,15 +12518,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-decode-string/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9975,12 +12537,13 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", - "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", "funding": [ { "type": "GitHub Sponsors", @@ -9990,12 +12553,13 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-events-to-acorn": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.2.tgz", - "integrity": "sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", + "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", "funding": [ { "type": "GitHub Sponsors", @@ -10006,8 +12570,8 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { - "@types/acorn": "^4.0.0", "@types/estree": "^1.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", @@ -10018,9 +12582,9 @@ } }, "node_modules/micromark-util-events-to-acorn/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -10030,12 +12594,13 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-html-tag-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", - "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", "funding": [ { "type": "GitHub Sponsors", @@ -10045,12 +12610,13 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", - "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", "funding": [ { "type": "GitHub Sponsors", @@ -10061,14 +12627,15 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "node_modules/micromark-util-normalize-identifier/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -10078,12 +12645,13 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-resolve-all": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", - "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", "funding": [ { "type": "GitHub Sponsors", @@ -10094,14 +12662,15 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", - "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10112,6 +12681,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", @@ -10119,9 +12689,9 @@ } }, "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -10132,15 +12702,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -10150,12 +12721,13 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-subtokenize": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", - "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", "funding": [ { "type": "GitHub Sponsors", @@ -10166,6 +12738,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", @@ -10174,9 +12747,9 @@ } }, "node_modules/micromark-util-subtokenize/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -10186,7 +12759,8 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-symbol": { "version": "1.1.0", @@ -10201,12 +12775,13 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", - "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", "funding": [ { "type": "GitHub Sponsors", @@ -10216,12 +12791,13 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -10232,15 +12808,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -10251,15 +12828,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -10269,14 +12847,16 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -10287,6 +12867,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -10298,6 +12879,7 @@ "version": "1.33.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -10306,6 +12888,7 @@ "version": "2.1.18", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "license": "MIT", "dependencies": { "mime-db": "~1.33.0" }, @@ -10317,6 +12900,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", "engines": { "node": ">=6" } @@ -10325,6 +12909,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -10333,11 +12918,13 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.7.6", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", - "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.10.2.tgz", + "integrity": "sha512-AOSS0IdEB95ayVkxn5oGzNQwqAi2J0Jb/kKm43t7H73s8+f5873g0yuj0PNvK4dO75mu5DHg4nlgp4k6Kga8eg==", + "license": "MIT", "dependencies": { - "schema-utils": "^4.0.0" + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" }, "engines": { "node": ">= 12.13.0" @@ -10353,12 +12940,14 @@ "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -10370,27 +12959,31 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/multicast-dns": { "version": "7.2.5", "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "license": "MIT", "dependencies": { "dns-packet": "^5.2.2", "thunky": "^1.0.2" @@ -10400,15 +12993,16 @@ } }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -10417,9 +13011,10 @@ } }, "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -10427,21 +13022,24 @@ "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" }, "node_modules/no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "license": "MIT", "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" } }, "node_modules/node-emoji": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", - "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", + "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", + "license": "MIT", "dependencies": { "@sindresorhus/is": "^4.6.0", "char-regex": "^1.0.2", @@ -10452,39 +13050,38 @@ "node": ">=18" } }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "engines": { - "node": ">= 6.13.0" - } - }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" + "version": "2.0.37", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz", + "integrity": "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==", + "license": "MIT" }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "node_modules/normalize-url": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.1.tgz", + "integrity": "sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -10495,12 +13092,14 @@ "node_modules/nprogress": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", - "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", + "license": "MIT" }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" }, @@ -10508,18 +13107,89 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, + "node_modules/null-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", + "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/null-loader/node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/null-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/null-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/null-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -10531,18 +13201,22 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", "object-keys": "^1.1.1" }, "engines": { @@ -10555,12 +13229,14 @@ "node_modules/obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "license": "MIT" }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -10569,25 +13245,19 @@ } }, "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, "node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -10602,6 +13272,7 @@ "version": "8.4.2", "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", @@ -10618,6 +13289,7 @@ "version": "1.5.2", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "license": "(WTFPL OR MIT)", "bin": { "opener": "bin/opener-bin.js" } @@ -10626,14 +13298,25 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "license": "MIT", "engines": { "node": ">=12.20" } }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/p-limit": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "license": "MIT", "dependencies": { "yocto-queue": "^1.0.0" }, @@ -10648,6 +13331,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "license": "MIT", "dependencies": { "p-limit": "^4.0.0" }, @@ -10662,6 +13346,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -10672,30 +13357,56 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", + "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", + "license": "MIT", "dependencies": { - "@types/retry": "0.12.0", + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", "retry": "^0.13.1" }, "engines": { - "node": ">=8" + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/package-json": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", + "license": "MIT", "dependencies": { "got": "^12.1.0", "registry-auth-token": "^5.0.1", @@ -10713,6 +13424,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "license": "MIT", "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -10722,6 +13434,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -10730,12 +13443,12 @@ } }, "node_modules/parse-entities": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", - "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", "dependencies": { "@types/unist": "^2.0.0", - "character-entities": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", @@ -10749,14 +13462,16 @@ } }, "node_modules/parse-entities/node_modules/@types/unist": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -10773,35 +13488,51 @@ "node_modules/parse-numeric-range": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", - "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==", + "license": "ISC" }, "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", "dependencies": { - "entities": "^4.4.0" + "entities": "^6.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" } }, "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", - "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "license": "MIT", "dependencies": { - "domhandler": "^5.0.2", + "domhandler": "^5.0.3", "parse5": "^7.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -10810,6 +13541,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -10819,27 +13551,22 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "license": "(WTFPL OR MIT)" }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", "engines": { "node": ">=8" } @@ -10847,12 +13574,14 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" }, "node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", + "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", + "license": "MIT", "dependencies": { "isarray": "0.0.1" } @@ -10861,29 +13590,22 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/periscopic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", - "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^3.0.0", - "is-reference": "^3.0.0" - } - }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -10895,6 +13617,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "license": "MIT", "dependencies": { "find-up": "^6.3.0" }, @@ -10905,151 +13628,376 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "node_modules/pkijs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.4.0.tgz", + "integrity": "sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw==", + "license": "BSD-3-Clause", "dependencies": { - "find-up": "^3.0.0" + "@noble/hashes": "1.4.0", + "asn1js": "^3.0.6", + "bytestreamjs": "^2.0.1", + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.3", + "tslib": "^2.8.1" }, "engines": { - "node": ">=8" + "node": ">=16.0.0" } }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "node_modules/postcss": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz", + "integrity": "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "locate-path": "^3.0.0" + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { - "node": ">=6" + "node": "^10 || ^12 || >=14" } }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "node_modules/postcss-attribute-case-insensitive": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz", + "integrity": "sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": ">=6" + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/postcss-attribute-case-insensitive/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "node_modules/postcss-calc": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", + "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", + "license": "MIT", "dependencies": { - "p-limit": "^2.0.0" + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=6" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" } }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "node_modules/postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">=4" + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" } }, - "node_modules/postcss": { - "version": "8.4.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", - "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", + "node_modules/postcss-color-functional-notation": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.12.tgz", + "integrity": "sha512-TLCW9fN5kvO/u38/uesdpbx3e8AkTYhMvDZYa9JpmImWuTE99bDQ7GU7hdOADIZsiI9/zuxfAJxny/khknp1Zw==", "funding": [ { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "type": "github", + "url": "https://github.com/sponsors/csstools" }, { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-10.0.0.tgz", + "integrity": "sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w==", + "funding": [ { "type": "github", - "url": "https://github.com/sponsors/ai" + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/postcss-calc": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", - "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", + "node_modules/postcss-color-rebeccapurple": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-10.0.0.tgz", + "integrity": "sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "postcss-selector-parser": "^6.0.11", + "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": ">=18" }, "peerDependencies": { - "postcss": "^8.2.2" + "postcss": "^8.4" } }, "node_modules/postcss-colormin": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "colord": "^2.9.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-convert-values": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", + "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-custom-media": { + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.6.tgz", + "integrity": "sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-properties": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.6.tgz", + "integrity": "sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.5.tgz", + "integrity": "sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-9.0.1.tgz", + "integrity": "sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "browserslist": "^4.23.0", - "caniuse-api": "^3.0.0", - "colord": "^2.9.3", - "postcss-value-parser": "^4.2.0" + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": ">=18" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.4" } }, - "node_modules/postcss-convert-values": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", - "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", + "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", "dependencies": { - "browserslist": "^4.23.0", - "postcss-value-parser": "^4.2.0" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "node": ">=4" } }, "node_modules/postcss-discard-comments": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -11061,6 +14009,7 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -11072,6 +14021,7 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -11083,6 +14033,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -11094,6 +14045,7 @@ "version": "6.0.5", "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz", "integrity": "sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==", + "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.16" }, @@ -11104,14 +14056,204 @@ "postcss": "^8.4.31" } }, + "node_modules/postcss-double-position-gradients": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.4.tgz", + "integrity": "sha512-m6IKmxo7FxSP5nF2l63QbCC3r+bWpFUWmZXZf096WxG0m7Vl1Q1+ruFOhpdDRmKrRS+S3Jtk+TVk/7z0+BVK6g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-visible": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-10.0.1.tgz", + "integrity": "sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-visible/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-focus-within": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz", + "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-within/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-6.0.0.tgz", + "integrity": "sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-image-set-function": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-7.0.0.tgz", + "integrity": "sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-lab-function": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.12.tgz", + "integrity": "sha512-tUcyRk1ZTPec3OuKFsqtRzW2Go5lehW29XA21lZ65XmzQkz43VY2tyWEC202F7W3mILOjw0voOiuxRGTsN+J9w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, "node_modules/postcss-loader": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz", - "integrity": "sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==", + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", + "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", + "license": "MIT", "dependencies": { - "cosmiconfig": "^8.2.0", - "jiti": "^1.18.2", - "semver": "^7.3.8" + "cosmiconfig": "^8.3.5", + "jiti": "^1.20.0", + "semver": "^7.5.4" }, "engines": { "node": ">= 14.15.0" @@ -11125,10 +14267,36 @@ "webpack": "^5.0.0" } }, + "node_modules/postcss-logical": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.1.0.tgz", + "integrity": "sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, "node_modules/postcss-merge-idents": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz", "integrity": "sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==", + "license": "MIT", "dependencies": { "cssnano-utils": "^4.0.2", "postcss-value-parser": "^4.2.0" @@ -11144,6 +14312,7 @@ "version": "6.0.5", "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", "stylehacks": "^6.1.1" @@ -11159,6 +14328,7 @@ "version": "6.1.1", "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "caniuse-api": "^3.0.0", @@ -11176,6 +14346,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -11190,6 +14361,7 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", + "license": "MIT", "dependencies": { "colord": "^2.9.3", "cssnano-utils": "^4.0.2", @@ -11206,6 +14378,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "cssnano-utils": "^4.0.2", @@ -11222,6 +14395,7 @@ "version": "6.0.4", "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", + "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.16" }, @@ -11233,9 +14407,10 @@ } }, "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -11244,12 +14419,13 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", - "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "license": "MIT", "dependencies": { "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", + "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.1.0" }, "engines": { @@ -11259,38 +14435,151 @@ "postcss": "^8.1.0" } }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "license": "ISC", "dependencies": { - "postcss-selector-parser": "^6.0.4" + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": "^10 || ^12 || >= 14" + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nesting": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz", + "integrity": "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-resolve-nested": "^3.1.0", + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-nesting/node_modules/@csstools/selector-resolve-nested": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz", + "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/postcss-nesting/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" }, "peerDependencies": { - "postcss": "^8.1.0" + "postcss-selector-parser": "^7.0.0" } }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "node_modules/postcss-nesting/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", "dependencies": { - "icss-utils": "^5.0.0" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">=4" } }, "node_modules/postcss-normalize-charset": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -11302,6 +14591,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -11316,6 +14606,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -11330,6 +14621,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -11344,6 +14636,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -11358,6 +14651,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -11372,6 +14666,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "postcss-value-parser": "^4.2.0" @@ -11387,6 +14682,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -11401,6 +14697,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -11411,10 +14708,33 @@ "postcss": "^8.4.31" } }, + "node_modules/postcss-opacity-percentage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-3.0.0.tgz", + "integrity": "sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ==", + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, "node_modules/postcss-ordered-values": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", + "license": "MIT", "dependencies": { "cssnano-utils": "^4.0.2", "postcss-value-parser": "^4.2.0" @@ -11426,10 +14746,203 @@ "postcss": "^8.4.31" } }, + "node_modules/postcss-overflow-shorthand": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-6.0.0.tgz", + "integrity": "sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-10.0.0.tgz", + "integrity": "sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-preset-env": { + "version": "10.6.1", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.6.1.tgz", + "integrity": "sha512-yrk74d9EvY+W7+lO9Aj1QmjWY9q5NsKjK2V9drkOPZB/X6KZ0B3igKsHUYakb7oYVhnioWypQX3xGuePf89f3g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-alpha-function": "^1.0.1", + "@csstools/postcss-cascade-layers": "^5.0.2", + "@csstools/postcss-color-function": "^4.0.12", + "@csstools/postcss-color-function-display-p3-linear": "^1.0.1", + "@csstools/postcss-color-mix-function": "^3.0.12", + "@csstools/postcss-color-mix-variadic-function-arguments": "^1.0.2", + "@csstools/postcss-content-alt-text": "^2.0.8", + "@csstools/postcss-contrast-color-function": "^2.0.12", + "@csstools/postcss-exponential-functions": "^2.0.9", + "@csstools/postcss-font-format-keywords": "^4.0.0", + "@csstools/postcss-gamut-mapping": "^2.0.11", + "@csstools/postcss-gradients-interpolation-method": "^5.0.12", + "@csstools/postcss-hwb-function": "^4.0.12", + "@csstools/postcss-ic-unit": "^4.0.4", + "@csstools/postcss-initial": "^2.0.1", + "@csstools/postcss-is-pseudo-class": "^5.0.3", + "@csstools/postcss-light-dark-function": "^2.0.11", + "@csstools/postcss-logical-float-and-clear": "^3.0.0", + "@csstools/postcss-logical-overflow": "^2.0.0", + "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", + "@csstools/postcss-logical-resize": "^3.0.0", + "@csstools/postcss-logical-viewport-units": "^3.0.4", + "@csstools/postcss-media-minmax": "^2.0.9", + "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.5", + "@csstools/postcss-nested-calc": "^4.0.0", + "@csstools/postcss-normalize-display-values": "^4.0.1", + "@csstools/postcss-oklab-function": "^4.0.12", + "@csstools/postcss-position-area-property": "^1.0.0", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/postcss-property-rule-prelude-list": "^1.0.0", + "@csstools/postcss-random-function": "^2.0.1", + "@csstools/postcss-relative-color-syntax": "^3.0.12", + "@csstools/postcss-scope-pseudo-class": "^4.0.1", + "@csstools/postcss-sign-functions": "^1.1.4", + "@csstools/postcss-stepped-value-functions": "^4.0.9", + "@csstools/postcss-syntax-descriptor-syntax-production": "^1.0.1", + "@csstools/postcss-system-ui-font-family": "^1.0.0", + "@csstools/postcss-text-decoration-shorthand": "^4.0.3", + "@csstools/postcss-trigonometric-functions": "^4.0.9", + "@csstools/postcss-unset-value": "^4.0.0", + "autoprefixer": "^10.4.23", + "browserslist": "^4.28.1", + "css-blank-pseudo": "^7.0.1", + "css-has-pseudo": "^7.0.3", + "css-prefers-color-scheme": "^10.0.0", + "cssdb": "^8.6.0", + "postcss-attribute-case-insensitive": "^7.0.1", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^7.0.12", + "postcss-color-hex-alpha": "^10.0.0", + "postcss-color-rebeccapurple": "^10.0.0", + "postcss-custom-media": "^11.0.6", + "postcss-custom-properties": "^14.0.6", + "postcss-custom-selectors": "^8.0.5", + "postcss-dir-pseudo-class": "^9.0.1", + "postcss-double-position-gradients": "^6.0.4", + "postcss-focus-visible": "^10.0.1", + "postcss-focus-within": "^9.0.1", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^6.0.0", + "postcss-image-set-function": "^7.0.0", + "postcss-lab-function": "^7.0.12", + "postcss-logical": "^8.1.0", + "postcss-nesting": "^13.0.2", + "postcss-opacity-percentage": "^3.0.0", + "postcss-overflow-shorthand": "^6.0.0", + "postcss-page-break": "^3.0.4", + "postcss-place": "^10.0.0", + "postcss-pseudo-class-any-link": "^10.0.1", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^8.0.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-10.0.1.tgz", + "integrity": "sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-reduce-idents": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz", "integrity": "sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -11444,6 +14957,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "caniuse-api": "^3.0.0" @@ -11459,6 +14973,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -11469,10 +14984,58 @@ "postcss": "^8.4.31" } }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/postcss-selector-not": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-8.0.1.tgz", + "integrity": "sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-selector-not/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-selector-parser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", - "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -11485,6 +15048,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz", "integrity": "sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==", + "license": "MIT", "dependencies": { "sort-css-media-queries": "2.2.0" }, @@ -11499,6 +15063,7 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", "svgo": "^3.2.0" @@ -11514,6 +15079,7 @@ "version": "6.0.4", "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", + "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.16" }, @@ -11527,12 +15093,14 @@ "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" }, "node_modules/postcss-zindex": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz", "integrity": "sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==", + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -11544,6 +15112,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "license": "MIT", "dependencies": { "lodash": "^4.17.20", "renderkid": "^3.0.0" @@ -11553,14 +15122,16 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/prism-react-renderer": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.3.1.tgz", - "integrity": "sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.4.1.tgz", + "integrity": "sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==", + "license": "MIT", "dependencies": { "@types/prismjs": "^1.26.0", "clsx": "^2.0.0" @@ -11573,14 +15144,16 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", "engines": { "node": ">=6" } @@ -11588,12 +15161,14 @@ "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -11606,6 +15181,7 @@ "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -11613,9 +15189,10 @@ } }, "node_modules/property-information": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", - "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -11624,12 +15201,14 @@ "node_modules/proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "license": "ISC" }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -11642,19 +15221,25 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", "engines": { "node": ">= 0.10" } }, "node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } }, "node_modules/pupa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", - "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.3.0.tgz", + "integrity": "sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA==", + "license": "MIT", "dependencies": { "escape-goat": "^4.0.0" }, @@ -11665,12 +15250,31 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/pvtsutils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", + "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/pvutils": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz", + "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", + "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", + "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.1.0" }, "engines": { "node": ">=0.6" @@ -11679,14 +15283,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/queue": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", - "dependencies": { - "inherits": "~2.0.3" - } - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -11704,12 +15300,14 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -11717,31 +15315,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, "node_modules/range-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8" @@ -11751,6 +15343,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -11759,6 +15352,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -11769,10 +15363,17 @@ "rc": "cli.js" } }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -11781,6 +15382,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" }, @@ -11788,128 +15390,11 @@ "node": ">=0.10.0" } }, - "node_modules/react-dev-utils": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", - "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", - "dependencies": { - "@babel/code-frame": "^7.16.0", - "address": "^1.1.2", - "browserslist": "^4.18.1", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", - "detect-port-alt": "^1.1.6", - "escape-string-regexp": "^4.0.0", - "filesize": "^8.0.6", - "find-up": "^5.0.0", - "fork-ts-checker-webpack-plugin": "^6.5.0", - "global-modules": "^2.0.0", - "globby": "^11.0.4", - "gzip-size": "^6.0.0", - "immer": "^9.0.7", - "is-root": "^2.1.0", - "loader-utils": "^3.2.0", - "open": "^8.4.0", - "pkg-up": "^3.1.0", - "prompts": "^2.4.2", - "react-error-overlay": "^6.0.11", - "recursive-readdir": "^2.2.2", - "shell-quote": "^1.7.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/react-dev-utils/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/loader-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/react-dev-utils/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/react-dev-utils/node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/react-dom": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -11918,20 +15403,18 @@ "react": "^18.3.1" } }, - "node_modules/react-error-overlay": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", - "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" - }, "node_modules/react-fast-compare": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", - "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==" + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", + "license": "MIT" }, "node_modules/react-helmet-async": { + "name": "@slorber/react-helmet-async", "version": "1.3.0", - "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz", - "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==", + "resolved": "https://registry.npmjs.org/@slorber/react-helmet-async/-/react-helmet-async-1.3.0.tgz", + "integrity": "sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A==", + "license": "Apache-2.0", "dependencies": { "@babel/runtime": "^7.12.5", "invariant": "^2.2.4", @@ -11940,24 +15423,26 @@ "shallowequal": "^1.1.0" }, "peerDependencies": { - "react": "^16.6.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0" + "react": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" }, "node_modules/react-json-view-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-1.4.0.tgz", - "integrity": "sha512-wh6F6uJyYAmQ4fK0e8dSQMEWuvTs2Wr3el3sLD9bambX1+pSWUVXIz1RFaoy3TI1mZ0FqdpKq9YgbgTTgyrmXA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-2.5.0.tgz", + "integrity": "sha512-tk7o7QG9oYyELWHL8xiMQ8x4WzjCzbWNyig3uexmkLb54r8jO0yH3WCWx8UZS0c49eSA4QUmG5caiRJ8fAn58g==", + "license": "MIT", "engines": { - "node": ">=14" + "node": ">=18" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0 || ^18.0.0" + "react": "^18.0.0 || ^19.0.0" } }, "node_modules/react-loadable": { @@ -11965,6 +15450,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", + "license": "MIT", "dependencies": { "@types/react": "*" }, @@ -11973,9 +15459,10 @@ } }, "node_modules/react-loadable-ssr-addon-v5-slorber": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", - "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.3.tgz", + "integrity": "sha512-GXfh9VLwB5ERaCsU6RULh7tkemeX15aNh6wuMEBtfdyMa7fFG8TXrhXlx1SoEK2Ty/l6XIkzzYIQmyaWW3JgdQ==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.3" }, @@ -11991,6 +15478,7 @@ "version": "5.3.4", "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -12010,6 +15498,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.1.2" }, @@ -12022,6 +15511,7 @@ "version": "5.3.4", "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -12039,6 +15529,7 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -12052,6 +15543,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -12059,42 +15551,90 @@ "node": ">=8.10.0" } }, - "node_modules/reading-time": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", - "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" + "node_modules/recma-build-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", + "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "node_modules/recma-jsx": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz", + "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", + "license": "MIT", "dependencies": { - "resolve": "^1.1.6" + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", + "unified": "^11.0.0" }, - "engines": { - "node": ">= 0.10" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "node_modules/recma-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", + "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", + "license": "MIT", "dependencies": { - "minimatch": "^3.0.5" + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" }, - "engines": { - "node": ">=6.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "license": "Apache-2.0" + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "license": "MIT" }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "license": "MIT", "dependencies": { "regenerate": "^1.4.2" }, @@ -12102,41 +15642,30 @@ "node": ">=4" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "license": "MIT", "dependencies": { - "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" + "unicode-match-property-value-ecmascript": "^2.2.1" }, "engines": { "node": ">=4" } }, "node_modules/registry-auth-token": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", - "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.1.tgz", + "integrity": "sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==", + "license": "MIT", "dependencies": { - "@pnpm/npm-conf": "^2.1.0" + "@pnpm/npm-conf": "^3.0.2" }, "engines": { "node": ">=14" @@ -12146,6 +15675,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "license": "MIT", "dependencies": { "rc": "1.2.8" }, @@ -12156,29 +15686,29 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "license": "MIT" + }, "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.1.tgz", + "integrity": "sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==", + "license": "BSD-2-Clause", "dependencies": { - "jsesc": "~0.5.0" + "jsesc": "~3.1.0" }, "bin": { "regjsparser": "bin/parser" } }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "bin": { - "jsesc": "bin/jsesc" - } - }, "node_modules/rehype-raw": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "hast-util-raw": "^9.0.0", @@ -12189,18 +15719,35 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/rehype-recma": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", + "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "license": "MIT", "engines": { "node": ">= 0.10" } }, "node_modules/remark-directive": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.0.tgz", - "integrity": "sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.1.tgz", + "integrity": "sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-directive": "^3.0.0", @@ -12216,6 +15763,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz", "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.2", "emoticon": "^4.0.1", @@ -12231,6 +15779,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-frontmatter": "^2.0.0", @@ -12243,9 +15792,10 @@ } }, "node_modules/remark-gfm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", - "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", @@ -12260,9 +15810,10 @@ } }, "node_modules/remark-mdx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.1.tgz", - "integrity": "sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz", + "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", + "license": "MIT", "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" @@ -12276,6 +15827,7 @@ "version": "11.0.0", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", @@ -12288,9 +15840,10 @@ } }, "node_modules/remark-rehype": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", - "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", @@ -12307,6 +15860,7 @@ "version": "11.0.0", "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", @@ -12321,6 +15875,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "license": "MIT", "dependencies": { "css-select": "^4.1.3", "dom-converter": "^0.2.0", @@ -12333,6 +15888,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.0.1", @@ -12348,6 +15904,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", @@ -12361,6 +15918,7 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.2.0" }, @@ -12375,6 +15933,7 @@ "version": "2.8.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", @@ -12388,6 +15947,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } @@ -12403,6 +15963,7 @@ "url": "https://github.com/sponsors/fb55" } ], + "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.0.0", @@ -12414,6 +15975,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -12429,20 +15991,26 @@ "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -12450,12 +16018,14 @@ "node_modules/resolve-alpn": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "license": "MIT" }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", "engines": { "node": ">=4" } @@ -12463,12 +16033,14 @@ "node_modules/resolve-pathname": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", + "license": "MIT" }, "node_modules/responselike": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "license": "MIT", "dependencies": { "lowercase-keys": "^3.0.0" }, @@ -12483,42 +16055,26 @@ "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rtl-detect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.1.2.tgz", - "integrity": "sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==" - }, "node_modules/rtlcss": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.1.1.tgz", - "integrity": "sha512-/oVHgBtnPNcggP2aVXQjSy6N1mMAfHg4GSag0QtZBlD5bdDgAHwr4pydqJGd+SUCu9260+Pjqbjwtvu7EMH1KQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", + "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", + "license": "MIT", "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0", @@ -12532,6 +16088,18 @@ "node": ">=12.0.0" } }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -12550,6 +16118,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -12571,30 +16140,44 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" }, "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } }, "node_modules/scheduler": { "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" } }, + "node_modules/schema-dts": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/schema-dts/-/schema-dts-1.1.5.tgz", + "integrity": "sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==", + "license": "Apache-2.0" + }, "node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -12602,7 +16185,7 @@ "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", @@ -12610,15 +16193,17 @@ } }, "node_modules/search-insights": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.14.0.tgz", - "integrity": "sha512-OLN6MsPMCghDOqlCtsIsYgtsC0pnwVTyT9Mu6A3ewOj1DxvzZF6COrn2g86E/c05xbktB0XN04m/t1Z+n+fTGw==", + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", + "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", + "license": "MIT", "peer": true }, "node_modules/section-matter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "license": "MIT", "dependencies": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" @@ -12630,27 +16215,27 @@ "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "license": "MIT" }, "node_modules/selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-5.5.0.tgz", + "integrity": "sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==", + "license": "MIT", "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" + "@peculiar/x509": "^1.14.2", + "pkijs": "^3.3.3" }, "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -12662,6 +16247,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "license": "MIT", "dependencies": { "semver": "^7.3.5" }, @@ -12672,40 +16258,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "range-parser": "~1.2.1", - "statuses": "2.0.1" + "statuses": "~2.0.2" }, "engines": { "node": ">= 0.8.0" @@ -12715,6 +16286,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -12722,70 +16294,75 @@ "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, "node_modules/send/node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dependencies": { - "randombytes": "^2.1.0" + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.0.5.tgz", + "integrity": "sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=20.0.0" } }, "node_modules/serve-handler": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", - "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.7.tgz", + "integrity": "sha512-CinAq1xWb0vR3twAv9evEU8cNWkXCb9kd5ePAHUKJBkOsUpR1wt/CvGdeca7vqumL1U5cSaeVQ6zZMxiJ3yWsg==", + "license": "MIT", "dependencies": { "bytes": "3.0.0", "content-disposition": "0.5.2", - "fast-url-parser": "1.1.3", "mime-types": "2.1.18", - "minimatch": "3.1.2", + "minimatch": "3.1.5", "path-is-inside": "1.0.2", - "path-to-regexp": "2.2.1", + "path-to-regexp": "3.3.0", "range-parser": "1.2.0" } }, "node_modules/serve-handler/node_modules/path-to-regexp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", - "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", + "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", + "license": "MIT" }, "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.2.tgz", + "integrity": "sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==", + "license": "MIT", "dependencies": { - "accepts": "~1.3.4", + "accepts": "~1.3.8", "batch": "0.6.1", "debug": "2.6.9", "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" + "http-errors": "~1.8.0", + "mime-types": "~2.1.35", + "parseurl": "~1.3.3" }, "engines": { "node": ">= 0.8.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/serve-index/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -12794,56 +16371,73 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "license": "MIT", "dependencies": { "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" }, "engines": { "node": ">= 0.6" } }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + "node_modules/serve-index/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, "node_modules/serve-index/node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "~0.19.1" }, "engines": { "node": ">= 0.8.0" @@ -12853,6 +16447,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -12868,12 +16463,14 @@ "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" }, "node_modules/shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "license": "MIT", "dependencies": { "kind-of": "^6.0.2" }, @@ -12884,12 +16481,14 @@ "node_modules/shallowequal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -12901,43 +16500,87 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" }, - "bin": { - "shjs": "bin/shjs" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -12949,15 +16592,17 @@ "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" }, "node_modules/sirv": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz", - "integrity": "sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "license": "MIT", "dependencies": { - "@polka/url": "^1.0.0-next.20", - "mrmime": "^1.0.0", + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", "totalist": "^3.0.0" }, "engines": { @@ -12967,12 +16612,14 @@ "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" }, "node_modules/sitemap": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.2.tgz", - "integrity": "sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.3.tgz", + "integrity": "sha512-tAjEd+wt/YwnEbfNB2ht51ybBJxbEWwe5ki/Z//Wh0rpBFTCUSj46GnxUKEWzhfuJTsee8x3lybHxFgUMig2hw==", + "license": "MIT", "dependencies": { "@types/node": "^17.0.5", "@types/sax": "^1.2.1", @@ -12990,12 +16637,14 @@ "node_modules/sitemap/node_modules/@types/node": { "version": "17.0.45", "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", + "license": "MIT" }, "node_modules/skin-tone": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "license": "MIT", "dependencies": { "unicode-emoji-modifier-base": "^1.0.0" }, @@ -13007,6 +16656,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", "engines": { "node": ">=8" } @@ -13015,6 +16665,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "license": "MIT", "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -13024,6 +16675,7 @@ "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "license": "MIT", "dependencies": { "faye-websocket": "^0.11.3", "uuid": "^8.3.2", @@ -13034,22 +16686,25 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz", "integrity": "sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==", + "license": "MIT", "engines": { "node": ">= 6.3.0" } }, "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "license": "BSD-3-Clause", "engines": { - "node": ">= 8" + "node": ">= 12" } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -13058,6 +16713,7 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -13067,6 +16723,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -13075,6 +16732,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -13084,6 +16742,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "license": "MIT", "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -13099,6 +16758,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "license": "MIT", "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", @@ -13111,12 +16771,14 @@ "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" }, "node_modules/srcset": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -13125,22 +16787,25 @@ } }, "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/std-env": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.5.0.tgz", - "integrity": "sha512-JGUEaALvL0Mf6JCfYnJOTcobY+Nc7sG/TemDRBqCA0wEr4DER7zDchaaixTlmOxAjG1uRJmX82EQcxwTQTkqVA==" + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "license": "MIT" }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } @@ -13149,6 +16814,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -13162,9 +16828,10 @@ } }, "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -13173,11 +16840,12 @@ } }, "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -13190,6 +16858,7 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" @@ -13203,6 +16872,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "license": "BSD-2-Clause", "dependencies": { "get-own-enumerable-property-symbols": "^3.0.0", "is-obj": "^1.0.1", @@ -13216,6 +16886,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -13227,6 +16898,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -13235,6 +16907,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "license": "MIT", "engines": { "node": ">=6" } @@ -13243,6 +16916,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "license": "MIT", "engines": { "node": ">=8" }, @@ -13250,18 +16924,29 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/style-to-js": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.14" + } + }, "node_modules/style-to-object": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", - "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "license": "MIT", "dependencies": { - "inline-style-parser": "0.1.1" + "inline-style-parser": "0.2.7" } }, "node_modules/stylehacks": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "postcss-selector-parser": "^6.0.16" @@ -13277,6 +16962,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -13288,6 +16974,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -13298,20 +16985,22 @@ "node_modules/svg-parser": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "license": "MIT" }, "node_modules/svgo": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", - "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.3.tgz", + "integrity": "sha512-+wn7I4p7YgJhHs38k2TNjy1vCfPIfLIJWR5MnCStsN8WuuTcBnRKcMHQLMM2ijxGZmDoZwNv8ipl5aTTen62ng==", + "license": "MIT", "dependencies": { - "@trysound/sax": "0.2.0", "commander": "^7.2.0", "css-select": "^5.1.0", "css-tree": "^2.3.1", "css-what": "^6.1.0", "csso": "^5.0.5", - "picocolors": "^1.0.0" + "picocolors": "^1.0.0", + "sax": "^1.5.0" }, "bin": { "svgo": "bin/svgo" @@ -13328,25 +17017,32 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.2.tgz", + "integrity": "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==", + "license": "MIT", "engines": { "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/terser": { - "version": "5.24.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", - "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.1.tgz", + "integrity": "sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ==", + "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", + "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -13358,15 +17054,15 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.4.0.tgz", + "integrity": "sha512-Bn5vxm48flOIfkdl5CaD2+1CiUVbonWQ3KQPyP7/EuIl9Gbzq/gQFOzaMFUEgVjB1396tcK0SG8XcNJ/2kDH8g==", + "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", + "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" + "schema-utils": "^4.3.0", + "terser": "^5.31.1" }, "engines": { "node": ">= 10.13.0" @@ -13376,47 +17072,25 @@ "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } } }, "node_modules/terser-webpack-plugin/node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -13426,32 +17100,11 @@ "node": ">= 10.13.0" } }, - "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/terser-webpack-plugin/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -13465,40 +17118,57 @@ "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + "node_modules/thingies": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.6.0.tgz", + "integrity": "sha512-rMHRjmlFLM1R96UYPvpmnc3LYtdFrT33JIB7L9hetGue1qAPfn1N2LJeEjxUSidu1Iku+haLZXDuEXUHNGO/lg==", + "license": "MIT", + "engines": { + "node": ">=10.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "^2" + } }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "license": "MIT" }, "node_modules/tiny-invariant": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", - "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" }, "node_modules/tiny-warning": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", + "license": "MIT" }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "license": "MIT", "engines": { - "node": ">=4" + "node": "^18.0.0 || >=20.0.0" } }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -13510,6 +17180,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", "engines": { "node": ">=0.6" } @@ -13518,14 +17189,32 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/tree-dump": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz", + "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -13535,20 +17224,41 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tsyringe": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.10.0.tgz", + "integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==", + "license": "MIT", + "dependencies": { + "tslib": "^1.9.3" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/tsyringe/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" }, "node_modules/type-fest": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=12.20" }, @@ -13560,6 +17270,7 @@ "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -13572,6 +17283,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -13580,6 +17292,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -13591,32 +17304,22 @@ "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "license": "MIT", "dependencies": { "is-typedarray": "^1.0.0" } }, - "node_modules/typescript": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", - "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + "version": "7.19.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz", + "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==", + "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "license": "MIT", "engines": { "node": ">=4" } @@ -13625,6 +17328,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "license": "MIT", "engines": { "node": ">=4" } @@ -13633,6 +17337,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "license": "MIT", "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" @@ -13642,17 +17347,19 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "license": "MIT", "engines": { "node": ">=4" } @@ -13661,6 +17368,7 @@ "version": "11.0.5", "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", @@ -13679,6 +17387,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "license": "MIT", "dependencies": { "crypto-random-string": "^4.0.0" }, @@ -13690,9 +17399,10 @@ } }, "node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, @@ -13705,6 +17415,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, @@ -13717,6 +17428,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, @@ -13725,23 +17437,11 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/unist-util-remove-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", - "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/unist-util-stringify-position": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, @@ -13751,9 +17451,10 @@ } }, "node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", @@ -13765,9 +17466,10 @@ } }, "node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" @@ -13781,6 +17483,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", "engines": { "node": ">= 10.0.0" } @@ -13789,14 +17492,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "funding": [ { "type": "opencollective", @@ -13811,9 +17515,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -13826,6 +17531,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", + "license": "BSD-2-Clause", "dependencies": { "boxen": "^7.0.0", "chalk": "^5.0.1", @@ -13853,6 +17559,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "license": "MIT", "dependencies": { "ansi-align": "^3.0.1", "camelcase": "^7.0.1", @@ -13874,6 +17581,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -13882,9 +17590,10 @@ } }, "node_modules/update-notifier/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -13896,22 +17605,16 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, - "node_modules/uri-js/node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, "node_modules/url-loader": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", "mime-types": "^2.1.27", @@ -13935,9 +17638,10 @@ } }, "node_modules/url-loader/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -13953,6 +17657,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } @@ -13960,12 +17665,14 @@ "node_modules/url-loader/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" }, "node_modules/url-loader/node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -13974,6 +17681,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -13985,6 +17693,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -14001,17 +17710,20 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" }, "node_modules/utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "license": "MIT" }, "node_modules/utility-types": { "version": "3.11.0", "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "license": "MIT", "engines": { "node": ">= 4" } @@ -14020,6 +17732,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", "engines": { "node": ">= 0.4.0" } @@ -14028,6 +17741,7 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -14035,23 +17749,25 @@ "node_modules/value-equal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", + "license": "MIT" }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/vfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", - "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" }, "funding": { @@ -14060,9 +17776,10 @@ } }, "node_modules/vfile-location": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.2.tgz", - "integrity": "sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" @@ -14073,9 +17790,10 @@ } }, "node_modules/vfile-message": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", - "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" @@ -14086,9 +17804,10 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", + "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -14101,6 +17820,7 @@ "version": "1.7.3", "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "license": "MIT", "dependencies": { "minimalistic-assert": "^1.0.0" } @@ -14109,40 +17829,42 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/webpack": { - "version": "5.89.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", - "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", + "version": "5.106.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.106.2.tgz", + "integrity": "sha512-wGN3qcrBQIFmQ/c0AiOAQBvrZ5lmY8vbbMv4Mxfgzqd/B6+9pXtLo73WuS1dSGXM5QYY3hZnIbvx+K1xxe6FyA==", + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.16.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", - "es-module-lexer": "^1.2.1", + "enhanced-resolve": "^5.20.0", + "es-module-lexer": "^2.0.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", + "graceful-fs": "^4.2.11", + "loader-runner": "^4.3.1", + "mime-db": "^1.54.0", "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.17", + "watchpack": "^2.5.1", + "webpack-sources": "^3.3.4" }, "bin": { "webpack": "bin/webpack.js" @@ -14161,9 +17883,10 @@ } }, "node_modules/webpack-bundle-analyzer": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.1.tgz", - "integrity": "sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ==", + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", + "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", + "license": "MIT", "dependencies": { "@discoveryjs/json-ext": "0.5.7", "acorn": "^8.0.4", @@ -14173,7 +17896,6 @@ "escape-string-regexp": "^4.0.0", "gzip-size": "^6.0.0", "html-escaper": "^2.0.2", - "is-plain-object": "^5.0.0", "opener": "^1.5.2", "picocolors": "^1.0.0", "sirv": "^2.0.3", @@ -14190,107 +17912,121 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/webpack-dev-middleware": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", - "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz", + "integrity": "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==", + "license": "MIT", "dependencies": { "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", + "memfs": "^4.43.1", + "mime-types": "^3.0.1", + "on-finished": "^2.4.1", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } } }, "node_modules/webpack-dev-middleware/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/webpack-dev-middleware/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", "dependencies": { - "mime-db": "1.52.0" + "mime-db": "^1.54.0" }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/webpack-dev-middleware/node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/webpack-dev-server": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", - "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", - "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.5", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.3.tgz", + "integrity": "sha512-9Gyu2F7+bg4Vv+pjbovuYDhHX+mqdqITykfzdM9UyKqKHlsE5aAjRhR+oOEfXW5vBeu8tarzlJFIZva4ZjAdrQ==", + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.25", + "@types/express-serve-static-core": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", "colorette": "^2.0.10", - "compression": "^1.7.4", + "compression": "^1.8.1", "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", + "express": "^4.22.1", "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "launch-editor": "^2.6.0", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", + "http-proxy-middleware": "^2.0.9", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "schema-utils": "^4.2.0", + "selfsigned": "^5.5.0", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.13.0" + "webpack-dev-middleware": "^7.4.2", + "ws": "^8.18.0" }, "bin": { "webpack-dev-server": "bin/webpack-dev-server.js" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" + "webpack": "^5.0.0" }, "peerDependenciesMeta": { "webpack": { @@ -14301,10 +18037,41 @@ } } }, + "node_modules/webpack-dev-server/node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", + "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -14322,111 +18089,69 @@ } }, "node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", + "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", "flat": "^5.0.2", - "wildcard": "^2.0.0" + "wildcard": "^2.0.1" }, "engines": { - "node": ">=10.0.0" + "node": ">=18.0.0" } }, "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.4.tgz", + "integrity": "sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==", + "license": "MIT", "engines": { "node": ">=10.13.0" } }, - "node_modules/webpack/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/webpack/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, "node_modules/webpack/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/webpackbar": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz", - "integrity": "sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-7.0.0.tgz", + "integrity": "sha512-aS9soqSO2iCHgqHoCrj4LbfGQUboDCYJPSFOAchEK+9psIjNrfSWW4Y0YEz67MKURNvMmfo0ycOg9d/+OOf9/Q==", + "license": "MIT", "dependencies": { - "chalk": "^4.1.0", - "consola": "^2.15.3", + "ansis": "^3.2.0", + "consola": "^3.2.3", "pretty-time": "^1.1.0", - "std-env": "^3.0.1" + "std-env": "^3.7.0" }, "engines": { - "node": ">=12" + "node": ">=14.21.3" }, "peerDependencies": { + "@rspack/core": "*", "webpack": "3 || 4 || 5" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, "node_modules/websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "license": "Apache-2.0", "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", @@ -14440,6 +18165,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "license": "Apache-2.0", "engines": { "node": ">=0.8.0" } @@ -14448,6 +18174,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -14462,6 +18189,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "license": "MIT", "dependencies": { "string-width": "^5.0.1" }, @@ -14475,12 +18203,14 @@ "node_modules/wildcard": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==" + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "license": "MIT" }, "node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -14494,9 +18224,10 @@ } }, "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -14505,9 +18236,10 @@ } }, "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -14516,11 +18248,12 @@ } }, "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -14529,15 +18262,11 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, "node_modules/write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", @@ -14549,6 +18278,7 @@ "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", "engines": { "node": ">=8.3.0" }, @@ -14565,10 +18295,41 @@ } } }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wsl-utils/node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/xdg-basedir": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -14580,6 +18341,7 @@ "version": "1.6.11", "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "license": "MIT", "dependencies": { "sax": "^1.2.4" }, @@ -14590,20 +18352,14 @@ "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" - } + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" }, "node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "license": "MIT", "engines": { "node": ">=12.20" }, @@ -14615,6 +18371,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" diff --git a/api-docs/package.json b/api-docs/package.json index 82c13afab..5c9483c7e 100644 --- a/api-docs/package.json +++ b/api-docs/package.json @@ -14,8 +14,8 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@docusaurus/core": "3.4.0", - "@docusaurus/preset-classic": "3.4.0", + "@docusaurus/core": "3.10.0", + "@docusaurus/preset-classic": "3.10.0", "@mdx-js/react": "^3.0.1", "clsx": "^1.2.1", "prism-react-renderer": "^2.3.1", @@ -23,8 +23,13 @@ "react-dom": "^18.3.1" }, "devDependencies": { - "@docusaurus/module-type-aliases": "3.4.0", - "@docusaurus/types": "3.4.0" + "@docusaurus/module-type-aliases": "3.10.0", + "@docusaurus/types": "3.10.0" + }, + "overrides": { + "serialize-javascript": "^6.0.2 || ^7.0.3", + "lodash": "^4.17.21", + "webpackbar": "^7.0.0" }, "browserslist": { "production": [ diff --git a/api-docs/src/pages/index.md b/api-docs/src/pages/index.md deleted file mode 100644 index ed88adf59..000000000 --- a/api-docs/src/pages/index.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -sidebar_position: 1 ---- - -# JavaScript Trackers -The Snowplow JavaScript Trackers support being used in a number of environments. There are three versions of the tracker. - -## Web tracking -We have two flavours of web tracker: JavaScript and Browser. - -- JavaScript Tracker (v2 and v3) for loading via tags, by adding code snippets to your website or Tag Manager solution. -- Browser Tracker (v3) for installation into web apps via npm. Popular when natively integrating tracking into React, Angular and Vue applications. - -## Server-side tracking -Track events in server-side Node.js environments using the Node.js Tracker (v3). Used via npm. - - diff --git a/api-docs/src/pages/index.tsx b/api-docs/src/pages/index.tsx new file mode 100644 index 000000000..8925295d8 --- /dev/null +++ b/api-docs/src/pages/index.tsx @@ -0,0 +1,6 @@ +import React from 'react'; +import { Redirect } from '@docusaurus/router'; + +export default function HomeRedirect() { + return ; +} diff --git a/common/autoinstallers/rush-prettier/pnpm-lock.yaml b/common/autoinstallers/rush-prettier/pnpm-lock.yaml index d0e063911..430c80350 100644 --- a/common/autoinstallers/rush-prettier/pnpm-lock.yaml +++ b/common/autoinstallers/rush-prettier/pnpm-lock.yaml @@ -1,296 +1,263 @@ -lockfileVersion: 5.3 +lockfileVersion: '9.0' -specifiers: - prettier: ^2.5.1 - pretty-quick: ^3.1.3 +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false -dependencies: - prettier: 2.5.1 - pretty-quick: 3.1.3_prettier@2.5.1 +importers: + + .: + dependencies: + prettier: + specifier: ^2.5.1 + version: 2.8.8 + pretty-quick: + specifier: ^3.1.3 + version: 3.3.1(prettier@2.8.8) packages: - /@types/minimatch/3.0.5: - resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} - dev: false + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - /ansi-styles/4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + execa@4.1.0: + resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} + engines: {node: '>=10'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: false - /array-differ/3.0.0: - resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} - dev: false - /array-union/2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + human-signals@1.1.1: + resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} + engines: {node: '>=8.12.0'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} - dev: false - /arrify/2.0.1: - resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} - dev: false - /balanced-match/1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: false + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - /brace-expansion/1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - dev: false + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} - /chalk/3.0.0: - resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: false - /color-convert/2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - dev: false + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@3.0.2: + resolution: {integrity: sha512-cfDHL6LStTEKlNilboNtobT/kEa30PtAf2Q1OgszfrG/rpVl1xaFWT9ktfkS306GmHgmnad1Sw4wabhlvFtsTw==} + engines: {node: '>=10'} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + pretty-quick@3.3.1: + resolution: {integrity: sha512-3b36UXfYQ+IXXqex6mCca89jC8u0mYLqFAN5eTQKoXO6oCQYcIVYZEB/5AlBHI7JPYygReM2Vv6Vom/Gln7fBg==} + engines: {node: '>=10.13'} + hasBin: true + peerDependencies: + prettier: ^2.0.0 - /color-name/1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: false + pump@3.0.4: + resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} - /concat-map/0.0.1: - resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} - dev: false + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - /cross-spawn/7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} + hasBin: true + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + +snapshots: + + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - dev: false - /end-of-stream/1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + end-of-stream@1.4.5: dependencies: once: 1.4.0 - dev: false - /execa/4.1.0: - resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} - engines: {node: '>=10'} + execa@4.1.0: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 5.2.0 human-signals: 1.1.1 is-stream: 2.0.1 merge-stream: 2.0.0 npm-run-path: 4.0.1 onetime: 5.1.2 - signal-exit: 3.0.6 + signal-exit: 3.0.7 strip-final-newline: 2.0.0 - dev: false - /find-up/4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + find-up@4.1.0: dependencies: locate-path: 5.0.0 path-exists: 4.0.0 - dev: false - /get-stream/5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} + get-stream@5.2.0: dependencies: - pump: 3.0.0 - dev: false - - /has-flag/4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: false + pump: 3.0.4 - /human-signals/1.1.1: - resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} - engines: {node: '>=8.12.0'} - dev: false + human-signals@1.1.1: {} - /ignore/5.2.0: - resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} - engines: {node: '>= 4'} - dev: false + ignore@5.3.2: {} - /is-stream/2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: false + is-stream@2.0.1: {} - /isexe/2.0.0: - resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} - dev: false + isexe@2.0.0: {} - /locate-path/5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 - dev: false - - /merge-stream/2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: false - /mimic-fn/2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: false + merge-stream@2.0.0: {} - /minimatch/3.0.4: - resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} - dependencies: - brace-expansion: 1.1.11 - dev: false + mimic-fn@2.1.0: {} - /mri/1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - dev: false + mri@1.2.0: {} - /multimatch/4.0.0: - resolution: {integrity: sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==} - engines: {node: '>=8'} - dependencies: - '@types/minimatch': 3.0.5 - array-differ: 3.0.0 - array-union: 2.1.0 - arrify: 2.0.1 - minimatch: 3.0.4 - dev: false - - /npm-run-path/4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 - dev: false - /once/1.4.0: - resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} + once@1.4.0: dependencies: wrappy: 1.0.2 - dev: false - /onetime/5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 - dev: false - /p-limit/2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + p-limit@2.3.0: dependencies: p-try: 2.2.0 - dev: false - /p-locate/4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + p-locate@4.1.0: dependencies: p-limit: 2.3.0 - dev: false - /p-try/2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: false + p-try@2.2.0: {} - /path-exists/4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: false + path-exists@4.0.0: {} - /path-key/3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: false + path-key@3.1.1: {} - /prettier/2.5.1: - resolution: {integrity: sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==} - engines: {node: '>=10.13.0'} - hasBin: true - dev: false + picocolors@1.1.1: {} - /pretty-quick/3.1.3_prettier@2.5.1: - resolution: {integrity: sha512-kOCi2FJabvuh1as9enxYmrnBC6tVMoVOenMaBqRfsvBHB0cbpYHjdQEpSglpASDFEXVwplpcGR4CLEaisYAFcA==} - engines: {node: '>=10.13'} - hasBin: true - peerDependencies: - prettier: '>=2.0.0' + picomatch@3.0.2: {} + + prettier@2.8.8: {} + + pretty-quick@3.3.1(prettier@2.8.8): dependencies: - chalk: 3.0.0 execa: 4.1.0 find-up: 4.1.0 - ignore: 5.2.0 + ignore: 5.3.2 mri: 1.2.0 - multimatch: 4.0.0 - prettier: 2.5.1 - dev: false + picocolors: 1.1.1 + picomatch: 3.0.2 + prettier: 2.8.8 + tslib: 2.8.1 - /pump/3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + pump@3.0.4: dependencies: - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 once: 1.4.0 - dev: false - /shebang-command/2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - dev: false - /shebang-regex/3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: false + shebang-regex@3.0.0: {} - /signal-exit/3.0.6: - resolution: {integrity: sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==} - dev: false + signal-exit@3.0.7: {} - /strip-final-newline/2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: false + strip-final-newline@2.0.0: {} - /supports-color/7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - dev: false + tslib@2.8.1: {} - /which/2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + which@2.0.2: dependencies: isexe: 2.0.0 - dev: false - /wrappy/1.0.2: - resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} - dev: false + wrappy@1.0.2: {} diff --git a/common/config/rush/browser-approved-packages.json b/common/config/rush/browser-approved-packages.json index 60f7e3426..3b15c2084 100644 --- a/common/config/rush/browser-approved-packages.json +++ b/common/config/rush/browser-approved-packages.json @@ -6,6 +6,22 @@ "name": "@ampproject/rollup-plugin-closure-compiler", "allowedCategories": [ "libraries", "plugins", "trackers" ] }, + { + "name": "@fingerprintjs/botd", + "allowedCategories": [ "plugins" ] + }, + { + "name": "@react-native-async-storage/async-storage", + "allowedCategories": [ "trackers" ] + }, + { + "name": "@react-native/babel-preset", + "allowedCategories": [ "trackers" ] + }, + { + "name": "@react-native/eslint-config", + "allowedCategories": [ "trackers" ] + }, { "name": "@rollup/plugin-alias", "allowedCategories": [ "trackers" ] @@ -30,6 +46,10 @@ "name": "@snowplow/browser-plugin-ad-tracking", "allowedCategories": [ "trackers" ] }, + { + "name": "@snowplow/browser-plugin-bot-detection", + "allowedCategories": [ "trackers" ] + }, { "name": "@snowplow/browser-plugin-browser-features", "allowedCategories": [ "trackers" ] @@ -50,6 +70,10 @@ "name": "@snowplow/browser-plugin-ecommerce", "allowedCategories": [ "trackers" ] }, + { + "name": "@snowplow/browser-plugin-element-tracking", + "allowedCategories": [ "trackers" ] + }, { "name": "@snowplow/browser-plugin-enhanced-consent", "allowedCategories": [ "trackers" ] @@ -114,6 +138,10 @@ "name": "@snowplow/browser-plugin-privacy-sandbox", "allowedCategories": [ "trackers" ] }, + { + "name": "@snowplow/browser-plugin-screen-tracking", + "allowedCategories": [ "trackers" ] + }, { "name": "@snowplow/browser-plugin-site-tracking", "allowedCategories": [ "trackers" ] @@ -134,6 +162,10 @@ "name": "@snowplow/browser-plugin-web-vitals", "allowedCategories": [ "trackers" ] }, + { + "name": "@snowplow/browser-plugin-webview", + "allowedCategories": [ "trackers" ] + }, { "name": "@snowplow/browser-plugin-youtube-tracking", "allowedCategories": [ "trackers" ] @@ -150,6 +182,10 @@ "name": "@snowplow/tracker-core", "allowedCategories": [ "libraries", "plugins", "trackers" ] }, + { + "name": "@snowplow/webview-tracker", + "allowedCategories": [ "plugins" ] + }, { "name": "@testing-library/dom", "allowedCategories": [ "libraries" ] @@ -187,8 +223,8 @@ "allowedCategories": [ "plugins" ] }, { - "name": "@types/sha1", - "allowedCategories": [ "libraries" ] + "name": "@types/react", + "allowedCategories": [ "trackers" ] }, { "name": "@types/sinon", @@ -196,7 +232,7 @@ }, { "name": "@types/uuid", - "allowedCategories": [ "libraries", "plugins" ] + "allowedCategories": [ "libraries", "plugins", "trackers" ] }, { "name": "@types/vimeo__player", @@ -290,6 +326,10 @@ "name": "jest", "allowedCategories": [ "libraries", "plugins", "trackers" ] }, + { + "name": "jest-config", + "allowedCategories": [ "trackers" ] + }, { "name": "jest-environment-jsdom", "allowedCategories": [ "libraries", "plugins", "trackers" ] @@ -298,6 +338,18 @@ "name": "jest-environment-jsdom-global", "allowedCategories": [ "libraries", "plugins", "trackers" ] }, + { + "name": "jest-environment-node", + "allowedCategories": [ "trackers" ] + }, + { + "name": "jest-expo", + "allowedCategories": [ "trackers" ] + }, + { + "name": "jest-react-native", + "allowedCategories": [ "trackers" ] + }, { "name": "jest-standard-reporter", "allowedCategories": [ "libraries", "plugins", "trackers" ] @@ -330,6 +382,22 @@ "name": "randomcolor", "allowedCategories": [ "plugins" ] }, + { + "name": "react", + "allowedCategories": [ "trackers" ] + }, + { + "name": "react-native", + "allowedCategories": [ "trackers" ] + }, + { + "name": "react-native-builder-bob", + "allowedCategories": [ "trackers" ] + }, + { + "name": "react-native-get-random-values", + "allowedCategories": [ "trackers" ] + }, { "name": "rollup", "allowedCategories": [ "libraries", "plugins", "trackers" ] @@ -362,10 +430,6 @@ "name": "saucelabs", "allowedCategories": [ "trackers" ] }, - { - "name": "sha1", - "allowedCategories": [ "libraries" ] - }, { "name": "sinon", "allowedCategories": [ "trackers" ] @@ -392,7 +456,7 @@ }, { "name": "uuid", - "allowedCategories": [ "libraries", "plugins" ] + "allowedCategories": [ "libraries", "plugins", "trackers" ] }, { "name": "wdio-chromedriver-service", diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index e7b0a4c7f..81b895e74 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -15,19 +15,13 @@ importers: '@snowplow/tracker-core': specifier: workspace:* version: link:../tracker-core - sha1: - specifier: ^1.1.1 - version: 1.1.1 tslib: specifier: ^2.3.1 - version: 2.7.0 + version: 2.8.1 uuid: - specifier: ^10.0.0 - version: 10.0.0 + specifier: ^11.1.1 + version: 11.1.1 devDependencies: - '@ampproject/rollup-plugin-closure-compiler': - specifier: ~0.27.0 - version: 0.27.0(rollup@2.70.2) '@rollup/plugin-commonjs': specifier: ~21.0.2 version: 21.0.3(rollup@2.70.2) @@ -38,17 +32,11 @@ importers: specifier: ~9.3.1 version: 9.3.4 '@types/jest': - specifier: ~27.4.1 - version: 27.4.1 + specifier: ~28.1.1 + version: 28.1.8 '@types/jsdom': specifier: ~16.2.14 version: 16.2.15 - '@types/sha1': - specifier: ~1.1.3 - version: 1.1.5 - '@types/uuid': - specifier: ^10.0.0 - version: 10.0.0 '@typescript-eslint/eslint-plugin': specifier: ~5.15.0 version: 5.15.0(@typescript-eslint/parser@5.15.0(eslint@8.11.0)(typescript@4.6.4))(eslint@8.11.0)(typescript@4.6.4) @@ -59,14 +47,14 @@ importers: specifier: ~8.11.0 version: 8.11.0 jest: - specifier: ~27.5.1 - version: 27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)) + specifier: ~28.1.3 + version: 28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) jest-environment-jsdom: - specifier: ~27.5.1 - version: 27.5.1 + specifier: ~28.1.3 + version: 28.1.3 jest-environment-jsdom-global: - specifier: ~3.0.0 - version: 3.0.0(jest-environment-jsdom@27.5.1) + specifier: ~4.0.0 + version: 4.0.0(jest-environment-jsdom@28.1.3) jest-standard-reporter: specifier: ~2.0.0 version: 2.0.0 @@ -84,10 +72,10 @@ importers: version: 7.0.2(rollup@2.70.2) rollup-plugin-ts: specifier: ~2.0.5 - version: 2.0.7(@babel/core@7.25.2)(@babel/runtime@7.25.6)(rollup@2.70.2)(typescript@4.6.4) + version: 2.0.7(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.25.9(@babel/core@7.29.7))(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.26.0)(rollup@2.70.2)(typescript@4.6.4) ts-jest: - specifier: ~27.1.3 - version: 27.1.5(@babel/core@7.25.2)(@types/jest@27.4.1)(babel-jest@27.5.1(@babel/core@7.25.2))(jest@27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)))(typescript@4.6.4) + specifier: ~28.0.8 + version: 28.0.8(@babel/core@7.29.7)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.29.7))(jest@28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)))(typescript@4.6.4) typescript: specifier: ~4.6.2 version: 4.6.4 @@ -99,14 +87,11 @@ importers: dependencies: tslib: specifier: ^2.3.1 - version: 2.7.0 + version: 2.8.1 uuid: - specifier: ^10.0.0 - version: 10.0.0 + specifier: ^11.1.1 + version: 11.1.1 devDependencies: - '@ampproject/rollup-plugin-closure-compiler': - specifier: ~0.27.0 - version: 0.27.0(rollup@2.70.2) '@rollup/plugin-commonjs': specifier: ~21.0.2 version: 21.0.3(rollup@2.70.2) @@ -119,9 +104,6 @@ importers: '@types/node': specifier: ~14.6.0 version: 14.6.4 - '@types/uuid': - specifier: ^10.0.0 - version: 10.0.0 '@typescript-eslint/eslint-plugin': specifier: ~5.15.0 version: 5.15.0(@typescript-eslint/parser@5.15.0(eslint@8.11.0)(typescript@4.6.4))(eslint@8.11.0)(typescript@4.6.4) @@ -151,7 +133,7 @@ importers: version: 7.0.2(rollup@2.70.2) rollup-plugin-ts: specifier: ~2.0.5 - version: 2.0.7(@babel/core@7.25.2)(@babel/runtime@7.25.6)(rollup@2.70.2)(typescript@4.6.4) + version: 2.0.7(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.25.9(@babel/core@7.29.7))(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.26.0)(rollup@2.70.2)(typescript@4.6.4) ts-node: specifier: ~10.9.1 version: 10.9.2(@types/node@14.6.4)(typescript@4.6.4) @@ -169,11 +151,8 @@ importers: version: link:../../libraries/tracker-core tslib: specifier: ^2.3.1 - version: 2.7.0 + version: 2.8.1 devDependencies: - '@ampproject/rollup-plugin-closure-compiler': - specifier: ~0.27.0 - version: 0.27.0(rollup@2.70.2) '@rollup/plugin-commonjs': specifier: ~21.0.2 version: 21.0.3(rollup@2.70.2) @@ -181,8 +160,8 @@ importers: specifier: ~13.1.3 version: 13.1.3(rollup@2.70.2) '@types/jest': - specifier: ~27.4.1 - version: 27.4.1 + specifier: ~28.1.1 + version: 28.1.8 '@types/jsdom': specifier: ~16.2.14 version: 16.2.15 @@ -199,14 +178,14 @@ importers: specifier: ~8.11.0 version: 8.11.0 jest: - specifier: ~27.5.1 - version: 27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)) + specifier: ~28.1.3 + version: 28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) jest-environment-jsdom: - specifier: ~27.5.1 - version: 27.5.1 + specifier: ~28.1.3 + version: 28.1.3 jest-environment-jsdom-global: - specifier: ~3.0.0 - version: 3.0.0(jest-environment-jsdom@27.5.1) + specifier: ~4.0.0 + version: 4.0.0(jest-environment-jsdom@28.1.3) jest-standard-reporter: specifier: ~2.0.0 version: 2.0.0 @@ -227,10 +206,80 @@ importers: version: 7.0.2(rollup@2.70.2) rollup-plugin-ts: specifier: ~2.0.5 - version: 2.0.7(@babel/core@7.25.2)(@babel/runtime@7.25.6)(rollup@2.70.2)(typescript@4.6.4) + version: 2.0.7(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.25.9(@babel/core@7.29.7))(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.26.0)(rollup@2.70.2)(typescript@4.6.4) + ts-jest: + specifier: ~28.0.8 + version: 28.0.8(@babel/core@7.29.7)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.29.7))(jest@28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)))(typescript@4.6.4) + typescript: + specifier: ~4.6.2 + version: 4.6.4 + + ../../plugins/browser-plugin-bot-detection: + dependencies: + '@fingerprintjs/botd': + specifier: 2.0.0 + version: 2.0.0 + '@snowplow/browser-tracker-core': + specifier: workspace:* + version: link:../../libraries/browser-tracker-core + '@snowplow/tracker-core': + specifier: workspace:* + version: link:../../libraries/tracker-core + tslib: + specifier: ^2.3.1 + version: 2.8.1 + devDependencies: + '@rollup/plugin-commonjs': + specifier: ~21.0.2 + version: 21.0.3(rollup@2.70.2) + '@rollup/plugin-node-resolve': + specifier: ~13.1.3 + version: 13.1.3(rollup@2.70.2) + '@types/jest': + specifier: ~28.1.1 + version: 28.1.8 + '@types/jsdom': + specifier: ~16.2.14 + version: 16.2.15 + '@typescript-eslint/eslint-plugin': + specifier: ~5.15.0 + version: 5.15.0(@typescript-eslint/parser@5.15.0(eslint@8.11.0)(typescript@4.6.4))(eslint@8.11.0)(typescript@4.6.4) + '@typescript-eslint/parser': + specifier: ~5.15.0 + version: 5.15.0(eslint@8.11.0)(typescript@4.6.4) + eslint: + specifier: ~8.11.0 + version: 8.11.0 + jest: + specifier: ~28.1.3 + version: 28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) + jest-environment-jsdom: + specifier: ~28.1.3 + version: 28.1.3 + jest-environment-jsdom-global: + specifier: ~4.0.0 + version: 4.0.0(jest-environment-jsdom@28.1.3) + jest-standard-reporter: + specifier: ~2.0.0 + version: 2.0.0 + rollup: + specifier: ~2.70.1 + version: 2.70.2 + rollup-plugin-cleanup: + specifier: ~3.2.1 + version: 3.2.1(rollup@2.70.2) + rollup-plugin-license: + specifier: ~2.6.1 + version: 2.6.1(rollup@2.70.2) + rollup-plugin-terser: + specifier: ~7.0.2 + version: 7.0.2(rollup@2.70.2) + rollup-plugin-ts: + specifier: ~2.0.5 + version: 2.0.7(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.25.9(@babel/core@7.29.7))(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.26.0)(rollup@2.70.2)(typescript@4.6.4) ts-jest: - specifier: ~27.1.3 - version: 27.1.5(@babel/core@7.25.2)(@types/jest@27.4.1)(babel-jest@27.5.1(@babel/core@7.25.2))(jest@27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)))(typescript@4.6.4) + specifier: ~28.0.8 + version: 28.0.8(@babel/core@7.29.7)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.29.7))(jest@28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)))(typescript@4.6.4) typescript: specifier: ~4.6.2 version: 4.6.4 @@ -245,11 +294,8 @@ importers: version: link:../../libraries/tracker-core tslib: specifier: ^2.3.1 - version: 2.7.0 + version: 2.8.1 devDependencies: - '@ampproject/rollup-plugin-closure-compiler': - specifier: ~0.27.0 - version: 0.27.0(rollup@2.70.2) '@rollup/plugin-commonjs': specifier: ~21.0.2 version: 21.0.3(rollup@2.70.2) @@ -257,8 +303,8 @@ importers: specifier: ~13.1.3 version: 13.1.3(rollup@2.70.2) '@types/jest': - specifier: ~27.4.1 - version: 27.4.1 + specifier: ~28.1.1 + version: 28.1.8 '@types/jsdom': specifier: ~16.2.14 version: 16.2.15 @@ -275,14 +321,14 @@ importers: specifier: ~8.11.0 version: 8.11.0 jest: - specifier: ~27.5.1 - version: 27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)) + specifier: ~28.1.3 + version: 28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) jest-environment-jsdom: - specifier: ~27.5.1 - version: 27.5.1 + specifier: ~28.1.3 + version: 28.1.3 jest-environment-jsdom-global: - specifier: ~3.0.0 - version: 3.0.0(jest-environment-jsdom@27.5.1) + specifier: ~4.0.0 + version: 4.0.0(jest-environment-jsdom@28.1.3) jest-standard-reporter: specifier: ~2.0.0 version: 2.0.0 @@ -303,10 +349,10 @@ importers: version: 7.0.2(rollup@2.70.2) rollup-plugin-ts: specifier: ~2.0.5 - version: 2.0.7(@babel/core@7.25.2)(@babel/runtime@7.25.6)(rollup@2.70.2)(typescript@4.6.4) + version: 2.0.7(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.25.9(@babel/core@7.29.7))(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.26.0)(rollup@2.70.2)(typescript@4.6.4) ts-jest: - specifier: ~27.1.3 - version: 27.1.5(@babel/core@7.25.2)(@types/jest@27.4.1)(babel-jest@27.5.1(@babel/core@7.25.2))(jest@27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)))(typescript@4.6.4) + specifier: ~28.0.8 + version: 28.0.8(@babel/core@7.29.7)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.29.7))(jest@28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)))(typescript@4.6.4) typescript: specifier: ~4.6.2 version: 4.6.4 @@ -318,11 +364,8 @@ importers: version: link:../../libraries/browser-tracker-core tslib: specifier: ^2.3.1 - version: 2.7.0 + version: 2.8.1 devDependencies: - '@ampproject/rollup-plugin-closure-compiler': - specifier: ~0.27.0 - version: 0.27.0(rollup@2.70.2) '@rollup/plugin-commonjs': specifier: ~21.0.2 version: 21.0.3(rollup@2.70.2) @@ -333,8 +376,8 @@ importers: specifier: workspace:* version: link:../../libraries/tracker-core '@types/jest': - specifier: ~27.4.1 - version: 27.4.1 + specifier: ~28.1.1 + version: 28.1.8 '@types/jsdom': specifier: ~16.2.14 version: 16.2.15 @@ -348,14 +391,14 @@ importers: specifier: ~8.11.0 version: 8.11.0 jest: - specifier: ~27.5.1 - version: 27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)) + specifier: ~28.1.3 + version: 28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) jest-environment-jsdom: - specifier: ~27.5.1 - version: 27.5.1 + specifier: ~28.1.3 + version: 28.1.3 jest-environment-jsdom-global: - specifier: ~3.0.0 - version: 3.0.0(jest-environment-jsdom@27.5.1) + specifier: ~4.0.0 + version: 4.0.0(jest-environment-jsdom@28.1.3) jest-standard-reporter: specifier: ~2.0.0 version: 2.0.0 @@ -373,10 +416,10 @@ importers: version: 7.0.2(rollup@2.70.2) rollup-plugin-ts: specifier: ~2.0.5 - version: 2.0.7(@babel/core@7.25.2)(@babel/runtime@7.25.6)(rollup@2.70.2)(typescript@4.6.4) + version: 2.0.7(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.25.9(@babel/core@7.29.7))(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.26.0)(rollup@2.70.2)(typescript@4.6.4) ts-jest: - specifier: ~27.1.3 - version: 27.1.5(@babel/core@7.25.2)(@types/jest@27.4.1)(babel-jest@27.5.1(@babel/core@7.25.2))(jest@27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)))(typescript@4.6.4) + specifier: ~28.0.8 + version: 28.0.8(@babel/core@7.29.7)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.29.7))(jest@28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)))(typescript@4.6.4) typescript: specifier: ~4.6.2 version: 4.6.4 @@ -394,11 +437,8 @@ importers: version: 0.6.2 tslib: specifier: ^2.3.1 - version: 2.7.0 + version: 2.8.1 devDependencies: - '@ampproject/rollup-plugin-closure-compiler': - specifier: ~0.27.0 - version: 0.27.0(rollup@2.70.2) '@rollup/plugin-commonjs': specifier: ~21.0.2 version: 21.0.3(rollup@2.70.2) @@ -406,8 +446,8 @@ importers: specifier: ~13.1.3 version: 13.1.3(rollup@2.70.2) '@types/jest': - specifier: ~27.4.1 - version: 27.4.1 + specifier: ~28.1.1 + version: 28.1.8 '@types/jsdom': specifier: ~16.2.14 version: 16.2.15 @@ -424,14 +464,81 @@ importers: specifier: ~8.11.0 version: 8.11.0 jest: - specifier: ~27.5.1 - version: 27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)) + specifier: ~28.1.3 + version: 28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) + jest-environment-jsdom: + specifier: ~28.1.3 + version: 28.1.3 + jest-environment-jsdom-global: + specifier: ~4.0.0 + version: 4.0.0(jest-environment-jsdom@28.1.3) + jest-standard-reporter: + specifier: ~2.0.0 + version: 2.0.0 + rollup: + specifier: ~2.70.1 + version: 2.70.2 + rollup-plugin-cleanup: + specifier: ~3.2.1 + version: 3.2.1(rollup@2.70.2) + rollup-plugin-license: + specifier: ~2.6.1 + version: 2.6.1(rollup@2.70.2) + rollup-plugin-terser: + specifier: ~7.0.2 + version: 7.0.2(rollup@2.70.2) + rollup-plugin-ts: + specifier: ~2.0.5 + version: 2.0.7(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.25.9(@babel/core@7.29.7))(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.26.0)(rollup@2.70.2)(typescript@4.6.4) + ts-jest: + specifier: ~28.0.8 + version: 28.0.8(@babel/core@7.29.7)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.29.7))(jest@28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)))(typescript@4.6.4) + typescript: + specifier: ~4.6.2 + version: 4.6.4 + + ../../plugins/browser-plugin-element-tracking: + dependencies: + '@snowplow/browser-tracker-core': + specifier: workspace:* + version: link:../../libraries/browser-tracker-core + '@snowplow/tracker-core': + specifier: workspace:* + version: link:../../libraries/tracker-core + tslib: + specifier: ^2.3.1 + version: 2.8.1 + devDependencies: + '@rollup/plugin-commonjs': + specifier: ~21.0.2 + version: 21.0.3(rollup@2.70.2) + '@rollup/plugin-node-resolve': + specifier: ~13.1.3 + version: 13.1.3(rollup@2.70.2) + '@types/jest': + specifier: ~28.1.1 + version: 28.1.8 + '@types/jsdom': + specifier: ~16.2.14 + version: 16.2.15 + '@typescript-eslint/eslint-plugin': + specifier: ~5.15.0 + version: 5.15.0(@typescript-eslint/parser@5.15.0(eslint@8.11.0)(typescript@4.6.4))(eslint@8.11.0)(typescript@4.6.4) + '@typescript-eslint/parser': + specifier: ~5.15.0 + version: 5.15.0(eslint@8.11.0)(typescript@4.6.4) + eslint: + specifier: ~8.11.0 + version: 8.11.0 + jest: + specifier: ~28.1.3 + version: 28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) jest-environment-jsdom: - specifier: ~27.5.1 - version: 27.5.1 + specifier: ~28.1.3 + version: 28.1.3 jest-environment-jsdom-global: - specifier: ~3.0.0 - version: 3.0.0(jest-environment-jsdom@27.5.1) + specifier: ~4.0.0 + version: 4.0.0(jest-environment-jsdom@28.1.3) jest-standard-reporter: specifier: ~2.0.0 version: 2.0.0 @@ -449,10 +556,10 @@ importers: version: 7.0.2(rollup@2.70.2) rollup-plugin-ts: specifier: ~2.0.5 - version: 2.0.7(@babel/core@7.25.2)(@babel/runtime@7.25.6)(rollup@2.70.2)(typescript@4.6.4) + version: 2.0.7(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.25.9(@babel/core@7.29.7))(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.26.0)(rollup@2.70.2)(typescript@4.6.4) ts-jest: - specifier: ~27.1.3 - version: 27.1.5(@babel/core@7.25.2)(@types/jest@27.4.1)(babel-jest@27.5.1(@babel/core@7.25.2))(jest@27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)))(typescript@4.6.4) + specifier: ~28.0.8 + version: 28.0.8(@babel/core@7.29.7)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.29.7))(jest@28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)))(typescript@4.6.4) typescript: specifier: ~4.6.2 version: 4.6.4 @@ -467,11 +574,8 @@ importers: version: link:../../libraries/tracker-core tslib: specifier: ^2.3.1 - version: 2.7.0 + version: 2.8.1 devDependencies: - '@ampproject/rollup-plugin-closure-compiler': - specifier: ~0.27.0 - version: 0.27.0(rollup@2.70.2) '@rollup/plugin-commonjs': specifier: ~21.0.2 version: 21.0.3(rollup@2.70.2) @@ -479,8 +583,8 @@ importers: specifier: ~13.1.3 version: 13.1.3(rollup@2.70.2) '@types/jest': - specifier: ~27.4.1 - version: 27.4.1 + specifier: ~28.1.1 + version: 28.1.8 '@types/jsdom': specifier: ~16.2.14 version: 16.2.15 @@ -497,14 +601,14 @@ importers: specifier: ~8.11.0 version: 8.11.0 jest: - specifier: ~27.5.1 - version: 27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)) + specifier: ~28.1.3 + version: 28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) jest-environment-jsdom: - specifier: ~27.5.1 - version: 27.5.1 + specifier: ~28.1.3 + version: 28.1.3 jest-environment-jsdom-global: - specifier: ~3.0.0 - version: 3.0.0(jest-environment-jsdom@27.5.1) + specifier: ~4.0.0 + version: 4.0.0(jest-environment-jsdom@28.1.3) jest-standard-reporter: specifier: ~2.0.0 version: 2.0.0 @@ -525,10 +629,10 @@ importers: version: 7.0.2(rollup@2.70.2) rollup-plugin-ts: specifier: ~2.0.5 - version: 2.0.7(@babel/core@7.25.2)(@babel/runtime@7.25.6)(rollup@2.70.2)(typescript@4.6.4) + version: 2.0.7(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.25.9(@babel/core@7.29.7))(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.26.0)(rollup@2.70.2)(typescript@4.6.4) ts-jest: - specifier: ~27.1.3 - version: 27.1.5(@babel/core@7.25.2)(@types/jest@27.4.1)(babel-jest@27.5.1(@babel/core@7.25.2))(jest@27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)))(typescript@4.6.4) + specifier: ~28.0.8 + version: 28.0.8(@babel/core@7.29.7)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.29.7))(jest@28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)))(typescript@4.6.4) typescript: specifier: ~4.6.2 version: 4.6.4 @@ -543,11 +647,8 @@ importers: version: link:../../libraries/tracker-core tslib: specifier: ^2.3.1 - version: 2.7.0 + version: 2.8.1 devDependencies: - '@ampproject/rollup-plugin-closure-compiler': - specifier: ~0.27.0 - version: 0.27.0(rollup@2.70.2) '@rollup/plugin-commonjs': specifier: ~21.0.2 version: 21.0.3(rollup@2.70.2) @@ -555,8 +656,8 @@ importers: specifier: ~13.1.3 version: 13.1.3(rollup@2.70.2) '@types/jest': - specifier: ~27.4.1 - version: 27.4.1 + specifier: ~28.1.1 + version: 28.1.8 '@types/jsdom': specifier: ~16.2.14 version: 16.2.15 @@ -573,14 +674,14 @@ importers: specifier: ~8.11.0 version: 8.11.0 jest: - specifier: ~27.5.1 - version: 27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)) + specifier: ~28.1.3 + version: 28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) jest-environment-jsdom: - specifier: ~27.5.1 - version: 27.5.1 + specifier: ~28.1.3 + version: 28.1.3 jest-environment-jsdom-global: - specifier: ~3.0.0 - version: 3.0.0(jest-environment-jsdom@27.5.1) + specifier: ~4.0.0 + version: 4.0.0(jest-environment-jsdom@28.1.3) jest-standard-reporter: specifier: ~2.0.0 version: 2.0.0 @@ -601,10 +702,10 @@ importers: version: 7.0.2(rollup@2.70.2) rollup-plugin-ts: specifier: ~2.0.5 - version: 2.0.7(@babel/core@7.25.2)(@babel/runtime@7.25.6)(rollup@2.70.2)(typescript@4.6.4) + version: 2.0.7(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.25.9(@babel/core@7.29.7))(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.26.0)(rollup@2.70.2)(typescript@4.6.4) ts-jest: - specifier: ~27.1.3 - version: 27.1.5(@babel/core@7.25.2)(@types/jest@27.4.1)(babel-jest@27.5.1(@babel/core@7.25.2))(jest@27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)))(typescript@4.6.4) + specifier: ~28.0.8 + version: 28.0.8(@babel/core@7.29.7)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.29.7))(jest@28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)))(typescript@4.6.4) typescript: specifier: ~4.6.2 version: 4.6.4 @@ -619,11 +720,8 @@ importers: version: link:../../libraries/tracker-core tslib: specifier: ^2.3.1 - version: 2.7.0 + version: 2.8.1 devDependencies: - '@ampproject/rollup-plugin-closure-compiler': - specifier: ~0.27.0 - version: 0.27.0(rollup@2.70.2) '@rollup/plugin-commonjs': specifier: ~21.0.2 version: 21.0.3(rollup@2.70.2) @@ -631,8 +729,8 @@ importers: specifier: ~13.1.3 version: 13.1.3(rollup@2.70.2) '@types/jest': - specifier: ~27.4.1 - version: 27.4.1 + specifier: ~28.1.1 + version: 28.1.8 '@types/jsdom': specifier: ~16.2.14 version: 16.2.15 @@ -649,14 +747,14 @@ importers: specifier: ~8.11.0 version: 8.11.0 jest: - specifier: ~27.5.1 - version: 27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)) + specifier: ~28.1.3 + version: 28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) jest-environment-jsdom: - specifier: ~27.5.1 - version: 27.5.1 + specifier: ~28.1.3 + version: 28.1.3 jest-environment-jsdom-global: - specifier: ~3.0.0 - version: 3.0.0(jest-environment-jsdom@27.5.1) + specifier: ~4.0.0 + version: 4.0.0(jest-environment-jsdom@28.1.3) jest-standard-reporter: specifier: ~2.0.0 version: 2.0.0 @@ -677,10 +775,10 @@ importers: version: 7.0.2(rollup@2.70.2) rollup-plugin-ts: specifier: ~2.0.5 - version: 2.0.7(@babel/core@7.25.2)(@babel/runtime@7.25.6)(rollup@2.70.2)(typescript@4.6.4) + version: 2.0.7(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.25.9(@babel/core@7.29.7))(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.26.0)(rollup@2.70.2)(typescript@4.6.4) ts-jest: - specifier: ~27.1.3 - version: 27.1.5(@babel/core@7.25.2)(@types/jest@27.4.1)(babel-jest@27.5.1(@babel/core@7.25.2))(jest@27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)))(typescript@4.6.4) + specifier: ~28.0.8 + version: 28.0.8(@babel/core@7.29.7)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.29.7))(jest@28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)))(typescript@4.6.4) typescript: specifier: ~4.6.2 version: 4.6.4 @@ -695,11 +793,8 @@ importers: version: link:../../libraries/tracker-core tslib: specifier: ^2.3.1 - version: 2.7.0 + version: 2.8.1 devDependencies: - '@ampproject/rollup-plugin-closure-compiler': - specifier: ~0.27.0 - version: 0.27.0(rollup@2.70.2) '@rollup/plugin-commonjs': specifier: ~21.0.2 version: 21.0.3(rollup@2.70.2) @@ -707,8 +802,8 @@ importers: specifier: ~13.1.3 version: 13.1.3(rollup@2.70.2) '@types/jest': - specifier: ~27.4.1 - version: 27.4.1 + specifier: ~28.1.1 + version: 28.1.8 '@types/jsdom': specifier: ~16.2.14 version: 16.2.15 @@ -722,14 +817,14 @@ importers: specifier: ~8.11.0 version: 8.11.0 jest: - specifier: ~27.5.1 - version: 27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)) + specifier: ~28.1.3 + version: 28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) jest-environment-jsdom: - specifier: ~27.5.1 - version: 27.5.1 + specifier: ~28.1.3 + version: 28.1.3 jest-environment-jsdom-global: - specifier: ~3.0.0 - version: 3.0.0(jest-environment-jsdom@27.5.1) + specifier: ~4.0.0 + version: 4.0.0(jest-environment-jsdom@28.1.3) jest-standard-reporter: specifier: ~2.0.0 version: 2.0.0 @@ -747,10 +842,10 @@ importers: version: 7.0.2(rollup@2.70.2) rollup-plugin-ts: specifier: ~2.0.5 - version: 2.0.7(@babel/core@7.25.2)(@babel/runtime@7.25.6)(rollup@2.70.2)(typescript@4.6.4) + version: 2.0.7(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.25.9(@babel/core@7.29.7))(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.26.0)(rollup@2.70.2)(typescript@4.6.4) ts-jest: - specifier: ~27.1.3 - version: 27.1.5(@babel/core@7.25.2)(@types/jest@27.4.1)(babel-jest@27.5.1(@babel/core@7.25.2))(jest@27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)))(typescript@4.6.4) + specifier: ~28.0.8 + version: 28.0.8(@babel/core@7.29.7)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.29.7))(jest@28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)))(typescript@4.6.4) typescript: specifier: ~4.6.2 version: 4.6.4 @@ -765,11 +860,8 @@ importers: version: link:../../libraries/tracker-core tslib: specifier: ^2.3.1 - version: 2.7.0 + version: 2.8.1 devDependencies: - '@ampproject/rollup-plugin-closure-compiler': - specifier: ~0.27.0 - version: 0.27.0(rollup@2.70.2) '@rollup/plugin-commonjs': specifier: ~21.0.2 version: 21.0.3(rollup@2.70.2) @@ -777,8 +869,8 @@ importers: specifier: ~13.1.3 version: 13.1.3(rollup@2.70.2) '@types/jest': - specifier: ~27.4.1 - version: 27.4.1 + specifier: ~28.1.1 + version: 28.1.8 '@types/jsdom': specifier: ~16.2.14 version: 16.2.15 @@ -792,14 +884,14 @@ importers: specifier: ~8.11.0 version: 8.11.0 jest: - specifier: ~27.5.1 - version: 27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)) + specifier: ~28.1.3 + version: 28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) jest-environment-jsdom: - specifier: ~27.5.1 - version: 27.5.1 + specifier: ~28.1.3 + version: 28.1.3 jest-environment-jsdom-global: - specifier: ~3.0.0 - version: 3.0.0(jest-environment-jsdom@27.5.1) + specifier: ~4.0.0 + version: 4.0.0(jest-environment-jsdom@28.1.3) jest-standard-reporter: specifier: ~2.0.0 version: 2.0.0 @@ -817,10 +909,10 @@ importers: version: 7.0.2(rollup@2.70.2) rollup-plugin-ts: specifier: ~2.0.5 - version: 2.0.7(@babel/core@7.25.2)(@babel/runtime@7.25.6)(rollup@2.70.2)(typescript@4.6.4) + version: 2.0.7(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.25.9(@babel/core@7.29.7))(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.26.0)(rollup@2.70.2)(typescript@4.6.4) ts-jest: - specifier: ~27.1.3 - version: 27.1.5(@babel/core@7.25.2)(@types/jest@27.4.1)(babel-jest@27.5.1(@babel/core@7.25.2))(jest@27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)))(typescript@4.6.4) + specifier: ~28.0.8 + version: 28.0.8(@babel/core@7.29.7)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.29.7))(jest@28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)))(typescript@4.6.4) typescript: specifier: ~4.6.2 version: 4.6.4 @@ -835,11 +927,8 @@ importers: version: link:../../libraries/tracker-core tslib: specifier: ^2.3.1 - version: 2.7.0 + version: 2.8.1 devDependencies: - '@ampproject/rollup-plugin-closure-compiler': - specifier: ~0.27.0 - version: 0.27.0(rollup@2.70.2) '@rollup/plugin-commonjs': specifier: ~21.0.2 version: 21.0.3(rollup@2.70.2) @@ -847,8 +936,8 @@ importers: specifier: ~13.1.3 version: 13.1.3(rollup@2.70.2) '@types/jest': - specifier: ~27.4.1 - version: 27.4.1 + specifier: ~28.1.1 + version: 28.1.8 '@types/jsdom': specifier: ~16.2.14 version: 16.2.15 @@ -862,14 +951,14 @@ importers: specifier: ~8.11.0 version: 8.11.0 jest: - specifier: ~27.5.1 - version: 27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)) + specifier: ~28.1.3 + version: 28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) jest-environment-jsdom: - specifier: ~27.5.1 - version: 27.5.1 + specifier: ~28.1.3 + version: 28.1.3 jest-environment-jsdom-global: - specifier: ~3.0.0 - version: 3.0.0(jest-environment-jsdom@27.5.1) + specifier: ~4.0.0 + version: 4.0.0(jest-environment-jsdom@28.1.3) jest-standard-reporter: specifier: ~2.0.0 version: 2.0.0 @@ -887,10 +976,10 @@ importers: version: 7.0.2(rollup@2.70.2) rollup-plugin-ts: specifier: ~2.0.5 - version: 2.0.7(@babel/core@7.25.2)(@babel/runtime@7.25.6)(rollup@2.70.2)(typescript@4.6.4) + version: 2.0.7(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.25.9(@babel/core@7.29.7))(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.26.0)(rollup@2.70.2)(typescript@4.6.4) ts-jest: - specifier: ~27.1.3 - version: 27.1.5(@babel/core@7.25.2)(@types/jest@27.4.1)(babel-jest@27.5.1(@babel/core@7.25.2))(jest@27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)))(typescript@4.6.4) + specifier: ~28.0.8 + version: 28.0.8(@babel/core@7.29.7)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.29.7))(jest@28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)))(typescript@4.6.4) typescript: specifier: ~4.6.2 version: 4.6.4 @@ -905,11 +994,8 @@ importers: version: link:../../libraries/tracker-core tslib: specifier: ^2.3.1 - version: 2.7.0 + version: 2.8.1 devDependencies: - '@ampproject/rollup-plugin-closure-compiler': - specifier: ~0.27.0 - version: 0.27.0(rollup@2.70.2) '@rollup/plugin-commonjs': specifier: ~21.0.2 version: 21.0.3(rollup@2.70.2) @@ -917,8 +1003,8 @@ importers: specifier: ~13.1.3 version: 13.1.3(rollup@2.70.2) '@types/jest': - specifier: ~27.4.1 - version: 27.4.1 + specifier: ~28.1.1 + version: 28.1.8 '@types/jsdom': specifier: ~16.2.14 version: 16.2.15 @@ -932,14 +1018,14 @@ importers: specifier: ~8.11.0 version: 8.11.0 jest: - specifier: ~27.5.1 - version: 27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)) + specifier: ~28.1.3 + version: 28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) jest-environment-jsdom: - specifier: ~27.5.1 - version: 27.5.1 + specifier: ~28.1.3 + version: 28.1.3 jest-environment-jsdom-global: - specifier: ~3.0.0 - version: 3.0.0(jest-environment-jsdom@27.5.1) + specifier: ~4.0.0 + version: 4.0.0(jest-environment-jsdom@28.1.3) jest-standard-reporter: specifier: ~2.0.0 version: 2.0.0 @@ -957,10 +1043,10 @@ importers: version: 7.0.2(rollup@2.70.2) rollup-plugin-ts: specifier: ~2.0.5 - version: 2.0.7(@babel/core@7.25.2)(@babel/runtime@7.25.6)(rollup@2.70.2)(typescript@4.6.4) + version: 2.0.7(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.25.9(@babel/core@7.29.7))(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.26.0)(rollup@2.70.2)(typescript@4.6.4) ts-jest: - specifier: ~27.1.3 - version: 27.1.5(@babel/core@7.25.2)(@types/jest@27.4.1)(babel-jest@27.5.1(@babel/core@7.25.2))(jest@27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)))(typescript@4.6.4) + specifier: ~28.0.8 + version: 28.0.8(@babel/core@7.29.7)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.29.7))(jest@28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)))(typescript@4.6.4) typescript: specifier: ~4.6.2 version: 4.6.4 @@ -975,11 +1061,8 @@ importers: version: link:../../libraries/tracker-core tslib: specifier: ^2.3.1 - version: 2.7.0 + version: 2.8.1 devDependencies: - '@ampproject/rollup-plugin-closure-compiler': - specifier: ~0.27.0 - version: 0.27.0(rollup@2.70.2) '@rollup/plugin-commonjs': specifier: ~21.0.2 version: 21.0.3(rollup@2.70.2) @@ -987,8 +1070,8 @@ importers: specifier: ~13.1.3 version: 13.1.3(rollup@2.70.2) '@types/jest': - specifier: ~27.4.1 - version: 27.4.1 + specifier: ~28.1.1 + version: 28.1.8 '@types/jsdom': specifier: ~16.2.14 version: 16.2.15 @@ -1002,14 +1085,14 @@ importers: specifier: ~8.11.0 version: 8.11.0 jest: - specifier: ~27.5.1 - version: 27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)) + specifier: ~28.1.3 + version: 28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) jest-environment-jsdom: - specifier: ~27.5.1 - version: 27.5.1 + specifier: ~28.1.3 + version: 28.1.3 jest-environment-jsdom-global: - specifier: ~3.0.0 - version: 3.0.0(jest-environment-jsdom@27.5.1) + specifier: ~4.0.0 + version: 4.0.0(jest-environment-jsdom@28.1.3) jest-standard-reporter: specifier: ~2.0.0 version: 2.0.0 @@ -1027,10 +1110,10 @@ importers: version: 7.0.2(rollup@2.70.2) rollup-plugin-ts: specifier: ~2.0.5 - version: 2.0.7(@babel/core@7.25.2)(@babel/runtime@7.25.6)(rollup@2.70.2)(typescript@4.6.4) + version: 2.0.7(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.25.9(@babel/core@7.29.7))(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.26.0)(rollup@2.70.2)(typescript@4.6.4) ts-jest: - specifier: ~27.1.3 - version: 27.1.5(@babel/core@7.25.2)(@types/jest@27.4.1)(babel-jest@27.5.1(@babel/core@7.25.2))(jest@27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)))(typescript@4.6.4) + specifier: ~28.0.8 + version: 28.0.8(@babel/core@7.29.7)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.29.7))(jest@28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)))(typescript@4.6.4) typescript: specifier: ~4.6.2 version: 4.6.4 @@ -1045,11 +1128,8 @@ importers: version: link:../../libraries/tracker-core tslib: specifier: ^2.3.1 - version: 2.7.0 + version: 2.8.1 devDependencies: - '@ampproject/rollup-plugin-closure-compiler': - specifier: ~0.27.0 - version: 0.27.0(rollup@2.70.2) '@rollup/plugin-commonjs': specifier: ~21.0.2 version: 21.0.3(rollup@2.70.2) @@ -1057,8 +1137,8 @@ importers: specifier: ~13.1.3 version: 13.1.3(rollup@2.70.2) '@types/jest': - specifier: ~27.4.1 - version: 27.4.1 + specifier: ~28.1.1 + version: 28.1.8 '@types/jsdom': specifier: ~16.2.14 version: 16.2.15 @@ -1075,14 +1155,14 @@ importers: specifier: ~8.11.0 version: 8.11.0 jest: - specifier: ~27.5.1 - version: 27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)) + specifier: ~28.1.3 + version: 28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) jest-environment-jsdom: - specifier: ~27.5.1 - version: 27.5.1 + specifier: ~28.1.3 + version: 28.1.3 jest-environment-jsdom-global: - specifier: ~3.0.0 - version: 3.0.0(jest-environment-jsdom@27.5.1) + specifier: ~4.0.0 + version: 4.0.0(jest-environment-jsdom@28.1.3) jest-standard-reporter: specifier: ~2.0.0 version: 2.0.0 @@ -1103,10 +1183,10 @@ importers: version: 7.0.2(rollup@2.70.2) rollup-plugin-ts: specifier: ~2.0.5 - version: 2.0.7(@babel/core@7.25.2)(@babel/runtime@7.25.6)(rollup@2.70.2)(typescript@4.6.4) + version: 2.0.7(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.25.9(@babel/core@7.29.7))(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.26.0)(rollup@2.70.2)(typescript@4.6.4) ts-jest: - specifier: ~27.1.3 - version: 27.1.5(@babel/core@7.25.2)(@types/jest@27.4.1)(babel-jest@27.5.1(@babel/core@7.25.2))(jest@27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)))(typescript@4.6.4) + specifier: ~28.0.8 + version: 28.0.8(@babel/core@7.29.7)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.29.7))(jest@28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)))(typescript@4.6.4) typescript: specifier: ~4.6.2 version: 4.6.4 @@ -1121,14 +1201,11 @@ importers: version: link:../../libraries/tracker-core tslib: specifier: ^2.3.1 - version: 2.7.0 + version: 2.8.1 uuid: - specifier: ^10.0.0 - version: 10.0.0 + specifier: ^11.1.1 + version: 11.1.1 devDependencies: - '@ampproject/rollup-plugin-closure-compiler': - specifier: ~0.27.0 - version: 0.27.0(rollup@2.70.2) '@rollup/plugin-commonjs': specifier: ~21.0.2 version: 21.0.3(rollup@2.70.2) @@ -1136,14 +1213,11 @@ importers: specifier: ~13.1.3 version: 13.1.3(rollup@2.70.2) '@types/jest': - specifier: ~27.4.1 - version: 27.4.1 + specifier: ~28.1.1 + version: 28.1.8 '@types/jsdom': specifier: ~16.2.14 version: 16.2.15 - '@types/uuid': - specifier: ^10.0.0 - version: 10.0.0 '@typescript-eslint/eslint-plugin': specifier: ~5.15.0 version: 5.15.0(@typescript-eslint/parser@5.15.0(eslint@8.11.0)(typescript@4.6.4))(eslint@8.11.0)(typescript@4.6.4) @@ -1154,14 +1228,14 @@ importers: specifier: ~8.11.0 version: 8.11.0 jest: - specifier: ~27.5.1 - version: 27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)) + specifier: ~28.1.3 + version: 28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) jest-environment-jsdom: - specifier: ~27.5.1 - version: 27.5.1 + specifier: ~28.1.3 + version: 28.1.3 jest-environment-jsdom-global: - specifier: ~3.0.0 - version: 3.0.0(jest-environment-jsdom@27.5.1) + specifier: ~4.0.0 + version: 4.0.0(jest-environment-jsdom@28.1.3) jest-standard-reporter: specifier: ~2.0.0 version: 2.0.0 @@ -1179,10 +1253,10 @@ importers: version: 7.0.2(rollup@2.70.2) rollup-plugin-ts: specifier: ~2.0.5 - version: 2.0.7(@babel/core@7.25.2)(@babel/runtime@7.25.6)(rollup@2.70.2)(typescript@4.6.4) + version: 2.0.7(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.25.9(@babel/core@7.29.7))(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.26.0)(rollup@2.70.2)(typescript@4.6.4) ts-jest: - specifier: ~27.1.3 - version: 27.1.5(@babel/core@7.25.2)(@types/jest@27.4.1)(babel-jest@27.5.1(@babel/core@7.25.2))(jest@27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)))(typescript@4.6.4) + specifier: ~28.0.8 + version: 28.0.8(@babel/core@7.29.7)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.29.7))(jest@28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)))(typescript@4.6.4) typescript: specifier: ~4.6.2 version: 4.6.4 @@ -1200,14 +1274,11 @@ importers: version: link:../../libraries/tracker-core tslib: specifier: ^2.3.1 - version: 2.7.0 + version: 2.8.1 uuid: - specifier: ^10.0.0 - version: 10.0.0 + specifier: ^11.1.1 + version: 11.1.1 devDependencies: - '@ampproject/rollup-plugin-closure-compiler': - specifier: ~0.27.0 - version: 0.27.0(rollup@2.70.2) '@rollup/plugin-commonjs': specifier: ~21.0.2 version: 21.0.3(rollup@2.70.2) @@ -1215,14 +1286,11 @@ importers: specifier: ~13.1.3 version: 13.1.3(rollup@2.70.2) '@types/jest': - specifier: ~27.4.1 - version: 27.4.1 + specifier: ~28.1.1 + version: 28.1.8 '@types/jsdom': specifier: ~16.2.14 version: 16.2.15 - '@types/uuid': - specifier: ^10.0.0 - version: 10.0.0 '@typescript-eslint/eslint-plugin': specifier: ~5.15.0 version: 5.15.0(@typescript-eslint/parser@5.15.0(eslint@8.11.0)(typescript@4.6.4))(eslint@8.11.0)(typescript@4.6.4) @@ -1233,14 +1301,14 @@ importers: specifier: ~8.11.0 version: 8.11.0 jest: - specifier: ~27.5.1 - version: 27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)) + specifier: ~28.1.3 + version: 28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) jest-environment-jsdom: - specifier: ~27.5.1 - version: 27.5.1 + specifier: ~28.1.3 + version: 28.1.3 jest-environment-jsdom-global: - specifier: ~3.0.0 - version: 3.0.0(jest-environment-jsdom@27.5.1) + specifier: ~4.0.0 + version: 4.0.0(jest-environment-jsdom@28.1.3) jest-standard-reporter: specifier: ~2.0.0 version: 2.0.0 @@ -1258,10 +1326,10 @@ importers: version: 7.0.2(rollup@2.70.2) rollup-plugin-ts: specifier: ~2.0.5 - version: 2.0.7(@babel/core@7.25.2)(@babel/runtime@7.25.6)(rollup@2.70.2)(typescript@4.6.4) + version: 2.0.7(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.25.9(@babel/core@7.29.7))(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.26.0)(rollup@2.70.2)(typescript@4.6.4) ts-jest: - specifier: ~27.1.3 - version: 27.1.5(@babel/core@7.25.2)(@types/jest@27.4.1)(babel-jest@27.5.1(@babel/core@7.25.2))(jest@27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)))(typescript@4.6.4) + specifier: ~28.0.8 + version: 28.0.8(@babel/core@7.29.7)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.29.7))(jest@28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)))(typescript@4.6.4) typescript: specifier: ~4.6.2 version: 4.6.4 @@ -1276,11 +1344,8 @@ importers: version: link:../../libraries/tracker-core tslib: specifier: ^2.3.1 - version: 2.7.0 + version: 2.8.1 devDependencies: - '@ampproject/rollup-plugin-closure-compiler': - specifier: ~0.27.0 - version: 0.27.0(rollup@2.70.2) '@rollup/plugin-commonjs': specifier: ~21.0.2 version: 21.0.3(rollup@2.70.2) @@ -1288,8 +1353,8 @@ importers: specifier: ~13.1.3 version: 13.1.3(rollup@2.70.2) '@types/jest': - specifier: ~27.4.1 - version: 27.4.1 + specifier: ~28.1.1 + version: 28.1.8 '@types/jsdom': specifier: ~16.2.14 version: 16.2.15 @@ -1303,14 +1368,14 @@ importers: specifier: ~8.11.0 version: 8.11.0 jest: - specifier: ~27.5.1 - version: 27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)) + specifier: ~28.1.3 + version: 28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) jest-environment-jsdom: - specifier: ~27.5.1 - version: 27.5.1 + specifier: ~28.1.3 + version: 28.1.3 jest-environment-jsdom-global: - specifier: ~3.0.0 - version: 3.0.0(jest-environment-jsdom@27.5.1) + specifier: ~4.0.0 + version: 4.0.0(jest-environment-jsdom@28.1.3) jest-standard-reporter: specifier: ~2.0.0 version: 2.0.0 @@ -1328,10 +1393,10 @@ importers: version: 7.0.2(rollup@2.70.2) rollup-plugin-ts: specifier: ~2.0.5 - version: 2.0.7(@babel/core@7.25.2)(@babel/runtime@7.25.6)(rollup@2.70.2)(typescript@4.6.4) + version: 2.0.7(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.25.9(@babel/core@7.29.7))(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.26.0)(rollup@2.70.2)(typescript@4.6.4) ts-jest: - specifier: ~27.1.3 - version: 27.1.5(@babel/core@7.25.2)(@types/jest@27.4.1)(babel-jest@27.5.1(@babel/core@7.25.2))(jest@27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)))(typescript@4.6.4) + specifier: ~28.0.8 + version: 28.0.8(@babel/core@7.29.7)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.29.7))(jest@28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)))(typescript@4.6.4) typescript: specifier: ~4.6.2 version: 4.6.4 @@ -1346,11 +1411,8 @@ importers: version: link:../../libraries/tracker-core tslib: specifier: ^2.3.1 - version: 2.7.0 + version: 2.8.1 devDependencies: - '@ampproject/rollup-plugin-closure-compiler': - specifier: ~0.27.0 - version: 0.27.0(rollup@2.70.2) '@rollup/plugin-commonjs': specifier: ~21.0.2 version: 21.0.3(rollup@2.70.2) @@ -1358,8 +1420,8 @@ importers: specifier: ~13.1.3 version: 13.1.3(rollup@2.70.2) '@types/jest': - specifier: ~27.4.1 - version: 27.4.1 + specifier: ~28.1.1 + version: 28.1.8 '@types/jsdom': specifier: ~16.2.14 version: 16.2.15 @@ -1373,14 +1435,14 @@ importers: specifier: ~8.11.0 version: 8.11.0 jest: - specifier: ~27.5.1 - version: 27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)) + specifier: ~28.1.3 + version: 28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) jest-environment-jsdom: - specifier: ~27.5.1 - version: 27.5.1 + specifier: ~28.1.3 + version: 28.1.3 jest-environment-jsdom-global: - specifier: ~3.0.0 - version: 3.0.0(jest-environment-jsdom@27.5.1) + specifier: ~4.0.0 + version: 4.0.0(jest-environment-jsdom@28.1.3) jest-standard-reporter: specifier: ~2.0.0 version: 2.0.0 @@ -1398,10 +1460,10 @@ importers: version: 7.0.2(rollup@2.70.2) rollup-plugin-ts: specifier: ~2.0.5 - version: 2.0.7(@babel/core@7.25.2)(@babel/runtime@7.25.6)(rollup@2.70.2)(typescript@4.6.4) + version: 2.0.7(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.25.9(@babel/core@7.29.7))(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.26.0)(rollup@2.70.2)(typescript@4.6.4) ts-jest: - specifier: ~27.1.3 - version: 27.1.5(@babel/core@7.25.2)(@types/jest@27.4.1)(babel-jest@27.5.1(@babel/core@7.25.2))(jest@27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)))(typescript@4.6.4) + specifier: ~28.0.8 + version: 28.0.8(@babel/core@7.29.7)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.29.7))(jest@28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)))(typescript@4.6.4) typescript: specifier: ~4.6.2 version: 4.6.4 @@ -1416,11 +1478,8 @@ importers: version: link:../../libraries/tracker-core tslib: specifier: ^2.3.1 - version: 2.7.0 + version: 2.8.1 devDependencies: - '@ampproject/rollup-plugin-closure-compiler': - specifier: ~0.27.0 - version: 0.27.0(rollup@2.70.2) '@rollup/plugin-commonjs': specifier: ~21.0.2 version: 21.0.3(rollup@2.70.2) @@ -1428,8 +1487,8 @@ importers: specifier: ~13.1.3 version: 13.1.3(rollup@2.70.2) '@types/jest': - specifier: ~27.4.1 - version: 27.4.1 + specifier: ~28.1.1 + version: 28.1.8 '@types/jsdom': specifier: ~16.2.14 version: 16.2.15 @@ -1443,14 +1502,14 @@ importers: specifier: ~8.11.0 version: 8.11.0 jest: - specifier: ~27.5.1 - version: 27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)) + specifier: ~28.1.3 + version: 28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) jest-environment-jsdom: - specifier: ~27.5.1 - version: 27.5.1 + specifier: ~28.1.3 + version: 28.1.3 jest-environment-jsdom-global: - specifier: ~3.0.0 - version: 3.0.0(jest-environment-jsdom@27.5.1) + specifier: ~4.0.0 + version: 4.0.0(jest-environment-jsdom@28.1.3) jest-standard-reporter: specifier: ~2.0.0 version: 2.0.0 @@ -1468,10 +1527,10 @@ importers: version: 7.0.2(rollup@2.70.2) rollup-plugin-ts: specifier: ~2.0.5 - version: 2.0.7(@babel/core@7.25.2)(@babel/runtime@7.25.6)(rollup@2.70.2)(typescript@4.6.4) + version: 2.0.7(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.25.9(@babel/core@7.29.7))(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.26.0)(rollup@2.70.2)(typescript@4.6.4) ts-jest: - specifier: ~27.1.3 - version: 27.1.5(@babel/core@7.25.2)(@types/jest@27.4.1)(babel-jest@27.5.1(@babel/core@7.25.2))(jest@27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)))(typescript@4.6.4) + specifier: ~28.0.8 + version: 28.0.8(@babel/core@7.29.7)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.29.7))(jest@28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)))(typescript@4.6.4) typescript: specifier: ~4.6.2 version: 4.6.4 @@ -1486,11 +1545,78 @@ importers: version: link:../../libraries/tracker-core tslib: specifier: ^2.3.1 - version: 2.7.0 + version: 2.8.1 + devDependencies: + '@rollup/plugin-commonjs': + specifier: ~21.0.2 + version: 21.0.3(rollup@2.70.2) + '@rollup/plugin-node-resolve': + specifier: ~13.1.3 + version: 13.1.3(rollup@2.70.2) + '@types/jest': + specifier: ~28.1.1 + version: 28.1.8 + '@types/jsdom': + specifier: ~16.2.14 + version: 16.2.15 + '@typescript-eslint/eslint-plugin': + specifier: ~5.15.0 + version: 5.15.0(@typescript-eslint/parser@5.15.0(eslint@8.11.0)(typescript@4.6.4))(eslint@8.11.0)(typescript@4.6.4) + '@typescript-eslint/parser': + specifier: ~5.15.0 + version: 5.15.0(eslint@8.11.0)(typescript@4.6.4) + eslint: + specifier: ~8.11.0 + version: 8.11.0 + jest: + specifier: ~28.1.3 + version: 28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) + jest-environment-jsdom: + specifier: ~28.1.3 + version: 28.1.3 + jest-environment-jsdom-global: + specifier: ~4.0.0 + version: 4.0.0(jest-environment-jsdom@28.1.3) + jest-standard-reporter: + specifier: ~2.0.0 + version: 2.0.0 + rollup: + specifier: ~2.70.1 + version: 2.70.2 + rollup-plugin-cleanup: + specifier: ~3.2.1 + version: 3.2.1(rollup@2.70.2) + rollup-plugin-license: + specifier: ~2.6.1 + version: 2.6.1(rollup@2.70.2) + rollup-plugin-terser: + specifier: ~7.0.2 + version: 7.0.2(rollup@2.70.2) + rollup-plugin-ts: + specifier: ~2.0.5 + version: 2.0.7(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.25.9(@babel/core@7.29.7))(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.26.0)(rollup@2.70.2)(typescript@4.6.4) + ts-jest: + specifier: ~28.0.8 + version: 28.0.8(@babel/core@7.29.7)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.29.7))(jest@28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)))(typescript@4.6.4) + typescript: + specifier: ~4.6.2 + version: 4.6.4 + + ../../plugins/browser-plugin-screen-tracking: + dependencies: + '@snowplow/browser-tracker-core': + specifier: workspace:* + version: link:../../libraries/browser-tracker-core + '@snowplow/tracker-core': + specifier: workspace:* + version: link:../../libraries/tracker-core + tslib: + specifier: ^2.3.1 + version: 2.8.1 + uuid: + specifier: ^11.1.1 + version: 11.1.1 devDependencies: - '@ampproject/rollup-plugin-closure-compiler': - specifier: ~0.27.0 - version: 0.27.0(rollup@2.70.2) '@rollup/plugin-commonjs': specifier: ~21.0.2 version: 21.0.3(rollup@2.70.2) @@ -1498,11 +1624,14 @@ importers: specifier: ~13.1.3 version: 13.1.3(rollup@2.70.2) '@types/jest': - specifier: ~27.4.1 - version: 27.4.1 + specifier: ~28.1.1 + version: 28.1.8 '@types/jsdom': specifier: ~16.2.14 version: 16.2.15 + '@types/lodash': + specifier: ~4.14.180 + version: 4.14.202 '@typescript-eslint/eslint-plugin': specifier: ~5.15.0 version: 5.15.0(@typescript-eslint/parser@5.15.0(eslint@8.11.0)(typescript@4.6.4))(eslint@8.11.0)(typescript@4.6.4) @@ -1513,17 +1642,20 @@ importers: specifier: ~8.11.0 version: 8.11.0 jest: - specifier: ~27.5.1 - version: 27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)) + specifier: ~28.1.3 + version: 28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) jest-environment-jsdom: - specifier: ~27.5.1 - version: 27.5.1 + specifier: ~28.1.3 + version: 28.1.3 jest-environment-jsdom-global: - specifier: ~3.0.0 - version: 3.0.0(jest-environment-jsdom@27.5.1) + specifier: ~4.0.0 + version: 4.0.0(jest-environment-jsdom@28.1.3) jest-standard-reporter: specifier: ~2.0.0 version: 2.0.0 + lodash: + specifier: ~4.17.21 + version: 4.17.21 rollup: specifier: ~2.70.1 version: 2.70.2 @@ -1538,10 +1670,10 @@ importers: version: 7.0.2(rollup@2.70.2) rollup-plugin-ts: specifier: ~2.0.5 - version: 2.0.7(@babel/core@7.25.2)(@babel/runtime@7.25.6)(rollup@2.70.2)(typescript@4.6.4) + version: 2.0.7(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.25.9(@babel/core@7.29.7))(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.26.0)(rollup@2.70.2)(typescript@4.6.4) ts-jest: - specifier: ~27.1.3 - version: 27.1.5(@babel/core@7.25.2)(@types/jest@27.4.1)(babel-jest@27.5.1(@babel/core@7.25.2))(jest@27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)))(typescript@4.6.4) + specifier: ~28.0.8 + version: 28.0.8(@babel/core@7.29.7)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.29.7))(jest@28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)))(typescript@4.6.4) typescript: specifier: ~4.6.2 version: 4.6.4 @@ -1556,11 +1688,8 @@ importers: version: link:../../libraries/tracker-core tslib: specifier: ^2.3.1 - version: 2.7.0 + version: 2.8.1 devDependencies: - '@ampproject/rollup-plugin-closure-compiler': - specifier: ~0.27.0 - version: 0.27.0(rollup@2.70.2) '@rollup/plugin-commonjs': specifier: ~21.0.2 version: 21.0.3(rollup@2.70.2) @@ -1568,8 +1697,8 @@ importers: specifier: ~13.1.3 version: 13.1.3(rollup@2.70.2) '@types/jest': - specifier: ~27.4.1 - version: 27.4.1 + specifier: ~28.1.1 + version: 28.1.8 '@types/jsdom': specifier: ~16.2.14 version: 16.2.15 @@ -1586,14 +1715,14 @@ importers: specifier: ~8.11.0 version: 8.11.0 jest: - specifier: ~27.5.1 - version: 27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)) + specifier: ~28.1.3 + version: 28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) jest-environment-jsdom: - specifier: ~27.5.1 - version: 27.5.1 + specifier: ~28.1.3 + version: 28.1.3 jest-environment-jsdom-global: - specifier: ~3.0.0 - version: 3.0.0(jest-environment-jsdom@27.5.1) + specifier: ~4.0.0 + version: 4.0.0(jest-environment-jsdom@28.1.3) jest-standard-reporter: specifier: ~2.0.0 version: 2.0.0 @@ -1614,10 +1743,10 @@ importers: version: 7.0.2(rollup@2.70.2) rollup-plugin-ts: specifier: ~2.0.5 - version: 2.0.7(@babel/core@7.25.2)(@babel/runtime@7.25.6)(rollup@2.70.2)(typescript@4.6.4) + version: 2.0.7(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.25.9(@babel/core@7.29.7))(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.26.0)(rollup@2.70.2)(typescript@4.6.4) ts-jest: - specifier: ~27.1.3 - version: 27.1.5(@babel/core@7.25.2)(@types/jest@27.4.1)(babel-jest@27.5.1(@babel/core@7.25.2))(jest@27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)))(typescript@4.6.4) + specifier: ~28.0.8 + version: 28.0.8(@babel/core@7.29.7)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.29.7))(jest@28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)))(typescript@4.6.4) typescript: specifier: ~4.6.2 version: 4.6.4 @@ -1632,11 +1761,8 @@ importers: version: link:../../libraries/tracker-core tslib: specifier: ^2.3.1 - version: 2.7.0 + version: 2.8.1 devDependencies: - '@ampproject/rollup-plugin-closure-compiler': - specifier: ~0.27.0 - version: 0.27.0(rollup@2.70.2) '@rollup/plugin-commonjs': specifier: ~21.0.2 version: 21.0.3(rollup@2.70.2) @@ -1644,8 +1770,8 @@ importers: specifier: ~13.1.3 version: 13.1.3(rollup@2.70.2) '@types/jest': - specifier: ~27.4.1 - version: 27.4.1 + specifier: ~28.1.1 + version: 28.1.8 '@types/jsdom': specifier: ~16.2.14 version: 16.2.15 @@ -1662,14 +1788,14 @@ importers: specifier: ~8.11.0 version: 8.11.0 jest: - specifier: ~27.5.1 - version: 27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)) + specifier: ~28.1.3 + version: 28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) jest-environment-jsdom: - specifier: ~27.5.1 - version: 27.5.1 + specifier: ~28.1.3 + version: 28.1.3 jest-environment-jsdom-global: - specifier: ~3.0.0 - version: 3.0.0(jest-environment-jsdom@27.5.1) + specifier: ~4.0.0 + version: 4.0.0(jest-environment-jsdom@28.1.3) jest-standard-reporter: specifier: ~2.0.0 version: 2.0.0 @@ -1690,10 +1816,10 @@ importers: version: 7.0.2(rollup@2.70.2) rollup-plugin-ts: specifier: ~2.0.5 - version: 2.0.7(@babel/core@7.25.2)(@babel/runtime@7.25.6)(rollup@2.70.2)(typescript@4.6.4) + version: 2.0.7(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.25.9(@babel/core@7.29.7))(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.26.0)(rollup@2.70.2)(typescript@4.6.4) ts-jest: - specifier: ~27.1.3 - version: 27.1.5(@babel/core@7.25.2)(@types/jest@27.4.1)(babel-jest@27.5.1(@babel/core@7.25.2))(jest@27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)))(typescript@4.6.4) + specifier: ~28.0.8 + version: 28.0.8(@babel/core@7.29.7)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.29.7))(jest@28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)))(typescript@4.6.4) typescript: specifier: ~4.6.2 version: 4.6.4 @@ -1711,11 +1837,8 @@ importers: version: 1.0.7 tslib: specifier: ^2.3.1 - version: 2.7.0 + version: 2.8.1 devDependencies: - '@ampproject/rollup-plugin-closure-compiler': - specifier: ~0.27.0 - version: 0.27.0(rollup@2.70.2) '@rollup/plugin-commonjs': specifier: ~21.0.2 version: 21.0.3(rollup@2.70.2) @@ -1723,8 +1846,8 @@ importers: specifier: ~13.1.3 version: 13.1.3(rollup@2.70.2) '@types/jest': - specifier: ~27.4.1 - version: 27.4.1 + specifier: ~28.1.1 + version: 28.1.8 '@types/jsdom': specifier: ~16.2.14 version: 16.2.15 @@ -1741,20 +1864,20 @@ importers: specifier: ~8.11.0 version: 8.11.0 jest: - specifier: ~27.5.1 - version: 27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)) + specifier: ~28.1.3 + version: 28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) jest-environment-jsdom: - specifier: ~27.5.1 - version: 27.5.1 + specifier: ~28.1.3 + version: 28.1.3 jest-environment-jsdom-global: - specifier: ~3.0.0 - version: 3.0.0(jest-environment-jsdom@27.5.1) + specifier: ~4.0.0 + version: 4.0.0(jest-environment-jsdom@28.1.3) jest-standard-reporter: specifier: ~2.0.0 version: 2.0.0 moment-timezone: specifier: ~0.5.26 - version: 0.5.45 + version: 0.5.46 rollup: specifier: ~2.70.1 version: 2.70.2 @@ -1769,10 +1892,10 @@ importers: version: 7.0.2(rollup@2.70.2) rollup-plugin-ts: specifier: ~2.0.5 - version: 2.0.7(@babel/core@7.25.2)(@babel/runtime@7.25.6)(rollup@2.70.2)(typescript@4.6.4) + version: 2.0.7(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.25.9(@babel/core@7.29.7))(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.26.0)(rollup@2.70.2)(typescript@4.6.4) ts-jest: - specifier: ~27.1.3 - version: 27.1.5(@babel/core@7.25.2)(@types/jest@27.4.1)(babel-jest@27.5.1(@babel/core@7.25.2))(jest@27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)))(typescript@4.6.4) + specifier: ~28.0.8 + version: 28.0.8(@babel/core@7.29.7)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.29.7))(jest@28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)))(typescript@4.6.4) typescript: specifier: ~4.6.2 version: 4.6.4 @@ -1793,11 +1916,8 @@ importers: version: 2.16.4 tslib: specifier: ^2.3.1 - version: 2.7.0 + version: 2.8.1 devDependencies: - '@ampproject/rollup-plugin-closure-compiler': - specifier: ~0.27.0 - version: 0.27.0(rollup@2.70.2) '@rollup/plugin-commonjs': specifier: ~21.0.2 version: 21.0.3(rollup@2.70.2) @@ -1805,8 +1925,8 @@ importers: specifier: ~13.1.3 version: 13.1.3(rollup@2.70.2) '@types/jest': - specifier: ~27.4.1 - version: 27.4.1 + specifier: ~28.1.1 + version: 28.1.8 '@types/jsdom': specifier: ~16.2.14 version: 16.2.15 @@ -1823,14 +1943,14 @@ importers: specifier: ~8.11.0 version: 8.11.0 jest: - specifier: ~27.5.1 - version: 27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)) + specifier: ~28.1.3 + version: 28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) jest-environment-jsdom: - specifier: ~27.5.1 - version: 27.5.1 + specifier: ~28.1.3 + version: 28.1.3 jest-environment-jsdom-global: - specifier: ~3.0.0 - version: 3.0.0(jest-environment-jsdom@27.5.1) + specifier: ~4.0.0 + version: 4.0.0(jest-environment-jsdom@28.1.3) jest-standard-reporter: specifier: ~2.0.0 version: 2.0.0 @@ -1848,10 +1968,10 @@ importers: version: 7.0.2(rollup@2.70.2) rollup-plugin-ts: specifier: ~2.0.5 - version: 2.0.7(@babel/core@7.25.2)(@babel/runtime@7.25.6)(rollup@2.70.2)(typescript@4.6.4) + version: 2.0.7(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.25.9(@babel/core@7.29.7))(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.26.0)(rollup@2.70.2)(typescript@4.6.4) ts-jest: - specifier: ~27.1.3 - version: 27.1.5(@babel/core@7.25.2)(@types/jest@27.4.1)(babel-jest@27.5.1(@babel/core@7.25.2))(jest@27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)))(typescript@4.6.4) + specifier: ~28.0.8 + version: 28.0.8(@babel/core@7.29.7)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.29.7))(jest@28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)))(typescript@4.6.4) typescript: specifier: ~4.6.2 version: 4.6.4 @@ -1866,14 +1986,11 @@ importers: version: link:../../libraries/tracker-core tslib: specifier: ^2.3.1 - version: 2.7.0 + version: 2.8.1 web-vitals: - specifier: ~3.3.2 - version: 3.3.2 + specifier: ~4.2.4 + version: 4.2.4 devDependencies: - '@ampproject/rollup-plugin-closure-compiler': - specifier: ~0.27.0 - version: 0.27.0(rollup@2.70.2) '@rollup/plugin-commonjs': specifier: ~21.0.2 version: 21.0.3(rollup@2.70.2) @@ -1881,8 +1998,8 @@ importers: specifier: ~13.1.3 version: 13.1.3(rollup@2.70.2) '@types/jest': - specifier: ~27.4.1 - version: 27.4.1 + specifier: ~28.1.1 + version: 28.1.8 '@types/jsdom': specifier: ~16.2.14 version: 16.2.15 @@ -1896,14 +2013,14 @@ importers: specifier: ~8.11.0 version: 8.11.0 jest: - specifier: ~27.5.1 - version: 27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)) + specifier: ~28.1.3 + version: 28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) jest-environment-jsdom: - specifier: ~27.5.1 - version: 27.5.1 + specifier: ~28.1.3 + version: 28.1.3 jest-environment-jsdom-global: - specifier: ~3.0.0 - version: 3.0.0(jest-environment-jsdom@27.5.1) + specifier: ~4.0.0 + version: 4.0.0(jest-environment-jsdom@28.1.3) jest-standard-reporter: specifier: ~2.0.0 version: 2.0.0 @@ -1921,35 +2038,29 @@ importers: version: 7.0.2(rollup@2.70.2) rollup-plugin-ts: specifier: ~2.0.5 - version: 2.0.7(@babel/core@7.25.2)(@babel/runtime@7.25.6)(rollup@2.70.2)(typescript@4.6.4) + version: 2.0.7(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.25.9(@babel/core@7.29.7))(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.26.0)(rollup@2.70.2)(typescript@4.6.4) ts-jest: - specifier: ~27.1.3 - version: 27.1.5(@babel/core@7.25.2)(@types/jest@27.4.1)(babel-jest@27.5.1(@babel/core@7.25.2))(jest@27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)))(typescript@4.6.4) + specifier: ~28.0.8 + version: 28.0.8(@babel/core@7.29.7)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.29.7))(jest@28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)))(typescript@4.6.4) typescript: specifier: ~4.6.2 version: 4.6.4 - ../../plugins/browser-plugin-youtube-tracking: + ../../plugins/browser-plugin-webview: dependencies: - '@snowplow/browser-plugin-media': - specifier: workspace:* - version: link:../browser-plugin-media '@snowplow/browser-tracker-core': specifier: workspace:* version: link:../../libraries/browser-tracker-core '@snowplow/tracker-core': specifier: workspace:* version: link:../../libraries/tracker-core + '@snowplow/webview-tracker': + specifier: ^0.3.1 + version: 0.3.1 tslib: specifier: ^2.3.1 - version: 2.7.0 - uuid: - specifier: ^10.0.0 - version: 10.0.0 + version: 2.8.1 devDependencies: - '@ampproject/rollup-plugin-closure-compiler': - specifier: ~0.27.0 - version: 0.27.0(rollup@2.70.2) '@rollup/plugin-commonjs': specifier: ~21.0.2 version: 21.0.3(rollup@2.70.2) @@ -1957,17 +2068,11 @@ importers: specifier: ~13.1.3 version: 13.1.3(rollup@2.70.2) '@types/jest': - specifier: ~27.4.1 - version: 27.4.1 + specifier: ~28.1.1 + version: 28.1.8 '@types/jsdom': specifier: ~16.2.14 version: 16.2.15 - '@types/uuid': - specifier: ^10.0.0 - version: 10.0.0 - '@types/youtube': - specifier: ~0.0.46 - version: 0.0.50 '@typescript-eslint/eslint-plugin': specifier: ~5.15.0 version: 5.15.0(@typescript-eslint/parser@5.15.0(eslint@8.11.0)(typescript@4.6.4))(eslint@8.11.0)(typescript@4.6.4) @@ -1978,14 +2083,14 @@ importers: specifier: ~8.11.0 version: 8.11.0 jest: - specifier: ~27.5.1 - version: 27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)) + specifier: ~28.1.3 + version: 28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) jest-environment-jsdom: - specifier: ~27.5.1 - version: 27.5.1 + specifier: ~28.1.3 + version: 28.1.3 jest-environment-jsdom-global: - specifier: ~3.0.0 - version: 3.0.0(jest-environment-jsdom@27.5.1) + specifier: ~4.0.0 + version: 4.0.0(jest-environment-jsdom@28.1.3) jest-standard-reporter: specifier: ~2.0.0 version: 2.0.0 @@ -2003,16 +2108,19 @@ importers: version: 7.0.2(rollup@2.70.2) rollup-plugin-ts: specifier: ~2.0.5 - version: 2.0.7(@babel/core@7.25.2)(@babel/runtime@7.25.6)(rollup@2.70.2)(typescript@4.6.4) + version: 2.0.7(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.25.9(@babel/core@7.29.7))(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.26.0)(rollup@2.70.2)(typescript@4.6.4) ts-jest: - specifier: ~27.1.3 - version: 27.1.5(@babel/core@7.25.2)(@types/jest@27.4.1)(babel-jest@27.5.1(@babel/core@7.25.2))(jest@27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)))(typescript@4.6.4) + specifier: ~28.0.8 + version: 28.0.8(@babel/core@7.29.7)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.29.7))(jest@28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)))(typescript@4.6.4) typescript: specifier: ~4.6.2 version: 4.6.4 - ../../trackers/browser-tracker: + ../../plugins/browser-plugin-youtube-tracking: dependencies: + '@snowplow/browser-plugin-media': + specifier: workspace:* + version: link:../browser-plugin-media '@snowplow/browser-tracker-core': specifier: workspace:* version: link:../../libraries/browser-tracker-core @@ -2021,11 +2129,11 @@ importers: version: link:../../libraries/tracker-core tslib: specifier: ^2.3.1 - version: 2.7.0 + version: 2.8.1 + uuid: + specifier: ^11.1.1 + version: 11.1.1 devDependencies: - '@ampproject/rollup-plugin-closure-compiler': - specifier: ~0.27.0 - version: 0.27.0(rollup@2.70.2) '@rollup/plugin-commonjs': specifier: ~21.0.2 version: 21.0.3(rollup@2.70.2) @@ -2033,14 +2141,14 @@ importers: specifier: ~13.1.3 version: 13.1.3(rollup@2.70.2) '@types/jest': - specifier: ~27.4.1 - version: 27.4.1 + specifier: ~28.1.1 + version: 28.1.8 '@types/jsdom': specifier: ~16.2.14 version: 16.2.15 - '@types/lodash': - specifier: ~4.14.180 - version: 4.14.202 + '@types/youtube': + specifier: ~0.0.46 + version: 0.0.50 '@typescript-eslint/eslint-plugin': specifier: ~5.15.0 version: 5.15.0(@typescript-eslint/parser@5.15.0(eslint@8.11.0)(typescript@4.6.4))(eslint@8.11.0)(typescript@4.6.4) @@ -2051,20 +2159,17 @@ importers: specifier: ~8.11.0 version: 8.11.0 jest: - specifier: ~27.5.1 - version: 27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)) + specifier: ~28.1.3 + version: 28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) jest-environment-jsdom: - specifier: ~27.5.1 - version: 27.5.1 + specifier: ~28.1.3 + version: 28.1.3 jest-environment-jsdom-global: - specifier: ~3.0.0 - version: 3.0.0(jest-environment-jsdom@27.5.1) + specifier: ~4.0.0 + version: 4.0.0(jest-environment-jsdom@28.1.3) jest-standard-reporter: specifier: ~2.0.0 version: 2.0.0 - lodash: - specifier: ~4.17.21 - version: 4.17.21 rollup: specifier: ~2.70.1 version: 2.70.2 @@ -2079,44 +2184,120 @@ importers: version: 7.0.2(rollup@2.70.2) rollup-plugin-ts: specifier: ~2.0.5 - version: 2.0.7(@babel/core@7.25.2)(@babel/runtime@7.25.6)(rollup@2.70.2)(typescript@4.6.4) + version: 2.0.7(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.25.9(@babel/core@7.29.7))(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.26.0)(rollup@2.70.2)(typescript@4.6.4) ts-jest: - specifier: ~27.1.3 - version: 27.1.5(@babel/core@7.25.2)(@types/jest@27.4.1)(babel-jest@27.5.1(@babel/core@7.25.2))(jest@27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)))(typescript@4.6.4) + specifier: ~28.0.8 + version: 28.0.8(@babel/core@7.29.7)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.29.7))(jest@28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)))(typescript@4.6.4) typescript: specifier: ~4.6.2 version: 4.6.4 - whatwg-fetch: - specifier: ~3.6.20 - version: 3.6.20 - ../../trackers/javascript-tracker: + ../../trackers/browser-tracker: dependencies: - '@snowplow/browser-plugin-ad-tracking': - specifier: workspace:* - version: link:../../plugins/browser-plugin-ad-tracking - '@snowplow/browser-plugin-button-click-tracking': - specifier: workspace:* - version: link:../../plugins/browser-plugin-button-click-tracking - '@snowplow/browser-plugin-client-hints': - specifier: workspace:* - version: link:../../plugins/browser-plugin-client-hints - '@snowplow/browser-plugin-enhanced-consent': - specifier: workspace:* - version: link:../../plugins/browser-plugin-enhanced-consent - '@snowplow/browser-plugin-enhanced-ecommerce': - specifier: workspace:* - version: link:../../plugins/browser-plugin-enhanced-ecommerce - '@snowplow/browser-plugin-error-tracking': - specifier: workspace:* - version: link:../../plugins/browser-plugin-error-tracking - '@snowplow/browser-plugin-event-specifications': + '@snowplow/browser-tracker-core': specifier: workspace:* - version: link:../../plugins/browser-plugin-event-specifications - '@snowplow/browser-plugin-form-tracking': + version: link:../../libraries/browser-tracker-core + '@snowplow/tracker-core': specifier: workspace:* - version: link:../../plugins/browser-plugin-form-tracking - '@snowplow/browser-plugin-ga-cookies': + version: link:../../libraries/tracker-core + tslib: + specifier: ^2.3.1 + version: 2.8.1 + devDependencies: + '@rollup/plugin-commonjs': + specifier: ~21.0.2 + version: 21.0.3(rollup@2.70.2) + '@rollup/plugin-node-resolve': + specifier: ~13.1.3 + version: 13.1.3(rollup@2.70.2) + '@types/jest': + specifier: ~28.1.1 + version: 28.1.8 + '@types/jsdom': + specifier: ~16.2.14 + version: 16.2.15 + '@types/lodash': + specifier: ~4.14.180 + version: 4.14.202 + '@typescript-eslint/eslint-plugin': + specifier: ~5.15.0 + version: 5.15.0(@typescript-eslint/parser@5.15.0(eslint@8.11.0)(typescript@4.6.4))(eslint@8.11.0)(typescript@4.6.4) + '@typescript-eslint/parser': + specifier: ~5.15.0 + version: 5.15.0(eslint@8.11.0)(typescript@4.6.4) + eslint: + specifier: ~8.11.0 + version: 8.11.0 + jest: + specifier: ~28.1.3 + version: 28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) + jest-environment-jsdom: + specifier: ~28.1.3 + version: 28.1.3 + jest-environment-jsdom-global: + specifier: ~4.0.0 + version: 4.0.0(jest-environment-jsdom@28.1.3) + jest-standard-reporter: + specifier: ~2.0.0 + version: 2.0.0 + lodash: + specifier: ~4.17.21 + version: 4.17.21 + rollup: + specifier: ~2.70.1 + version: 2.70.2 + rollup-plugin-cleanup: + specifier: ~3.2.1 + version: 3.2.1(rollup@2.70.2) + rollup-plugin-license: + specifier: ~2.6.1 + version: 2.6.1(rollup@2.70.2) + rollup-plugin-terser: + specifier: ~7.0.2 + version: 7.0.2(rollup@2.70.2) + rollup-plugin-ts: + specifier: ~2.0.5 + version: 2.0.7(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.25.9(@babel/core@7.29.7))(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.26.0)(rollup@2.70.2)(typescript@4.6.4) + ts-jest: + specifier: ~28.0.8 + version: 28.0.8(@babel/core@7.29.7)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.29.7))(jest@28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)))(typescript@4.6.4) + typescript: + specifier: ~4.6.2 + version: 4.6.4 + whatwg-fetch: + specifier: ~3.6.20 + version: 3.6.20 + + ../../trackers/javascript-tracker: + dependencies: + '@snowplow/browser-plugin-ad-tracking': + specifier: workspace:* + version: link:../../plugins/browser-plugin-ad-tracking + '@snowplow/browser-plugin-button-click-tracking': + specifier: workspace:* + version: link:../../plugins/browser-plugin-button-click-tracking + '@snowplow/browser-plugin-client-hints': + specifier: workspace:* + version: link:../../plugins/browser-plugin-client-hints + '@snowplow/browser-plugin-element-tracking': + specifier: workspace:* + version: link:../../plugins/browser-plugin-element-tracking + '@snowplow/browser-plugin-enhanced-consent': + specifier: workspace:* + version: link:../../plugins/browser-plugin-enhanced-consent + '@snowplow/browser-plugin-enhanced-ecommerce': + specifier: workspace:* + version: link:../../plugins/browser-plugin-enhanced-ecommerce + '@snowplow/browser-plugin-error-tracking': + specifier: workspace:* + version: link:../../plugins/browser-plugin-error-tracking + '@snowplow/browser-plugin-event-specifications': + specifier: workspace:* + version: link:../../plugins/browser-plugin-event-specifications + '@snowplow/browser-plugin-form-tracking': + specifier: workspace:* + version: link:../../plugins/browser-plugin-form-tracking + '@snowplow/browser-plugin-ga-cookies': specifier: workspace:* version: link:../../plugins/browser-plugin-ga-cookies '@snowplow/browser-plugin-geolocation': @@ -2158,6 +2339,9 @@ importers: '@snowplow/browser-plugin-web-vitals': specifier: workspace:* version: link:../../plugins/browser-plugin-web-vitals + '@snowplow/browser-plugin-webview': + specifier: workspace:* + version: link:../../plugins/browser-plugin-webview '@snowplow/browser-plugin-youtube-tracking': specifier: workspace:* version: link:../../plugins/browser-plugin-youtube-tracking @@ -2172,11 +2356,8 @@ importers: version: link:../../libraries/tracker-core tslib: specifier: ^2.3.1 - version: 2.7.0 + version: 2.8.1 devDependencies: - '@ampproject/rollup-plugin-closure-compiler': - specifier: ~0.27.0 - version: 0.27.0(rollup@2.70.2) '@rollup/plugin-alias': specifier: ~3.1.9 version: 3.1.9(rollup@2.70.2) @@ -2194,10 +2375,10 @@ importers: version: 4.0.0(rollup@2.70.2) '@types/dockerode': specifier: ~3.3.5 - version: 3.3.31 + version: 3.3.32 '@types/jest': - specifier: ~27.4.1 - version: 27.4.1 + specifier: ~28.1.1 + version: 28.1.8 '@types/jsdom': specifier: ~16.2.14 version: 16.2.15 @@ -2241,20 +2422,20 @@ importers: specifier: 4.1.2 version: 4.1.2 chromedriver: - specifier: ~129.0.0 - version: 129.0.4 + specifier: ~131.0.0 + version: 131.0.4 dockerode: specifier: ~3.3.1 version: 3.3.5 jest: - specifier: ~27.5.1 - version: 27.5.1(ts-node@10.9.2(@types/node@14.6.4)(typescript@4.6.4)) + specifier: ~28.1.3 + version: 28.1.3(@types/node@14.6.4)(ts-node@10.9.2(@types/node@14.6.4)(typescript@4.6.4)) jest-environment-jsdom: - specifier: ~27.5.1 - version: 27.5.1 + specifier: ~28.1.3 + version: 28.1.3 jest-environment-jsdom-global: - specifier: ~3.0.0 - version: 3.0.0(jest-environment-jsdom@27.5.1) + specifier: ~4.0.0 + version: 4.0.0(jest-environment-jsdom@28.1.3) jest-standard-reporter: specifier: ~2.0.0 version: 2.0.0 @@ -2284,13 +2465,13 @@ importers: version: 7.0.2(rollup@2.70.2) rollup-plugin-ts: specifier: ~2.0.5 - version: 2.0.7(@babel/core@7.25.2)(@babel/runtime@7.25.6)(rollup@2.70.2)(typescript@4.6.4) + version: 2.0.7(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.25.9(@babel/core@7.29.7))(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.26.0)(rollup@2.70.2)(typescript@4.6.4) saucelabs: specifier: ~7.5.0 version: 7.5.0 ts-jest: - specifier: ~27.1.3 - version: 27.1.5(@babel/core@7.25.2)(@types/jest@27.4.1)(babel-jest@27.5.1(@babel/core@7.25.2))(jest@27.5.1(ts-node@10.9.2(@types/node@14.6.4)(typescript@4.6.4)))(typescript@4.6.4) + specifier: ~28.0.8 + version: 28.0.8(@babel/core@7.29.7)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.29.7))(jest@28.1.3(@types/node@14.6.4)(ts-node@10.9.2(@types/node@14.6.4)(typescript@4.6.4)))(typescript@4.6.4) ts-node: specifier: ~10.9.1 version: 10.9.2(@types/node@14.6.4)(typescript@4.6.4) @@ -2299,7 +2480,7 @@ importers: version: 4.6.4 wdio-chromedriver-service: specifier: ~8.1.1 - version: 8.1.1(@wdio/types@8.39.0)(chromedriver@129.0.4)(webdriverio@8.39.1(encoding@0.1.13)(typescript@4.6.4)) + version: 8.1.1(@wdio/types@8.39.0)(chromedriver@131.0.4)(webdriverio@8.39.1(encoding@0.1.13)(typescript@4.6.4)) wdio-edgedriver-service: specifier: ~3.0.3 version: 3.0.3(@wdio/types@8.39.0) @@ -2317,7 +2498,7 @@ importers: version: link:../../libraries/tracker-core tslib: specifier: ^2.3.1 - version: 2.7.0 + version: 2.8.1 devDependencies: '@rollup/plugin-json': specifier: ~4.1.0 @@ -2348,7 +2529,7 @@ importers: version: 2.6.1(rollup@2.70.2) rollup-plugin-ts: specifier: ~2.0.5 - version: 2.0.7(@babel/core@7.25.2)(@babel/runtime@7.25.6)(rollup@2.70.2)(typescript@4.6.4) + version: 2.0.7(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.25.9(@babel/core@7.29.7))(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.26.0)(rollup@2.70.2)(typescript@4.6.4) ts-node: specifier: ~10.9.1 version: 10.9.2(@types/node@14.6.4)(typescript@4.6.4) @@ -2356,5251 +2537,8361 @@ importers: specifier: ~4.6.2 version: 4.6.4 -packages: + ../../trackers/react-native-tracker: + dependencies: + '@snowplow/browser-plugin-screen-tracking': + specifier: workspace:* + version: link:../../plugins/browser-plugin-screen-tracking + '@snowplow/browser-tracker-core': + specifier: workspace:* + version: link:../../libraries/browser-tracker-core + '@snowplow/tracker-core': + specifier: workspace:* + version: link:../../libraries/tracker-core + tslib: + specifier: ^2.3.1 + version: 2.8.1 + uuid: + specifier: ^11.1.1 + version: 11.1.1 + devDependencies: + '@react-native-async-storage/async-storage': + specifier: ^2.0.0 + version: 2.0.0(react-native@0.74.5(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@types/react@18.3.18)(encoding@0.1.13)(react@18.2.0)) + '@snowplow/browser-plugin-snowplow-ecommerce': + specifier: workspace:* + version: link:../../plugins/browser-plugin-snowplow-ecommerce + '@types/jest': + specifier: ~28.1.1 + version: 28.1.8 + '@types/node': + specifier: ~14.6.0 + version: 14.6.4 + '@types/react': + specifier: ^18.2.44 + version: 18.3.18 + '@typescript-eslint/eslint-plugin': + specifier: ~5.15.0 + version: 5.15.0(@typescript-eslint/parser@5.15.0(eslint@8.11.0)(typescript@4.6.4))(eslint@8.11.0)(typescript@4.6.4) + '@typescript-eslint/parser': + specifier: ~5.15.0 + version: 5.15.0(eslint@8.11.0)(typescript@4.6.4) + eslint: + specifier: ~8.11.0 + version: 8.11.0 + jest: + specifier: ~28.1.3 + version: 28.1.3(@types/node@14.6.4)(ts-node@10.9.2(@types/node@14.6.4)(typescript@4.6.4)) + node-fetch: + specifier: ~3.3.2 + version: 3.3.2 + react: + specifier: 18.2.0 + version: 18.2.0 + react-native: + specifier: 0.74.5 + version: 0.74.5(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@types/react@18.3.18)(encoding@0.1.13)(react@18.2.0) + react-native-builder-bob: + specifier: ^0.42.1 + version: 0.42.1 + react-native-get-random-values: + specifier: ^1.11.0 || ^2.0.0 + version: 1.11.0(react-native@0.74.5(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@types/react@18.3.18)(encoding@0.1.13)(react@18.2.0)) + ts-jest: + specifier: ~28.0.8 + version: 28.0.8(@babel/core@7.29.7)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.29.7))(jest@28.1.3(@types/node@14.6.4)(ts-node@10.9.2(@types/node@14.6.4)(typescript@4.6.4)))(typescript@4.6.4) + typescript: + specifier: ~4.6.2 + version: 4.6.4 - '@ampproject/remapping@0.2.0': - resolution: {integrity: sha512-a4EztS9/GOVQjX5Ol+Iz33TFhaXvYBF7aB6D8+Qz0/SCIxOm3UNRhGZiwcCuJ8/Ifc6NCogp3S48kc5hFxRpUw==} - engines: {node: '>=6.0.0'} +packages: '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@ampproject/rollup-plugin-closure-compiler@0.27.0': - resolution: {integrity: sha512-stpAOn2ZZEJuAV39HFw9cnKJYNhEeHtcsoa83orpLDhSxsxSbVEKwHaWlFBaQYpQRSOdapC4eJhJnCzocZxnqg==} - engines: {node: '>=10'} - peerDependencies: - rollup: '>=1.27' + '@ark/schema@0.56.0': + resolution: {integrity: sha512-ECg3hox/6Z/nLajxXqNhgPtNdHWC9zNsDyskwO28WinoFEnWow4IsERNz9AnXRhTZJnYIlAJ4uGn3nlLk65vZA==} + + '@ark/util@0.56.0': + resolution: {integrity: sha512-BghfRC8b9pNs3vBoDJhcta0/c1J1rsoS1+HgVUreMFPdhz/CRAKReAu57YEllNaSy98rWAdY1gE+gFup7OXpgA==} '@arr/every@1.0.1': resolution: {integrity: sha512-UQFQ6SgyJ6LX42W8rHCs8KVc0JS0tzVL9ct4XYedJukskYVWTo49tNiMEK9C2HTyarbNiT/RVIRSY82vH+6sTg==} engines: {node: '>=4'} - '@babel/code-frame@7.24.7': - resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.25.4': - resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} - '@babel/core@7.25.2': - resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} + '@babel/compat-data@7.26.3': + resolution: {integrity: sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==} engines: {node: '>=6.9.0'} - '@babel/generator@7.25.6': - resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==} + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.25.2': - resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} + '@babel/core@7.26.0': + resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.24.7': - resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.25.2': - resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} + '@babel/generator@7.26.3': + resolution: {integrity: sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-plugin-utils@7.24.8': - resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} + '@babel/generator@7.29.7': + resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} engines: {node: '>=6.9.0'} - '@babel/helper-simple-access@7.24.7': - resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} + '@babel/helper-annotate-as-pure@7.25.9': + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.24.8': - resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} + '@babel/helper-annotate-as-pure@7.29.7': + resolution: {integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.24.7': - resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + '@babel/helper-compilation-targets@7.25.9': + resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.24.8': - resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.25.6': - resolution: {integrity: sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==} + '@babel/helper-create-class-features-plugin@7.25.9': + resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@babel/highlight@7.24.7': - resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + '@babel/helper-create-class-features-plugin@7.29.7': + resolution: {integrity: sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@babel/parser@7.25.6': - resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} - engines: {node: '>=6.0.0'} - hasBin: true + '@babel/helper-create-regexp-features-plugin@7.26.3': + resolution: {integrity: sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@babel/plugin-syntax-async-generators@7.8.4': - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + '@babel/helper-create-regexp-features-plugin@7.29.7': + resolution: {integrity: sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg==} + engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.0.0 - '@babel/plugin-syntax-bigint@7.8.3': - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + '@babel/helper-define-polyfill-provider@0.6.3': + resolution: {integrity: sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - '@babel/plugin-syntax-class-properties@7.12.13': - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + '@babel/helper-define-polyfill-provider@0.6.8': + resolution: {integrity: sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - '@babel/plugin-syntax-class-static-block@7.14.5': - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + '@babel/helper-environment-visitor@7.24.7': + resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-attributes@7.25.6': - resolution: {integrity: sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==} + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-meta@7.10.4': - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/helper-member-expression-to-functions@7.25.9': + resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} + engines: {node: '>=6.9.0'} - '@babel/plugin-syntax-json-strings@7.8.3': - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/helper-member-expression-to-functions@7.29.7': + resolution: {integrity: sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==} + engines: {node: '>=6.9.0'} - '@babel/plugin-syntax-logical-assignment-operators@7.10.4': - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} + engines: {node: '>=6.9.0'} - '@babel/plugin-syntax-numeric-separator@7.10.4': - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.0.0 - '@babel/plugin-syntax-object-rest-spread@7.8.3': - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} + engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.0.0 - '@babel/plugin-syntax-optional-catch-binding@7.8.3': - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/helper-optimise-call-expression@7.25.9': + resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} + engines: {node: '>=6.9.0'} - '@babel/plugin-syntax-optional-chaining@7.8.3': - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/helper-optimise-call-expression@7.29.7': + resolution: {integrity: sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==} + engines: {node: '>=6.9.0'} - '@babel/plugin-syntax-private-property-in-object@7.14.5': - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + '@babel/helper-plugin-utils@7.25.9': + resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.29.7': + resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-remap-async-to-generator@7.25.9': + resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.0.0 - '@babel/plugin-syntax-top-level-await@7.14.5': - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + '@babel/helper-remap-async-to-generator@7.29.7': + resolution: {integrity: sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.0.0 - '@babel/plugin-syntax-typescript@7.25.4': - resolution: {integrity: sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==} + '@babel/helper-replace-supers@7.25.9': + resolution: {integrity: sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.0.0 - '@babel/runtime@7.25.6': - resolution: {integrity: sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==} + '@babel/helper-replace-supers@7.29.7': + resolution: {integrity: sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@babel/template@7.25.0': - resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.25.6': - resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==} + '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + resolution: {integrity: sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==} engines: {node: '>=6.9.0'} - '@babel/types@7.25.6': - resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} - '@balena/dockerignore@1.0.2': - resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} - '@bcoe/v8-coverage@0.2.3': - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} - '@cspotcode/source-map-support@0.8.1': - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} - '@eggjs/yauzl@2.11.0': - resolution: {integrity: sha512-Jq+k2fCZJ3i3HShb0nxLUiAgq5pwo8JTT1TrH22JoehZQ0Nm2dvByGIja1NYfNyuE4Tx5/Dns5nVsBN/mlC8yg==} + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} - '@eslint/eslintrc@1.4.1': - resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} + engines: {node: '>=6.9.0'} - '@gar/promisify@1.1.3': - resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + '@babel/helper-wrap-function@7.25.9': + resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} + engines: {node: '>=6.9.0'} - '@humanwhocodes/config-array@0.9.5': - resolution: {integrity: sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead + '@babel/helper-wrap-function@7.29.7': + resolution: {integrity: sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw==} + engines: {node: '>=6.9.0'} - '@humanwhocodes/object-schema@1.2.1': - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} - deprecated: Use @eslint/object-schema instead + '@babel/helpers@7.26.0': + resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} + engines: {node: '>=6.9.0'} - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} + '@babel/helpers@7.29.7': + resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} + engines: {node: '>=6.9.0'} - '@istanbuljs/load-nyc-config@1.1.0': - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} + '@babel/parser@7.26.3': + resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==} + engines: {node: '>=6.0.0'} + hasBin: true - '@istanbuljs/schema@0.1.3': - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} + engines: {node: '>=6.0.0'} + hasBin: true - '@jest/console@26.6.2': - resolution: {integrity: sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==} - engines: {node: '>= 10.14.2'} + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.29.7': + resolution: {integrity: sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@jest/console@27.5.1': - resolution: {integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.29.7': + resolution: {integrity: sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@jest/core@27.5.1': - resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.29.7': + resolution: {integrity: sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ==} + engines: {node: '>=6.9.0'} peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + '@babel/core': ^7.0.0 - '@jest/environment@27.5.1': - resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@7.29.7': + resolution: {integrity: sha512-oBNVCvnO5tND+xSopWvV8WNGfpTfgP4Zr/YXXSj8zfmcPktp5Ku/aZlsIowgSD4fjmgHn6sGmB9APVsU5zOdhA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@jest/expect-utils@29.7.0': - resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.29.7': + resolution: {integrity: sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 - '@jest/fake-timers@27.5.1': - resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.29.7': + resolution: {integrity: sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@jest/globals@27.5.1': - resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + '@babel/plugin-proposal-async-generator-functions@7.20.7': + resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead. + peerDependencies: + '@babel/core': ^7.0.0-0 - '@jest/reporters@27.5.1': - resolution: {integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + '@babel/plugin-proposal-class-properties@7.18.6': + resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + '@babel/core': ^7.0.0-0 - '@jest/schemas@29.6.3': - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@babel/plugin-proposal-export-default-from@7.25.9': + resolution: {integrity: sha512-ykqgwNfSnNOB+C8fV5X4mG3AVmvu+WVxcaU9xHHtBb7PCrPeweMmPjGsn8eMaeJg6SJuoUuZENeeSWaarWqonQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@jest/source-map@27.5.1': - resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + '@babel/plugin-proposal-logical-assignment-operators@7.20.7': + resolution: {integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-logical-assignment-operators instead. + peerDependencies: + '@babel/core': ^7.0.0-0 - '@jest/test-result@27.5.1': - resolution: {integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6': + resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. + peerDependencies: + '@babel/core': ^7.0.0-0 - '@jest/test-sequencer@27.5.1': - resolution: {integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + '@babel/plugin-proposal-numeric-separator@7.18.6': + resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead. + peerDependencies: + '@babel/core': ^7.0.0-0 - '@jest/transform@27.5.1': - resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + '@babel/plugin-proposal-object-rest-spread@7.20.7': + resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead. + peerDependencies: + '@babel/core': ^7.0.0-0 - '@jest/types@26.6.2': - resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==} - engines: {node: '>= 10.14.2'} + '@babel/plugin-proposal-optional-catch-binding@7.18.6': + resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead. + peerDependencies: + '@babel/core': ^7.0.0-0 - '@jest/types@27.5.1': - resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + '@babel/plugin-proposal-optional-chaining@7.21.0': + resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. + peerDependencies: + '@babel/core': ^7.0.0-0 - '@jest/types@29.6.3': - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@jridgewell/resolve-uri@1.0.0': - resolution: {integrity: sha512-9oLAnygRMi8Q5QkYEU4XWK04B+nuoXoxjRvRxgjuChkLZFBja0YPSgdZ7dZtwhncLBcQe/I/E+fLuk5qxcYVJA==} - engines: {node: '>=6.0.0'} + '@babel/plugin-syntax-bigint@7.8.3': + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} + '@babel/plugin-syntax-class-static-block@7.14.5': + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@jridgewell/source-map@0.3.6': - resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + '@babel/plugin-syntax-dynamic-import@7.8.3': + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@babel/plugin-syntax-export-default-from@7.25.9': + resolution: {integrity: sha512-9MhJ/SMTsVqsd69GyQg89lYR4o9T+oDGv5F6IsigxxqFVOyR/IflDLYP8WDI1l8fkhNGGktqkvL5qwNCtGEpgQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@babel/plugin-syntax-flow@7.26.0': + resolution: {integrity: sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@jridgewell/trace-mapping@0.3.9': - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@babel/plugin-syntax-flow@7.29.7': + resolution: {integrity: sha512-ajMX6QPcyomotqwpzhkYGxcK2i/us0rs1Qo9QvUpa+Fca0FTmqrzKrctoIYLMxcOhGZldGT/BAVkRGTWBiR8gQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@ljharb/through@2.3.13': - resolution: {integrity: sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==} - engines: {node: '>= 0.4'} + '@babel/plugin-syntax-import-assertions@7.29.7': + resolution: {integrity: sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@mdn/browser-compat-data@4.2.1': - resolution: {integrity: sha512-EWUguj2kd7ldmrF9F+vI5hUOralPd+sdsUnYbRy33vZTuZkduC1shE9TtEMEjAQwyfyMb4ole5KtjF8MsnQOlA==} + '@babel/plugin-syntax-import-attributes@7.26.0': + resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + '@babel/plugin-syntax-import-attributes@7.29.7': + resolution: {integrity: sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@npmcli/fs@1.1.1': - resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} + '@babel/plugin-syntax-jsx@7.25.9': + resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@npmcli/git@2.1.0': - resolution: {integrity: sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==} + '@babel/plugin-syntax-jsx@7.29.7': + resolution: {integrity: sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@npmcli/installed-package-contents@1.0.7': - resolution: {integrity: sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==} - engines: {node: '>= 10'} - hasBin: true + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@npmcli/move-file@1.1.2': - resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} - engines: {node: '>=10'} - deprecated: This functionality has been moved to @npmcli/fs + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@npmcli/node-gyp@1.0.3': - resolution: {integrity: sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==} + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@npmcli/promise-spawn@1.3.2': - resolution: {integrity: sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==} + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@npmcli/run-script@1.8.6': - resolution: {integrity: sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g==} + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@polka/parse@1.0.0-next.0': - resolution: {integrity: sha512-zcPNrc3PNrRLSCQ7ca8XR7h18VxdPIXhn+yvrYMdUFCHM7mhXGSPw5xBdbcf/dQ1cI4uE8pDfmm5uU+HX+WfFg==} + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@polka/url@0.5.0': - resolution: {integrity: sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw==} + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@promptbook/utils@0.70.0-1': - resolution: {integrity: sha512-qd2lLRRN+sE6UuNMi2tEeUUeb4zmXnxY5EMdfHVXNE+bqBDpUC7/aEfXgA3jnUXEr+xFjQ8PTFQgWvBMaKvw0g==} + '@babel/plugin-syntax-typescript@7.25.9': + resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@puppeteer/browsers@1.4.6': - resolution: {integrity: sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==} - engines: {node: '>=16.3.0'} - hasBin: true + '@babel/plugin-syntax-typescript@7.29.7': + resolution: {integrity: sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==} + engines: {node: '>=6.9.0'} peerDependencies: - typescript: '>= 4.7.4' - peerDependenciesMeta: - typescript: - optional: true + '@babel/core': ^7.0.0-0 - '@puppeteer/browsers@1.9.1': - resolution: {integrity: sha512-PuvK6xZzGhKPvlx3fpfdM2kYY3P/hB1URtK8wA7XUJ6prn6pp22zvJHu48th0SGcHL9SutbPHrFuQgfXTFobWA==} - engines: {node: '>=16.3.0'} - hasBin: true + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@rollup/plugin-alias@3.1.9': - resolution: {integrity: sha512-QI5fsEvm9bDzt32k39wpOwZhVzRcL5ydcffUHMyLVaVaLeC70I8TJZ17F1z1eMoLu4E/UOcH9BWVkKpIKdrfiw==} - engines: {node: '>=8.0.0'} + '@babel/plugin-transform-arrow-functions@7.25.9': + resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==} + engines: {node: '>=6.9.0'} peerDependencies: - rollup: ^1.20.0||^2.0.0 + '@babel/core': ^7.0.0-0 - '@rollup/plugin-commonjs@21.0.3': - resolution: {integrity: sha512-ThGfwyvcLc6cfP/MWxA5ACF+LZCvsuhUq7V5134Az1oQWsiC7lNpLT4mJI86WQunK7BYmpUiHmMk2Op6OAHs0g==} - engines: {node: '>= 8.0.0'} + '@babel/plugin-transform-arrow-functions@7.29.7': + resolution: {integrity: sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==} + engines: {node: '>=6.9.0'} peerDependencies: - rollup: ^2.38.3 + '@babel/core': ^7.0.0-0 - '@rollup/plugin-json@4.1.0': - resolution: {integrity: sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==} + '@babel/plugin-transform-async-generator-functions@7.29.7': + resolution: {integrity: sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA==} + engines: {node: '>=6.9.0'} peerDependencies: - rollup: ^1.20.0 || ^2.0.0 + '@babel/core': ^7.0.0-0 - '@rollup/plugin-node-resolve@13.1.3': - resolution: {integrity: sha512-BdxNk+LtmElRo5d06MGY4zoepyrXX1tkzX2hrnPEZ53k78GuOMWLqmJDGIIOPwVRIFZrLQOo+Yr6KtCuLIA0AQ==} - engines: {node: '>= 10.0.0'} + '@babel/plugin-transform-async-to-generator@7.25.9': + resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==} + engines: {node: '>=6.9.0'} peerDependencies: - rollup: ^2.42.0 + '@babel/core': ^7.0.0-0 - '@rollup/plugin-replace@4.0.0': - resolution: {integrity: sha512-+rumQFiaNac9y64OHtkHGmdjm7us9bo1PlbgQfdihQtuNxzjpaB064HbRnewUOggLQxVCCyINfStkgmBeQpv1g==} + '@babel/plugin-transform-async-to-generator@7.29.7': + resolution: {integrity: sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w==} + engines: {node: '>=6.9.0'} peerDependencies: - rollup: ^1.20.0 || ^2.0.0 + '@babel/core': ^7.0.0-0 - '@rollup/pluginutils@3.1.0': - resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} - engines: {node: '>= 8.0.0'} + '@babel/plugin-transform-block-scoped-functions@7.29.7': + resolution: {integrity: sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA==} + engines: {node: '>=6.9.0'} peerDependencies: - rollup: ^1.20.0||^2.0.0 - - '@rollup/pluginutils@4.2.1': - resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} - engines: {node: '>= 8.0.0'} + '@babel/core': ^7.0.0-0 - '@sinclair/typebox@0.27.8': - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@babel/plugin-transform-block-scoping@7.25.9': + resolution: {integrity: sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@sindresorhus/is@4.6.0': - resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} - engines: {node: '>=10'} + '@babel/plugin-transform-block-scoping@7.29.7': + resolution: {integrity: sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@sindresorhus/is@5.6.0': - resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} - engines: {node: '>=14.16'} + '@babel/plugin-transform-class-properties@7.29.7': + resolution: {integrity: sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@sinonjs/commons@1.8.6': - resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} + '@babel/plugin-transform-class-static-block@7.29.7': + resolution: {integrity: sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 - '@sinonjs/fake-timers@8.1.0': - resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} + '@babel/plugin-transform-classes@7.25.9': + resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@szmarczak/http-timer@4.0.6': - resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} - engines: {node: '>=10'} + '@babel/plugin-transform-classes@7.29.7': + resolution: {integrity: sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@szmarczak/http-timer@5.0.1': - resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} - engines: {node: '>=14.16'} + '@babel/plugin-transform-computed-properties@7.25.9': + resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@testim/chrome-version@1.1.4': - resolution: {integrity: sha512-kIhULpw9TrGYnHp/8VfdcneIcxKnLixmADtukQRtJUmsVlMg0niMkwV0xZmi8hqa57xqilIHjWFA0GKvEjVU5g==} + '@babel/plugin-transform-computed-properties@7.29.7': + resolution: {integrity: sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@testing-library/dom@9.3.4': - resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} - engines: {node: '>=14'} + '@babel/plugin-transform-destructuring@7.25.9': + resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@tootallnate/once@1.1.2': - resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} - engines: {node: '>= 6'} + '@babel/plugin-transform-destructuring@7.29.7': + resolution: {integrity: sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@tootallnate/quickjs-emscripten@0.23.0': - resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + '@babel/plugin-transform-dotall-regex@7.29.7': + resolution: {integrity: sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@tsconfig/node10@1.0.11': - resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + '@babel/plugin-transform-duplicate-keys@7.29.7': + resolution: {integrity: sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@tsconfig/node12@1.0.11': - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.7': + resolution: {integrity: sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@tsconfig/node14@1.0.3': - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + '@babel/plugin-transform-dynamic-import@7.29.7': + resolution: {integrity: sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@tsconfig/node16@1.0.4': - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@babel/plugin-transform-explicit-resource-management@7.29.7': + resolution: {integrity: sha512-Rstj7coNz8sE+7Ju7ihpHLI564lsK5pUpNNlvptCIC/16E/S5hbl6n3kESPKdNRmqEWlpn5xpS5Q2dvXBsySLw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/aria-query@5.0.4': - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + '@babel/plugin-transform-exponentiation-operator@7.29.7': + resolution: {integrity: sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/babel__core@7.20.5': - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + '@babel/plugin-transform-export-namespace-from@7.29.7': + resolution: {integrity: sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/babel__generator@7.6.8': - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + '@babel/plugin-transform-flow-strip-types@7.25.9': + resolution: {integrity: sha512-/VVukELzPDdci7UUsWQaSkhgnjIWXnIyRpM02ldxaVoFK96c41So8JcKT3m0gYjyv7j5FNPGS5vfELrWalkbDA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/babel__template@7.4.4': - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + '@babel/plugin-transform-flow-strip-types@7.29.7': + resolution: {integrity: sha512-wRHeUjUjCZnMHmiO5bRgjFLcoEh7JyTdByOW11ahhwNa4V0bmeGEaIvt51yq0zQp2yWIpqfxXXPyUP6GFJZHOQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/babel__traverse@7.20.6': - resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + '@babel/plugin-transform-for-of@7.29.7': + resolution: {integrity: sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/cacheable-request@6.0.3': - resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + '@babel/plugin-transform-function-name@7.25.9': + resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/docker-modem@3.0.6': - resolution: {integrity: sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg==} + '@babel/plugin-transform-function-name@7.29.7': + resolution: {integrity: sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/dockerode@3.3.31': - resolution: {integrity: sha512-42R9eoVqJDSvVspV89g7RwRqfNExgievLNWoHkg7NoWIqAmavIbgQBb4oc0qRtHkxE+I3Xxvqv7qVXFABKPBTg==} + '@babel/plugin-transform-json-strings@7.29.7': + resolution: {integrity: sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/estree@0.0.39': - resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} + '@babel/plugin-transform-literals@7.25.9': + resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/estree@1.0.5': - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@babel/plugin-transform-literals@7.29.7': + resolution: {integrity: sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/graceful-fs@4.1.9': - resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + '@babel/plugin-transform-logical-assignment-operators@7.29.7': + resolution: {integrity: sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/http-cache-semantics@4.0.4': - resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + '@babel/plugin-transform-member-expression-literals@7.29.7': + resolution: {integrity: sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/istanbul-lib-coverage@2.0.6': - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + '@babel/plugin-transform-modules-amd@7.29.7': + resolution: {integrity: sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/istanbul-lib-report@3.0.3': - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + '@babel/plugin-transform-modules-commonjs@7.26.3': + resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/istanbul-reports@3.0.4': - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + '@babel/plugin-transform-modules-commonjs@7.29.7': + resolution: {integrity: sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/jest@27.4.1': - resolution: {integrity: sha512-23iPJADSmicDVrWk+HT58LMJtzLAnB2AgIzplQuq/bSrGaxCrlvRFjGbXmamnnk/mAmCdLStiGqggu28ocUyiw==} + '@babel/plugin-transform-modules-systemjs@7.29.7': + resolution: {integrity: sha512-TM2ZcQLoG2/y4HODiStCo10DibYhWhGWAwVv+EQKmG/7GFl0N+AAmUiXOMKM+aiJ9XBJ9AHVZBvTzMnJ2sM3cQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/jsdom@16.2.15': - resolution: {integrity: sha512-nwF87yjBKuX/roqGYerZZM0Nv1pZDMAT5YhOHYeM/72Fic+VEqJh4nyoqoapzJnW3pUlfxPY5FhgsJtM+dRnQQ==} + '@babel/plugin-transform-modules-umd@7.29.7': + resolution: {integrity: sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@babel/plugin-transform-named-capturing-groups-regex@7.25.9': + resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@types/jstimezonedetect@1.0.6': - resolution: {integrity: sha512-MKi1fgLzyqEWKgmvjwa+1p6k+phAACpFOK4eA1gBCHzbx4RyNGcO29IQWThGo1oKxSFa57gqm4iQn1lDaFJCQg==} + '@babel/plugin-transform-named-capturing-groups-regex@7.29.7': + resolution: {integrity: sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@types/keyv@3.1.4': - resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + '@babel/plugin-transform-new-target@7.29.7': + resolution: {integrity: sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/lodash@4.14.202': - resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} + '@babel/plugin-transform-nullish-coalescing-operator@7.29.7': + resolution: {integrity: sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/node@14.6.4': - resolution: {integrity: sha512-Wk7nG1JSaMfMpoMJDKUsWYugliB2Vy55pdjLpmLixeyMi7HizW2I/9QoxsPCkXl3dO+ZOVqPumKaDUv5zJu2uQ==} + '@babel/plugin-transform-numeric-separator@7.29.7': + resolution: {integrity: sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/node@16.18.106': - resolution: {integrity: sha512-YTgQUcpdXRc7iiEMutkkXl9WUx5lGUCVYvnfRg9CV+IA4l9epctEhCTbaw4KgzXaKYv8emvFJkEM65+MkNUhsQ==} + '@babel/plugin-transform-object-rest-spread@7.29.7': + resolution: {integrity: sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/node@18.19.48': - resolution: {integrity: sha512-7WevbG4ekUcRQSZzOwxWgi5dZmTak7FaxXDoW7xVxPBmKx1rTzfmRLkeCgJzcbBnOV2dkhAPc8cCeT6agocpjg==} + '@babel/plugin-transform-object-super@7.29.7': + resolution: {integrity: sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/node@20.16.3': - resolution: {integrity: sha512-/wdGiWRkMOm53gAsSyFMXFZHbVg7C6CbkrzHNpaHoYfsUWPg7m6ZRKtvQjgvQ9i8WT540a3ydRlRQbxjY30XxQ==} + '@babel/plugin-transform-optional-catch-binding@7.29.7': + resolution: {integrity: sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/normalize-package-data@2.4.4': - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@babel/plugin-transform-optional-chaining@7.29.7': + resolution: {integrity: sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/object-path@0.11.4': - resolution: {integrity: sha512-4tgJ1Z3elF/tOMpA8JLVuR9spt9Ynsf7+JjqsQ2IqtiPJtcLoHoXcT6qU4E10cPFqyXX5HDm9QwIzZhBSkLxsw==} + '@babel/plugin-transform-parameters@7.25.9': + resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/parse5@6.0.3': - resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} + '@babel/plugin-transform-parameters@7.29.7': + resolution: {integrity: sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/prettier@2.7.3': - resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + '@babel/plugin-transform-private-methods@7.25.9': + resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/randomcolor@0.5.9': - resolution: {integrity: sha512-k58cfpkK15AKn1m+oRd9nh5BnuiowhbyvBBdAzcddtARMr3xRzP0VlFaAKovSG6N6Knx08EicjPlOMzDejerrQ==} + '@babel/plugin-transform-private-methods@7.29.7': + resolution: {integrity: sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/resolve@1.17.1': - resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} + '@babel/plugin-transform-private-property-in-object@7.25.9': + resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/responselike@1.0.3': - resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + '@babel/plugin-transform-private-property-in-object@7.29.7': + resolution: {integrity: sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/semver@7.5.8': - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + '@babel/plugin-transform-property-literals@7.29.7': + resolution: {integrity: sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/sha1@1.1.5': - resolution: {integrity: sha512-eE1PzjW7u2VfxI+bTsvjzjBfpwqvxSpgfUmnRNVY+PJU1NBsdGZlaO/qnVnPKHzzpgIl9YyBIxvrgBvt1mzt2A==} + '@babel/plugin-transform-react-display-name@7.25.9': + resolution: {integrity: sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/split2@4.2.3': - resolution: {integrity: sha512-59OXIlfUsi2k++H6CHgUQKEb2HKRokUA39HY1i1dS8/AIcqVjtAAFdf8u+HxTWK/4FUHMJQlKSZ4I6irCBJ1Zw==} - - '@types/ssh2@1.15.1': - resolution: {integrity: sha512-ZIbEqKAsi5gj35y4P4vkJYly642wIbY6PqoN0xiyQGshKUGXR9WQjF/iF9mXBQ8uBKy3ezfsCkcoHKhd0BzuDA==} + '@babel/plugin-transform-react-display-name@7.29.7': + resolution: {integrity: sha512-+1wdDMGNb4UPeY3Q4L5yLiYe6TXPXubs4NjrgRFw13hPRLJfEMw2Q5OXkee6/IfdqePIeW4Jjwe3aBh7SdKz4Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/stack-utils@2.0.3': - resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + '@babel/plugin-transform-react-jsx-development@7.29.7': + resolution: {integrity: sha512-Xfy3UVMF04+ypnFbkhvfqtmvwfe92qwQdbGZVonhE+6v35GzlofmOnA1szaZqzb9xYWr0nl1e5EMmzi0DNON1g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/tcp-port-used@1.0.4': - resolution: {integrity: sha512-0vQ4fz9TTM4bCdllYWEJ2JHBUXR9xqPtc70dJ7BMRDVfvZyYdrgey3nP5RRcVj+qAgnHJM8r9fvgrfnPMxdnhA==} + '@babel/plugin-transform-react-jsx-self@7.25.9': + resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/tough-cookie@4.0.5': - resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + '@babel/plugin-transform-react-jsx-source@7.25.9': + resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/ua-parser-js@0.7.39': - resolution: {integrity: sha512-P/oDfpofrdtF5xw433SPALpdSchtJmY7nsJItf8h3KXqOslkbySh8zq4dSWXH2oTjRvJ5PczVEoCZPow6GicLg==} + '@babel/plugin-transform-react-jsx@7.25.9': + resolution: {integrity: sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/uuid@10.0.0': - resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} + '@babel/plugin-transform-react-jsx@7.29.7': + resolution: {integrity: sha512-WsZulLVBUHXVj2cUcPVx6UE21TpalB6bHbSFErKT0Ib++ax24jjXe73FqlWvdylFOjiuPHYi6VCcgRad1ItN+A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/vimeo__player@2.16.3': - resolution: {integrity: sha512-hsOe6CZFTNyfjRjQUrNHBF4LDmjvjcU2yQIPWp5AglKeGxt11JYGToQhKUPM876gBXggqR6rMQ0/sNI06ec2Rg==} + '@babel/plugin-transform-react-pure-annotations@7.29.7': + resolution: {integrity: sha512-H5E+HBgDpr6Q5t+Aj11tL7XkIui1jhbIoArVQnqjgXo5/3YxkN7ZEBcWF4RQlB0T4rrxJQbXS6kiFV6B7XTqUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/which@2.0.2': - resolution: {integrity: sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==} + '@babel/plugin-transform-regenerator@7.29.7': + resolution: {integrity: sha512-rNNFV0DBAJp988xW2DOntfDoYn1eR8GGF5AT5vYc+rjyfaQkM242c9tZUHHPe7KYaiJizXPWhQTzzdbXySyhBw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/ws@8.5.12': - resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} + '@babel/plugin-transform-regexp-modifiers@7.29.7': + resolution: {integrity: sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@types/yargs-parser@21.0.3': - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + '@babel/plugin-transform-reserved-words@7.29.7': + resolution: {integrity: sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/yargs@15.0.19': - resolution: {integrity: sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==} + '@babel/plugin-transform-runtime@7.25.9': + resolution: {integrity: sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/yargs@16.0.9': - resolution: {integrity: sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==} + '@babel/plugin-transform-shorthand-properties@7.25.9': + resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/yargs@17.0.33': - resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + '@babel/plugin-transform-shorthand-properties@7.29.7': + resolution: {integrity: sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/yauzl@2.10.3': - resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + '@babel/plugin-transform-spread@7.25.9': + resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/youtube@0.0.50': - resolution: {integrity: sha512-d4GpH4uPYp9W07kc487tiq6V/EUHl18vZWFMbQoe4Sk9LXEWzFi/BMf9x7TI4m7/j7gU3KeX8H6M8aPBgykeLw==} + '@babel/plugin-transform-spread@7.29.7': + resolution: {integrity: sha512-/u5K1QWada7tbYNqTjMh96718g9NTwh9tfPJMsSmVsQwGT447FskV+KcfeXkXq2GWki4EM/MuTdmBec+hOuVTQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@typescript-eslint/eslint-plugin@5.15.0': - resolution: {integrity: sha512-u6Db5JfF0Esn3tiAKELvoU5TpXVSkOpZ78cEGn/wXtT2RVqs2vkt4ge6N8cRCyw7YVKhmmLDbwI2pg92mlv7cA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@babel/plugin-transform-sticky-regex@7.25.9': + resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==} + engines: {node: '>=6.9.0'} peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@babel/core': ^7.0.0-0 - '@typescript-eslint/parser@5.15.0': - resolution: {integrity: sha512-NGAYP/+RDM2sVfmKiKOCgJYPstAO40vPAgACoWPO/+yoYKSgAXIFaBKsV8P0Cc7fwKgvj27SjRNX4L7f4/jCKQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@babel/plugin-transform-sticky-regex@7.29.7': + resolution: {integrity: sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA==} + engines: {node: '>=6.9.0'} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@babel/core': ^7.0.0-0 - '@typescript-eslint/scope-manager@5.15.0': - resolution: {integrity: sha512-EFiZcSKrHh4kWk0pZaa+YNJosvKE50EnmN4IfgjkA3bTHElPtYcd2U37QQkNTqwMCS7LXeDeZzEqnsOH8chjSg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@babel/plugin-transform-strict-mode@7.29.7': + resolution: {integrity: sha512-YjFcy7S8kEndK6dsK4UBISrMZa2MHiitApdZ7hTxAyQpX+Ct+aKgKOZoTx/Kcz6drgKxe50TIPUvZq7V4HGGKg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@typescript-eslint/type-utils@5.15.0': - resolution: {integrity: sha512-KGeDoEQ7gHieLydujGEFLyLofipe9PIzfvA/41urz4hv+xVxPEbmMQonKSynZ0Ks2xDhJQ4VYjB3DnRiywvKDA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@babel/plugin-transform-template-literals@7.29.7': + resolution: {integrity: sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA==} + engines: {node: '>=6.9.0'} peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@babel/core': ^7.0.0-0 - '@typescript-eslint/types@5.15.0': - resolution: {integrity: sha512-yEiTN4MDy23vvsIksrShjNwQl2vl6kJeG9YkVJXjXZnkJElzVK8nfPsWKYxcsGWG8GhurYXP4/KGj3aZAxbeOA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@babel/plugin-transform-typeof-symbol@7.29.7': + resolution: {integrity: sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@typescript-eslint/typescript-estree@5.15.0': - resolution: {integrity: sha512-Hb0e3dGc35b75xLzixM3cSbG1sSbrTBQDfIScqdyvrfJZVEi4XWAT+UL/HMxEdrJNB8Yk28SKxPLtAhfCbBInA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@babel/plugin-transform-typescript@7.26.3': + resolution: {integrity: sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA==} + engines: {node: '>=6.9.0'} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@babel/core': ^7.0.0-0 - '@typescript-eslint/utils@5.15.0': - resolution: {integrity: sha512-081rWu2IPKOgTOhHUk/QfxuFog8m4wxW43sXNOMSCdh578tGJ1PAaWPsj42LOa7pguh173tNlMigsbrHvh/mtA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@babel/plugin-transform-typescript@7.29.7': + resolution: {integrity: sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==} + engines: {node: '>=6.9.0'} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@babel/core': ^7.0.0-0 - '@typescript-eslint/visitor-keys@5.15.0': - resolution: {integrity: sha512-+vX5FKtgvyHbmIJdxMJ2jKm9z2BIlXJiuewI8dsDYMp5LzPUcuTT78Ya5iwvQg3VqSVdmxyM8Anj1Jeq7733ZQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@babel/plugin-transform-unicode-escapes@7.29.7': + resolution: {integrity: sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@vimeo/player@2.16.4': - resolution: {integrity: sha512-i+ids9ziQuai3mp8XzF9Q5b2hLgRCekRcefdnoy+RkKUR8Xq0cJndnk9jHugEOw8v6PLj7tO3eEAw4lu2/AG2Q==} + '@babel/plugin-transform-unicode-property-regex@7.29.7': + resolution: {integrity: sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@vitest/pretty-format@2.0.5': - resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==} + '@babel/plugin-transform-unicode-regex@7.25.9': + resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@vitest/snapshot@1.6.0': - resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} + '@babel/plugin-transform-unicode-regex@7.29.7': + resolution: {integrity: sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@vitest/snapshot@2.0.5': - resolution: {integrity: sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew==} + '@babel/plugin-transform-unicode-sets-regex@7.29.7': + resolution: {integrity: sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@wdio/cli@8.39.1': - resolution: {integrity: sha512-CUze/nbOMzgSEp+Qo27dnM5IhlOPAiBJCPX3xO85/kjweqqxmAB1QBKww1Mz9YlNIXineaHrkgqlUQIvEqOJdQ==} - engines: {node: ^16.13 || >=18} - hasBin: true + '@babel/preset-env@7.29.7': + resolution: {integrity: sha512-GYzX36n1nsciIb0uyH0GHwxwtNwPQIcpxSeiVLDtG/B7jB5xXgchnmL1f/jCX5o+pwnaDBtO60ONSJhEBJfxYA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@wdio/config@8.39.0': - resolution: {integrity: sha512-yNuGPMPibY91s936gnJCHWlStvIyDrwLwGfLC/NCdTin4F7HL4Gp5iJnHWkJFty1/DfFi8jjoIUBNLM8HEez+A==} - engines: {node: ^16.13 || >=18} + '@babel/preset-flow@7.25.9': + resolution: {integrity: sha512-EASHsAhE+SSlEzJ4bzfusnXSHiU+JfAYzj+jbw2vgQKgq5HrUr8qs+vgtiEL5dOH6sEweI+PNt2D7AqrDSHyqQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@wdio/globals@8.39.1': - resolution: {integrity: sha512-kNb1TlxI8Le/tsOiw7CMQcG0+ZGyxk9ZDO/PQLxkJvjo/q2QmiBcgaNMPuf+j1ABETcQK4bI7QtiT5uZ+f2AGA==} - engines: {node: ^16.13 || >=18} + '@babel/preset-modules@0.1.6-no-external-plugins': + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - '@wdio/jasmine-framework@8.39.1': - resolution: {integrity: sha512-WnoNvdVyj1HzBv8KpftNWsj7aCy5/v2NQt66lTewxG6KfxEFGgjCRVtnH46dK/HlOFGrh0J8qCTRZDYerUqR9w==} - engines: {node: ^16.13 || >=18} + '@babel/preset-react@7.29.7': + resolution: {integrity: sha512-C+PV1TFUPTmBQGoPBL8j2QmLpZ117YTCwxIZeJOM96GbYMFSc7/pOXU5lVykwnZxyTqQxRsvoRk6f2FktZgGHA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@wdio/local-runner@8.39.1': - resolution: {integrity: sha512-VYRD7pSkl5JTsYXroM65yb+vJVn9pFJf0XZMB7Xj+WVUqGXuVkZ+XybsQetUlhruXvHIsPdiFj12V1tMyaUHrQ==} - engines: {node: ^16.13 || >=18} + '@babel/preset-typescript@7.26.0': + resolution: {integrity: sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@wdio/logger@8.38.0': - resolution: {integrity: sha512-kcHL86RmNbcQP+Gq/vQUGlArfU6IIcbbnNp32rRIraitomZow+iEoc519rdQmSVusDozMS5DZthkgDdxK+vz6Q==} - engines: {node: ^16.13 || >=18} + '@babel/preset-typescript@7.29.7': + resolution: {integrity: sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@wdio/logger@9.0.4': - resolution: {integrity: sha512-b6gcu0PTVb3fgK4kyAH/k5UUWN5FOUdAfhA4PAY/IZvxZTMFYMqnrZb0WRWWWqL6nu9pcrOVtCOdPBvj0cb+Nw==} - engines: {node: '>=18'} + '@babel/register@7.25.9': + resolution: {integrity: sha512-8D43jXtGsYmEeDvm4MWHYUpWf8iiXgWYx3fW7E7Wb7Oe6FWqJPl5K6TuFW0dOwNZzEE5rjlaSJYH9JjrUKJszA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@wdio/protocols@8.38.0': - resolution: {integrity: sha512-7BPi7aXwUtnXZPeWJRmnCNFjyDvGrXlBmN9D4Pi58nILkyjVRQKEY9/qv/pcdyB0cvmIvw++Kl/1Lg+RxG++UA==} + '@babel/runtime@7.26.0': + resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} + engines: {node: '>=6.9.0'} - '@wdio/repl@8.24.12': - resolution: {integrity: sha512-321F3sWafnlw93uRTSjEBVuvWCxTkWNDs7ektQS15drrroL3TMeFOynu4rDrIz0jXD9Vas0HCD2Tq/P0uxFLdw==} - engines: {node: ^16.13 || >=18} + '@babel/template@7.25.9': + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + engines: {node: '>=6.9.0'} - '@wdio/reporter@8.39.0': - resolution: {integrity: sha512-XahXhmaA1okdwg4/ThHFSqy/41KywxhbtszPcTzyXB+9INaqFNHA1b1vvWs0mrD5+tTtKbg4caTcEHVJU4iv0w==} - engines: {node: ^16.13 || >=18} + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} + engines: {node: '>=6.9.0'} - '@wdio/runner@8.39.1': - resolution: {integrity: sha512-hCGI+TSAyb14UtdDjswI5AAdW1CZMi6di+rDZ6ml43hQyHc6sw+74CXI8dwoJ29dcTzbg7QCJZZXV1qMn0kh2w==} - engines: {node: ^16.13 || >=18} + '@babel/traverse@7.26.4': + resolution: {integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==} + engines: {node: '>=6.9.0'} - '@wdio/sauce-service@8.39.1': - resolution: {integrity: sha512-tt0oNqh2FxnR4JaMTwc7LRRLO03ERZxbZjeNf5IzK8PsjQ/JFUefeRBWmqoa93FVi3YGO8gUPCVElaS7OEqkRg==} - engines: {node: ^16.13 || >=18} + '@babel/traverse@7.29.7': + resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} + engines: {node: '>=6.9.0'} - '@wdio/shared-store-service@8.39.1': - resolution: {integrity: sha512-o6Hcd2BzMy8bjrNccb4Fw8hAqbd6wJ9fh24hdsp7KbRBymOMuYJajpCHzU5bFDFGr3rPL/wL0Ji671pY8gcS1g==} - engines: {node: ^16.13 || >=18} + '@babel/types@7.26.3': + resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} + engines: {node: '>=6.9.0'} - '@wdio/spec-reporter@8.39.0': - resolution: {integrity: sha512-2DX0+xvP+PyeVTBd6iGCH/RU66WXaa8HL+HpsJXZu5rSkZ4+6B2Tv8JB3ZE/pOWGNpI+B4ac/NfDs1DrX9sB7A==} - engines: {node: ^16.13 || >=18} + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} + engines: {node: '>=6.9.0'} - '@wdio/static-server-service@8.39.0': - resolution: {integrity: sha512-blP4dLlPcNmVqu1YtCPOQVENePVpbZNSPAGixLRAe+db9gGLVZDD1c8TcUSabJ0yRUICpKlQ2otH/AHAib/+4w==} - engines: {node: ^16.13 || >=18} + '@balena/dockerignore@1.0.2': + resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} - '@wdio/types@8.39.0': - resolution: {integrity: sha512-86lcYROTapOJuFd9ouomFDfzDnv3Kn+jE0RmqfvN9frZAeLVJ5IKjX9M6HjplsyTZhjGO1uCaehmzx+HJus33Q==} - engines: {node: ^16.13 || >=18} + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@wdio/utils@8.39.0': - resolution: {integrity: sha512-jY+n6jlGeK+9Tx8T659PKLwMQTGpLW5H78CSEWgZLbjbVSr2LfGR8Lx0CRktNXxAtqEVZPj16Pi74OtAhvhE6Q==} - engines: {node: ^16.13 || >=18} + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} - '@wessberg/stringutil@1.0.19': - resolution: {integrity: sha512-9AZHVXWlpN8Cn9k5BC/O0Dzb9E9xfEMXzYrNunwvkUTvuK7xgQPVRZpLo+jWCOZ5r8oBa8NIrHuPEu1hzbb6bg==} - engines: {node: '>=8.0.0'} + '@eggjs/yauzl@2.11.0': + resolution: {integrity: sha512-Jq+k2fCZJ3i3HShb0nxLUiAgq5pwo8JTT1TrH22JoehZQ0Nm2dvByGIja1NYfNyuE4Tx5/Dns5nVsBN/mlC8yg==} - '@zip.js/zip.js@2.7.52': - resolution: {integrity: sha512-+5g7FQswvrCHwYKNMd/KFxZSObctLSsQOgqBSi0LzwHo3li9Eh1w5cF5ndjQw9Zbr3ajVnd2+XyiX85gAetx1Q==} - engines: {bun: '>=0.7.0', deno: '>=1.0.0', node: '>=16.5.0'} + '@eslint/eslintrc@1.4.1': + resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - abab@2.0.6: - resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} - deprecated: Use your platform's native atob() and btoa() methods instead + '@fingerprintjs/botd@2.0.0': + resolution: {integrity: sha512-yhuz23NKEcBDTHmGz/ULrXlGnbHenO+xZmVwuBkuqHUkqvaZ5TAA0kAgcRy4Wyo5dIBdkIf57UXX8/c9UlMLJg==} - abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + '@gar/promisify@1.1.3': + resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} - abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} + '@hapi/hoek@9.3.0': + resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} - accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} + '@hapi/topo@5.1.0': + resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} - acorn-globals@6.0.0: - resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} + '@humanwhocodes/config-array@0.9.5': + resolution: {integrity: sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@humanwhocodes/object-schema@1.2.1': + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + deprecated: Use @eslint/object-schema instead - acorn-walk@7.1.1: - resolution: {integrity: sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==} - engines: {node: '>=0.4.0'} + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} - acorn-walk@7.2.0: - resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} - engines: {node: '>=0.4.0'} + '@isaacs/ttlcache@1.4.1': + resolution: {integrity: sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==} + engines: {node: '>=12'} - acorn-walk@8.3.3: - resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} - engines: {node: '>=0.4.0'} + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} - acorn@7.3.1: - resolution: {integrity: sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==} - engines: {node: '>=0.4.0'} - hasBin: true + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} - acorn@7.4.1: - resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} - engines: {node: '>=0.4.0'} - hasBin: true + '@jest/console@26.6.2': + resolution: {integrity: sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==} + engines: {node: '>= 10.14.2'} - acorn@8.12.1: - resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} - engines: {node: '>=0.4.0'} - hasBin: true + '@jest/console@28.1.3': + resolution: {integrity: sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} + '@jest/core@28.1.3': + resolution: {integrity: sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true - agent-base@7.1.1: - resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} - engines: {node: '>= 14'} + '@jest/create-cache-key-function@29.7.0': + resolution: {integrity: sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} - engines: {node: '>= 8.0.0'} + '@jest/environment@28.1.3': + resolution: {integrity: sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} + '@jest/environment@29.7.0': + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - aggregate-error@4.0.1: - resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} - engines: {node: '>=12'} + '@jest/expect-utils@28.1.3': + resolution: {integrity: sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + '@jest/expect-utils@29.7.0': + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - ansi-align@3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + '@jest/expect@28.1.3': + resolution: {integrity: sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} + '@jest/fake-timers@28.1.3': + resolution: {integrity: sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - ansi-regex@2.1.1: - resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} - engines: {node: '>=0.10.0'} + '@jest/fake-timers@29.7.0': + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + '@jest/globals@28.1.3': + resolution: {integrity: sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} + '@jest/reporters@28.1.3': + resolution: {integrity: sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + '@jest/schemas@28.1.3': + resolution: {integrity: sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} + '@jest/source-map@28.1.2': + resolution: {integrity: sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} + '@jest/test-result@28.1.3': + resolution: {integrity: sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + '@jest/test-sequencer@28.1.3': + resolution: {integrity: sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - aproba@1.2.0: - resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==} + '@jest/transform@28.1.3': + resolution: {integrity: sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - archiver-utils@5.0.2: - resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} - engines: {node: '>= 14'} + '@jest/types@26.6.2': + resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==} + engines: {node: '>= 10.14.2'} - archiver@7.0.1: - resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} - engines: {node: '>= 14'} + '@jest/types@28.1.3': + resolution: {integrity: sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - are-we-there-yet@1.1.7: - resolution: {integrity: sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==} - deprecated: This package is no longer supported. + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} - aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} - aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} - array-find-index@1.0.2: - resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} - engines: {node: '>=0.10.0'} + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - arrgv@1.0.2: - resolution: {integrity: sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw==} - engines: {node: '>=8.0.0'} + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - arrify@3.0.0: - resolution: {integrity: sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==} - engines: {node: '>=12'} + '@ljharb/through@2.3.13': + resolution: {integrity: sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==} + engines: {node: '>= 0.4'} - asn1@0.2.6: - resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + '@mdn/browser-compat-data@4.2.1': + resolution: {integrity: sha512-EWUguj2kd7ldmrF9F+vI5hUOralPd+sdsUnYbRy33vZTuZkduC1shE9TtEMEjAQwyfyMb4ole5KtjF8MsnQOlA==} - assert-plus@1.0.0: - resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} - engines: {node: '>=0.8'} + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} - ast-types@0.13.4: - resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} - engines: {node: '>=4'} + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} - async-exit-hook@2.0.1: - resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==} - engines: {node: '>=0.12.0'} + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} - async@3.2.6: - resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + '@npmcli/fs@1.1.1': + resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + '@npmcli/git@2.1.0': + resolution: {integrity: sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==} - ava@5.1.1: - resolution: {integrity: sha512-od1CWgWVIKZSdEc1dhQWhbsd6KBs0EYjek7eqZNGPvy+NyC9Q1bXixcadlgOXwDG9aM0zLMQZwRXfe9gMb1LQQ==} - engines: {node: '>=14.19 <15 || >=16.15 <17 || >=18'} + '@npmcli/installed-package-contents@1.0.7': + resolution: {integrity: sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==} + engines: {node: '>= 10'} hasBin: true - peerDependencies: - '@ava/typescript': '*' - peerDependenciesMeta: - '@ava/typescript': - optional: true - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} + '@npmcli/move-file@1.1.2': + resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} + engines: {node: '>=10'} + deprecated: This functionality has been moved to @npmcli/fs - aws-sign2@0.7.0: - resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + '@npmcli/node-gyp@1.0.3': + resolution: {integrity: sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==} - aws4@1.13.2: - resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} + '@npmcli/promise-spawn@1.3.2': + resolution: {integrity: sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==} - axios@1.7.7: - resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} + '@npmcli/run-script@1.8.6': + resolution: {integrity: sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g==} - b4a@1.6.6: - resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} - babel-jest@27.5.1: - resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - peerDependencies: - '@babel/core': ^7.8.0 + '@polka/parse@1.0.0-next.0': + resolution: {integrity: sha512-zcPNrc3PNrRLSCQ7ca8XR7h18VxdPIXhn+yvrYMdUFCHM7mhXGSPw5xBdbcf/dQ1cI4uE8pDfmm5uU+HX+WfFg==} - babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} + '@polka/url@0.5.0': + resolution: {integrity: sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw==} - babel-plugin-jest-hoist@27.5.1: - resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + '@promptbook/utils@0.69.5': + resolution: {integrity: sha512-xm5Ti/Hp3o4xHrsK9Yy3MS6KbDxYbq485hDsFvxqaNA7equHLPdo8H8faTitTeb14QCDfLW4iwCxdVYu5sn6YQ==} - babel-preset-current-node-syntax@1.1.0: - resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} + '@puppeteer/browsers@1.4.6': + resolution: {integrity: sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==} + engines: {node: '>=16.3.0'} + hasBin: true peerDependencies: - '@babel/core': ^7.0.0 + typescript: '>= 4.7.4' + peerDependenciesMeta: + typescript: + optional: true - babel-preset-jest@27.5.1: - resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + '@puppeteer/browsers@1.9.1': + resolution: {integrity: sha512-PuvK6xZzGhKPvlx3fpfdM2kYY3P/hB1URtK8wA7XUJ6prn6pp22zvJHu48th0SGcHL9SutbPHrFuQgfXTFobWA==} + engines: {node: '>=16.3.0'} + hasBin: true + + '@react-native-async-storage/async-storage@2.0.0': + resolution: {integrity: sha512-af6H9JjfL6G/PktBfUivvexoiFKQTJGQCtSWxMdivLzNIY94mu9DdiY0JqCSg/LyPCLGKhHPUlRQhNvpu3/KVA==} peerDependencies: - '@babel/core': ^7.0.0 + react-native: ^0.0.0-0 || >=0.65 <1.0 - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + '@react-native-community/cli-clean@13.6.9': + resolution: {integrity: sha512-7Dj5+4p9JggxuVNOjPbduZBAP1SUgNhLKVw5noBUzT/3ZpUZkDM+RCSwyoyg8xKWoE4OrdUAXwAFlMcFDPKykA==} - bare-events@2.4.2: - resolution: {integrity: sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==} + '@react-native-community/cli-config@13.6.9': + resolution: {integrity: sha512-rFfVBcNojcMm+KKHE/xqpqXg8HoKl4EC7bFHUrahMJ+y/tZll55+oX/PGG37rzB8QzP2UbMQ19DYQKC1G7kXeg==} - bare-fs@2.3.3: - resolution: {integrity: sha512-7RYKL+vZVCyAsMLi5SPu7QGauGGT8avnP/HO571ndEuV4MYdGXvLhtW67FuLPeEI8EiIY7zbbRR9x7x7HU0kgw==} + '@react-native-community/cli-debugger-ui@13.6.9': + resolution: {integrity: sha512-TkN7IdFmGPPvTpAo3nCAH9uwGCPxWBEAwpqEZDrq0NWllI7Tdie8vDpGdrcuCcKalmhq6OYnkXzeBah7O1Ztpw==} - bare-os@2.4.2: - resolution: {integrity: sha512-HZoJwzC+rZ9lqEemTMiO0luOePoGYNBgsLLgegKR/cljiJvcDNhDZQkzC+NC5Oh0aHbdBNSOHpghwMuB5tqhjg==} + '@react-native-community/cli-doctor@13.6.9': + resolution: {integrity: sha512-5quFaLdWFQB+677GXh5dGU9I5eg2z6Vg4jOX9vKnc9IffwyIFAyJfCZHrxLSRPDGNXD7biDQUdoezXYGwb6P/A==} - bare-path@2.1.3: - resolution: {integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==} + '@react-native-community/cli-hermes@13.6.9': + resolution: {integrity: sha512-GvwiwgvFw4Ws+krg2+gYj8sR3g05evmNjAHkKIKMkDTJjZ8EdyxbkifRUs1ZCq3TMZy2oeblZBXCJVOH4W7ZbA==} - bare-stream@2.2.0: - resolution: {integrity: sha512-+o9MG5bPRRBlkVSpfFlMag3n7wMaIZb4YZasU2+/96f+3HTQ4F9DKQeu3K/Sjz1W0umu6xvVq1ON0ipWdMlr3A==} + '@react-native-community/cli-platform-android@13.6.9': + resolution: {integrity: sha512-9KsYGdr08QhdvT3Ht7e8phQB3gDX9Fs427NJe0xnoBh+PDPTI2BD5ks5ttsH8CzEw8/P6H8tJCHq6hf2nxd9cw==} - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + '@react-native-community/cli-platform-apple@13.6.9': + resolution: {integrity: sha512-KoeIHfhxMhKXZPXmhQdl6EE+jGKWwoO9jUVWgBvibpVmsNjo7woaG/tfJMEWfWF3najX1EkQAoJWpCDBMYWtlA==} - basic-auth@2.0.1: - resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} - engines: {node: '>= 0.8'} + '@react-native-community/cli-platform-ios@13.6.9': + resolution: {integrity: sha512-CiUcHlGs8vE0CAB4oi1f+dzniqfGuhWPNrDvae2nm8dewlahTBwIcK5CawyGezjcJoeQhjBflh9vloska+nlnw==} - basic-ftp@5.0.5: - resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} - engines: {node: '>=10.0.0'} - - bcrypt-pbkdf@1.0.2: - resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bl@1.2.3: - resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==} + '@react-native-community/cli-server-api@13.6.9': + resolution: {integrity: sha512-W8FSlCPWymO+tlQfM3E0JmM8Oei5HZsIk5S0COOl0MRi8h0NmHI4WSTF2GCfbFZkcr2VI/fRsocoN8Au4EZAug==} - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - - blueimp-md5@2.19.0: - resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} + '@react-native-community/cli-tools@13.6.9': + resolution: {integrity: sha512-OXaSjoN0mZVw3nrAwcY1PC0uMfyTd9fz7Cy06dh+EJc+h0wikABsVRzV8cIOPrVV+PPEEXE0DBrH20T2puZzgQ==} - body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + '@react-native-community/cli-types@13.6.9': + resolution: {integrity: sha512-RLxDppvRxXfs3hxceW/mShi+6o5yS+kFPnPqZTaMKKR5aSg7LwDpLQW4K2D22irEG8e6RKDkZUeH9aL3vO2O0w==} - boxen@5.1.2: - resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} - engines: {node: '>=10'} + '@react-native-community/cli@13.6.9': + resolution: {integrity: sha512-hFJL4cgLPxncJJd/epQ4dHnMg5Jy/7Q56jFvA3MHViuKpzzfTCJCB+pGY54maZbtym53UJON9WTGpM3S81UfjQ==} + engines: {node: '>=18'} + hasBin: true - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + '@react-native/assets-registry@0.74.87': + resolution: {integrity: sha512-1XmRhqQchN+pXPKEKYdpJlwESxVomJOxtEnIkbo7GAlaN2sym84fHEGDXAjLilih5GVPpcpSmFzTy8jx3LtaFg==} + engines: {node: '>=18'} - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + '@react-native/babel-plugin-codegen@0.74.87': + resolution: {integrity: sha512-+vJYpMnENFrwtgvDfUj+CtVJRJuUnzAUYT0/Pb68Sq9RfcZ5xdcCuUgyf7JO+akW2VTBoJY427wkcxU30qrWWw==} + engines: {node: '>=18'} - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} + '@react-native/babel-preset@0.74.87': + resolution: {integrity: sha512-hyKpfqzN2nxZmYYJ0tQIHG99FQO0OWXp/gVggAfEUgiT+yNKas1C60LuofUsK7cd+2o9jrpqgqW4WzEDZoBlTg==} + engines: {node: '>=18'} - brotli-size@4.0.0: - resolution: {integrity: sha512-uA9fOtlTRC0iqKfzff1W34DXUA3GyVqbUaeo3Rw3d4gd1eavKVCETXrn3NzO74W+UVkG3UHu8WxUi+XvKI/huA==} - engines: {node: '>= 10.16.0'} + '@react-native/codegen@0.74.87': + resolution: {integrity: sha512-GMSYDiD+86zLKgMMgz9z0k6FxmRn+z6cimYZKkucW4soGbxWsbjUAZoZ56sJwt2FJ3XVRgXCrnOCgXoH/Bkhcg==} + engines: {node: '>=18'} + peerDependencies: + '@babel/preset-env': ^7.1.6 - browser-process-hrtime@1.0.0: - resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + '@react-native/community-cli-plugin@0.74.87': + resolution: {integrity: sha512-EgJG9lSr8x3X67dHQKQvU6EkO+3ksVlJHYIVv6U/AmW9dN80BEFxgYbSJ7icXS4wri7m4kHdgeq2PQ7/3vvrTQ==} + engines: {node: '>=18'} - browserslist-generator@1.0.66: - resolution: {integrity: sha512-aFDax4Qzh29DdyhHQBD2Yu2L5OvaDnvYFMbmpLrLwwaNK4H6dHEhC/Nxv93/+mfAA+a/t94ln0P2JZvHO6LZDA==} - engines: {node: '>=8.0.0'} + '@react-native/debugger-frontend@0.74.87': + resolution: {integrity: sha512-MN95DJLYTv4EqJc+9JajA3AJZSBYJz2QEJ3uWlHrOky2vKrbbRVaW1ityTmaZa2OXIvNc6CZwSRSE7xCoHbXhQ==} + engines: {node: '>=18'} - browserslist@4.20.2: - resolution: {integrity: sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true + '@react-native/dev-middleware@0.74.87': + resolution: {integrity: sha512-7TmZ3hTHwooYgIHqc/z87BMe1ryrIqAUi+AF7vsD+EHCGxHFdMjSpf1BZ2SUPXuLnF2cTiTfV2RwhbPzx0tYIA==} + engines: {node: '>=18'} - browserslist@4.23.3: - resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true + '@react-native/gradle-plugin@0.74.87': + resolution: {integrity: sha512-T+VX0N1qP+U9V4oAtn7FTX7pfsoVkd1ocyw9swYXgJqU2fK7hC9famW7b3s3ZiufPGPr1VPJe2TVGtSopBjL6A==} + engines: {node: '>=18'} - bs-logger@0.2.6: - resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} - engines: {node: '>= 6'} + '@react-native/js-polyfills@0.74.87': + resolution: {integrity: sha512-M5Evdn76CuVEF0GsaXiGi95CBZ4IWubHqwXxV9vG9CC9kq0PSkoM2Pn7Lx7dgyp4vT7ccJ8a3IwHbe+5KJRnpw==} + engines: {node: '>=18'} - bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + '@react-native/metro-babel-transformer@0.74.87': + resolution: {integrity: sha512-UsJCO24sNax2NSPBmV1zLEVVNkS88kcgAiYrZHtYSwSjpl4WZ656tIeedBfiySdJ94Hr3kQmBYLipV5zk0NI1A==} + engines: {node: '>=18'} - buffer-alloc-unsafe@1.1.0: - resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} + '@react-native/normalize-colors@0.74.87': + resolution: {integrity: sha512-Xh7Nyk/MPefkb0Itl5Z+3oOobeG9lfLb7ZOY2DKpFnoCE1TzBmib9vMNdFaLdSxLIP+Ec6icgKtdzYg8QUPYzA==} - buffer-alloc@1.2.0: - resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} + '@react-native/virtualized-lists@0.74.87': + resolution: {integrity: sha512-lsGxoFMb0lyK/MiplNKJpD+A1EoEUumkLrCjH4Ht+ZlG8S0BfCxmskLZ6qXn3BiDSkLjfjI/qyZ3pnxNBvkXpQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/react': ^18.2.6 + react: '*' + react-native: '*' + peerDependenciesMeta: + '@types/react': + optional: true - buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + '@rnx-kit/chromium-edge-launcher@1.0.0': + resolution: {integrity: sha512-lzD84av1ZQhYUS+jsGqJiCMaJO2dn9u+RTT9n9q6D3SaKVwWqv+7AoRKqBu19bkwyE+iFRl1ymr40QS90jVFYg==} + engines: {node: '>=14.15'} - buffer-crc32@1.0.0: - resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} + '@rollup/plugin-alias@3.1.9': + resolution: {integrity: sha512-QI5fsEvm9bDzt32k39wpOwZhVzRcL5ydcffUHMyLVaVaLeC70I8TJZ17F1z1eMoLu4E/UOcH9BWVkKpIKdrfiw==} engines: {node: '>=8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 - buffer-fill@1.0.0: - resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} + '@rollup/plugin-commonjs@21.0.3': + resolution: {integrity: sha512-ThGfwyvcLc6cfP/MWxA5ACF+LZCvsuhUq7V5134Az1oQWsiC7lNpLT4mJI86WQunK7BYmpUiHmMk2Op6OAHs0g==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^2.38.3 - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + '@rollup/plugin-json@4.1.0': + resolution: {integrity: sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==} + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + '@rollup/plugin-node-resolve@13.1.3': + resolution: {integrity: sha512-BdxNk+LtmElRo5d06MGY4zoepyrXX1tkzX2hrnPEZ53k78GuOMWLqmJDGIIOPwVRIFZrLQOo+Yr6KtCuLIA0AQ==} + engines: {node: '>= 10.0.0'} + peerDependencies: + rollup: ^2.42.0 - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + '@rollup/plugin-replace@4.0.0': + resolution: {integrity: sha512-+rumQFiaNac9y64OHtkHGmdjm7us9bo1PlbgQfdihQtuNxzjpaB064HbRnewUOggLQxVCCyINfStkgmBeQpv1g==} + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 - buildcheck@0.0.6: - resolution: {integrity: sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==} - engines: {node: '>=10.0.0'} + '@rollup/pluginutils@3.1.0': + resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 - builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} + '@rollup/pluginutils@4.2.1': + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} - builtins@1.0.3: - resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==} + '@sideway/address@4.1.5': + resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} - bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} + '@sideway/formula@3.0.1': + resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} - cacache@15.3.0: - resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} - engines: {node: '>= 10'} + '@sideway/pinpoint@2.0.0': + resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} - cacheable-lookup@5.0.4: - resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} - engines: {node: '>=10.6.0'} + '@sinclair/typebox@0.24.51': + resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} - cacheable-lookup@7.0.0: - resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} - engines: {node: '>=14.16'} + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - cacheable-request@10.2.14: - resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + '@sindresorhus/is@5.6.0': + resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} engines: {node: '>=14.16'} - cacheable-request@7.0.4: - resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} - engines: {node: '>=8'} + '@sindresorhus/merge-streams@2.3.0': + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} + '@sinonjs/commons@1.8.6': + resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} - callsites@4.2.0: - resolution: {integrity: sha512-kfzR4zzQtAE9PC7CzZsjl3aBNbXWuXiSeOCdLcPpBfGW8YuCqQHcRPFDbr/BPVmd3EEPVpuFzLyuT/cUhPr4OQ==} - engines: {node: '>=12.20'} + '@sinonjs/fake-timers@10.3.0': + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - camel-case@4.1.2: - resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + '@sinonjs/fake-timers@9.1.2': + resolution: {integrity: sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==} - camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} + '@snowplow/webview-tracker@0.3.1': + resolution: {integrity: sha512-jQnflWxPFYwE4DeQ/JYTkRXiCUxZLkPyHybO7BI/Yp6R6dcLGx7uIZuX8F1zAmv+FKKkSXtEG4r52WD0jnoQxg==} - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + '@szmarczak/http-timer@4.0.6': + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} engines: {node: '>=10'} - caniuse-lite@1.0.30001655: - resolution: {integrity: sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==} + '@szmarczak/http-timer@5.0.1': + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} - capital-case@1.0.4: - resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} + '@testim/chrome-version@1.1.4': + resolution: {integrity: sha512-kIhULpw9TrGYnHp/8VfdcneIcxKnLixmADtukQRtJUmsVlMg0niMkwV0xZmi8hqa57xqilIHjWFA0GKvEjVU5g==} - caseless@0.12.0: - resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + '@testing-library/dom@9.3.4': + resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} + engines: {node: '>=14'} - cbor@8.1.0: - resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} - engines: {node: '>=12.19'} + '@tootallnate/once@1.1.2': + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + '@tootallnate/once@2.0.0': + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + '@tootallnate/quickjs-emscripten@0.23.0': + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} - change-case@4.1.2: - resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - char-regex@1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - charenc@0.0.2: - resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} - chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - chromedriver@129.0.4: - resolution: {integrity: sha512-j5I55cQwodFJUaYa1tWUmj2ss9KcPRBWmUa5Qonq3X8kqv2ASPyTboFYb4YB/YLztkYTUUw2E43txXw0wYzT/A==} - engines: {node: '>=18'} - hasBin: true + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} - chromium-bidi@0.4.16: - resolution: {integrity: sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==} - peerDependencies: - devtools-protocol: '*' + '@types/cacheable-request@6.0.3': + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} - chunkd@2.0.1: - resolution: {integrity: sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ==} + '@types/docker-modem@3.0.6': + resolution: {integrity: sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg==} - ci-info@2.0.0: - resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + '@types/dockerode@3.3.32': + resolution: {integrity: sha512-xxcG0g5AWKtNyh7I7wswLdFvym4Mlqks5ZlKzxEUrGHS0r0PUOfxm2T0mspwu10mHQqu3Ck3MI3V2HqvLWE1fg==} - ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} + '@types/estree@0.0.39': + resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} - ci-parallel-vars@1.0.1: - resolution: {integrity: sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg==} + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - cjs-module-lexer@1.4.0: - resolution: {integrity: sha512-N1NGmowPlGBLsOZLPvm48StN04V4YvQRL0i6b7ctrVY3epjP/ct7hFLOItz6pDIvRjwpfPxi52a2UWV2ziir8g==} + '@types/graceful-fs@4.1.9': + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} - clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} - clean-stack@4.2.0: - resolution: {integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==} - engines: {node: '>=12'} + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - clean-yaml-object@0.1.0: - resolution: {integrity: sha512-3yONmlN9CSAkzNwnRCiJQ7Q2xK5mWuEfL3PuTZcAUzhObbXsfsnMptJzXwz93nc5zn9V9TwCVMmV7w4xsm43dw==} - engines: {node: '>=0.10.0'} - - cli-boxes@2.2.1: - resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} - engines: {node: '>=6'} - - cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} - cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - cli-truncate@3.1.0: - resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + '@types/jest@28.1.8': + resolution: {integrity: sha512-8TJkV++s7B6XqnDrzR1m/TT0A0h948Pnl/097veySPN67VRAgQ4gZ7n2KfJo2rVq6njQjdxU3GCCyDvAeuHoiw==} - cli-width@4.1.0: - resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} - engines: {node: '>= 12'} + '@types/jsdom@16.2.15': + resolution: {integrity: sha512-nwF87yjBKuX/roqGYerZZM0Nv1pZDMAT5YhOHYeM/72Fic+VEqJh4nyoqoapzJnW3pUlfxPY5FhgsJtM+dRnQQ==} - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + '@types/jstimezonedetect@1.0.6': + resolution: {integrity: sha512-MKi1fgLzyqEWKgmvjwa+1p6k+phAACpFOK4eA1gBCHzbx4RyNGcO29IQWThGo1oKxSFa57gqm4iQn1lDaFJCQg==} - clone-buffer@1.0.0: - resolution: {integrity: sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==} - engines: {node: '>= 0.10'} + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} - clone-response@1.0.3: - resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + '@types/lodash@4.14.202': + resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} - clone-stats@1.0.0: - resolution: {integrity: sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==} + '@types/node-forge@1.3.11': + resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} - clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} + '@types/node@14.6.4': + resolution: {integrity: sha512-Wk7nG1JSaMfMpoMJDKUsWYugliB2Vy55pdjLpmLixeyMi7HizW2I/9QoxsPCkXl3dO+ZOVqPumKaDUv5zJu2uQ==} - clone@2.1.2: - resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} - engines: {node: '>=0.8'} + '@types/node@16.18.122': + resolution: {integrity: sha512-rF6rUBS80n4oK16EW8nE75U+9fw0SSUgoPtWSvHhPXdT7itbvmS7UjB/jyM8i3AkvI6yeSM5qCwo+xN0npGDHg==} - cloneable-readable@1.1.3: - resolution: {integrity: sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==} + '@types/node@18.19.68': + resolution: {integrity: sha512-QGtpFH1vB99ZmTa63K4/FU8twThj4fuVSBkGddTp7uIL/cuoLWIUSL2RcOaigBhfR+hg5pgGkBnkoOxrTVBMKw==} - co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + '@types/node@20.17.10': + resolution: {integrity: sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==} - code-excerpt@4.0.0: - resolution: {integrity: sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - code-point-at@1.1.0: - resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} - engines: {node: '>=0.10.0'} + '@types/object-path@0.11.4': + resolution: {integrity: sha512-4tgJ1Z3elF/tOMpA8JLVuR9spt9Ynsf7+JjqsQ2IqtiPJtcLoHoXcT6qU4E10cPFqyXX5HDm9QwIzZhBSkLxsw==} - collect-v8-coverage@1.0.2: - resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + '@types/parse5@6.0.3': + resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + '@types/prettier@2.7.3': + resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + '@types/prop-types@15.7.14': + resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + '@types/randomcolor@0.5.9': + resolution: {integrity: sha512-k58cfpkK15AKn1m+oRd9nh5BnuiowhbyvBBdAzcddtARMr3xRzP0VlFaAKovSG6N6Knx08EicjPlOMzDejerrQ==} - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + '@types/react@18.3.18': + resolution: {integrity: sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==} - colors@1.4.0: - resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} - engines: {node: '>=0.1.90'} + '@types/resolve@1.17.1': + resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} + '@types/split2@4.2.3': + resolution: {integrity: sha512-59OXIlfUsi2k++H6CHgUQKEb2HKRokUA39HY1i1dS8/AIcqVjtAAFdf8u+HxTWK/4FUHMJQlKSZ4I6irCBJ1Zw==} - commenting@1.1.0: - resolution: {integrity: sha512-YeNK4tavZwtH7jEgK1ZINXzLKm6DZdEMfsaaieOsCAN0S8vsY7UeuO3Q7d/M018EFgE+IeUAuBOKkFccBZsUZA==} + '@types/ssh2@1.15.1': + resolution: {integrity: sha512-ZIbEqKAsi5gj35y4P4vkJYly642wIbY6PqoN0xiyQGshKUGXR9WQjF/iF9mXBQ8uBKy3ezfsCkcoHKhd0BzuDA==} - common-path-prefix@3.0.0: - resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + '@types/tcp-port-used@1.0.4': + resolution: {integrity: sha512-0vQ4fz9TTM4bCdllYWEJ2JHBUXR9xqPtc70dJ7BMRDVfvZyYdrgey3nP5RRcVj+qAgnHJM8r9fvgrfnPMxdnhA==} - compare-versions@6.1.1: - resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + '@types/tough-cookie@4.0.5': + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} - compatfactory@0.0.13: - resolution: {integrity: sha512-k9Sl/Qal3xQPnjAFZaRpl7jlCh0hDEhVaxyiTMfiHKC/w5TYn4Nds+7340X/v1OrAQC5xGBtaD2JpWgPhXWaAw==} - engines: {node: '>=10.0.0'} - peerDependencies: - typescript: '>=3.x || >= 4.x' + '@types/ua-parser-js@0.7.39': + resolution: {integrity: sha512-P/oDfpofrdtF5xw433SPALpdSchtJmY7nsJItf8h3KXqOslkbySh8zq4dSWXH2oTjRvJ5PczVEoCZPow6GicLg==} - compress-commons@6.0.2: - resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} - engines: {node: '>= 14'} + '@types/vimeo__player@2.16.3': + resolution: {integrity: sha512-hsOe6CZFTNyfjRjQUrNHBF4LDmjvjcU2yQIPWp5AglKeGxt11JYGToQhKUPM876gBXggqR6rMQ0/sNI06ec2Rg==} - compressing@1.10.1: - resolution: {integrity: sha512-XXwUffcVjqv8NGSQu1ttp6eMmuZ3zZEAec28Rt30o/vkXE20jXhowRQ9LXLY4uOgFkxXrNzApLobpam53Dc1AA==} - engines: {node: '>= 4.0.0'} + '@types/which@2.0.2': + resolution: {integrity: sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==} - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + '@types/ws@8.5.13': + resolution: {integrity: sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==} - concordance@5.0.4: - resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==} - engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14'} + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + '@types/yargs@15.0.19': + resolution: {integrity: sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==} - constant-case@3.0.4: - resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} + '@types/yargs@17.0.33': + resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} - content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} + '@types/youtube@0.0.50': + resolution: {integrity: sha512-d4GpH4uPYp9W07kc487tiq6V/EUHl18vZWFMbQoe4Sk9LXEWzFi/BMf9x7TI4m7/j7gU3KeX8H6M8aPBgykeLw==} - convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + '@typescript-eslint/eslint-plugin@5.15.0': + resolution: {integrity: sha512-u6Db5JfF0Esn3tiAKELvoU5TpXVSkOpZ78cEGn/wXtT2RVqs2vkt4ge6N8cRCyw7YVKhmmLDbwI2pg92mlv7cA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + '@typescript-eslint/parser@5.15.0': + resolution: {integrity: sha512-NGAYP/+RDM2sVfmKiKOCgJYPstAO40vPAgACoWPO/+yoYKSgAXIFaBKsV8P0Cc7fwKgvj27SjRNX4L7f4/jCKQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - convert-to-spaces@2.0.1: - resolution: {integrity: sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + '@typescript-eslint/scope-manager@5.15.0': + resolution: {integrity: sha512-EFiZcSKrHh4kWk0pZaa+YNJosvKE50EnmN4IfgjkA3bTHElPtYcd2U37QQkNTqwMCS7LXeDeZzEqnsOH8chjSg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + '@typescript-eslint/type-utils@5.15.0': + resolution: {integrity: sha512-KGeDoEQ7gHieLydujGEFLyLofipe9PIzfvA/41urz4hv+xVxPEbmMQonKSynZ0Ks2xDhJQ4VYjB3DnRiywvKDA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - cookie@0.6.0: - resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} - engines: {node: '>= 0.6'} + '@typescript-eslint/types@5.15.0': + resolution: {integrity: sha512-yEiTN4MDy23vvsIksrShjNwQl2vl6kJeG9YkVJXjXZnkJElzVK8nfPsWKYxcsGWG8GhurYXP4/KGj3aZAxbeOA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - core-util-is@1.0.2: - resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + '@typescript-eslint/typescript-estree@5.15.0': + resolution: {integrity: sha512-Hb0e3dGc35b75xLzixM3cSbG1sSbrTBQDfIScqdyvrfJZVEi4XWAT+UL/HMxEdrJNB8Yk28SKxPLtAhfCbBInA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + '@typescript-eslint/utils@5.15.0': + resolution: {integrity: sha512-081rWu2IPKOgTOhHUk/QfxuFog8m4wxW43sXNOMSCdh578tGJ1PAaWPsj42LOa7pguh173tNlMigsbrHvh/mtA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - cpu-features@0.0.10: - resolution: {integrity: sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==} - engines: {node: '>=10.0.0'} + '@typescript-eslint/visitor-keys@5.15.0': + resolution: {integrity: sha512-+vX5FKtgvyHbmIJdxMJ2jKm9z2BIlXJiuewI8dsDYMp5LzPUcuTT78Ya5iwvQg3VqSVdmxyM8Anj1Jeq7733ZQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - crc-32@1.2.2: - resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} - engines: {node: '>=0.8'} - hasBin: true + '@vimeo/player@2.16.4': + resolution: {integrity: sha512-i+ids9ziQuai3mp8XzF9Q5b2hLgRCekRcefdnoy+RkKUR8Xq0cJndnk9jHugEOw8v6PLj7tO3eEAw4lu2/AG2Q==} - crc32-stream@6.0.0: - resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} - engines: {node: '>= 14'} + '@vitest/pretty-format@2.1.8': + resolution: {integrity: sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==} - create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + '@vitest/snapshot@1.6.0': + resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} - cross-fetch@4.0.0: - resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} + '@vitest/snapshot@2.1.8': + resolution: {integrity: sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==} - cross-spawn@6.0.5: - resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} - engines: {node: '>=4.8'} + '@wdio/cli@8.39.1': + resolution: {integrity: sha512-CUze/nbOMzgSEp+Qo27dnM5IhlOPAiBJCPX3xO85/kjweqqxmAB1QBKww1Mz9YlNIXineaHrkgqlUQIvEqOJdQ==} + engines: {node: ^16.13 || >=18} + hasBin: true - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + '@wdio/config@8.39.0': + resolution: {integrity: sha512-yNuGPMPibY91s936gnJCHWlStvIyDrwLwGfLC/NCdTin4F7HL4Gp5iJnHWkJFty1/DfFi8jjoIUBNLM8HEez+A==} + engines: {node: ^16.13 || >=18} - crosspath@1.0.0: - resolution: {integrity: sha512-mpjkSErNO6vioL/Cde2aF4UBysPFEMyn+1AN1t7Oc4yqvzSRWe8iBte4P8BHyjo64OmC+ZBxwjIqmpSpIWiQ7Q==} - engines: {node: '>=10.0.0'} + '@wdio/globals@8.39.1': + resolution: {integrity: sha512-kNb1TlxI8Le/tsOiw7CMQcG0+ZGyxk9ZDO/PQLxkJvjo/q2QmiBcgaNMPuf+j1ABETcQK4bI7QtiT5uZ+f2AGA==} + engines: {node: ^16.13 || >=18} - crypt@0.0.2: - resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + '@wdio/jasmine-framework@8.39.1': + resolution: {integrity: sha512-WnoNvdVyj1HzBv8KpftNWsj7aCy5/v2NQt66lTewxG6KfxEFGgjCRVtnH46dK/HlOFGrh0J8qCTRZDYerUqR9w==} + engines: {node: ^16.13 || >=18} - css-shorthand-properties@1.1.1: - resolution: {integrity: sha512-Md+Juc7M3uOdbAFwOYlTrccIZ7oCFuzrhKYQjdeUEW/sE1hv17Jp/Bws+ReOPpGVBTYCBoYo+G17V5Qo8QQ75A==} + '@wdio/local-runner@8.39.1': + resolution: {integrity: sha512-VYRD7pSkl5JTsYXroM65yb+vJVn9pFJf0XZMB7Xj+WVUqGXuVkZ+XybsQetUlhruXvHIsPdiFj12V1tMyaUHrQ==} + engines: {node: ^16.13 || >=18} - css-value@0.0.1: - resolution: {integrity: sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==} + '@wdio/logger@8.38.0': + resolution: {integrity: sha512-kcHL86RmNbcQP+Gq/vQUGlArfU6IIcbbnNp32rRIraitomZow+iEoc519rdQmSVusDozMS5DZthkgDdxK+vz6Q==} + engines: {node: ^16.13 || >=18} - cssom@0.3.8: - resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + '@wdio/logger@9.4.4': + resolution: {integrity: sha512-BXx8RXFUW2M4dcO6t5Le95Hi2ZkTQBRsvBQqLekT2rZ6Xmw8ZKZBPf0FptnoftFGg6dYmwnDidYv/0+4PiHjpQ==} + engines: {node: '>=18.20.0'} - cssom@0.4.4: - resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} + '@wdio/protocols@8.38.0': + resolution: {integrity: sha512-7BPi7aXwUtnXZPeWJRmnCNFjyDvGrXlBmN9D4Pi58nILkyjVRQKEY9/qv/pcdyB0cvmIvw++Kl/1Lg+RxG++UA==} - cssstyle@2.3.0: - resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} - engines: {node: '>=8'} + '@wdio/repl@8.24.12': + resolution: {integrity: sha512-321F3sWafnlw93uRTSjEBVuvWCxTkWNDs7ektQS15drrroL3TMeFOynu4rDrIz0jXD9Vas0HCD2Tq/P0uxFLdw==} + engines: {node: ^16.13 || >=18} - currently-unhandled@0.4.1: - resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==} - engines: {node: '>=0.10.0'} + '@wdio/reporter@8.39.0': + resolution: {integrity: sha512-XahXhmaA1okdwg4/ThHFSqy/41KywxhbtszPcTzyXB+9INaqFNHA1b1vvWs0mrD5+tTtKbg4caTcEHVJU4iv0w==} + engines: {node: ^16.13 || >=18} - dashdash@1.14.1: - resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} - engines: {node: '>=0.10'} + '@wdio/runner@8.39.1': + resolution: {integrity: sha512-hCGI+TSAyb14UtdDjswI5AAdW1CZMi6di+rDZ6ml43hQyHc6sw+74CXI8dwoJ29dcTzbg7QCJZZXV1qMn0kh2w==} + engines: {node: ^16.13 || >=18} - data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} + '@wdio/sauce-service@8.39.1': + resolution: {integrity: sha512-tt0oNqh2FxnR4JaMTwc7LRRLO03ERZxbZjeNf5IzK8PsjQ/JFUefeRBWmqoa93FVi3YGO8gUPCVElaS7OEqkRg==} + engines: {node: ^16.13 || >=18} - data-uri-to-buffer@6.0.2: - resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} - engines: {node: '>= 14'} + '@wdio/shared-store-service@8.39.1': + resolution: {integrity: sha512-o6Hcd2BzMy8bjrNccb4Fw8hAqbd6wJ9fh24hdsp7KbRBymOMuYJajpCHzU5bFDFGr3rPL/wL0Ji671pY8gcS1g==} + engines: {node: ^16.13 || >=18} - data-urls@2.0.0: - resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} - engines: {node: '>=10'} + '@wdio/spec-reporter@8.39.0': + resolution: {integrity: sha512-2DX0+xvP+PyeVTBd6iGCH/RU66WXaa8HL+HpsJXZu5rSkZ4+6B2Tv8JB3ZE/pOWGNpI+B4ac/NfDs1DrX9sB7A==} + engines: {node: ^16.13 || >=18} - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} + '@wdio/static-server-service@8.39.0': + resolution: {integrity: sha512-blP4dLlPcNmVqu1YtCPOQVENePVpbZNSPAGixLRAe+db9gGLVZDD1c8TcUSabJ0yRUICpKlQ2otH/AHAib/+4w==} + engines: {node: ^16.13 || >=18} - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} + '@wdio/types@8.39.0': + resolution: {integrity: sha512-86lcYROTapOJuFd9ouomFDfzDnv3Kn+jE0RmqfvN9frZAeLVJ5IKjX9M6HjplsyTZhjGO1uCaehmzx+HJus33Q==} + engines: {node: ^16.13 || >=18} - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} + '@wdio/utils@8.39.0': + resolution: {integrity: sha512-jY+n6jlGeK+9Tx8T659PKLwMQTGpLW5H78CSEWgZLbjbVSr2LfGR8Lx0CRktNXxAtqEVZPj16Pi74OtAhvhE6Q==} + engines: {node: ^16.13 || >=18} - date-time@3.1.0: - resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} - engines: {node: '>=6'} + '@wessberg/stringutil@1.0.19': + resolution: {integrity: sha512-9AZHVXWlpN8Cn9k5BC/O0Dzb9E9xfEMXzYrNunwvkUTvuK7xgQPVRZpLo+jWCOZ5r8oBa8NIrHuPEu1hzbb6bg==} + engines: {node: '>=8.0.0'} - debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + '@zip.js/zip.js@2.7.54': + resolution: {integrity: sha512-qMrJVg2hoEsZJjMJez9yI2+nZlBUxgYzGV3mqcb2B/6T1ihXp0fWBDYlVHlHquuorgNUQP5a8qSmX6HF5rFJNg==} + engines: {bun: '>=0.7.0', deno: '>=1.0.0', node: '>=16.5.0'} - debug@4.3.1: - resolution: {integrity: sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + deprecated: Use your platform's native atob() and btoa() methods instead - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - debug@4.3.6: - resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} - decamelize@6.0.0: - resolution: {integrity: sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} - decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + acorn-globals@6.0.0: + resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} - decode-uri-component@0.2.2: - resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} - engines: {node: '>=0.10'} + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} + acorn-walk@7.2.0: + resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} + engines: {node: '>=0.4.0'} - dedent@0.7.0: - resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} - deep-equal@2.2.3: - resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} - engines: {node: '>= 0.4'} + acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true - deepmerge-ts@5.1.0: - resolution: {integrity: sha512-eS8dRJOckyo9maw9Tu5O5RUi/4inFLrnoLkBe3cPfDMx3WZioXtmOew4TXQaxq7Rhl4xjDtR7c6x8nNTxOvbFw==} - engines: {node: '>=16.0.0'} + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} - deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} + agent-base@7.1.3: + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} + engines: {node: '>= 14'} - defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + agentkeepalive@4.6.0: + resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} + engines: {node: '>= 8.0.0'} - defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} - engines: {node: '>=10'} + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} + aggregate-error@4.0.1: + resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} + engines: {node: '>=12'} - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - degenerator@5.0.1: - resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} - engines: {node: '>= 14'} + anser@1.4.10: + resolution: {integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==} - del@7.1.0: - resolution: {integrity: sha512-v2KyNk7efxhlyHpjEvfyxaAihKKK0nWCuf6ZtqZcFFpQRG0bJ12Qsr0RpvsICMjAAZ8DOVCxrlqpxISlMHC4Kg==} - engines: {node: '>=14.16'} + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} - delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + ansi-fragments@0.2.1: + resolution: {integrity: sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==} - depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} + ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + ansi-regex@4.1.1: + resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} engines: {node: '>=6'} - destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - - detect-newline@3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - devtools-protocol@0.0.1147663: - resolution: {integrity: sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==} - - devtools-protocol@0.0.1302984: - resolution: {integrity: sha512-Rgh2Sk5fUSCtEx4QGH9iwTyECdFPySG2nlz5J8guGh2Wlha6uzSOCq/DCEC8faHlLaMPZJMuZ4ovgcX4LvOkKA==} + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} - diff-sequences@27.5.1: - resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} - diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} - diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} - diff@5.2.0: - resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} - engines: {node: '>=0.3.1'} + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} - docker-modem@3.0.8: - resolution: {integrity: sha512-f0ReSURdM3pcKPNS30mxOHSbaFLcknGmQjwSfmbcdOw1XWKXVhukM3NJHhr7NpY9BIyyWQb0EBo3KQvvuU5egQ==} - engines: {node: '>= 8.0'} + appdirsjs@1.2.7: + resolution: {integrity: sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==} - dockerode@3.3.5: - resolution: {integrity: sha512-/0YNa3ZDNeLr/tSckmD69+Gq+qVNhvKfAHNeZJBnp7EOP6RGKV8ORrJHkUn20So5wU+xxT7+1n5u8PjHbfjbSA==} - engines: {node: '>= 8.0'} + aproba@1.2.0: + resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==} - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} + archiver-utils@5.0.2: + resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} + engines: {node: '>= 14'} - dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + archiver@7.0.1: + resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} + engines: {node: '>= 14'} - domexception@2.0.1: - resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} - engines: {node: '>=8'} - deprecated: Use your platform's native DOMException instead + are-we-there-yet@1.1.7: + resolution: {integrity: sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==} + deprecated: This package is no longer supported. - dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - dotenv@16.4.5: - resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} - engines: {node: '>=12'} + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - duplexer@0.1.1: - resolution: {integrity: sha512-sxNZ+ljy+RA1maXoUReeqBBpBC6RLKmg5ewzV+x+mSETmWNoKdZN6vcQjpFROemza23hGFskJtFNoUWUaQ+R4Q==} - - duplexer@0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - easy-table@1.2.0: - resolution: {integrity: sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==} + aria-query@5.1.3: + resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} - ecc-jsbn@0.1.2: - resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} - edge-paths@3.0.5: - resolution: {integrity: sha512-sB7vSrDnFa4ezWQk9nZ/n0FdpdUuC6R1EOrlU3DL+bovcNFK28rqu2emmAUjujYEJTWIgQGqgVVWUZXMnc8iWg==} - engines: {node: '>=14.0.0'} + arkregex@0.0.5: + resolution: {integrity: sha512-ncYjBdLlh5/QnVsAA8De16Tc9EqmYM7y/WU9j+236KcyYNUXogpz3sC4ATIZYzzLxwI+0sEOaQLEmLmRleaEXw==} - edgedriver@5.6.1: - resolution: {integrity: sha512-3Ve9cd5ziLByUdigw6zovVeWJjVs8QHVmqOB0sJ0WNeVPcwf4p18GnxMmVvlFmYRloUwf5suNuorea4QzwBIOA==} - hasBin: true + arktype@2.2.0: + resolution: {integrity: sha512-t54MZ7ti5BhOEvzEkgKnWvqj+UbDfWig+DHr5I34xatymPusKLS0lQpNJd8M6DzmIto2QGszHfNKoFIT8tMCZQ==} - ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} - ejs@3.1.10: - resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + array-find-index@1.0.2: + resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} engines: {node: '>=0.10.0'} - hasBin: true - electron-to-chromium@1.5.13: - resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==} + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - emittery@0.8.1: - resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==} - engines: {node: '>=10'} + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} - emittery@1.0.3: - resolution: {integrity: sha512-tJdCJitoy2lrC2ldJcqN4vkqJ00lT+tOWNT1hBJjO/3FDMJa5TTIiYGCKGkn/WfCyOzUMObeohbVTj00fhiLiA==} - engines: {node: '>=14.16'} + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + arrgv@1.0.2: + resolution: {integrity: sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw==} + engines: {node: '>=8.0.0'} - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + arrify@3.0.0: + resolution: {integrity: sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==} + engines: {node: '>=12'} - encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - encoding@0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} - enhance-visitors@1.0.0: - resolution: {integrity: sha512-+29eJLiUixTEDRaZ35Vu8jP3gPLNcQQkQkOQjLp2X+6cZGGPDD/uasbFzvLsJKnGZnvmyZ0srxudwOtskHeIDA==} - engines: {node: '>=4.0.0'} + ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} - env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} + ast-types@0.15.2: + resolution: {integrity: sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==} + engines: {node: '>=4'} - err-code@2.0.3: - resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + astral-regex@1.0.0: + resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==} + engines: {node: '>=4'} - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + async-exit-hook@2.0.1: + resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==} + engines: {node: '>=0.12.0'} - es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} + async-limiter@1.0.1: + resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + ava@5.1.1: + resolution: {integrity: sha512-od1CWgWVIKZSdEc1dhQWhbsd6KBs0EYjek7eqZNGPvy+NyC9Q1bXixcadlgOXwDG9aM0zLMQZwRXfe9gMb1LQQ==} + engines: {node: '>=14.19 <15 || >=16.15 <17 || >=18'} + hasBin: true + peerDependencies: + '@ava/typescript': '*' + peerDependenciesMeta: + '@ava/typescript': + optional: true - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} + aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} + aws4@1.13.2: + resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} + axios@1.7.9: + resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==} - escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + b4a@1.6.7: + resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + babel-core@7.0.0-bridge.0: + resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} + peerDependencies: + '@babel/core': ^7.0.0-0 - escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} + babel-jest@28.1.3: + resolution: {integrity: sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + peerDependencies: + '@babel/core': ^7.8.0 - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} + babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} - escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} + babel-plugin-jest-hoist@28.1.3: + resolution: {integrity: sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true + babel-plugin-polyfill-corejs2@0.4.12: + resolution: {integrity: sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - eslint-plugin-ava@13.2.0: - resolution: {integrity: sha512-i5B5izsEdERKQLruk1nIWzTTE7C26/ju8qQf7JeyRv32XT2lRMW0zMFZNhIrEf5/5VvpSz2rqrV7UcjClGbKsw==} - engines: {node: '>=12.22 <13 || >=14.17 <15 || >=16.4'} + babel-plugin-polyfill-corejs2@0.4.17: + resolution: {integrity: sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==} peerDependencies: - eslint: '>=7.22.0' + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} + babel-plugin-polyfill-corejs3@0.10.6: + resolution: {integrity: sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + babel-plugin-polyfill-corejs3@0.14.2: + resolution: {integrity: sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - eslint-utils@3.0.0: - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + babel-plugin-polyfill-regenerator@0.6.3: + resolution: {integrity: sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==} peerDependencies: - eslint: '>=5' + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} + babel-plugin-polyfill-regenerator@0.6.8: + resolution: {integrity: sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + babel-plugin-syntax-hermes-parser@0.34.0: + resolution: {integrity: sha512-q4xeAymMrot/21MHA3+fd5mcFF7stx6ntKFO/Of5ldyDpgTBcK1l0NiHAh4NdHHdb4aHqHgQOy7r6yk0IIlz8Q==} - eslint@8.11.0: - resolution: {integrity: sha512-/KRpd9mIRg2raGxHRGwW9ZywYNAClZrHjdueHcrVDuO3a6bj83eoTirCCk0M0yPwOjWYKHwRVRid+xK4F/GHgA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true + babel-plugin-transform-flow-enums@0.0.2: + resolution: {integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==} - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + babel-preset-current-node-syntax@1.1.0: + resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} + peerDependencies: + '@babel/core': ^7.0.0 - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true + babel-preset-jest@28.1.3: + resolution: {integrity: sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + peerDependencies: + '@babel/core': ^7.0.0 - espurify@2.1.1: - resolution: {integrity: sha512-zttWvnkhcDyGOhSH4vO2qCBILpdCMv/MX8lp4cqgRkQoDRGK2oZxi2GfWhlP2dIXmk7BaKeOTuzbHhyC68o8XQ==} + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + bare-events@2.5.0: + resolution: {integrity: sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==} - estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} + bare-fs@2.3.5: + resolution: {integrity: sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==} - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} + bare-os@2.4.4: + resolution: {integrity: sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==} - estree-walker@0.6.1: - resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} + bare-path@2.1.3: + resolution: {integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==} - estree-walker@1.0.1: - resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} + bare-stream@2.6.1: + resolution: {integrity: sha512-eVZbtKM+4uehzrsj49KtCy3Pbg7kO1pJ3SKZ1SFrIH/0pnj9scuGGgUlNDf/7qS8WKtGdiJY5Kyhs/ivYPTB/g==} - estree-walker@2.0.1: - resolution: {integrity: sha512-tF0hv+Yi2Ot1cwj9eYHtxC0jB9bmjacjQs6ZBTj82H8JwUywFuc+7E83NWfNMwHXZc11mjfFcVXPe9gEP4B8dg==} + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + baseline-browser-mapping@2.10.36: + resolution: {integrity: sha512-lVq/Df7LXlO79MVaaUHztSwWiG9oXoWHlgvNS51v8Dpd4+G4/VIy6qYePTw31nAVls33nUtnfezYeLkYAak9dg==} + engines: {node: '>=6.0.0'} + hasBin: true - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} + basic-auth@2.0.1: + resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} + engines: {node: '>= 0.8'} - etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} + basic-ftp@5.0.5: + resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} + engines: {node: '>=10.0.0'} - event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} + bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} - events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} - execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + bl@1.2.3: + resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==} - execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} - engines: {node: '>= 0.8.0'} + blueimp-md5@2.19.0: + resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} - expect-webdriverio@4.15.4: - resolution: {integrity: sha512-Op1xZoevlv1pohCq7g2Og5Gr3xP2NhY7MQueOApmopVxgweoJ/BqJxyvMNP0A//QsMg8v0WsN/1j81Sx2er9Wg==} - engines: {node: '>=16 || >=18 || >=20'} + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - expect@27.5.1: - resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + boxen@5.1.2: + resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} + engines: {node: '>=10'} - expect@29.7.0: - resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - express@4.19.2: - resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} - engines: {node: '>= 0.10.0'} + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} + engines: {node: 18 || 20 || >=22} - external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} - extract-zip@2.0.1: - resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} - engines: {node: '>= 10.17.0'} - hasBin: true + brotli-size@4.0.0: + resolution: {integrity: sha512-uA9fOtlTRC0iqKfzff1W34DXUA3GyVqbUaeo3Rw3d4gd1eavKVCETXrn3NzO74W+UVkG3UHu8WxUi+XvKI/huA==} + engines: {node: '>= 10.16.0'} - extsprintf@1.3.0: - resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} - engines: {'0': node >=0.6.0} + browser-process-hrtime@1.0.0: + resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} - fast-deep-equal@2.0.1: - resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} + browserslist-generator@1.0.66: + resolution: {integrity: sha512-aFDax4Qzh29DdyhHQBD2Yu2L5OvaDnvYFMbmpLrLwwaNK4H6dHEhC/Nxv93/+mfAA+a/t94ln0P2JZvHO6LZDA==} + engines: {node: '>=8.0.0'} - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + browserslist@4.20.2: + resolution: {integrity: sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true - fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + browserslist@4.24.3: + resolution: {integrity: sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true - fast-fifo@1.3.2: - resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + browserslist@4.28.2: + resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} + bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + buffer-alloc-unsafe@1.1.0: + resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} - fast-xml-parser@4.5.0: - resolution: {integrity: sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==} - hasBin: true + buffer-alloc@1.2.0: + resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + buffer-crc32@1.0.0: + resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} + engines: {node: '>=8.0.0'} - fd-slicer2@1.2.0: - resolution: {integrity: sha512-3lBUNUckhMZduCc4g+Pw4Ve16LD9vpX9b8qUkkKq2mgDRLYWzblszZH2luADnJqjJe+cypngjCuKRm/IW12rRw==} + buffer-fill@1.0.0: + resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} - fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - figures@5.0.0: - resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==} - engines: {node: '>=14'} + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + buildcheck@0.0.6: + resolution: {integrity: sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==} + engines: {node: '>=10.0.0'} - filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} - filesize@6.4.0: - resolution: {integrity: sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ==} - engines: {node: '>= 0.4.0'} + builtins@1.0.3: + resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==} - filesize@9.0.11: - resolution: {integrity: sha512-gTAiTtI0STpKa5xesyTA9hA3LX4ga8sm2nWRcffEa1L/5vQwb4mj2MdzMkoHoGv4QzfDshQZuYscQSf8c4TKOA==} - engines: {node: '>= 0.4.0'} + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} + cacache@15.3.0: + resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} + engines: {node: '>= 10'} - filter-obj@1.1.0: - resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} - engines: {node: '>=0.10.0'} + cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} - finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} + cacheable-lookup@7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + engines: {node: '>=14.16'} - find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + cacheable-request@10.2.14: + resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} + engines: {node: '>=14.16'} - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} - find-up@6.3.0: - resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + call-bind-apply-helpers@1.0.1: + resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + engines: {node: '>= 0.4'} - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} - flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + engines: {node: '>= 0.4'} - flushwritable@1.0.0: - resolution: {integrity: sha512-3VELfuWCLVzt5d2Gblk8qcqFro6nuwvxwMzHaENVDHI7rxcBRtMCwTk/E9FXcgh+82DSpavPNDueA9+RxXJoFg==} + caller-callsite@2.0.0: + resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} + engines: {node: '>=4'} - follow-redirects@1.15.6: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true + caller-path@2.0.0: + resolution: {integrity: sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==} + engines: {node: '>=4'} - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + callsites@2.0.0: + resolution: {integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==} + engines: {node: '>=4'} - foreground-child@3.3.0: - resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} - engines: {node: '>=14'} + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} - forever-agent@0.6.1: - resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + callsites@4.2.0: + resolution: {integrity: sha512-kfzR4zzQtAE9PC7CzZsjl3aBNbXWuXiSeOCdLcPpBfGW8YuCqQHcRPFDbr/BPVmd3EEPVpuFzLyuT/cUhPr4OQ==} + engines: {node: '>=12.20'} - form-data-encoder@2.1.4: - resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} - engines: {node: '>= 14.17'} + camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} - form-data@2.3.3: - resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} - engines: {node: '>= 0.12'} + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} - form-data@3.0.1: - resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} - engines: {node: '>= 6'} + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} - form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} + caniuse-lite@1.0.30001690: + resolution: {integrity: sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==} - formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} + caniuse-lite@1.0.30001799: + resolution: {integrity: sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==} - forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} + capital-case@1.0.4: + resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} - fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} + caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} - fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + cbor@8.1.0: + resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} + engines: {node: '>=12.19'} - fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} - engines: {node: '>=14.14'} + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} - fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + chalk@5.4.1: + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] + change-case@4.1.2: + resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - functional-red-black-tree@1.0.1: - resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - gauge@2.7.4: - resolution: {integrity: sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==} - deprecated: This package is no longer supported. + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} - gaze@1.1.3: - resolution: {integrity: sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==} - engines: {node: '>= 4.0.0'} + chrome-launcher@0.15.2: + resolution: {integrity: sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==} + engines: {node: '>=12.13.0'} + hasBin: true - geckodriver@4.4.4: - resolution: {integrity: sha512-0zaw19tcmWeluqx7+Y559JGBtidu1D0Lb8ElYKiNEQu8r3sCfrLUf5V10xypl8u29ZLbgRV7WflxCJVTCkCMFA==} - engines: {node: ^16.13 || >=18 || >=20} + chromedriver@131.0.4: + resolution: {integrity: sha512-JgIkept8YrnqT05ldLaOzxxEJDUV1t3PFIIMO/gQz9AbnpZx7Pl1zq6tQTTz2HoY5T2JKZ5kyiEWwc48g4fJ5w==} + engines: {node: '>=18'} hasBin: true - gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} + chromium-bidi@0.4.16: + resolution: {integrity: sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==} + peerDependencies: + devtools-protocol: '*' - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} + chunkd@2.0.1: + resolution: {integrity: sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ==} - get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} + ci-info@2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} - get-port@7.1.0: - resolution: {integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==} - engines: {node: '>=16'} + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} - get-ready@1.0.0: - resolution: {integrity: sha512-mFXCZPJIlcYcth+N8267+mghfYN9h3EhsDa6JSnbA3Wrhh/XFpuowviFcsDeYZtKspQyWyJqfs4O6P8CHeTwzw==} + ci-parallel-vars@1.0.1: + resolution: {integrity: sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg==} - get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} + cjs-module-lexer@1.4.1: + resolution: {integrity: sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==} - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} - get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} + clean-stack@4.2.0: + resolution: {integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==} + engines: {node: '>=12'} - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} + clean-yaml-object@0.1.0: + resolution: {integrity: sha512-3yONmlN9CSAkzNwnRCiJQ7Q2xK5mWuEfL3PuTZcAUzhObbXsfsnMptJzXwz93nc5zn9V9TwCVMmV7w4xsm43dw==} + engines: {node: '>=0.10.0'} - get-uri@6.0.3: - resolution: {integrity: sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==} - engines: {node: '>= 14'} + cli-boxes@2.2.1: + resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} + engines: {node: '>=6'} - getpass@0.1.7: - resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + cli-truncate@3.1.0: + resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} - hasBin: true + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} - glob@7.1.7: - resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} - deprecated: Glob versions prior to v9 are no longer supported + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Glob versions prior to v9 are no longer supported + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + cliui@9.0.1: + resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} + engines: {node: '>=20'} - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} + clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} + clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} - globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - globby@13.2.2: - resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} + code-excerpt@4.0.0: + resolution: {integrity: sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - globule@1.3.4: - resolution: {integrity: sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==} - engines: {node: '>= 0.10'} + code-point-at@1.1.0: + resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} + engines: {node: '>=0.10.0'} - google-closure-compiler-java@20210808.0.0: - resolution: {integrity: sha512-7dEQfBzOdwdjwa/Pq8VAypNBKyWRrOcKjnNYOO9gEg2hjh8XVMeQzTqw4uANfVvvANGdE/JjD+HF6zHVgLRwjg==} + collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} - google-closure-compiler-linux@20210808.0.0: - resolution: {integrity: sha512-byKi5ITUiWRvEIcQo76i1siVnOwrTmG+GNcBG4cJ7x8IE6+4ki9rG5pUe4+DOYHkfk52XU6XHt9aAAgCcFDKpg==} - cpu: [x64, x86] - os: [linux] + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - google-closure-compiler-osx@20210808.0.0: - resolution: {integrity: sha512-iwyAY6dGj1FrrBdmfwKXkjtTGJnqe8F+9WZbfXxiBjkWLtIsJt2dD1+q7g/sw3w8mdHrGQAdxtDZP/usMwj/Rg==} - cpu: [x64, x86, arm64] - os: [darwin] + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} - google-closure-compiler-windows@20210808.0.0: - resolution: {integrity: sha512-VI+UUYwtGWDYwpiixrWRD8EklHgl6PMbiEaHxQSrQbH8PDXytwaOKqmsaH2lWYd5Y/BOZie2MzjY7F5JI69q1w==} - cpu: [x64] - os: [win32] + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - google-closure-compiler@20210808.0.0: - resolution: {integrity: sha512-+R2+P1tT1lEnDDGk8b+WXfyVZgWjcCK9n1mmZe8pMEzPaPWxqK7GMetLVWnqfTDJ5Q+LRspOiFBv3Is+0yuhCA==} - engines: {node: '>=10'} - hasBin: true + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + colorette@1.4.0: + resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} - got@11.8.6: - resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} - engines: {node: '>=10.19.0'} + colors@1.4.0: + resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} + engines: {node: '>=0.1.90'} - got@12.6.1: - resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} - engines: {node: '>=14.16'} + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + command-exists@1.2.9: + resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} - grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - gzip-size@6.0.0: - resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} - engines: {node: '>=10'} + commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} - har-schema@2.0.0: - resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} - engines: {node: '>=4'} + commenting@1.1.0: + resolution: {integrity: sha512-YeNK4tavZwtH7jEgK1ZINXzLKm6DZdEMfsaaieOsCAN0S8vsY7UeuO3Q7d/M018EFgE+IeUAuBOKkFccBZsUZA==} - har-validator@5.1.5: - resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} - engines: {node: '>=6'} - deprecated: this library is no longer supported + common-path-prefix@3.0.0: + resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + compatfactory@0.0.13: + resolution: {integrity: sha512-k9Sl/Qal3xQPnjAFZaRpl7jlCh0hDEhVaxyiTMfiHKC/w5TYn4Nds+7340X/v1OrAQC5xGBtaD2JpWgPhXWaAw==} + engines: {node: '>=10.0.0'} + peerDependencies: + typescript: '>=3.x || >= 4.x' - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + compress-commons@6.0.2: + resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} + engines: {node: '>= 14'} - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} + compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} + compressing@1.10.1: + resolution: {integrity: sha512-XXwUffcVjqv8NGSQu1ttp6eMmuZ3zZEAec28Rt30o/vkXE20jXhowRQ9LXLY4uOgFkxXrNzApLobpam53Dc1AA==} + engines: {node: '>= 4.0.0'} - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} + compression@1.7.5: + resolution: {integrity: sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==} + engines: {node: '>= 0.8.0'} - has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + concordance@5.0.4: + resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==} + engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14'} - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + connect@3.7.0: + resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} + engines: {node: '>= 0.10.0'} - header-case@2.0.4: - resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} + console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - helpertypes@0.0.18: - resolution: {integrity: sha512-XRhfbSEmR+poXUC5/8AbmYNJb2riOT6qPzjGJZr0S9YedHiaY+/tzPYzWMUclYMEdCYo/1l8PDYrQFCj02v97w==} - engines: {node: '>=10.0.0'} + constant-case@3.0.4: + resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} - hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} - hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} - hosted-git-info@7.0.2: - resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} - engines: {node: ^16.14.0 || >=18.0.0} + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - html-encoding-sniffer@2.0.1: - resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} - engines: {node: '>=10'} + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + convert-to-spaces@2.0.1: + resolution: {integrity: sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} + cookie@0.7.1: + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} + engines: {node: '>= 0.6'} - http-proxy-agent@4.0.1: - resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} - engines: {node: '>= 6'} + core-js-compat@3.39.0: + resolution: {integrity: sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==} - http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} - - http-signature@1.2.0: - resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} - engines: {node: '>=0.8', npm: '>=1.3.7'} - - http2-wrapper@1.0.3: - resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} - engines: {node: '>=10.19.0'} - - http2-wrapper@2.2.1: - resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} - engines: {node: '>=10.19.0'} - - https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} + core-js-compat@3.49.0: + resolution: {integrity: sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==} - https-proxy-agent@7.0.5: - resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} - engines: {node: '>= 14'} + core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} - human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} + cosmiconfig@5.2.1: + resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} + engines: {node: '>=4'} - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + cpu-features@0.0.10: + resolution: {integrity: sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==} + engines: {node: '>=10.0.0'} - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true - iconv-lite@0.5.2: - resolution: {integrity: sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==} - engines: {node: '>=0.10.0'} + crc32-stream@6.0.0: + resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} + engines: {node: '>= 14'} - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + cross-fetch@4.0.0: + resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} - ignore-by-default@2.1.0: - resolution: {integrity: sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw==} - engines: {node: '>=10 <11 || >=12 <13 || >=14'} + cross-spawn@6.0.6: + resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==} + engines: {node: '>=4.8'} - ignore-walk@3.0.4: - resolution: {integrity: sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} - ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} + crosspath@1.0.0: + resolution: {integrity: sha512-mpjkSErNO6vioL/Cde2aF4UBysPFEMyn+1AN1t7Oc4yqvzSRWe8iBte4P8BHyjo64OmC+ZBxwjIqmpSpIWiQ7Q==} + engines: {node: '>=10.0.0'} - immediate@3.0.6: - resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + css-shorthand-properties@1.1.2: + resolution: {integrity: sha512-C2AugXIpRGQTxaCW0N7n5jD/p5irUmCrwl03TrnMFBHDbdq44CFWR2zO7rK9xPN4Eo3pUxC4vQzQgbIpzrD1PQ==} - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + css-value@0.0.1: + resolution: {integrity: sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==} - import-local@3.2.0: - resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} - engines: {node: '>=8'} - hasBin: true + cssom@0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} - import-meta-resolve@4.1.0: - resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + cssom@0.5.0: + resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} - import-modules@2.1.0: - resolution: {integrity: sha512-8HEWcnkbGpovH9yInoisxaSoIg9Brbul+Ju3Kqe2UsYDUBJD/iQjSgEj0zPcTDPKfPp2fs5xlv1i+JSye/m1/A==} + cssstyle@2.3.0: + resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} engines: {node: '>=8'} - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} + currently-unhandled@0.4.1: + resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==} + engines: {node: '>=0.10.0'} - indent-string@5.0.0: - resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} - engines: {node: '>=12'} + dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} - infer-owner@1.0.4: - resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + data-uri-to-buffer@6.0.2: + resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} + engines: {node: '>= 14'} - inherits@2.0.3: - resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + data-urls@3.0.2: + resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} + engines: {node: '>=12'} - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} - inquirer@9.2.12: - resolution: {integrity: sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==} - engines: {node: '>=14.18.0'} + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} - internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} - ip-address@9.0.5: - resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} - engines: {node: '>= 12'} + date-time@3.1.0: + resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} + engines: {node: '>=6'} - ip-regex@4.3.0: - resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} - engines: {node: '>=8'} + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} - ip@2.0.1: - resolution: {integrity: sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==} + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} + debug@4.3.1: + resolution: {integrity: sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true - irregular-plurals@3.5.0: - resolution: {integrity: sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==} - engines: {node: '>=8'} + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true - is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + decamelize@6.0.0: + resolution: {integrity: sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} + decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} - is-ci@2.0.0: - resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} - hasBin: true + dedent@0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - is-core-module@2.15.1: - resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} - engines: {node: '>= 0.4'} + dedent@1.7.2: + resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true - is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + deep-equal@2.2.3: + resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} engines: {node: '>= 0.4'} - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - is-error@2.2.2: - resolution: {integrity: sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg==} + deepmerge-ts@5.1.0: + resolution: {integrity: sha512-eS8dRJOckyo9maw9Tu5O5RUi/4inFLrnoLkBe3cPfDMx3WZioXtmOew4TXQaxq7Rhl4xjDtR7c6x8nNTxOvbFw==} + engines: {node: '>=16.0.0'} - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} - is-fullwidth-code-point@1.0.0: - resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} - engines: {node: '>=0.10.0'} + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} - is-fullwidth-code-point@4.0.0: - resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} - engines: {node: '>=12'} + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} - is-generator-fn@2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} - engines: {node: '>=6'} + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + degenerator@5.0.1: + resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} + engines: {node: '>= 14'} - is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} + del@7.1.0: + resolution: {integrity: sha512-v2KyNk7efxhlyHpjEvfyxaAihKKK0nWCuf6ZtqZcFFpQRG0bJ12Qsr0RpvsICMjAAZ8DOVCxrlqpxISlMHC4Kg==} + engines: {node: '>=14.16'} - is-lambda@1.0.1: - resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + del@8.0.1: + resolution: {integrity: sha512-gPqh0mKTPvaUZGAuHbrBUYKZWBNAeHG7TU3QH5EhVwPMyKvmfJaNXhcD2jTcXsJRRcffuho4vaYweu80dRrMGA==} + engines: {node: '>=18'} - is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - - is-module@1.0.0: - resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} - - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - is-path-cwd@3.0.0: - resolution: {integrity: sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + denodeify@1.2.1: + resolution: {integrity: sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==} - is-path-inside@4.0.0: - resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} - engines: {node: '>=12'} + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} - is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} + detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} - is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + devtools-protocol@0.0.1147663: + resolution: {integrity: sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==} - is-promise@4.0.0: - resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + devtools-protocol@0.0.1302984: + resolution: {integrity: sha512-Rgh2Sk5fUSCtEx4QGH9iwTyECdFPySG2nlz5J8guGh2Wlha6uzSOCq/DCEC8faHlLaMPZJMuZ4ovgcX4LvOkKA==} - is-reference@1.2.1: - resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + diff-sequences@28.1.1: + resolution: {integrity: sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} - is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + docker-modem@3.0.8: + resolution: {integrity: sha512-f0ReSURdM3pcKPNS30mxOHSbaFLcknGmQjwSfmbcdOw1XWKXVhukM3NJHhr7NpY9BIyyWQb0EBo3KQvvuU5egQ==} + engines: {node: '>= 8.0'} - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} + dockerode@3.3.5: + resolution: {integrity: sha512-/0YNa3ZDNeLr/tSckmD69+Gq+qVNhvKfAHNeZJBnp7EOP6RGKV8ORrJHkUn20So5wU+xxT7+1n5u8PjHbfjbSA==} + engines: {node: '>= 8.0'} - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} - is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + domexception@4.0.0: + resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} + engines: {node: '>=12'} + deprecated: Use your platform's native DOMException instead - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} - is-unicode-supported@1.3.0: - resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} - is-url@1.2.4: - resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} - - is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + duplexer@0.1.1: + resolution: {integrity: sha512-sxNZ+ljy+RA1maXoUReeqBBpBC6RLKmg5ewzV+x+mSETmWNoKdZN6vcQjpFROemza23hGFskJtFNoUWUaQ+R4Q==} - is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} - engines: {node: '>= 0.4'} + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - is2@2.0.9: - resolution: {integrity: sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==} - engines: {node: '>=v0.10.0'} + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + easy-table@1.2.0: + resolution: {integrity: sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==} - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} - isbot@3.4.5: - resolution: {integrity: sha512-+KD6q1BBtw0iK9aGBGSfxJ31/ZgizKRjhm8ebgJUBMx0aeeQuIJ1I72beCoIrltIZGrSm4vmrxRxrG5n1aUTtw==} - engines: {node: '>=12'} + edge-paths@3.0.5: + resolution: {integrity: sha512-sB7vSrDnFa4ezWQk9nZ/n0FdpdUuC6R1EOrlU3DL+bovcNFK28rqu2emmAUjujYEJTWIgQGqgVVWUZXMnc8iWg==} + engines: {node: '>=14.0.0'} - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + edgedriver@5.6.1: + resolution: {integrity: sha512-3Ve9cd5ziLByUdigw6zovVeWJjVs8QHVmqOB0sJ0WNeVPcwf4p18GnxMmVvlFmYRloUwf5suNuorea4QzwBIOA==} + hasBin: true - isexe@3.1.1: - resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} - engines: {node: '>=16'} + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - isstream@0.1.2: - resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true - istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} + electron-to-chromium@1.5.372: + resolution: {integrity: sha512-M3yhbAlilnwqC8D21t28UCDGHyitShTmmLRU/H+b74P6Ski16Nb9HONYEaVpMj/pwC7BEo5B95FpjODLCWbtfA==} - istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} + electron-to-chromium@1.5.76: + resolution: {integrity: sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==} - istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} + emittery@0.10.2: + resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==} + engines: {node: '>=12'} - istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} + emittery@1.0.3: + resolution: {integrity: sha512-tJdCJitoy2lrC2ldJcqN4vkqJ00lT+tOWNT1hBJjO/3FDMJa5TTIiYGCKGkn/WfCyOzUMObeohbVTj00fhiLiA==} + engines: {node: '>=14.16'} - istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} - engines: {node: '>=8'} + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - jake@10.9.2: - resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} - engines: {node: '>=10'} - hasBin: true + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - jasmine-core@5.2.0: - resolution: {integrity: sha512-tSAtdrvWybZkQmmaIoDgnvHG8ORUNw5kEVlO5CvrXj02Jjr9TZrmjFq7FUiOUzJiOP2wLGYT6PgrQgQF4R1xiw==} + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} - jasmine@5.2.0: - resolution: {integrity: sha512-il+noV96N1BGU9/FMmc8QtAMxC8lPnXUiAvgb0o9MDZATRdxglTQe9wo6UdL049ropQL6MopDYwDlludKR6wJQ==} - hasBin: true + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} - jest-changed-files@27.5.1: - resolution: {integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - jest-circus@27.5.1: - resolution: {integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - jest-cli@27.5.1: - resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + enhance-visitors@1.0.0: + resolution: {integrity: sha512-+29eJLiUixTEDRaZ35Vu8jP3gPLNcQQkQkOQjLp2X+6cZGGPDD/uasbFzvLsJKnGZnvmyZ0srxudwOtskHeIDA==} + engines: {node: '>=4.0.0'} - jest-config@27.5.1: - resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - peerDependencies: - ts-node: '>=9.0.0' - peerDependenciesMeta: - ts-node: - optional: true + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} - jest-diff@27.5.1: - resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + envinfo@7.14.0: + resolution: {integrity: sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==} + engines: {node: '>=4'} + hasBin: true - jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} - jest-docblock@27.5.1: - resolution: {integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - jest-each@27.5.1: - resolution: {integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + error-stack-parser@2.1.4: + resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} - jest-environment-jsdom-global@3.0.0: - resolution: {integrity: sha512-+7ZNxuB/35ybGug9vMaBYontqI7T8KhnUU55wtT5OYw6GRfDn2Vzak2YRvBwFjdm0so0Qz7KAL6NtEB0r+3x+g==} - engines: {node: '>= 12'} - peerDependencies: - jest-environment-jsdom: 22.x || 23.x || 24.x || 25.x || 26.x || 27.x + errorhandler@1.5.1: + resolution: {integrity: sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==} + engines: {node: '>= 0.8'} - jest-environment-jsdom@27.5.1: - resolution: {integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + es-abstract@1.23.8: + resolution: {integrity: sha512-lfab8IzDn6EpI1ibZakcgS6WsfEBiB+43cuJo+wgylx1xKXf+Sp+YR3vFuQwC/u3sxYwV8Cxe3B0DpVUu/WiJQ==} + engines: {node: '>= 0.4'} - jest-environment-node@27.5.1: - resolution: {integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} - jest-get-type@27.5.1: - resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} - jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + es-get-iterator@1.1.3: + resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - jest-haste-map@27.5.1: - resolution: {integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} - jest-jasmine2@27.5.1: - resolution: {integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} - jest-leak-detector@27.5.1: - resolution: {integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} - jest-matcher-utils@27.5.1: - resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} - jest-matcher-utils@29.7.0: - resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - jest-message-util@26.6.2: - resolution: {integrity: sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==} - engines: {node: '>= 10.14.2'} + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} - jest-message-util@27.5.1: - resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} - jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-mock@27.5.1: - resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - - jest-pnp-resolver@1.2.3: - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} - jest-regex-util@27.5.1: - resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} - jest-resolve-dependencies@27.5.1: - resolution: {integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true - jest-resolve@27.5.1: - resolution: {integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + eslint-plugin-ava@13.2.0: + resolution: {integrity: sha512-i5B5izsEdERKQLruk1nIWzTTE7C26/ju8qQf7JeyRv32XT2lRMW0zMFZNhIrEf5/5VvpSz2rqrV7UcjClGbKsw==} + engines: {node: '>=12.22 <13 || >=14.17 <15 || >=16.4'} + peerDependencies: + eslint: '>=7.22.0' - jest-runner@27.5.1: - resolution: {integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} - jest-runtime@27.5.1: - resolution: {integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - jest-serializer@27.5.1: - resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + eslint-utils@3.0.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' - jest-snapshot@27.5.1: - resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} - jest-standard-reporter@2.0.0: - resolution: {integrity: sha512-JhV3qzNzs5u/T1mzN9ivVrf2i4xYOQJgyPMKQbAmwRAZIprCpkikt8GF1kQKrP5ch1qBMn5xYyNdUUOKi8bltA==} + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - jest-util@26.6.2: - resolution: {integrity: sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==} - engines: {node: '>= 10.14.2'} + eslint@8.11.0: + resolution: {integrity: sha512-/KRpd9mIRg2raGxHRGwW9ZywYNAClZrHjdueHcrVDuO3a6bj83eoTirCCk0M0yPwOjWYKHwRVRid+xK4F/GHgA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true - jest-util@27.5.1: - resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true - jest-validate@27.5.1: - resolution: {integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + espurify@2.1.1: + resolution: {integrity: sha512-zttWvnkhcDyGOhSH4vO2qCBILpdCMv/MX8lp4cqgRkQoDRGK2oZxi2GfWhlP2dIXmk7BaKeOTuzbHhyC68o8XQ==} - jest-watcher@27.5.1: - resolution: {integrity: sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} - jest-worker@26.6.2: - resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} - engines: {node: '>= 10.13.0'} + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} - jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} - jest@27.5.1: - resolution: {integrity: sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} - js-cleanup@1.2.0: - resolution: {integrity: sha512-JeDD0yiiSt80fXzAVa/crrS0JDPQljyBG/RpOtaSbyDq03VHa9szJWMaWOYU/bcTn412uMN2MxApXq8v79cUiQ==} - engines: {node: ^10.14.2 || >=12.0.0} + estree-walker@0.6.1: + resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} - js-string-escape@1.0.1: - resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} - engines: {node: '>= 0.8'} + estree-walker@1.0.1: + resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} - jsbn@0.1.1: - resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} - jsbn@1.1.0: - resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} - jsdom@16.7.0: - resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} - json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + expect-webdriverio@4.15.4: + resolution: {integrity: sha512-Op1xZoevlv1pohCq7g2Og5Gr3xP2NhY7MQueOApmopVxgweoJ/BqJxyvMNP0A//QsMg8v0WsN/1j81Sx2er9Wg==} + engines: {node: '>=16 || >=18 || >=20'} - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + expect@28.1.3: + resolution: {integrity: sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - json-parse-even-better-errors@3.0.2: - resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + exponential-backoff@3.1.1: + resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} - json-schema@0.4.0: - resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + express@4.21.2: + resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} + engines: {node: '>= 0.10.0'} - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} hasBin: true - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} - jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} + fast-base64-decode@1.0.0: + resolution: {integrity: sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==} - jsprim@1.4.2: - resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} - engines: {node: '>=0.6.0'} + fast-deep-equal@2.0.1: + resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} - jstimezonedetect@1.0.7: - resolution: {integrity: sha512-ARADHortktl9IZ1tr4GHwGPIAzgz3mLNCbR/YjWtRtc/O0o634O3NeFlpLjv95EvuDA5dc8z6yfgbS8nUc4zcQ==} + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - jszip@3.10.1: - resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} - ky@0.33.3: - resolution: {integrity: sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==} - engines: {node: '>=14.16'} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} - lazystream@1.0.1: - resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} - engines: {node: '>= 0.6.3'} + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + fast-xml-parser@4.5.1: + resolution: {integrity: sha512-y655CeyUQ+jj7KBbYMc4FG01V8ZQqjN+gDYGJ50RtfsUB8iG9AmwmwoAgeKLJdmueKKMrH1RJ7yXHTSoczdv5w==} + hasBin: true - lie@3.3.0: - resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + fastq@1.18.0: + resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - lines-and-columns@2.0.4: - resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + fd-slicer2@1.2.0: + resolution: {integrity: sha512-3lBUNUckhMZduCc4g+Pw4Ve16LD9vpX9b8qUkkKq2mgDRLYWzblszZH2luADnJqjJe+cypngjCuKRm/IW12rRw==} - load-json-file@4.0.0: - resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} - engines: {node: '>=4'} + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - load-json-file@7.0.1: - resolution: {integrity: sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} - locate-app@2.4.37: - resolution: {integrity: sha512-NJjAzMx1LxOeFmmHM0qvMM7CjTC37IMtL4T+mYxUZlsMSn9QtZQzCcfYwp1pPY/Ey7D7HGzfUcxPzYOy4TaysQ==} - - locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + figures@5.0.0: + resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==} + engines: {node: '>=14'} - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} - locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} - lodash.clonedeep@4.5.0: - resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + filesize@6.4.0: + resolution: {integrity: sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ==} + engines: {node: '>= 0.4.0'} - lodash.flattendeep@4.4.0: - resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} + filesize@9.0.11: + resolution: {integrity: sha512-gTAiTtI0STpKa5xesyTA9hA3LX4ga8sm2nWRcffEa1L/5vQwb4mj2MdzMkoHoGv4QzfDshQZuYscQSf8c4TKOA==} + engines: {node: '>= 0.4.0'} - lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} - lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + filter-obj@1.1.0: + resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} + engines: {node: '>=0.10.0'} - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + finalhandler@1.1.2: + resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} + engines: {node: '>= 0.8'} - lodash.pickby@4.6.0: - resolution: {integrity: sha512-AZV+GsS/6ckvPOVQPXSiFFacKvKB4kOQu6ynt9wz0F3LO4R9Ij4K1ddYsIytDpSgLz88JHd9P+oaLeej5/Sl7Q==} + finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} + engines: {node: '>= 0.8'} - lodash.union@4.6.0: - resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} + find-cache-dir@2.1.0: + resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} + engines: {node: '>=6'} - lodash.zip@4.2.0: - resolution: {integrity: sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==} + find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - loglevel-plugin-prefix@0.8.4: - resolution: {integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==} - - loglevel@1.9.1: - resolution: {integrity: sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==} - engines: {node: '>= 0.6.0'} - - lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - - lowercase-keys@2.0.0: - resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} - engines: {node: '>=8'} - - lowercase-keys@3.0.0: - resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} - lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + flatted@3.3.2: + resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + flow-enums-runtime@0.0.6: + resolution: {integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==} - lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} + flow-parser@0.257.1: + resolution: {integrity: sha512-7+KYDpAXyBPD/wODhbPYO6IGUx+WwtJcLLG/r3DvbNyxaDyuYaTBKbSqeCldWQzuFcj+MsOVx2bpkEwVPB9JRw==} + engines: {node: '>=0.4.0'} - lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} - hasBin: true + flushwritable@1.0.0: + resolution: {integrity: sha512-3VELfuWCLVzt5d2Gblk8qcqFro6nuwvxwMzHaENVDHI7rxcBRtMCwTk/E9FXcgh+82DSpavPNDueA9+RxXJoFg==} - magic-string@0.25.7: - resolution: {integrity: sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==} + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true - magic-string@0.25.9: - resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - magic-string@0.26.7: - resolution: {integrity: sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==} - engines: {node: '>=12'} + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} - magic-string@0.30.11: - resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} - make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} + form-data-encoder@2.1.4: + resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} + engines: {node: '>= 14.17'} - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + form-data@2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} - make-fetch-happen@9.1.0: - resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} - engines: {node: '>= 10'} + form-data@4.0.1: + resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} + engines: {node: '>= 6'} - makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} - map-age-cleaner@0.1.3: - resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==} - engines: {node: '>=6'} + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} - matcher@5.0.0: - resolution: {integrity: sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} - matchit@1.1.0: - resolution: {integrity: sha512-+nGYoOlfHmxe5BW5tE0EMJppXEwdSf8uBA1GTZC7Q77kbT35+VKLYJMzVNWCHSsga1ps1tPYFtFyvxvKzWVmMA==} - engines: {node: '>=6'} + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - md5-hex@3.0.1: - resolution: {integrity: sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==} - engines: {node: '>=8'} + fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} - media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} + fs-extra@11.3.5: + resolution: {integrity: sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==} + engines: {node: '>=14.14'} - mem@9.0.2: - resolution: {integrity: sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A==} - engines: {node: '>=12.20'} + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} - memorystream@0.3.1: - resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} - engines: {node: '>= 0.10.0'} + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} - merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} - micro-spelling-correcter@1.1.1: - resolution: {integrity: sha512-lkJ3Rj/mtjlRcHk6YyCbvZhyWTOzdBvTHsxMmZSk5jxN1YyVSQ+JETAom55mdzfcyDrY/49Z7UCW760BK30crg==} + functional-red-black-tree@1.0.1: + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} + gauge@2.7.4: + resolution: {integrity: sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==} + deprecated: This package is no longer supported. - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + gaze@1.1.3: + resolution: {integrity: sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==} + engines: {node: '>= 4.0.0'} - mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} + geckodriver@4.5.1: + resolution: {integrity: sha512-lGCRqPMuzbRNDWJOQcUqhNqPvNsIFu6yzXF8J/6K3WCYFd2r5ckbeF7h1cxsnjA7YLSEiWzERCt6/gjZ3tW0ug==} + engines: {node: ^16.13 || >=18 || >=20} hasBin: true - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} - mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} - mimic-response@1.0.1: - resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} - engines: {node: '>=4'} + get-east-asian-width@1.6.0: + resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} + engines: {node: '>=18'} - mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} + get-intrinsic@1.2.6: + resolution: {integrity: sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==} + engines: {node: '>= 0.4'} - mimic-response@4.0.0: - resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} - minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + get-port@7.1.0: + resolution: {integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==} + engines: {node: '>=16'} - minimatch@3.0.8: - resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} + get-ready@1.0.0: + resolution: {integrity: sha512-mFXCZPJIlcYcth+N8267+mghfYN9h3EhsDa6JSnbA3Wrhh/XFpuowviFcsDeYZtKspQyWyJqfs4O6P8CHeTwzw==} - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} - minipass-collect@1.0.2: - resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} - engines: {node: '>= 8'} + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} - minipass-fetch@1.4.1: - resolution: {integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==} - engines: {node: '>=8'} + get-uri@6.0.4: + resolution: {integrity: sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==} + engines: {node: '>= 14'} - minipass-flush@1.0.5: - resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} - engines: {node: '>= 8'} + getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} - minipass-json-stream@1.0.2: - resolution: {integrity: sha512-myxeeTm57lYs8pH2nxPzmEEg8DGIgW+9mv6D4JZD2pa81I/OBjeU7PtICXV6c9eRGTA5JMDsuIPUZRCyBMYNhg==} + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} - minipass-pipeline@1.2.4: - resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} - engines: {node: '>=8'} + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} - minipass-sized@1.0.3: - resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} - engines: {node: '>=8'} + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true - minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} + glob@13.0.6: + resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} + engines: {node: 18 || 20 || >=22} - minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} + glob@7.1.7: + resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} + glob@7.2.0: + resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + deprecated: Glob versions prior to v9 are no longer supported - minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported - mitt@3.0.0: - resolution: {integrity: sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==} + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} - mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} - mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - hasBin: true - module-details-from-path@1.0.3: - resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==} - - moment-timezone@0.5.45: - resolution: {integrity: sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==} + globby@13.2.2: + resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - moment@2.29.1: - resolution: {integrity: sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==} + globby@14.1.0: + resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} + engines: {node: '>=18'} - moment@2.30.1: - resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} + globule@1.3.4: + resolution: {integrity: sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==} + engines: {node: '>= 0.10'} - morgan@1.10.0: - resolution: {integrity: sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==} - engines: {node: '>= 0.8.0'} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} - ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + got@12.6.1: + resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} + engines: {node: '>=14.16'} - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - mute-stream@1.0.0: - resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + grapheme-splitter@1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - nan@2.20.0: - resolution: {integrity: sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==} + gzip-size@6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} - native-promise-only@0.8.1: - resolution: {integrity: sha512-zkVhZUA3y8mbz652WrL5x0fB0ehrBkulWT3TomAQ9iDtyXZvzKeEA6GPxAItBYeNYl5yngKRX612qHOhvMkDeg==} + har-schema@2.0.0: + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} + engines: {node: '>=4'} - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + har-validator@5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} + deprecated: this library is no longer supported - negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} - netmask@2.0.2: - resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} - engines: {node: '>= 0.4.0'} + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} - nice-try@1.0.5: - resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} - no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} - node-fetch@3.3.2: - resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} - node-gyp@7.1.2: - resolution: {integrity: sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==} - engines: {node: '>= 10.12.0'} - hasBin: true + has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} - node-releases@2.0.18: - resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} - nofilter@3.1.0: - resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} - engines: {node: '>=12.19'} + header-case@2.0.4: + resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} - nopt@5.0.0: - resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} - engines: {node: '>=6'} - hasBin: true + helpertypes@0.0.18: + resolution: {integrity: sha512-XRhfbSEmR+poXUC5/8AbmYNJb2riOT6qPzjGJZr0S9YedHiaY+/tzPYzWMUclYMEdCYo/1l8PDYrQFCj02v97w==} + engines: {node: '>=10.0.0'} - normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + hermes-estree@0.19.1: + resolution: {integrity: sha512-daLGV3Q2MKk8w4evNMKwS8zBE/rcpA800nu1Q5kM08IKijoSnPe9Uo1iIxzPKRkn95IxxsgBMPeYHt3VG4ej2g==} - normalize-package-data@6.0.2: - resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} - engines: {node: ^16.14.0 || >=18.0.0} + hermes-estree@0.23.1: + resolution: {integrity: sha512-eT5MU3f5aVhTqsfIReZ6n41X5sYn4IdQL0nvz6yO+MMlPxw49aSARHLg/MSehQftyjnrE8X6bYregzSumqc6cg==} - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} + hermes-estree@0.34.0: + resolution: {integrity: sha512-6qLylexjmuKa/YYhMiNn/3VejBsdzwmYUGmNpc693/pJzymmbufhkRW/2K6GqFgu0ApRWoqF0NbM6u82jFcOXA==} - normalize-url@6.1.0: - resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} - engines: {node: '>=10'} + hermes-parser@0.19.1: + resolution: {integrity: sha512-Vp+bXzxYJWrpEuJ/vXxUsLnt0+y4q9zyi4zUlkLqD8FKv4LjIfOvP69R/9Lty3dCyKh0E2BU7Eypqr63/rKT/A==} - normalize-url@8.0.1: - resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} - engines: {node: '>=14.16'} + hermes-parser@0.23.1: + resolution: {integrity: sha512-oxl5h2DkFW83hT4DAUJorpah8ou4yvmweUzLJmmr6YV2cezduCdlil1AvU/a/xSsAFo4WUcNA4GoV5Bvq6JffA==} - npm-bundled@1.1.2: - resolution: {integrity: sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==} + hermes-parser@0.34.0: + resolution: {integrity: sha512-tcgan5UNZvu3WwmR3jDAlmwEAR2CMv8cwQVMe5j0NrLQkstf0l3ULbYPuTZWbXxbPa0PyZPiq5LYEcFVmhM9LQ==} - npm-install-checks@4.0.0: - resolution: {integrity: sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==} - engines: {node: '>=10'} + hermes-profile-transformer@0.0.6: + resolution: {integrity: sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==} + engines: {node: '>=8'} - npm-normalize-package-bin@1.0.1: - resolution: {integrity: sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==} + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - npm-package-arg@8.1.5: - resolution: {integrity: sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==} + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} engines: {node: '>=10'} - npm-packlist@2.2.2: - resolution: {integrity: sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg==} - engines: {node: '>=10'} - hasBin: true + hosted-git-info@7.0.2: + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} + engines: {node: ^16.14.0 || >=18.0.0} - npm-pick-manifest@6.1.1: - resolution: {integrity: sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==} + html-encoding-sniffer@3.0.0: + resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} + engines: {node: '>=12'} - npm-registry-fetch@11.0.0: - resolution: {integrity: sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==} - engines: {node: '>=10'} + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - npm-run-all@4.1.5: - resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} - engines: {node: '>= 4'} - hasBin: true + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} - npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + http-proxy-agent@4.0.1: + resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} + engines: {node: '>= 6'} - npmlog@4.1.2: - resolution: {integrity: sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==} - deprecated: This package is no longer supported. - - number-is-nan@1.0.1: - resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} - engines: {node: '>=0.10.0'} + http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} - nwsapi@2.2.12: - resolution: {integrity: sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==} + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} - oauth-sign@0.9.0: - resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + http-signature@1.2.0: + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: '>=0.8', npm: '>=1.3.7'} - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} + http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} - object-inspect@1.13.2: - resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} - engines: {node: '>= 0.4'} + http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} + engines: {node: '>=10.19.0'} - object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} - object-path@0.11.8: - resolution: {integrity: sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==} - engines: {node: '>= 10.12.0'} + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} - on-finished@2.3.0: - resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} - engines: {node: '>= 0.8'} + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} - on-headers@1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} - engines: {node: '>= 0.8'} + iconv-lite@0.5.2: + resolution: {integrity: sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==} + engines: {node: '>=0.10.0'} - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} + ignore-by-default@2.1.0: + resolution: {integrity: sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw==} + engines: {node: '>=10 <11 || >=12 <13 || >=14'} - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} + ignore-walk@3.0.4: + resolution: {integrity: sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==} - ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} - os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} - p-cancelable@2.1.1: - resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} - engines: {node: '>=8'} + image-size@1.2.0: + resolution: {integrity: sha512-4S8fwbO6w3GeCVN6OPtA9I5IGKkcDMPcKndtUlpJuCwu7JLjtj7JZpwqLuyY2nrmQT3AWsCJLSKPsc2mPBSl3w==} + engines: {node: '>=16.x'} + hasBin: true - p-cancelable@3.0.0: - resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} - engines: {node: '>=12.20'} + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - p-defer@1.0.0: - resolution: {integrity: sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==} + import-fresh@2.0.0: + resolution: {integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==} engines: {node: '>=4'} - p-event@5.0.1: - resolution: {integrity: sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} + hasBin: true - p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} - p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + import-modules@2.1.0: + resolution: {integrity: sha512-8HEWcnkbGpovH9yInoisxaSoIg9Brbul+Ju3Kqe2UsYDUBJD/iQjSgEj0zPcTDPKfPp2fs5xlv1i+JSye/m1/A==} engines: {node: '>=8'} - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} - p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} - p-map@5.5.0: - resolution: {integrity: sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==} + indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} engines: {node: '>=12'} - p-timeout@5.1.0: - resolution: {integrity: sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==} - engines: {node: '>=12'} + infer-owner@1.0.4: + resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} - p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - pac-proxy-agent@7.0.2: - resolution: {integrity: sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==} - engines: {node: '>= 14'} + inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} - pac-resolver@7.0.1: - resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} - engines: {node: '>= 14'} + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - package-json-from-dist@1.0.0: - resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + inquirer@9.2.12: + resolution: {integrity: sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==} + engines: {node: '>=14.18.0'} - package-name-regex@2.0.5: - resolution: {integrity: sha512-F0lX+FBs/Bo7KWY6EuUXj+oarXU0Og1R2Zdg3F/fVcNw3pPQAKFKxUrugno0Ds5NUztlx/gRLnQW9MF+7VTqAw==} - engines: {node: '>=12'} + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} - pacote@11.3.5: - resolution: {integrity: sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg==} - engines: {node: '>=10'} - hasBin: true + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} - pako@1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} - param-case@3.0.4: - resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + ip-regex@4.3.0: + resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} + engines: {node: '>=8'} - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + ip@2.0.1: + resolution: {integrity: sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==} - parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + irregular-plurals@3.5.0: + resolution: {integrity: sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==} engines: {node: '>=8'} - parse-json@7.1.1: - resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==} - engines: {node: '>=16'} + is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + engines: {node: '>= 0.4'} - parse-ms@2.1.0: - resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} - engines: {node: '>=6'} + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} - parse-ms@3.0.0: - resolution: {integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==} - engines: {node: '>=12'} + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - parse5@6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} - parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} - pascal-case@3.1.2: - resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} - path-case@3.0.4: - resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} + is-boolean-object@1.2.1: + resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} + engines: {node: '>= 0.4'} - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} - path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-ci@2.0.0: + resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} + hasBin: true - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} - path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} - path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} + is-directory@0.3.1: + resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} + engines: {node: '>=0.10.0'} - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} + is-error@2.2.2: + resolution: {integrity: sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg==} - path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} - path-type@3.0.0: - resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@1.0.0: + resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@2.0.0: + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} engines: {node: '>=4'} - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - path@0.12.7: - resolution: {integrity: sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==} + is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} - pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} - pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} - perf-regexes@1.0.1: - resolution: {integrity: sha512-L7MXxUDtqr4PUaLFCDCXBfGV/6KLIuSEccizDI7JxT+c9x1G1v04BQ4+4oag84SHaCdrBgQAIs/Cqn+flwFPng==} - engines: {node: '>=6.14'} + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} - performance-now@2.1.0: - resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} - picocolors@1.1.0: - resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + is-lambda@1.0.1: + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} - pidtree@0.3.1: - resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} - engines: {node: '>=0.10'} - hasBin: true + is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} - pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} - pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} - pkg-conf@4.0.0: - resolution: {integrity: sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w==} + is-path-cwd@3.0.0: + resolution: {integrity: sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + is-path-inside@4.0.0: + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} + engines: {node: '>=12'} + + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} engines: {node: '>=8'} - pkg-dir@5.0.0: - resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} - engines: {node: '>=10'} + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} - plur@5.1.0: - resolution: {integrity: sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} - polka@0.5.2: - resolution: {integrity: sha512-FVg3vDmCqP80tOrs+OeNlgXYmFppTXdjD5E7I4ET1NjvtNmQrb1/mJibybKkb/d4NA7YWAr1ojxuhpL3FHqdlw==} + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} - pretty-format@26.6.2: - resolution: {integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==} - engines: {node: '>= 10'} + is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} - pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} - pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} - pretty-ms@7.0.1: - resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} - engines: {node: '>=10'} + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} - pretty-ms@8.0.0: - resolution: {integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==} - engines: {node: '>=14.16'} + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} - process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} - progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} - promise-inflight@1.0.1: - resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} - promise-retry@2.0.1: - resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} - prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} - proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} + is-url@1.2.4: + resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} - proxy-agent@6.3.0: - resolution: {integrity: sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==} - engines: {node: '>= 14'} + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} - proxy-agent@6.3.1: - resolution: {integrity: sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==} - engines: {node: '>= 14'} + is-weakref@1.1.0: + resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==} + engines: {node: '>= 0.4'} - proxy-agent@6.4.0: - resolution: {integrity: sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==} - engines: {node: '>= 14'} + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + is-wsl@1.1.0: + resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} + engines: {node: '>=4'} - psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} - pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + is2@2.0.9: + resolution: {integrity: sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==} + engines: {node: '>=v0.10.0'} - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - puppeteer-core@20.9.0: - resolution: {integrity: sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==} - engines: {node: '>=16.3.0'} - peerDependencies: - typescript: '>= 4.7.4' - peerDependenciesMeta: - typescript: - optional: true + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} - engines: {node: '>=0.6'} + isbot@3.4.5: + resolution: {integrity: sha512-+KD6q1BBtw0iK9aGBGSfxJ31/ZgizKRjhm8ebgJUBMx0aeeQuIJ1I72beCoIrltIZGrSm4vmrxRxrG5n1aUTtw==} + engines: {node: '>=12'} - qs@6.5.3: - resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} - engines: {node: '>=0.6'} + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - query-selector-shadow-dom@1.0.1: - resolution: {integrity: sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==} + isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} - query-string@7.1.3: - resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} - engines: {node: '>=6'} + isexe@4.0.0: + resolution: {integrity: sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==} + engines: {node: '>=20'} - querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} - queue-tick@1.0.1: - resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} - quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} - randomcolor@0.6.2: - resolution: {integrity: sha512-Mn6TbyYpFgwFuQ8KJKqf3bqqY9O1y37/0jgSK/61PUxV4QfIMv0+K2ioq8DfOjkBslcjwSzRfIDEXfzA9aCx7A==} + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} - range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} + jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} + engines: {node: '>=10'} + hasBin: true - react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + jasmine-core@5.5.0: + resolution: {integrity: sha512-NHOvoPO6o9gVR6pwqEACTEpbgcH+JJ6QDypyymGbSUIFIFsMMbBJ/xsFNud8MSClfnWclXd7RQlAZBz7yVo5TQ==} - react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + jasmine@5.5.0: + resolution: {integrity: sha512-JKlEVCVD5QBPYLsg/VE+IUtjyseDCrW8rMBu8la+9ysYashDgavMLM9Kotls1FhI6dCJLJ40dBCIfQjGLPZI1Q==} + hasBin: true - read-package-json-fast@2.0.3: - resolution: {integrity: sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==} - engines: {node: '>=10'} + jest-changed-files@28.1.3: + resolution: {integrity: sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - read-pkg-up@10.0.0: - resolution: {integrity: sha512-jgmKiS//w2Zs+YbX039CorlkOp8FIVbSAN8r8GJHDsGlmNPXo+VeHkqAwCiQVTTx5/LwLZTcEw59z3DvcLbr0g==} - engines: {node: '>=16'} + jest-circus@28.1.3: + resolution: {integrity: sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - read-pkg@3.0.0: - resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} - engines: {node: '>=4'} + jest-cli@28.1.3: + resolution: {integrity: sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true - read-pkg@8.1.0: - resolution: {integrity: sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==} - engines: {node: '>=16'} + jest-config@28.1.3: + resolution: {integrity: sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true - readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + jest-diff@28.1.3: + resolution: {integrity: sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - readable-stream@4.5.2: - resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + jest-docblock@28.1.1: + resolution: {integrity: sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - readdir-glob@1.1.3: - resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + jest-each@28.1.3: + resolution: {integrity: sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + jest-environment-jsdom-global@4.0.0: + resolution: {integrity: sha512-qEV8j61oV5XhOBUQbrld2nMYKnp/AGINUaoYTtkwJ9rjvMNRN7ZaZ/dgoPpW83oFtrSiVM1gie6ajdsKFBUlLA==} + engines: {node: '>= 14'} + peerDependencies: + jest-environment-jsdom: 22.x || 23.x || 24.x || 25.x || 26.x || 27.x || 28.x || 29.x - recursive-readdir@2.2.3: - resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} - engines: {node: '>=6.0.0'} + jest-environment-jsdom@28.1.3: + resolution: {integrity: sha512-HnlGUmZRdxfCByd3GM2F100DgQOajUBzEitjGqIREcb45kGjZvRrKUdlaF6escXBdcXNl0OBh+1ZrfeZT3GnAg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + jest-environment-node@28.1.3: + resolution: {integrity: sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} + jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - regexpp@3.2.0: - resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} - engines: {node: '>=8'} + jest-get-type@28.0.2: + resolution: {integrity: sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - remove-trailing-separator@1.1.0: - resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - replace-ext@1.0.1: - resolution: {integrity: sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==} - engines: {node: '>= 0.10'} + jest-haste-map@28.1.3: + resolution: {integrity: sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - request@2.88.2: - resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} - engines: {node: '>= 6'} - deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + jest-leak-detector@28.1.3: + resolution: {integrity: sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} + jest-matcher-utils@28.1.3: + resolution: {integrity: sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - resolve-alpn@1.2.1: - resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + jest-message-util@26.6.2: + resolution: {integrity: sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==} + engines: {node: '>= 10.14.2'} - resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} + jest-message-util@28.1.3: + resolution: {integrity: sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} + jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} + jest-mock@28.1.3: + resolution: {integrity: sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - resolve.exports@1.1.1: - resolution: {integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==} - engines: {node: '>=10'} + jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true + jest-pnp-resolver@1.2.3: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true - responselike@2.0.1: - resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + jest-regex-util@28.0.2: + resolution: {integrity: sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - responselike@3.0.0: - resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} - engines: {node: '>=14.16'} + jest-resolve-dependencies@28.1.3: + resolution: {integrity: sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - resq@1.11.0: - resolution: {integrity: sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw==} + jest-resolve@28.1.3: + resolution: {integrity: sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} + jest-runner@28.1.3: + resolution: {integrity: sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} + jest-runtime@28.1.3: + resolution: {integrity: sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + jest-snapshot@28.1.3: + resolution: {integrity: sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - rgb2hex@0.2.5: - resolution: {integrity: sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==} + jest-standard-reporter@2.0.0: + resolution: {integrity: sha512-JhV3qzNzs5u/T1mzN9ivVrf2i4xYOQJgyPMKQbAmwRAZIprCpkikt8GF1kQKrP5ch1qBMn5xYyNdUUOKi8bltA==} - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true + jest-util@26.6.2: + resolution: {integrity: sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==} + engines: {node: '>= 10.14.2'} - rollup-plugin-cleanup@3.2.1: - resolution: {integrity: sha512-zuv8EhoO3TpnrU8MX8W7YxSbO4gmOR0ny06Lm3nkFfq0IVKdBUtHwhVzY1OAJyNCIAdLiyPnOrU0KnO0Fri1GQ==} - engines: {node: ^10.14.2 || >=12.0.0} - peerDependencies: - rollup: '>=2.0' + jest-util@28.1.3: + resolution: {integrity: sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - rollup-plugin-filesize@9.1.2: - resolution: {integrity: sha512-m2fE9hFaKgWKisJzyWXctOFKlgMRelo/58HgeC0lXUK/qykxiqkr6bsrotlvo2bvrwPsjgT7scNdQSr6qtl37A==} - engines: {node: '>=10.0.0'} + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - rollup-plugin-license@2.6.1: - resolution: {integrity: sha512-JPtlXF0tZKyHztKJsyd3HHmQFSkXei+596Xrb/a/bHIdDhvFuNSKimCKkQpoXyspfeVQk7CNay1MyGpFHAXjvg==} - engines: {node: '>=10.0.0'} - peerDependencies: - rollup: ^1.0.0 || ^2.0.0 + jest-validate@28.1.3: + resolution: {integrity: sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - rollup-plugin-sizes@1.0.6: - resolution: {integrity: sha512-TQlfd2Ef+1BQjsDIuXyoBPAFFJfA9q4DXSCT5/jsUEtsyn99CzwGH98StQOg+sriq9+j8VgCxPO4yodMbvynPg==} - peerDependencies: - rollup: ^2 || ^3 || ^4 + jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - rollup-plugin-terser@7.0.2: - resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} - deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser - peerDependencies: - rollup: ^2.0.0 + jest-watcher@28.1.3: + resolution: {integrity: sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - rollup-plugin-ts@2.0.7: - resolution: {integrity: sha512-M9sppRKX6y/b2KXbGdUdHid0tshAEK/sEeYLBHBJiBa4swukSsoFVXKGGZasLcjaXhgUnnizFuvFFj6znxwvSA==} - engines: {node: '>=10.0.0', npm: '>=7.0.0', pnpm: '>=3.2.0', yarn: '>=1.13'} + jest-worker@26.6.2: + resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} + engines: {node: '>= 10.13.0'} + + jest-worker@28.1.3: + resolution: {integrity: sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest@28.1.3: + resolution: {integrity: sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + hasBin: true peerDependencies: - '@babel/core': '>=6.x || >=7.x' - '@babel/plugin-transform-runtime': '>=6.x || >=7.x' - '@babel/preset-env': '>=6.x || >=7.x' - '@babel/runtime': '>=6.x || >=7.x' - '@swc/core': '>=1.x' - '@swc/helpers': '>=0.2' - rollup: '>=1.x || >=2.x' - typescript: '>=3.2.x || >= 4.x' + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: - '@babel/core': - optional: true - '@babel/plugin-transform-runtime': - optional: true - '@babel/preset-env': - optional: true - '@babel/runtime': - optional: true - '@swc/core': - optional: true - '@swc/helpers': + node-notifier: optional: true - rollup-pluginutils@2.8.2: - resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} + joi@17.13.3: + resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} - rollup@2.70.2: - resolution: {integrity: sha512-EitogNZnfku65I1DD5Mxe8JYRUCy0hkK5X84IlDtUs+O6JRMpRciXTzyCUuX11b5L5pvjH+OmFXiQ3XjabcXgg==} - engines: {node: '>=10.0.0'} - hasBin: true + js-cleanup@1.2.0: + resolution: {integrity: sha512-JeDD0yiiSt80fXzAVa/crrS0JDPQljyBG/RpOtaSbyDq03VHa9szJWMaWOYU/bcTn412uMN2MxApXq8v79cUiQ==} + engines: {node: ^10.14.2 || >=12.0.0} - run-async@3.0.0: - resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} - engines: {node: '>=0.12.0'} + js-string-escape@1.0.1: + resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} + engines: {node: '>= 0.8'} - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true - safaridriver@0.0.6: - resolution: {integrity: sha512-cU8eBBOOoCsPKb3o/lvx8ppYWFVmTsnAu2MofkPbUPCfDvyFRtD8VyOGwWTtuJTdMNIC+dPnOgaoPNnsk7zs0Q==} + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true - safaridriver@0.1.2: - resolution: {integrity: sha512-4R309+gWflJktzPXBQCobbWEHlzC4aK3a+Ov3tz2Ib2aBxiwd11phkdIBH1l0EO22x24CJMUQkpKFumRriCSRg==} + jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} - safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} + jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + jsc-android@250231.0.0: + resolution: {integrity: sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==} - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + jsc-safe-url@0.2.4: + resolution: {integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==} - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} + jscodeshift@0.14.0: + resolution: {integrity: sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==} + hasBin: true + peerDependencies: + '@babel/preset-env': ^7.1.6 - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + jsdom@19.0.0: + resolution: {integrity: sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==} + engines: {node: '>=12'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true - saucelabs@7.5.0: - resolution: {integrity: sha512-wq89BtE7xb4ns7ApbgAshaUgXHlPoseytPTNwaVQNPwAaD+0klYpBrsCy/Lj77EJ+kf/vKvX1tjhRT67eDyCXg==} + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} hasBin: true - saxes@5.0.1: - resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} - engines: {node: '>=10'} - - semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} hasBin: true - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} - engines: {node: '>=10'} - hasBin: true + json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - sentence-case@3.0.4: - resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} + json-parse-even-better-errors@3.0.2: + resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - serialize-error@11.0.3: - resolution: {integrity: sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==} - engines: {node: '>=14.16'} + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - serialize-error@7.0.1: - resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} - engines: {node: '>=10'} + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} - serialize-javascript@4.0.0: - resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + jsprim@1.4.2: + resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: '>=0.6.0'} - sha1@1.1.1: - resolution: {integrity: sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==} + jstimezonedetect@1.0.7: + resolution: {integrity: sha512-ARADHortktl9IZ1tr4GHwGPIAzgz3mLNCbR/YjWtRtc/O0o634O3NeFlpLjv95EvuDA5dc8z6yfgbS8nUc4zcQ==} - shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} + jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} - shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} + ky@0.33.3: + resolution: {integrity: sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==} + engines: {node: '>=14.16'} - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} - sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} - skip-regex@1.0.2: - resolution: {integrity: sha512-pEjMUbwJ5Pl/6Vn6FsamXHXItJXSRftcibixDmNCWbWhic0hzHrwkMZo0IZ7fMRH9KxcWDFSkzhccB4285PutA==} - engines: {node: '>=4.2'} + lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} + lighthouse-logger@1.4.2: + resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} - slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - slice-ansi@5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} + lines-and-columns@2.0.4: + resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + load-json-file@4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} - snake-case@3.0.4: - resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + load-json-file@7.0.1: + resolution: {integrity: sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - socks-proxy-agent@6.2.1: - resolution: {integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==} - engines: {node: '>= 10'} + locate-app@2.5.0: + resolution: {integrity: sha512-xIqbzPMBYArJRmPGUZD9CzV9wOqmVtQnaAn3wrj3s6WYW0bQvPI7x+sPYUGmDTYMHefVK//zc6HEYZ1qnxIK+Q==} - socks-proxy-agent@8.0.4: - resolution: {integrity: sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==} - engines: {node: '>= 14'} + locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} - socks@2.8.3: - resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} - source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} + lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} - source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - sourcemap-codec@1.4.8: - resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} - deprecated: Please use @jridgewell/sourcemap-codec instead + lodash.flattendeep@4.4.0: + resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} - spacetrim@0.11.39: - resolution: {integrity: sha512-S/baW29azJ7py5ausQRE2S6uEDQnlxgMHOEEq4V770ooBDD1/9kZnxRcco/tjZYuDuqYXblCk/r3N13ZmvHZ2g==} + lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - spdx-compare@1.0.0: - resolution: {integrity: sha512-C1mDZOX0hnu0ep9dfmuoi03+eOdDoz2yvK79RxbcrVEG1NO1Ph35yW102DHWKN4pk80nwCgeMmSY5L25VE4D9A==} + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + lodash.pickby@4.6.0: + resolution: {integrity: sha512-AZV+GsS/6ckvPOVQPXSiFFacKvKB4kOQu6ynt9wz0F3LO4R9Ij4K1ddYsIytDpSgLz88JHd9P+oaLeej5/Sl7Q==} - spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} - spdx-expression-validate@2.0.0: - resolution: {integrity: sha512-b3wydZLM+Tc6CFvaRDBOF9d76oGIHNCLYFeHbftFXUWjnfZWganmDmvtM5sm1cRwJc/VDBMLyGGrsLFd1vOxbg==} + lodash.union@4.6.0: + resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} - spdx-license-ids@3.0.20: - resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} + lodash.zip@4.2.0: + resolution: {integrity: sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==} - spdx-ranges@2.1.1: - resolution: {integrity: sha512-mcdpQFV7UDAgLpXEE/jOMqvK4LBoO0uTQg0uvXUewmEFhpiZx5yJSZITHB8w1ZahKdhfZqP5GPEOKLyEq5p8XA==} + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - spdx-satisfies@5.0.1: - resolution: {integrity: sha512-Nwor6W6gzFp8XX4neaKQ7ChV4wmpSh2sSDemMFSzHxpTw460jxFYeOn+jq4ybnSSw/5sc3pjka9MQPouksQNpw==} + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} - split-ca@1.0.1: - resolution: {integrity: sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==} + logkitty@0.7.1: + resolution: {integrity: sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==} + hasBin: true - split-on-first@1.1.0: - resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} - engines: {node: '>=6'} + loglevel-plugin-prefix@0.8.4: + resolution: {integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==} - split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} + loglevel@1.9.2: + resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} + engines: {node: '>= 0.6.0'} - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true - sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - ssh2@1.15.0: - resolution: {integrity: sha512-C0PHgX4h6lBxYx7hcXwu3QWdh4tg6tZZsTfXcdvc5caW/EMxaB4H9dWsl7qk+F7LAW762hp8VbXOX7x4xUYvEw==} - engines: {node: '>=10.16.0'} + lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} - sshpk@1.18.0: - resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} - engines: {node: '>=0.10.0'} - hasBin: true + lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - ssri@8.0.1: - resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} - engines: {node: '>= 8'} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + lru-cache@11.5.1: + resolution: {integrity: sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==} + engines: {node: 20 || >=22} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} - statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} - stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true - stream-buffers@3.0.3: - resolution: {integrity: sha512-pqMqwQCso0PBJt2PQmDO0cFj0lyqmiwOMiMSkVtRokl7e+ZTRYgDHKnuZNbqjiJXgsg4nuqtD/zxuo9KqTp0Yw==} - engines: {node: '>= 0.10.0'} + magic-string@0.25.7: + resolution: {integrity: sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==} + + magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + + magic-string@0.26.7: + resolution: {integrity: sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==} + engines: {node: '>=12'} + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + make-fetch-happen@9.1.0: + resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} + engines: {node: '>= 10'} + + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + + map-age-cleaner@0.1.3: + resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==} + engines: {node: '>=6'} + + marky@1.2.5: + resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==} + + matcher@5.0.0: + resolution: {integrity: sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + matchit@1.1.0: + resolution: {integrity: sha512-+nGYoOlfHmxe5BW5tE0EMJppXEwdSf8uBA1GTZC7Q77kbT35+VKLYJMzVNWCHSsga1ps1tPYFtFyvxvKzWVmMA==} + engines: {node: '>=6'} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + md5-hex@3.0.1: + resolution: {integrity: sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==} + engines: {node: '>=8'} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + mem@9.0.2: + resolution: {integrity: sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A==} + engines: {node: '>=12.20'} + + memoize-one@5.2.1: + resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} + + memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + + merge-options@3.0.4: + resolution: {integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==} + engines: {node: '>=10'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + metro-babel-transformer@0.80.12: + resolution: {integrity: sha512-YZziRs0MgA3pzCkkvOoQRXjIoVjvrpi/yRlJnObyIvMP6lFdtyG4nUGIwGY9VXnBvxmXD6mPY2e+NSw6JAyiRg==} + engines: {node: '>=18'} + + metro-cache-key@0.80.12: + resolution: {integrity: sha512-o4BspKnugg/pE45ei0LGHVuBJXwRgruW7oSFAeSZvBKA/sGr0UhOGY3uycOgWInnS3v5yTTfiBA9lHlNRhsvGA==} + engines: {node: '>=18'} + + metro-cache@0.80.12: + resolution: {integrity: sha512-p5kNHh2KJ0pbQI/H7ZBPCEwkyNcSz7OUkslzsiIWBMPQGFJ/xArMwkV7I+GJcWh+b4m6zbLxE5fk6fqbVK1xGA==} + engines: {node: '>=18'} + + metro-config@0.80.12: + resolution: {integrity: sha512-4rwOWwrhm62LjB12ytiuR5NgK1ZBNr24/He8mqCsC+HXZ+ATbrewLNztzbAZHtFsrxP4D4GLTGgh96pCpYLSAQ==} + engines: {node: '>=18'} + + metro-core@0.80.12: + resolution: {integrity: sha512-QqdJ/yAK+IpPs2HU/h5v2pKEdANBagSsc6DRSjnwSyJsCoHlmyJKCaCJ7KhWGx+N4OHxh37hoA8fc2CuZbx0Fw==} + engines: {node: '>=18'} + + metro-file-map@0.80.12: + resolution: {integrity: sha512-sYdemWSlk66bWzW2wp79kcPMzwuG32x1ZF3otI0QZTmrnTaaTiGyhE66P1z6KR4n2Eu5QXiABa6EWbAQv0r8bw==} + engines: {node: '>=18'} + + metro-minify-terser@0.80.12: + resolution: {integrity: sha512-muWzUw3y5k+9083ZoX9VaJLWEV2Jcgi+Oan0Mmb/fBNMPqP9xVDuy4pOMn/HOiGndgfh/MK7s4bsjkyLJKMnXQ==} + engines: {node: '>=18'} + + metro-resolver@0.80.12: + resolution: {integrity: sha512-PR24gYRZnYHM3xT9pg6BdbrGbM/Cu1TcyIFBVlAk7qDAuHkUNQ1nMzWumWs+kwSvtd9eZGzHoucGJpTUEeLZAw==} + engines: {node: '>=18'} + + metro-runtime@0.80.12: + resolution: {integrity: sha512-LIx7+92p5rpI0i6iB4S4GBvvLxStNt6fF0oPMaUd1Weku7jZdfkCZzmrtDD9CSQ6EPb0T9NUZoyXIxlBa3wOCw==} + engines: {node: '>=18'} + + metro-source-map@0.80.12: + resolution: {integrity: sha512-o+AXmE7hpvM8r8MKsx7TI21/eerYYy2DCDkWfoBkv+jNkl61khvDHlQn0cXZa6lrcNZiZkl9oHSMcwLLIrFmpw==} + engines: {node: '>=18'} + + metro-symbolicate@0.80.12: + resolution: {integrity: sha512-/dIpNdHksXkGHZXARZpL7doUzHqSNxgQ8+kQGxwpJuHnDhGkENxB5PS2QBaTDdEcmyTMjS53CN1rl9n1gR6fmw==} + engines: {node: '>=18'} + hasBin: true + + metro-transform-plugins@0.80.12: + resolution: {integrity: sha512-WQWp00AcZvXuQdbjQbx1LzFR31IInlkCDYJNRs6gtEtAyhwpMMlL2KcHmdY+wjDO9RPcliZ+Xl1riOuBecVlPA==} + engines: {node: '>=18'} + + metro-transform-worker@0.80.12: + resolution: {integrity: sha512-KAPFN1y3eVqEbKLx1I8WOarHPqDMUa8WelWxaJCNKO/yHCP26zELeqTJvhsQup+8uwB6EYi/sp0b6TGoh6lOEA==} + engines: {node: '>=18'} + + metro@0.80.12: + resolution: {integrity: sha512-1UsH5FzJd9quUsD1qY+zUG4JY3jo3YEMxbMYH9jT6NK3j4iORhlwTK8fYTfAUBhDKjgLfKjAh7aoazNE23oIRA==} + engines: {node: '>=18'} + hasBin: true + + micro-spelling-correcter@1.1.1: + resolution: {integrity: sha512-lkJ3Rj/mtjlRcHk6YyCbvZhyWTOzdBvTHsxMmZSk5jxN1YyVSQ+JETAom55mdzfcyDrY/49Z7UCW760BK30crg==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.53.0: + resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + mimic-response@4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + + minimatch@3.0.8: + resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass-collect@1.0.2: + resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} + engines: {node: '>= 8'} + + minipass-fetch@1.4.1: + resolution: {integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==} + engines: {node: '>=8'} + + minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + + minipass-json-stream@1.0.2: + resolution: {integrity: sha512-myxeeTm57lYs8pH2nxPzmEEg8DGIgW+9mv6D4JZD2pa81I/OBjeU7PtICXV6c9eRGTA5JMDsuIPUZRCyBMYNhg==} + + minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + + minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mitt@3.0.0: + resolution: {integrity: sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==} + + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + module-details-from-path@1.0.3: + resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==} + + moment-timezone@0.5.46: + resolution: {integrity: sha512-ZXm9b36esbe7OmdABqIWJuBBiLLwAjrN7CE+7sYdCCx82Nabt1wHDj8TVseS59QIlfFPbOoiBPm6ca9BioG4hw==} + + moment@2.29.1: + resolution: {integrity: sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==} + + moment@2.30.1: + resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} + + morgan@1.10.0: + resolution: {integrity: sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==} + engines: {node: '>= 0.8.0'} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + nan@2.22.0: + resolution: {integrity: sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==} + + native-promise-only@0.8.1: + resolution: {integrity: sha512-zkVhZUA3y8mbz652WrL5x0fB0ehrBkulWT3TomAQ9iDtyXZvzKeEA6GPxAItBYeNYl5yngKRX612qHOhvMkDeg==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + negotiator@0.6.4: + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + netmask@2.0.2: + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + engines: {node: '>= 0.4.0'} + + nice-try@1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + nocache@3.0.4: + resolution: {integrity: sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==} + engines: {node: '>=12.0.0'} + + node-abort-controller@3.1.1: + resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + + node-dir@0.1.17: + resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} + engines: {node: '>= 0.10.5'} + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + + node-gyp@7.1.2: + resolution: {integrity: sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==} + engines: {node: '>= 10.12.0'} + hasBin: true + + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + node-releases@2.0.47: + resolution: {integrity: sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==} + engines: {node: '>=18'} + + node-stream-zip@1.15.0: + resolution: {integrity: sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==} + engines: {node: '>=0.12.0'} + + nofilter@3.1.0: + resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} + engines: {node: '>=12.19'} + + nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-package-data@6.0.2: + resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} + engines: {node: ^16.14.0 || >=18.0.0} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + normalize-url@8.0.1: + resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} + engines: {node: '>=14.16'} + + npm-bundled@1.1.2: + resolution: {integrity: sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==} + + npm-install-checks@4.0.0: + resolution: {integrity: sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==} + engines: {node: '>=10'} + + npm-normalize-package-bin@1.0.1: + resolution: {integrity: sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==} + + npm-package-arg@8.1.5: + resolution: {integrity: sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==} + engines: {node: '>=10'} + + npm-packlist@2.2.2: + resolution: {integrity: sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg==} + engines: {node: '>=10'} + hasBin: true + + npm-pick-manifest@6.1.1: + resolution: {integrity: sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==} + + npm-registry-fetch@11.0.0: + resolution: {integrity: sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==} + engines: {node: '>=10'} + + npm-run-all@4.1.5: + resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} + engines: {node: '>= 4'} + hasBin: true + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + npmlog@4.1.2: + resolution: {integrity: sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==} + deprecated: This package is no longer supported. + + nullthrows@1.1.1: + resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} + + number-is-nan@1.0.1: + resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} + engines: {node: '>=0.10.0'} + + nwsapi@2.2.16: + resolution: {integrity: sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==} + + oauth-sign@0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + + ob1@0.80.12: + resolution: {integrity: sha512-VMArClVT6LkhUGpnuEoBuyjG9rzUyEzg4PDkav6wK1cLhOK02gPCYFxoiB4mqVnrMhDpIzJcrGNAMVi9P+hXrw==} + engines: {node: '>=18'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.3: + resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} + engines: {node: '>= 0.4'} + + object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object-path@0.11.8: + resolution: {integrity: sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==} + engines: {node: '>= 10.12.0'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + on-finished@2.3.0: + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} + engines: {node: '>= 0.8'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + open@6.4.0: + resolution: {integrity: sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==} + engines: {node: '>=8'} + + open@7.4.2: + resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} + engines: {node: '>=8'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + + p-cancelable@3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: '>=12.20'} + + p-defer@1.0.0: + resolution: {integrity: sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==} + engines: {node: '>=4'} + + p-event@5.0.1: + resolution: {integrity: sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + p-map@5.5.0: + resolution: {integrity: sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==} + engines: {node: '>=12'} + + p-map@7.0.4: + resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} + engines: {node: '>=18'} + + p-timeout@5.1.0: + resolution: {integrity: sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==} + engines: {node: '>=12'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + pac-proxy-agent@7.1.0: + resolution: {integrity: sha512-Z5FnLVVZSnX7WjBg0mhDtydeRZ1xMcATZThjySQUHqr+0ksP8kqaw23fNKkaaN/Z8gwLUs/W7xdl0I75eP2Xyw==} + engines: {node: '>= 14'} + + pac-resolver@7.0.1: + resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} + engines: {node: '>= 14'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + package-name-regex@2.0.5: + resolution: {integrity: sha512-F0lX+FBs/Bo7KWY6EuUXj+oarXU0Og1R2Zdg3F/fVcNw3pPQAKFKxUrugno0Ds5NUztlx/gRLnQW9MF+7VTqAw==} + engines: {node: '>=12'} + + pacote@11.3.5: + resolution: {integrity: sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg==} + engines: {node: '>=10'} + hasBin: true + + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-json@7.1.1: + resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==} + engines: {node: '>=16'} + + parse-ms@2.1.0: + resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} + engines: {node: '>=6'} + + parse-ms@3.0.0: + resolution: {integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==} + engines: {node: '>=12'} + + parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + + path-case@3.0.4: + resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} + + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} + + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + + path-type@3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + path-type@6.0.0: + resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} + engines: {node: '>=18'} + + path@0.12.7: + resolution: {integrity: sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + perf-regexes@1.0.1: + resolution: {integrity: sha512-L7MXxUDtqr4PUaLFCDCXBfGV/6KLIuSEccizDI7JxT+c9x1G1v04BQ4+4oag84SHaCdrBgQAIs/Cqn+flwFPng==} + engines: {node: '>=6.14'} + + performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pidtree@0.3.1: + resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} + engines: {node: '>=0.10'} + hasBin: true + + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + pkg-conf@4.0.0: + resolution: {integrity: sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + pkg-dir@3.0.0: + resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} + engines: {node: '>=6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pkg-dir@5.0.0: + resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} + engines: {node: '>=10'} + + plur@5.1.0: + resolution: {integrity: sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + polka@0.5.2: + resolution: {integrity: sha512-FVg3vDmCqP80tOrs+OeNlgXYmFppTXdjD5E7I4ET1NjvtNmQrb1/mJibybKkb/d4NA7YWAr1ojxuhpL3FHqdlw==} + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + presentable-error@0.0.1: + resolution: {integrity: sha512-E6rsNU1QNJgB3sjj7OANinGncFKuK+164sLXw1/CqBjj/EkXSoSdHCtWQGBNlREIGLnL7IEUEGa08YFVUbrhVg==} + engines: {node: '>=16'} + + pretty-format@26.6.2: + resolution: {integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==} + engines: {node: '>= 10'} + + pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + pretty-format@28.1.3: + resolution: {integrity: sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + pretty-ms@7.0.1: + resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} + engines: {node: '>=10'} + + pretty-ms@8.0.0: + resolution: {integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==} + engines: {node: '>=14.16'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + + promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + + promise@8.3.0: + resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-agent@6.3.0: + resolution: {integrity: sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==} + engines: {node: '>= 14'} + + proxy-agent@6.3.1: + resolution: {integrity: sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==} + engines: {node: '>= 14'} + + proxy-agent@6.5.0: + resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} + engines: {node: '>= 14'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + puppeteer-core@20.9.0: + resolution: {integrity: sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==} + engines: {node: '>=16.3.0'} + peerDependencies: + typescript: '>= 4.7.4' + peerDependenciesMeta: + typescript: + optional: true + + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + + qs@6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: '>=0.6'} + + query-selector-shadow-dom@1.0.1: + resolution: {integrity: sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==} + + query-string@7.1.3: + resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} + engines: {node: '>=6'} + + querystring@0.2.1: + resolution: {integrity: sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==} + engines: {node: '>=0.4.x'} + deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. + + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + + queue@6.0.2: + resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + randomcolor@0.6.2: + resolution: {integrity: sha512-Mn6TbyYpFgwFuQ8KJKqf3bqqY9O1y37/0jgSK/61PUxV4QfIMv0+K2ioq8DfOjkBslcjwSzRfIDEXfzA9aCx7A==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + react-devtools-core@5.3.2: + resolution: {integrity: sha512-crr9HkVrDiJ0A4zot89oS0Cgv0Oa4OG1Em4jit3P3ZxZSKPMYyMjfwMqgcJna9o625g8oN87rBm8SWWrSTBZxg==} + + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-native-builder-bob@0.42.1: + resolution: {integrity: sha512-piw301vvc+lDydNkKJfpJfLFyKH5ORcdFeHUUiSo/NIxhAT2SU8TZjvYyZsUmTpCPKwnapmZis3fRSOJpJTCkw==} + engines: {node: ^20.19.0 || ^22.12.0 || >= 23.4.0} + hasBin: true + + react-native-get-random-values@1.11.0: + resolution: {integrity: sha512-4BTbDbRmS7iPdhYLRcz3PGFIpFJBwNZg9g42iwa2P6FOv9vZj/xJc678RZXnLNZzd0qd7Q3CCF6Yd+CU2eoXKQ==} + peerDependencies: + react-native: '>=0.56' + + react-native-monorepo-config@0.3.5: + resolution: {integrity: sha512-Xdu7k0s4V2FHn2OGnlr3D22Dgt5ij0ek9yzloPoLkHh3rL/jUQbPrawieKsAbkqoenv/7pfPJwMlPT27bvN1fg==} + + react-native@0.74.5: + resolution: {integrity: sha512-Bgg2WvxaGODukJMTZFTZBNMKVaROHLwSb8VAGEdrlvKwfb1hHg/3aXTUICYk7dwgAnb+INbGMwnF8yeAgIUmqw==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@types/react': ^18.2.6 + react: 18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + + react-shallow-renderer@16.15.0: + resolution: {integrity: sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==} + peerDependencies: + react: ^16.0.0 || ^17.0.0 || ^18.0.0 + + react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + + read-package-json-fast@2.0.3: + resolution: {integrity: sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==} + engines: {node: '>=10'} + + read-pkg-up@10.0.0: + resolution: {integrity: sha512-jgmKiS//w2Zs+YbX039CorlkOp8FIVbSAN8r8GJHDsGlmNPXo+VeHkqAwCiQVTTx5/LwLZTcEw59z3DvcLbr0g==} + engines: {node: '>=16'} + + read-pkg@3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + + read-pkg@8.1.0: + resolution: {integrity: sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==} + engines: {node: '>=16'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readable-stream@4.6.0: + resolution: {integrity: sha512-cbAdYt0VcnpN2Bekq7PU+k363ZRsPwJoEEJOEtSJQlJXzwaxt3FIo/uL+KeDSGIjJqtkwyge4KQgD2S2kd+CQw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readline@1.3.0: + resolution: {integrity: sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==} + + recast@0.21.5: + resolution: {integrity: sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==} + engines: {node: '>= 4'} + + recursive-readdir@2.2.3: + resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} + engines: {node: '>=6.0.0'} + + reflect.getprototypeof@1.0.9: + resolution: {integrity: sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q==} + engines: {node: '>= 0.4'} + + regenerate-unicode-properties@10.2.0: + resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} + engines: {node: '>=4'} + + regenerate-unicode-properties@10.2.2: + resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regexp.prototype.flags@1.5.3: + resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} + engines: {node: '>= 0.4'} + + regexpp@3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + + regexpu-core@6.2.0: + resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} + engines: {node: '>=4'} + + regexpu-core@6.4.0: + resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} + engines: {node: '>=4'} + + regjsgen@0.8.0: + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + + regjsparser@0.12.0: + resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} + hasBin: true + + regjsparser@0.13.1: + resolution: {integrity: sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==} + hasBin: true + + request@2.88.2: + resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} + engines: {node: '>= 6'} + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-from@3.0.0: + resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} + engines: {node: '>=4'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve.exports@1.1.1: + resolution: {integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==} + engines: {node: '>=10'} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} + engines: {node: '>= 0.4'} + hasBin: true + + responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + + responselike@3.0.0: + resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} + engines: {node: '>=14.16'} + + resq@1.11.0: + resolution: {integrity: sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw==} + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rgb2hex@0.2.5: + resolution: {integrity: sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==} + + rimraf@2.6.3: + resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rollup-plugin-cleanup@3.2.1: + resolution: {integrity: sha512-zuv8EhoO3TpnrU8MX8W7YxSbO4gmOR0ny06Lm3nkFfq0IVKdBUtHwhVzY1OAJyNCIAdLiyPnOrU0KnO0Fri1GQ==} + engines: {node: ^10.14.2 || >=12.0.0} + peerDependencies: + rollup: '>=2.0' + + rollup-plugin-filesize@9.1.2: + resolution: {integrity: sha512-m2fE9hFaKgWKisJzyWXctOFKlgMRelo/58HgeC0lXUK/qykxiqkr6bsrotlvo2bvrwPsjgT7scNdQSr6qtl37A==} + engines: {node: '>=10.0.0'} + + rollup-plugin-license@2.6.1: + resolution: {integrity: sha512-JPtlXF0tZKyHztKJsyd3HHmQFSkXei+596Xrb/a/bHIdDhvFuNSKimCKkQpoXyspfeVQk7CNay1MyGpFHAXjvg==} + engines: {node: '>=10.0.0'} + peerDependencies: + rollup: ^1.0.0 || ^2.0.0 + + rollup-plugin-sizes@1.0.6: + resolution: {integrity: sha512-TQlfd2Ef+1BQjsDIuXyoBPAFFJfA9q4DXSCT5/jsUEtsyn99CzwGH98StQOg+sriq9+j8VgCxPO4yodMbvynPg==} + peerDependencies: + rollup: ^2 || ^3 || ^4 + + rollup-plugin-terser@7.0.2: + resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} + deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser + peerDependencies: + rollup: ^2.0.0 + + rollup-plugin-ts@2.0.7: + resolution: {integrity: sha512-M9sppRKX6y/b2KXbGdUdHid0tshAEK/sEeYLBHBJiBa4swukSsoFVXKGGZasLcjaXhgUnnizFuvFFj6znxwvSA==} + engines: {node: '>=10.0.0', npm: '>=7.0.0', pnpm: '>=3.2.0', yarn: '>=1.13'} + deprecated: please use @rollup/plugin-typescript and rollup-plugin-dts instead + peerDependencies: + '@babel/core': '>=6.x || >=7.x' + '@babel/plugin-transform-runtime': '>=6.x || >=7.x' + '@babel/preset-env': '>=6.x || >=7.x' + '@babel/runtime': '>=6.x || >=7.x' + '@swc/core': '>=1.x' + '@swc/helpers': '>=0.2' + rollup: '>=1.x || >=2.x' + typescript: '>=3.2.x || >= 4.x' + peerDependenciesMeta: + '@babel/core': + optional: true + '@babel/plugin-transform-runtime': + optional: true + '@babel/preset-env': + optional: true + '@babel/runtime': + optional: true + '@swc/core': + optional: true + '@swc/helpers': + optional: true + + rollup-pluginutils@2.8.2: + resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} + + rollup@2.70.2: + resolution: {integrity: sha512-EitogNZnfku65I1DD5Mxe8JYRUCy0hkK5X84IlDtUs+O6JRMpRciXTzyCUuX11b5L5pvjH+OmFXiQ3XjabcXgg==} + engines: {node: '>=10.0.0'} + hasBin: true + + run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + safaridriver@0.0.6: + resolution: {integrity: sha512-cU8eBBOOoCsPKb3o/lvx8ppYWFVmTsnAu2MofkPbUPCfDvyFRtD8VyOGwWTtuJTdMNIC+dPnOgaoPNnsk7zs0Q==} + + safaridriver@0.1.2: + resolution: {integrity: sha512-4R309+gWflJktzPXBQCobbWEHlzC4aK3a+Ov3tz2Ib2aBxiwd11phkdIBH1l0EO22x24CJMUQkpKFumRriCSRg==} + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + saucelabs@7.5.0: + resolution: {integrity: sha512-wq89BtE7xb4ns7ApbgAshaUgXHlPoseytPTNwaVQNPwAaD+0klYpBrsCy/Lj77EJ+kf/vKvX1tjhRT67eDyCXg==} + hasBin: true + + saxes@5.0.1: + resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} + engines: {node: '>=10'} + + scheduler@0.24.0-canary-efb381bbf-20230505: + resolution: {integrity: sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==} + + selfsigned@2.4.1: + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} + engines: {node: '>=10'} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} + + sentence-case@3.0.4: + resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} + + serialize-error@11.0.3: + resolution: {integrity: sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==} + engines: {node: '>=14.16'} + + serialize-error@2.1.0: + resolution: {integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==} + engines: {node: '>=0.10.0'} + + serialize-error@7.0.1: + resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} + engines: {node: '>=10'} + + serialize-javascript@4.0.0: + resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} + + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + engines: {node: '>= 0.8.0'} + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + + shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.2: + resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} + engines: {node: '>= 0.4'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + skip-regex@1.0.2: + resolution: {integrity: sha512-pEjMUbwJ5Pl/6Vn6FsamXHXItJXSRftcibixDmNCWbWhic0hzHrwkMZo0IZ7fMRH9KxcWDFSkzhccB4285PutA==} + engines: {node: '>=4.2'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + + slice-ansi@2.1.0: + resolution: {integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==} + engines: {node: '>=6'} + + slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + + socks-proxy-agent@6.2.1: + resolution: {integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==} + engines: {node: '>= 10'} + + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} + engines: {node: '>= 14'} + + socks@2.8.3: + resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + + source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + + spacetrim@0.11.59: + resolution: {integrity: sha512-lLYsktklSRKprreOm7NXReW8YiX2VBjbgmXYEziOoGf/qsJqAEACaDvoTtUOycwjpaSh+bT8eu0KrJn7UNxiCg==} + + spdx-compare@1.0.0: + resolution: {integrity: sha512-C1mDZOX0hnu0ep9dfmuoi03+eOdDoz2yvK79RxbcrVEG1NO1Ph35yW102DHWKN4pk80nwCgeMmSY5L25VE4D9A==} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-expression-validate@2.0.0: + resolution: {integrity: sha512-b3wydZLM+Tc6CFvaRDBOF9d76oGIHNCLYFeHbftFXUWjnfZWganmDmvtM5sm1cRwJc/VDBMLyGGrsLFd1vOxbg==} + + spdx-license-ids@3.0.20: + resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} + + spdx-ranges@2.1.1: + resolution: {integrity: sha512-mcdpQFV7UDAgLpXEE/jOMqvK4LBoO0uTQg0uvXUewmEFhpiZx5yJSZITHB8w1ZahKdhfZqP5GPEOKLyEq5p8XA==} + + spdx-satisfies@5.0.1: + resolution: {integrity: sha512-Nwor6W6gzFp8XX4neaKQ7ChV4wmpSh2sSDemMFSzHxpTw460jxFYeOn+jq4ybnSSw/5sc3pjka9MQPouksQNpw==} + + split-ca@1.0.1: + resolution: {integrity: sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==} + + split-on-first@1.1.0: + resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} + engines: {node: '>=6'} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + ssh2@1.16.0: + resolution: {integrity: sha512-r1X4KsBGedJqo7h8F5c4Ybpcr5RjyP+aWIG007uBPRjmdQWfEiVLzSK71Zji1B9sKxwaCvD8y8cwSkYrlLiRRg==} + engines: {node: '>=10.16.0'} + + sshpk@1.18.0: + resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + ssri@8.0.1: + resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} + engines: {node: '>= 8'} + + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + + stackframe@1.3.4: + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + + stacktrace-parser@0.1.10: + resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} + engines: {node: '>=6'} + + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + stream-buffers@3.0.3: + resolution: {integrity: sha512-pqMqwQCso0PBJt2PQmDO0cFj0lyqmiwOMiMSkVtRokl7e+ZTRYgDHKnuZNbqjiJXgsg4nuqtD/zxuo9KqTp0Yw==} + engines: {node: '>= 0.10.0'} streamifier@0.1.1: resolution: {integrity: sha512-zDgl+muIlWzXNsXeyUfOk9dChMjlpkq0DRsxujtYPgyJ676yQ8jEm6zzaaWHFDg5BNcLuif0eD2MTyJdZqXpdg==} engines: {node: '>=0.10'} - streamx@2.20.0: - resolution: {integrity: sha512-ZGd1LhDeGFucr1CUCTBOS58ZhEendd0ttpGT3usTvosS4ntIwKN9LJFp+OeCSprsCPL14BXVRZlHGRY1V9PVzQ==} + streamx@2.21.1: + resolution: {integrity: sha512-PhP9wUnFLa+91CPy3N6tiQsK+gnYyUNuk15S3YG/zjYE7RuPeCjJngqnzpC31ow0lzBHQ+QGO4cNJnd0djYUsw==} + + strict-uri-encode@2.0.0: + resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} + engines: {node: '>=4'} + + string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + + string-width@1.0.2: + resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} + engines: {node: '>=0.10.0'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string.prototype.padend@3.1.6: + resolution: {integrity: sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==} + engines: {node: '>= 0.4'} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + + strip-ansi@5.2.0: + resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} + engines: {node: '>=6'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strnum@1.0.5: + resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + + sudo-prompt@9.2.1: + resolution: {integrity: sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + supertap@3.0.1: + resolution: {integrity: sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-hyperlinks@2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + tar-fs@2.0.1: + resolution: {integrity: sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==} + + tar-fs@3.0.4: + resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==} + + tar-fs@3.0.6: + resolution: {integrity: sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==} + + tar-stream@1.6.2: + resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==} + engines: {node: '>= 0.8.0'} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + + tcp-port-used@1.0.2: + resolution: {integrity: sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==} + + temp-dir@2.0.0: + resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} + engines: {node: '>=8'} + + temp-dir@3.0.0: + resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} + engines: {node: '>=14.16'} + + temp@0.8.4: + resolution: {integrity: sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==} + engines: {node: '>=6.0.0'} + + terminal-link@2.1.1: + resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} + engines: {node: '>=8'} + + terser@5.37.0: + resolution: {integrity: sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==} + engines: {node: '>=10'} + hasBin: true + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + text-decoder@1.2.3: + resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + throat@5.0.0: + resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} + + through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + time-zone@1.0.0: + resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==} + engines: {node: '>=4'} + + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + + to-buffer@1.1.1: + resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tough-cookie@2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + + tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + engines: {node: '>=6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tr46@3.0.0: + resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} + engines: {node: '>=12'} + + trouter@2.0.1: + resolution: {integrity: sha512-kr8SKKw94OI+xTGOkfsvwZQ8mWoikZDd2n8XZHjJVZUARZT+4/VV6cacRS6CLsH9bNm+HFIPU1Zx4CnNnb4qlQ==} + engines: {node: '>=6'} + + ts-clone-node@0.3.32: + resolution: {integrity: sha512-YYGvoWy2Ba98/YC/0leD7IRsU/q5pu/KRg9dD8omzkbgoZ8g7gfYfED9mWMTyNp7J3CQiiKyvM62B7mXXHKU7Q==} + engines: {node: '>=10.0.0'} + peerDependencies: + typescript: ^3.x || ^4.x + + ts-jest@28.0.8: + resolution: {integrity: sha512-5FaG0lXmRPzApix8oFG8RKjAz4ehtm8yMKOTy5HX3fY6W8kmvOrmcY0hKDElW52FJov+clhUbrKAqofnj4mXTg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^28.0.0 + babel-jest: ^28.0.0 + esbuild: '*' + jest: ^28.0.0 + typescript: '>=4.3' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsutils@3.21.0: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + tunnel@0.0.6: + resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} + engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} + + tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@0.7.1: + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: '>=8'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + + type-fest@4.26.0: + resolution: {integrity: sha512-OduNjVJsFbifKb57UqZ2EMP1i4u64Xwow3NYXUtBbD4vIwJdQd4+xl8YDou1dlm4DVrtwT/7Ky8z8WyCULVfxw==} + engines: {node: '>=16'} + + type-fest@4.31.0: + resolution: {integrity: sha512-yCxltHW07Nkhv/1F6wWBr8kz+5BGMfP+RbRSYFnegVb0qV/UMT0G0ElBloPVerqn4M2ZV80Ir1FtCcYv1cT6vQ==} + engines: {node: '>=16'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typescript@4.6.4: + resolution: {integrity: sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==} + engines: {node: '>=4.2.0'} + hasBin: true + + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} + engines: {node: '>=14.17'} + hasBin: true + + ua-parser-js@1.0.40: + resolution: {integrity: sha512-z6PJ8Lml+v3ichVojCiB8toQJBuwR42ySM4ezjXIqXK3M0HczmKQ3LF4rhU55PfD99KEEXQG6yb7iOMyvYuHew==} + hasBin: true + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + unbzip2-stream@1.4.3: + resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + unicode-canonical-property-names-ecmascript@2.0.1: + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.2.0: + resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.2.1: + resolution: {integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + + unique-filename@1.1.1: + resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} + + unique-slug@2.0.2: + resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + update-browserslist-db@1.1.1: + resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' - strict-uri-encode@2.0.0: - resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} - engines: {node: '>=4'} + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' - string-length@4.0.2: - resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + upper-case-first@2.0.2: + resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} + + upper-case@2.0.2: + resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + + userhome@1.0.1: + resolution: {integrity: sha512-5cnLm4gseXjAclKowC4IjByaGsjtAoV6PrOQOljplNB54ReUYJP8HdAFq2muHinSDAh09PPX/uXDPfdxRHvuSA==} + engines: {node: '>= 0.8.0'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + util@0.10.4: + resolution: {integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + uuid@11.1.1: + resolution: {integrity: sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==} + hasBin: true + + uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). + hasBin: true + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + v8-compile-cache@2.4.0: + resolution: {integrity: sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==} + + v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} + engines: {node: '>=10.12.0'} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + validate-npm-package-name@3.0.0: + resolution: {integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + verror@1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} + + vlq@1.0.1: + resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} + + w3c-hr-time@1.0.2: + resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} + deprecated: Use your platform's native performance.now() and performance.timeOrigin. + + w3c-xmlserializer@3.0.0: + resolution: {integrity: sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==} + engines: {node: '>=12'} + + wait-port@1.1.0: + resolution: {integrity: sha512-3e04qkoN3LxTMLakdqeWth8nih8usyg+sf1Bgdf9wwUkp05iuK1eSY/QpLvscT/+F/gA89+LpUmmgBtesbqI2Q==} engines: {node: '>=10'} + hasBin: true - string-width@1.0.2: - resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + wdio-chromedriver-service@8.1.1: + resolution: {integrity: sha512-pN3GiOkTIMnalfq4PJAHdX95pDp1orHnTY8W1fIbd6ok81ba97UjerTgS7lUDRUh1p0MAm35Ww0uc0/9wzB7SA==} + engines: {node: ^16.13 || >=18} + peerDependencies: + '@wdio/types': ^7.0.0 || ^8.0.0-alpha.219 + chromedriver: '*' + webdriverio: ^7.0.0 || ^8.0.0-alpha.219 + peerDependenciesMeta: + '@wdio/types': + optional: true + chromedriver: + optional: true + + wdio-edgedriver-service@3.0.3: + resolution: {integrity: sha512-oHKUFnh9Nn4s749Yl8hp20xvfF8GnK4jNV84qoy52/a0ETgWh0FG5qlRVXBIqIulqhGlfrCgL5/pIizMnEix1w==} + engines: {node: ^16.13 || >=18} + peerDependencies: + '@wdio/types': ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + '@wdio/types': + optional: true + + wdio-safaridriver-service@2.1.1: + resolution: {integrity: sha512-Rz8uls7EY0bHOZJpykmAMIQzT0gNe6lg32XdCjO/ppSvscWKP57lePGWD80RCU4kKnwX1TbrTivqfjl6vK/1rQ==} + engines: {node: ^16.13 || >=18} + peerDependencies: + '@wdio/types': ^7.0.0 || ^8.0.0-alpha.219 + webdriverio: ^7.0.0 || ^8.0.0-alpha.219 + peerDependenciesMeta: + '@wdio/types': + optional: true + + weakmap-polyfill@2.0.4: + resolution: {integrity: sha512-ZzxBf288iALJseijWelmECm/1x7ZwQn3sMYIkDr2VvZp7r6SEKuT8D0O9Wiq6L9Nl5mazrOMcmiZE/2NCenaxw==} + engines: {node: '>=8.10.0'} + + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + web-vitals@4.2.4: + resolution: {integrity: sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==} + + webdriver@8.39.0: + resolution: {integrity: sha512-Kc3+SfiH4ufyrIht683VT2vnJocx0pfH8rYdyPvEh1b2OYewtFTHK36k9rBDHZiBmk6jcSXs4M2xeFgOuon9Lg==} + engines: {node: ^16.13 || >=18} + + webdriverio@8.39.1: + resolution: {integrity: sha512-dPwLgLNtP+l4vnybz+YFxxH8nBKOP7j6VVzKtfDyTLDQg9rz3U8OA4xMMQCBucnrVXy3KcKxGqlnMa+c4IfWCQ==} + engines: {node: ^16.13 || >=18} + peerDependencies: + devtools: ^8.14.0 + peerDependenciesMeta: + devtools: + optional: true + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + well-known-symbols@2.0.0: + resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} + engines: {node: '>=6'} + + whatwg-encoding@2.0.0: + resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} + engines: {node: '>=12'} + + whatwg-fetch@3.6.20: + resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} + + whatwg-mimetype@3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} + + whatwg-url@10.0.0: + resolution: {integrity: sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==} + engines: {node: '>=12'} + + whatwg-url@11.0.0: + resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} + engines: {node: '>=12'} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + + which-typed-array@1.1.18: + resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} + engines: {node: '>= 0.4'} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + + which@6.0.1: + resolution: {integrity: sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==} + engines: {node: ^20.17.0 || >=22.9.0} + hasBin: true + + wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + + widest-line@3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@2.4.3: + resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} + + write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + ws@6.2.3: + resolution: {integrity: sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==} + + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} - string.prototype.padend@3.1.6: - resolution: {integrity: sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==} - engines: {node: '>= 0.4'} + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} - string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} - string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - strip-ansi@3.0.1: - resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} - engines: {node: '>=0.10.0'} + yaml@2.6.1: + resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==} + engines: {node: '>= 14'} + hasBin: true - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} - strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} engines: {node: '>=8'} - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - - strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + yargs@17.7.1: + resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==} engines: {node: '>=12'} - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} - strnum@1.0.5: - resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + yargs@18.0.0: + resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} - supertap@3.0.1: - resolution: {integrity: sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + yazl@2.5.1: + resolution: {integrity: sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==} - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - supports-hyperlinks@2.3.0: - resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} - engines: {node: '>=8'} + yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} + engines: {node: '>=12.20'} - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} + zip-stream@6.0.1: + resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} + engines: {node: '>= 14'} - symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} +snapshots: - tar-fs@2.0.1: - resolution: {integrity: sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==} + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 - tar-fs@3.0.4: - resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==} + '@ark/schema@0.56.0': + dependencies: + '@ark/util': 0.56.0 - tar-fs@3.0.6: - resolution: {integrity: sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==} + '@ark/util@0.56.0': {} - tar-stream@1.6.2: - resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==} - engines: {node: '>= 0.8.0'} + '@arr/every@1.0.1': {} - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 - tar-stream@3.1.7: - resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 - tar@6.2.1: - resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} - engines: {node: '>=10'} + '@babel/compat-data@7.26.3': {} - tcp-port-used@1.0.2: - resolution: {integrity: sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==} + '@babel/compat-data@7.29.7': {} - temp-dir@3.0.0: - resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} - engines: {node: '>=14.16'} + '@babel/core@7.26.0': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.3 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helpers': 7.26.0 + '@babel/parser': 7.26.3 + '@babel/template': 7.25.9 + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 + convert-source-map: 2.0.0 + debug: 4.4.0 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color - terminal-link@2.1.1: - resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} - engines: {node: '>=8'} + '@babel/core@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.0 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color - terser@5.31.6: - resolution: {integrity: sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==} - engines: {node: '>=10'} - hasBin: true + '@babel/generator@7.26.3': + dependencies: + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 - test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} + '@babel/generator@7.29.7': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 - text-decoder@1.1.1: - resolution: {integrity: sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==} + '@babel/helper-annotate-as-pure@7.25.9': + dependencies: + '@babel/types': 7.26.3 - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + '@babel/helper-annotate-as-pure@7.29.7': + dependencies: + '@babel/types': 7.29.7 - throat@6.0.2: - resolution: {integrity: sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==} + '@babel/helper-compilation-targets@7.25.9': + dependencies: + '@babel/compat-data': 7.26.3 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.3 + lru-cache: 5.1.1 + semver: 6.3.1 - through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + '@babel/helper-compilation-targets@7.29.7': + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + browserslist: 4.28.2 + lru-cache: 5.1.1 + semver: 6.3.1 - time-zone@1.0.0: - resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==} - engines: {node: '>=4'} + '@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/traverse': 7.26.4 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color - tinyrainbow@1.2.0: - resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} - engines: {node: '>=14.0.0'} + '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/traverse': 7.29.7 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color - tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} + '@babel/helper-create-regexp-features-plugin@7.26.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + regexpu-core: 6.2.0 + semver: 6.3.1 - tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + '@babel/helper-create-regexp-features-plugin@7.26.3(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.25.9 + regexpu-core: 6.2.0 + semver: 6.3.1 - to-buffer@1.1.1: - resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==} + '@babel/helper-create-regexp-features-plugin@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + regexpu-core: 6.4.0 + semver: 6.3.1 - to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} + '@babel/helper-define-polyfill-provider@0.6.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + debug: 4.4.0 + lodash.debounce: 4.0.8 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + '@babel/helper-define-polyfill-provider@0.6.3(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + debug: 4.4.0 + lodash.debounce: 4.0.8 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + optional: true - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} + '@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + debug: 4.4.3 + lodash.debounce: 4.0.8 + resolve: 1.22.12 + transitivePeerDependencies: + - supports-color - tough-cookie@2.5.0: - resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} - engines: {node: '>=0.8'} + '@babel/helper-environment-visitor@7.24.7': + dependencies: + '@babel/types': 7.26.3 - tough-cookie@4.1.4: - resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} - engines: {node: '>=6'} + '@babel/helper-globals@7.29.7': {} - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + '@babel/helper-member-expression-to-functions@7.25.9': + dependencies: + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 + transitivePeerDependencies: + - supports-color - tr46@2.1.0: - resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} - engines: {node: '>=8'} + '@babel/helper-member-expression-to-functions@7.29.7': + dependencies: + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color - trouter@2.0.1: - resolution: {integrity: sha512-kr8SKKw94OI+xTGOkfsvwZQ8mWoikZDd2n8XZHjJVZUARZT+4/VV6cacRS6CLsH9bNm+HFIPU1Zx4CnNnb4qlQ==} - engines: {node: '>=6'} + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 + transitivePeerDependencies: + - supports-color - ts-clone-node@0.3.32: - resolution: {integrity: sha512-YYGvoWy2Ba98/YC/0leD7IRsU/q5pu/KRg9dD8omzkbgoZ8g7gfYfED9mWMTyNp7J3CQiiKyvM62B7mXXHKU7Q==} - engines: {node: '>=10.0.0'} - peerDependencies: - typescript: ^3.x || ^4.x + '@babel/helper-module-imports@7.29.7': + dependencies: + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.26.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.25.9': + dependencies: + '@babel/types': 7.26.3 + + '@babel/helper-optimise-call-expression@7.29.7': + dependencies: + '@babel/types': 7.29.7 + + '@babel/helper-plugin-utils@7.25.9': {} + + '@babel/helper-plugin-utils@7.29.7': {} + + '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-wrap-function': 7.25.9 + '@babel/traverse': 7.26.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-remap-async-to-generator@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-wrap-function': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color - ts-jest@27.1.5: - resolution: {integrity: sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@types/jest': ^27.0.0 - babel-jest: '>=27.0.0 <28' - esbuild: '*' - jest: ^27.0.0 - typescript: '>=3.8 <5.0' - peerDependenciesMeta: - '@babel/core': - optional: true - '@types/jest': - optional: true - babel-jest: - optional: true - esbuild: - optional: true + '@babel/helper-replace-supers@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/traverse': 7.26.4 + transitivePeerDependencies: + - supports-color - ts-node@10.9.2: - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true + '@babel/helper-replace-supers@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color - tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + dependencies: + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 + transitivePeerDependencies: + - supports-color - tslib@2.7.0: - resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + dependencies: + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color - tsutils@3.21.0: - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + '@babel/helper-string-parser@7.25.9': {} - tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + '@babel/helper-string-parser@7.29.7': {} - tunnel@0.0.6: - resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} - engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} + '@babel/helper-validator-identifier@7.25.9': {} - tweetnacl@0.14.5: - resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + '@babel/helper-validator-identifier@7.29.7': {} - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + '@babel/helper-validator-option@7.25.9': {} - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} + '@babel/helper-validator-option@7.29.7': {} - type-fest@0.13.1: - resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} - engines: {node: '>=10'} + '@babel/helper-wrap-function@7.25.9': + dependencies: + '@babel/template': 7.25.9 + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 + transitivePeerDependencies: + - supports-color - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} + '@babel/helper-wrap-function@7.29.7': + dependencies: + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color - type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} + '@babel/helpers@7.26.0': + dependencies: + '@babel/template': 7.25.9 + '@babel/types': 7.26.3 - type-fest@2.13.0: - resolution: {integrity: sha512-lPfAm42MxE4/456+QyIaaVBAwgpJb6xZ8PRu09utnhPdWwcyj9vgy6Sq0Z5yNbJ21EdxB5dRU/Qg8bsyAMtlcw==} - engines: {node: '>=12.20'} + '@babel/helpers@7.29.7': + dependencies: + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 - type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} + '@babel/parser@7.26.3': + dependencies: + '@babel/types': 7.26.3 - type-fest@3.13.1: - resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} - engines: {node: '>=14.16'} + '@babel/parser@7.29.7': + dependencies: + '@babel/types': 7.29.7 - type-fest@4.26.0: - resolution: {integrity: sha512-OduNjVJsFbifKb57UqZ2EMP1i4u64Xwow3NYXUtBbD4vIwJdQd4+xl8YDou1dlm4DVrtwT/7Ky8z8WyCULVfxw==} - engines: {node: '>=16'} + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color - type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} + '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + transitivePeerDependencies: + - supports-color - typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.7) + transitivePeerDependencies: + - supports-color - typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color - typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + '@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color - typescript@4.6.4: - resolution: {integrity: sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==} - engines: {node: '>=4.2.0'} - hasBin: true + '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color - ua-parser-js@1.0.38: - resolution: {integrity: sha512-Aq5ppTOfvrCMgAPneW1HfWj66Xi7XL+/mIy996R1/CLS/rcyJQm6QZdsKrUeivDFQ+Oc9Wyuwor8Ze8peEoUoQ==} + '@babel/plugin-proposal-export-default-from@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + '@babel/plugin-proposal-logical-assignment-operators@7.20.7(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.26.0) - unbzip2-stream@1.4.3: - resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.0) - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + '@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.0) - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + '@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.26.0)': + dependencies: + '@babel/compat-data': 7.26.3 + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) - unique-filename@1.1.1: - resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} + '@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.26.0) - unique-slug@2.0.2: - resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} + '@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color - universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 - universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.25.9 + optional: true - update-browserslist-db@1.1.0: - resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - upper-case-first@2.0.2: - resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.25.9 + optional: true - upper-case@2.0.2: - resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.25.9 + optional: true - url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - userhome@1.0.0: - resolution: {integrity: sha512-ayFKY3H+Pwfy4W98yPdtH1VqH4psDeyW8lYYFzfecR9d6hqLpqhecktvYR3SEEXt7vG0S1JEpciI3g94pMErig==} - engines: {node: '>= 0.8.0'} + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.25.9 + optional: true - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - util@0.10.4: - resolution: {integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==} + '@babel/plugin-syntax-export-default-from@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} + '@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - uuid@10.0.0: - resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} - hasBin: true + '@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - uuid@3.4.0: - resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} - deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. - hasBin: true + '@babel/plugin-syntax-import-assertions@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - uuid@8.1.0: - resolution: {integrity: sha512-CI18flHDznR0lq54xBycOVmphdCYnQLKn8abKn7PXUiKUGdEd+/l9LWNJmugXel4hXq7S+RMNl34ecyC9TntWg==} - hasBin: true + '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.25.9 + optional: true - v8-compile-cache@2.4.0: - resolution: {integrity: sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==} + '@babel/plugin-syntax-import-attributes@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - v8-to-istanbul@8.1.1: - resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==} - engines: {node: '>=10.12.0'} + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.25.9 + optional: true - validate-npm-package-name@3.0.0: - resolution: {integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==} + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.25.9 + optional: true - verror@1.10.0: - resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} - engines: {'0': node >=0.6.0} + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - vinyl-sourcemaps-apply@0.2.1: - resolution: {integrity: sha512-+oDh3KYZBoZC8hfocrbrxbLUeaYtQK7J5WU5Br9VqWqmCll3tFJqKp97GC9GmMsVIL0qnx2DgEDVxdo5EZ5sSw==} + '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - vinyl@2.2.1: - resolution: {integrity: sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==} - engines: {node: '>= 0.10'} + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - w3c-hr-time@1.0.2: - resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} - deprecated: Use your platform's native performance.now() and performance.timeOrigin. + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.25.9 + optional: true - w3c-xmlserializer@2.0.0: - resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} - engines: {node: '>=10'} + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - wait-port@1.1.0: - resolution: {integrity: sha512-3e04qkoN3LxTMLakdqeWth8nih8usyg+sf1Bgdf9wwUkp05iuK1eSY/QpLvscT/+F/gA89+LpUmmgBtesbqI2Q==} - engines: {node: '>=10'} - hasBin: true + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.25.9 + optional: true - walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.25.9 + optional: true - wdio-chromedriver-service@8.1.1: - resolution: {integrity: sha512-pN3GiOkTIMnalfq4PJAHdX95pDp1orHnTY8W1fIbd6ok81ba97UjerTgS7lUDRUh1p0MAm35Ww0uc0/9wzB7SA==} - engines: {node: ^16.13 || >=18} - peerDependencies: - '@wdio/types': ^7.0.0 || ^8.0.0-alpha.219 - chromedriver: '*' - webdriverio: ^7.0.0 || ^8.0.0-alpha.219 - peerDependenciesMeta: - '@wdio/types': - optional: true - chromedriver: - optional: true + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.25.9 + optional: true - wdio-edgedriver-service@3.0.3: - resolution: {integrity: sha512-oHKUFnh9Nn4s749Yl8hp20xvfF8GnK4jNV84qoy52/a0ETgWh0FG5qlRVXBIqIulqhGlfrCgL5/pIizMnEix1w==} - engines: {node: ^16.13 || >=18} - peerDependencies: - '@wdio/types': ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - '@wdio/types': - optional: true + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - wdio-safaridriver-service@2.1.1: - resolution: {integrity: sha512-Rz8uls7EY0bHOZJpykmAMIQzT0gNe6lg32XdCjO/ppSvscWKP57lePGWD80RCU4kKnwX1TbrTivqfjl6vK/1rQ==} - engines: {node: ^16.13 || >=18} - peerDependencies: - '@wdio/types': ^7.0.0 || ^8.0.0-alpha.219 - webdriverio: ^7.0.0 || ^8.0.0-alpha.219 - peerDependenciesMeta: - '@wdio/types': - optional: true + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.25.9 + optional: true - weakmap-polyfill@2.0.4: - resolution: {integrity: sha512-ZzxBf288iALJseijWelmECm/1x7ZwQn3sMYIkDr2VvZp7r6SEKuT8D0O9Wiq6L9Nl5mazrOMcmiZE/2NCenaxw==} - engines: {node: '>=8.10.0'} + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - web-streams-polyfill@3.3.3: - resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} - engines: {node: '>= 8'} + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.25.9 + optional: true - web-vitals@3.3.2: - resolution: {integrity: sha512-qRkpmSeKfEWAzNhtX541xA8gCJ+pqCqBmUlDVkVDSCSYUvfvNqF+k9g8I+uyreRcDBdfiJrd0/aLbTy5ydo49Q==} + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - webdriver@8.39.0: - resolution: {integrity: sha512-Kc3+SfiH4ufyrIht683VT2vnJocx0pfH8rYdyPvEh1b2OYewtFTHK36k9rBDHZiBmk6jcSXs4M2xeFgOuon9Lg==} - engines: {node: ^16.13 || >=18} + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.25.9 + optional: true - webdriverio@8.39.1: - resolution: {integrity: sha512-dPwLgLNtP+l4vnybz+YFxxH8nBKOP7j6VVzKtfDyTLDQg9rz3U8OA4xMMQCBucnrVXy3KcKxGqlnMa+c4IfWCQ==} - engines: {node: ^16.13 || >=18} - peerDependencies: - devtools: ^8.14.0 - peerDependenciesMeta: - devtools: - optional: true + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.25.9 + optional: true - webidl-conversions@5.0.0: - resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} - engines: {node: '>=8'} + '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - webidl-conversions@6.1.0: - resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} - engines: {node: '>=10.4'} + '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - well-known-symbols@2.0.0: - resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} - engines: {node: '>=6'} + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 - whatwg-encoding@1.0.5: - resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - whatwg-fetch@3.6.20: - resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} + '@babel/plugin-transform-arrow-functions@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - whatwg-mimetype@2.3.0: - resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} + '@babel/plugin-transform-async-generator-functions@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.7) + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color - whatwg-url@8.7.0: - resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} - engines: {node: '>=10'} + '@babel/plugin-transform-async-to-generator@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.7) + transitivePeerDependencies: + - supports-color - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + '@babel/plugin-transform-block-scoped-functions@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} + '@babel/plugin-transform-block-scoping@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} + '@babel/plugin-transform-block-scoping@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true + '@babel/plugin-transform-class-properties@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + '@babel/plugin-transform-class-static-block@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color - which@4.0.0: - resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} - engines: {node: ^16.13.0 || >=18.0.0} - hasBin: true + '@babel/plugin-transform-classes@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) + '@babel/traverse': 7.26.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color - wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + '@babel/plugin-transform-classes@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color - widest-line@3.1.0: - resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} - engines: {node: '>=8'} + '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/template': 7.25.9 - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} + '@babel/plugin-transform-computed-properties@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/template': 7.29.7 - wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + '@babel/plugin-transform-destructuring@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + '@babel/plugin-transform-dotall-regex@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + '@babel/plugin-transform-duplicate-keys@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - write-file-atomic@3.0.3: - resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 - write-file-atomic@5.0.1: - resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@babel/plugin-transform-dynamic-import@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true + '@babel/plugin-transform-explicit-resource-management@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7) + transitivePeerDependencies: + - supports-color - ws@8.13.0: - resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true + '@babel/plugin-transform-exponentiation-operator@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - ws@8.18.0: - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true + '@babel/plugin-transform-export-namespace-from@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - xml-name-validator@3.0.0: - resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} + '@babel/plugin-transform-flow-strip-types@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-flow': 7.26.0(@babel/core@7.26.0) - xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + '@babel/plugin-transform-flow-strip-types@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-syntax-flow': 7.29.7(@babel/core@7.29.7) - xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} + '@babel/plugin-transform-for-of@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + transitivePeerDependencies: + - supports-color - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.26.4 + transitivePeerDependencies: + - supports-color - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + '@babel/plugin-transform-function-name@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + '@babel/plugin-transform-json-strings@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} + '@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} + '@babel/plugin-transform-literals@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} + '@babel/plugin-transform-logical-assignment-operators@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - yargs@17.7.1: - resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==} - engines: {node: '>=12'} + '@babel/plugin-transform-member-expression-literals@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + '@babel/plugin-transform-modules-amd@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color - yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + '@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color - yazl@2.5.1: - resolution: {integrity: sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==} + '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color - yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} + '@babel/plugin-transform-modules-systemjs@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} + '@babel/plugin-transform-modules-umd@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color - yocto-queue@1.1.1: - resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} - engines: {node: '>=12.20'} + '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 - zip-stream@6.0.1: - resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} - engines: {node: '>= 14'} + '@babel/plugin-transform-named-capturing-groups-regex@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-new-target@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-nullish-coalescing-operator@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-numeric-separator@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-object-rest-spread@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.29.7) + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-object-super@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) + transitivePeerDependencies: + - supports-color -snapshots: + '@babel/plugin-transform-optional-catch-binding@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@ampproject/remapping@0.2.0': + '@babel/plugin-transform-optional-chaining@7.29.7(@babel/core@7.29.7)': dependencies: - '@jridgewell/resolve-uri': 1.0.0 - sourcemap-codec: 1.4.8 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + transitivePeerDependencies: + - supports-color - '@ampproject/remapping@2.3.0': + '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.0)': dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@ampproject/rollup-plugin-closure-compiler@0.27.0(rollup@2.70.2)': + '@babel/plugin-transform-parameters@7.29.7(@babel/core@7.29.7)': dependencies: - '@ampproject/remapping': 0.2.0 - acorn: 7.3.1 - acorn-walk: 7.1.1 - estree-walker: 2.0.1 - google-closure-compiler: 20210808.0.0 - magic-string: 0.25.7 - rollup: 2.70.2 - uuid: 8.1.0 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@arr/every@1.0.1': {} + '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color - '@babel/code-frame@7.24.7': + '@babel/plugin-transform-private-methods@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/highlight': 7.24.7 - picocolors: 1.1.0 + '@babel/core': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color - '@babel/compat-data@7.25.4': {} + '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color - '@babel/core@7.25.2': + '@babel/plugin-transform-private-property-in-object@7.29.7(@babel/core@7.29.7)': dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.6 - '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) - '@babel/helpers': 7.25.6 - '@babel/parser': 7.25.6 - '@babel/template': 7.25.0 - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 - convert-source-map: 2.0.0 - debug: 4.3.6 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/generator@7.25.6': + '@babel/plugin-transform-property-literals@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/types': 7.25.6 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-compilation-targets@7.25.2': + '@babel/plugin-transform-react-display-name@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/compat-data': 7.25.4 - '@babel/helper-validator-option': 7.24.8 - browserslist: 4.23.3 - lru-cache: 5.1.1 - semver: 6.3.1 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/helper-module-imports@7.24.7': + '@babel/plugin-transform-react-display-name@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-react-jsx-development@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7) transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-module-imports': 7.24.7 - '@babel/helper-simple-access': 7.24.7 - '@babel/helper-validator-identifier': 7.24.7 - '@babel/traverse': 7.25.6 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/types': 7.26.3 transitivePeerDependencies: - supports-color - '@babel/helper-plugin-utils@7.24.8': {} - - '@babel/helper-simple-access@7.24.7': + '@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-string-parser@7.24.8': {} + '@babel/plugin-transform-react-pure-annotations@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-validator-identifier@7.24.7': {} + '@babel/plugin-transform-regenerator@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-validator-option@7.24.8': {} + '@babel/plugin-transform-regexp-modifiers@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/helpers@7.25.6': + '@babel/plugin-transform-reserved-words@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/template': 7.25.0 - '@babel/types': 7.25.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/highlight@7.24.7': + '@babel/plugin-transform-runtime@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/helper-validator-identifier': 7.24.7 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.1.0 + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + babel-plugin-polyfill-corejs2: 0.4.12(@babel/core@7.26.0) + babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.26.0) + babel-plugin-polyfill-regenerator: 0.6.3(@babel/core@7.26.0) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-runtime@7.25.9(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + babel-plugin-polyfill-corejs2: 0.4.12(@babel/core@7.29.7) + babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.29.7) + babel-plugin-polyfill-regenerator: 0.6.3(@babel/core@7.29.7) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + optional: true - '@babel/parser@7.25.6': + '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/types': 7.25.6 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.2)': + '@babel/plugin-transform-shorthand-properties@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.25.2)': + '@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + transitivePeerDependencies: + - supports-color - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.2)': + '@babel/plugin-transform-spread@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + transitivePeerDependencies: + - supports-color - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.2)': + '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-import-attributes@7.25.6(@babel/core@7.25.2)': + '@babel/plugin-transform-sticky-regex@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2)': + '@babel/plugin-transform-strict-mode@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.2)': + '@babel/plugin-transform-template-literals@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.2)': + '@babel/plugin-transform-typeof-symbol@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.2)': + '@babel/plugin-transform-typescript@7.26.3(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.2)': + '@babel/plugin-transform-typescript@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-unicode-escapes@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-unicode-property-regex@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-unicode-regex@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-unicode-sets-regex@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/preset-env@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/core': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.7) + '@babel/plugin-syntax-import-assertions': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-import-attributes': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.29.7) + '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-async-generator-functions': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-async-to-generator': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-block-scoped-functions': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-block-scoping': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-class-static-block': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-computed-properties': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-dotall-regex': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-duplicate-keys': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-dynamic-import': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-explicit-resource-management': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-exponentiation-operator': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-export-namespace-from': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-for-of': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-function-name': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-json-strings': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-literals': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-logical-assignment-operators': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-member-expression-literals': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-modules-amd': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-modules-systemjs': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-modules-umd': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-named-capturing-groups-regex': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-new-target': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-nullish-coalescing-operator': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-numeric-separator': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-object-rest-spread': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-object-super': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-optional-catch-binding': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-property-literals': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-regenerator': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-regexp-modifiers': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-reserved-words': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-shorthand-properties': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-spread': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-sticky-regex': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-template-literals': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-typeof-symbol': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-unicode-escapes': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-unicode-property-regex': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-unicode-sets-regex': 7.29.7(@babel/core@7.29.7) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.29.7) + babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.7) + babel-plugin-polyfill-corejs3: 0.14.2(@babel/core@7.29.7) + babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.7) + core-js-compat: 3.49.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.2)': + '@babel/preset-flow@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-transform-flow-strip-types': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.2)': + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/types': 7.26.3 + esutils: 2.0.3 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.2)': + '@babel/preset-react@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + '@babel/plugin-transform-react-display-name': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-react-jsx-development': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-react-pure-annotations': 7.29.7(@babel/core@7.29.7) + transitivePeerDependencies: + - supports-color - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.2)': + '@babel/preset-typescript@7.26.0(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.0) + '@babel/plugin-transform-typescript': 7.26.3(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.2)': + '@babel/preset-typescript@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) + transitivePeerDependencies: + - supports-color - '@babel/plugin-syntax-typescript@7.25.4(@babel/core@7.25.2)': + '@babel/register@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + clone-deep: 4.0.1 + find-cache-dir: 2.1.0 + make-dir: 2.1.0 + pirates: 4.0.6 + source-map-support: 0.5.21 - '@babel/runtime@7.25.6': + '@babel/runtime@7.26.0': dependencies: regenerator-runtime: 0.14.1 - '@babel/template@7.25.0': + '@babel/template@7.25.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 + + '@babel/template@7.29.7': dependencies: - '@babel/code-frame': 7.24.7 - '@babel/parser': 7.25.6 - '@babel/types': 7.25.6 + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 - '@babel/traverse@7.25.6': + '@babel/traverse@7.26.4': dependencies: - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.6 - '@babel/parser': 7.25.6 - '@babel/template': 7.25.0 - '@babel/types': 7.25.6 - debug: 4.3.6 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.3 + '@babel/parser': 7.26.3 + '@babel/template': 7.25.9 + '@babel/types': 7.26.3 + debug: 4.4.0 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.25.6': + '@babel/traverse@7.29.7': dependencies: - '@babel/helper-string-parser': 7.24.8 - '@babel/helper-validator-identifier': 7.24.7 - to-fast-properties: 2.0.0 + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.26.3': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@babel/types@7.29.7': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 '@balena/dockerignore@1.0.2': {} @@ -7618,7 +10909,7 @@ snapshots: '@eslint/eslintrc@1.4.1': dependencies: ajv: 6.12.6 - debug: 4.3.6 + debug: 4.4.0 espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -7629,12 +10920,20 @@ snapshots: transitivePeerDependencies: - supports-color + '@fingerprintjs/botd@2.0.0': {} + '@gar/promisify@1.1.3': {} + '@hapi/hoek@9.3.0': {} + + '@hapi/topo@5.1.0': + dependencies: + '@hapi/hoek': 9.3.0 + '@humanwhocodes/config-array@0.9.5': dependencies: '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.6 + debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -7650,6 +10949,8 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@isaacs/ttlcache@1.4.1': {} + '@istanbuljs/load-nyc-config@1.1.0': dependencies: camelcase: 5.3.1 @@ -7669,122 +10970,152 @@ snapshots: jest-util: 26.6.2 slash: 3.0.0 - '@jest/console@27.5.1': + '@jest/console@28.1.3': dependencies: - '@jest/types': 27.5.1 + '@jest/types': 28.1.3 '@types/node': 14.6.4 chalk: 4.1.2 - jest-message-util: 27.5.1 - jest-util: 27.5.1 + jest-message-util: 28.1.3 + jest-util: 28.1.3 slash: 3.0.0 - '@jest/core@27.5.1(ts-node@10.9.2(@types/node@14.6.4)(typescript@4.6.4))': + '@jest/core@28.1.3(ts-node@10.9.2(@types/node@14.6.4)(typescript@4.6.4))': dependencies: - '@jest/console': 27.5.1 - '@jest/reporters': 27.5.1 - '@jest/test-result': 27.5.1 - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 + '@jest/console': 28.1.3 + '@jest/reporters': 28.1.3 + '@jest/test-result': 28.1.3 + '@jest/transform': 28.1.3 + '@jest/types': 28.1.3 '@types/node': 14.6.4 ansi-escapes: 4.3.2 chalk: 4.1.2 - emittery: 0.8.1 + ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 - jest-changed-files: 27.5.1 - jest-config: 27.5.1(ts-node@10.9.2(@types/node@14.6.4)(typescript@4.6.4)) - jest-haste-map: 27.5.1 - jest-message-util: 27.5.1 - jest-regex-util: 27.5.1 - jest-resolve: 27.5.1 - jest-resolve-dependencies: 27.5.1 - jest-runner: 27.5.1 - jest-runtime: 27.5.1 - jest-snapshot: 27.5.1 - jest-util: 27.5.1 - jest-validate: 27.5.1 - jest-watcher: 27.5.1 + jest-changed-files: 28.1.3 + jest-config: 28.1.3(@types/node@14.6.4)(ts-node@10.9.2(@types/node@14.6.4)(typescript@4.6.4)) + jest-haste-map: 28.1.3 + jest-message-util: 28.1.3 + jest-regex-util: 28.0.2 + jest-resolve: 28.1.3 + jest-resolve-dependencies: 28.1.3 + jest-runner: 28.1.3 + jest-runtime: 28.1.3 + jest-snapshot: 28.1.3 + jest-util: 28.1.3 + jest-validate: 28.1.3 + jest-watcher: 28.1.3 micromatch: 4.0.8 + pretty-format: 28.1.3 rimraf: 3.0.2 slash: 3.0.0 strip-ansi: 6.0.1 transitivePeerDependencies: - - bufferutil - - canvas - supports-color - ts-node - - utf-8-validate - '@jest/core@27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4))': + '@jest/core@28.1.3(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4))': dependencies: - '@jest/console': 27.5.1 - '@jest/reporters': 27.5.1 - '@jest/test-result': 27.5.1 - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 + '@jest/console': 28.1.3 + '@jest/reporters': 28.1.3 + '@jest/test-result': 28.1.3 + '@jest/transform': 28.1.3 + '@jest/types': 28.1.3 '@types/node': 14.6.4 ansi-escapes: 4.3.2 chalk: 4.1.2 - emittery: 0.8.1 + ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 - jest-changed-files: 27.5.1 - jest-config: 27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)) - jest-haste-map: 27.5.1 - jest-message-util: 27.5.1 - jest-regex-util: 27.5.1 - jest-resolve: 27.5.1 - jest-resolve-dependencies: 27.5.1 - jest-runner: 27.5.1 - jest-runtime: 27.5.1 - jest-snapshot: 27.5.1 - jest-util: 27.5.1 - jest-validate: 27.5.1 - jest-watcher: 27.5.1 + jest-changed-files: 28.1.3 + jest-config: 28.1.3(@types/node@14.6.4)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) + jest-haste-map: 28.1.3 + jest-message-util: 28.1.3 + jest-regex-util: 28.0.2 + jest-resolve: 28.1.3 + jest-resolve-dependencies: 28.1.3 + jest-runner: 28.1.3 + jest-runtime: 28.1.3 + jest-snapshot: 28.1.3 + jest-util: 28.1.3 + jest-validate: 28.1.3 + jest-watcher: 28.1.3 micromatch: 4.0.8 + pretty-format: 28.1.3 rimraf: 3.0.2 slash: 3.0.0 strip-ansi: 6.0.1 transitivePeerDependencies: - - bufferutil - - canvas - supports-color - ts-node - - utf-8-validate - '@jest/environment@27.5.1': + '@jest/create-cache-key-function@29.7.0': + dependencies: + '@jest/types': 29.6.3 + + '@jest/environment@28.1.3': + dependencies: + '@jest/fake-timers': 28.1.3 + '@jest/types': 28.1.3 + '@types/node': 14.6.4 + jest-mock: 28.1.3 + + '@jest/environment@29.7.0': dependencies: - '@jest/fake-timers': 27.5.1 - '@jest/types': 27.5.1 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 '@types/node': 14.6.4 - jest-mock: 27.5.1 + jest-mock: 29.7.0 + + '@jest/expect-utils@28.1.3': + dependencies: + jest-get-type: 28.0.2 '@jest/expect-utils@29.7.0': dependencies: jest-get-type: 29.6.3 - '@jest/fake-timers@27.5.1': + '@jest/expect@28.1.3': + dependencies: + expect: 28.1.3 + jest-snapshot: 28.1.3 + transitivePeerDependencies: + - supports-color + + '@jest/fake-timers@28.1.3': dependencies: - '@jest/types': 27.5.1 - '@sinonjs/fake-timers': 8.1.0 + '@jest/types': 28.1.3 + '@sinonjs/fake-timers': 9.1.2 '@types/node': 14.6.4 - jest-message-util: 27.5.1 - jest-mock: 27.5.1 - jest-util: 27.5.1 + jest-message-util: 28.1.3 + jest-mock: 28.1.3 + jest-util: 28.1.3 - '@jest/globals@27.5.1': + '@jest/fake-timers@29.7.0': dependencies: - '@jest/environment': 27.5.1 - '@jest/types': 27.5.1 - expect: 27.5.1 + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 14.6.4 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + '@jest/globals@28.1.3': + dependencies: + '@jest/environment': 28.1.3 + '@jest/expect': 28.1.3 + '@jest/types': 28.1.3 + transitivePeerDependencies: + - supports-color - '@jest/reporters@27.5.1': + '@jest/reporters@28.1.3': dependencies: '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 27.5.1 - '@jest/test-result': 27.5.1 - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 + '@jest/console': 28.1.3 + '@jest/test-result': 28.1.3 + '@jest/transform': 28.1.3 + '@jest/types': 28.1.3 + '@jridgewell/trace-mapping': 0.3.25 '@types/node': 14.6.4 chalk: 4.1.2 collect-v8-coverage: 1.0.2 @@ -7796,61 +11127,62 @@ snapshots: istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 4.0.1 istanbul-reports: 3.1.7 - jest-haste-map: 27.5.1 - jest-resolve: 27.5.1 - jest-util: 27.5.1 - jest-worker: 27.5.1 + jest-message-util: 28.1.3 + jest-util: 28.1.3 + jest-worker: 28.1.3 slash: 3.0.0 - source-map: 0.6.1 string-length: 4.0.2 + strip-ansi: 6.0.1 terminal-link: 2.1.1 - v8-to-istanbul: 8.1.1 + v8-to-istanbul: 9.3.0 transitivePeerDependencies: - supports-color + '@jest/schemas@28.1.3': + dependencies: + '@sinclair/typebox': 0.24.51 + '@jest/schemas@29.6.3': dependencies: '@sinclair/typebox': 0.27.8 - '@jest/source-map@27.5.1': + '@jest/source-map@28.1.2': dependencies: + '@jridgewell/trace-mapping': 0.3.25 callsites: 3.1.0 graceful-fs: 4.2.11 - source-map: 0.6.1 - '@jest/test-result@27.5.1': + '@jest/test-result@28.1.3': dependencies: - '@jest/console': 27.5.1 - '@jest/types': 27.5.1 + '@jest/console': 28.1.3 + '@jest/types': 28.1.3 '@types/istanbul-lib-coverage': 2.0.6 collect-v8-coverage: 1.0.2 - '@jest/test-sequencer@27.5.1': + '@jest/test-sequencer@28.1.3': dependencies: - '@jest/test-result': 27.5.1 + '@jest/test-result': 28.1.3 graceful-fs: 4.2.11 - jest-haste-map: 27.5.1 - jest-runtime: 27.5.1 - transitivePeerDependencies: - - supports-color + jest-haste-map: 28.1.3 + slash: 3.0.0 - '@jest/transform@27.5.1': + '@jest/transform@28.1.3': dependencies: - '@babel/core': 7.25.2 - '@jest/types': 27.5.1 + '@babel/core': 7.26.0 + '@jest/types': 28.1.3 + '@jridgewell/trace-mapping': 0.3.25 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 1.9.0 fast-json-stable-stringify: 2.1.0 graceful-fs: 4.2.11 - jest-haste-map: 27.5.1 - jest-regex-util: 27.5.1 - jest-util: 27.5.1 + jest-haste-map: 28.1.3 + jest-regex-util: 28.0.2 + jest-util: 28.1.3 micromatch: 4.0.8 pirates: 4.0.6 slash: 3.0.0 - source-map: 0.6.1 - write-file-atomic: 3.0.3 + write-file-atomic: 4.0.2 transitivePeerDependencies: - supports-color @@ -7862,12 +11194,13 @@ snapshots: '@types/yargs': 15.0.19 chalk: 4.1.2 - '@jest/types@27.5.1': + '@jest/types@28.1.3': dependencies: + '@jest/schemas': 28.1.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 '@types/node': 14.6.4 - '@types/yargs': 16.0.9 + '@types/yargs': 17.0.33 chalk: 4.1.2 '@jest/types@29.6.3': @@ -7879,13 +11212,21 @@ snapshots: '@types/yargs': 17.0.33 chalk: 4.1.2 - '@jridgewell/gen-mapping@0.3.5': + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 - '@jridgewell/resolve-uri@1.0.0': {} + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/resolve-uri@3.1.2': {} @@ -7893,16 +11234,23 @@ snapshots: '@jridgewell/source-map@0.3.6': dependencies: - '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 @@ -7910,7 +11258,7 @@ snapshots: '@ljharb/through@2.3.13': dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 '@mdn/browser-compat-data@4.2.1': {} @@ -7924,7 +11272,7 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + fastq: 1.18.0 '@npmcli/fs@1.1.1': dependencies: @@ -7972,9 +11320,9 @@ snapshots: '@polka/url@0.5.0': {} - '@promptbook/utils@0.70.0-1': + '@promptbook/utils@0.69.5': dependencies: - spacetrim: 0.11.39 + spacetrim: 0.11.59 '@puppeteer/browsers@1.4.6(typescript@4.6.4)': dependencies: @@ -7990,18 +11338,308 @@ snapshots: transitivePeerDependencies: - supports-color - '@puppeteer/browsers@1.9.1': + '@puppeteer/browsers@1.9.1': + dependencies: + debug: 4.3.4 + extract-zip: 2.0.1 + progress: 2.0.3 + proxy-agent: 6.3.1 + tar-fs: 3.0.4 + unbzip2-stream: 1.4.3 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + + '@react-native-async-storage/async-storage@2.0.0(react-native@0.74.5(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@types/react@18.3.18)(encoding@0.1.13)(react@18.2.0))': + dependencies: + merge-options: 3.0.4 + react-native: 0.74.5(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@types/react@18.3.18)(encoding@0.1.13)(react@18.2.0) + + '@react-native-community/cli-clean@13.6.9(encoding@0.1.13)': + dependencies: + '@react-native-community/cli-tools': 13.6.9(encoding@0.1.13) + chalk: 4.1.2 + execa: 5.1.1 + fast-glob: 3.3.2 + transitivePeerDependencies: + - encoding + + '@react-native-community/cli-config@13.6.9(encoding@0.1.13)': + dependencies: + '@react-native-community/cli-tools': 13.6.9(encoding@0.1.13) + chalk: 4.1.2 + cosmiconfig: 5.2.1 + deepmerge: 4.3.1 + fast-glob: 3.3.2 + joi: 17.13.3 + transitivePeerDependencies: + - encoding + + '@react-native-community/cli-debugger-ui@13.6.9': + dependencies: + serve-static: 1.16.2 + + '@react-native-community/cli-doctor@13.6.9(encoding@0.1.13)': + dependencies: + '@react-native-community/cli-config': 13.6.9(encoding@0.1.13) + '@react-native-community/cli-platform-android': 13.6.9(encoding@0.1.13) + '@react-native-community/cli-platform-apple': 13.6.9(encoding@0.1.13) + '@react-native-community/cli-platform-ios': 13.6.9(encoding@0.1.13) + '@react-native-community/cli-tools': 13.6.9(encoding@0.1.13) + chalk: 4.1.2 + command-exists: 1.2.9 + deepmerge: 4.3.1 + envinfo: 7.14.0 + execa: 5.1.1 + hermes-profile-transformer: 0.0.6 + node-stream-zip: 1.15.0 + ora: 5.4.1 + semver: 7.6.3 + strip-ansi: 5.2.0 + wcwidth: 1.0.1 + yaml: 2.6.1 + transitivePeerDependencies: + - encoding + + '@react-native-community/cli-hermes@13.6.9(encoding@0.1.13)': + dependencies: + '@react-native-community/cli-platform-android': 13.6.9(encoding@0.1.13) + '@react-native-community/cli-tools': 13.6.9(encoding@0.1.13) + chalk: 4.1.2 + hermes-profile-transformer: 0.0.6 + transitivePeerDependencies: + - encoding + + '@react-native-community/cli-platform-android@13.6.9(encoding@0.1.13)': + dependencies: + '@react-native-community/cli-tools': 13.6.9(encoding@0.1.13) + chalk: 4.1.2 + execa: 5.1.1 + fast-glob: 3.3.2 + fast-xml-parser: 4.5.1 + logkitty: 0.7.1 + transitivePeerDependencies: + - encoding + + '@react-native-community/cli-platform-apple@13.6.9(encoding@0.1.13)': + dependencies: + '@react-native-community/cli-tools': 13.6.9(encoding@0.1.13) + chalk: 4.1.2 + execa: 5.1.1 + fast-glob: 3.3.2 + fast-xml-parser: 4.5.1 + ora: 5.4.1 + transitivePeerDependencies: + - encoding + + '@react-native-community/cli-platform-ios@13.6.9(encoding@0.1.13)': + dependencies: + '@react-native-community/cli-platform-apple': 13.6.9(encoding@0.1.13) + transitivePeerDependencies: + - encoding + + '@react-native-community/cli-server-api@13.6.9(encoding@0.1.13)': + dependencies: + '@react-native-community/cli-debugger-ui': 13.6.9 + '@react-native-community/cli-tools': 13.6.9(encoding@0.1.13) + compression: 1.7.5 + connect: 3.7.0 + errorhandler: 1.5.1 + nocache: 3.0.4 + pretty-format: 26.6.2 + serve-static: 1.16.2 + ws: 6.2.3 + transitivePeerDependencies: + - encoding + + '@react-native-community/cli-tools@13.6.9(encoding@0.1.13)': + dependencies: + appdirsjs: 1.2.7 + chalk: 4.1.2 + execa: 5.1.1 + find-up: 5.0.0 + mime: 2.6.0 + node-fetch: 2.7.0(encoding@0.1.13) + open: 6.4.0 + ora: 5.4.1 + semver: 7.6.3 + shell-quote: 1.8.2 + sudo-prompt: 9.2.1 + transitivePeerDependencies: + - encoding + + '@react-native-community/cli-types@13.6.9': + dependencies: + joi: 17.13.3 + + '@react-native-community/cli@13.6.9(encoding@0.1.13)': + dependencies: + '@react-native-community/cli-clean': 13.6.9(encoding@0.1.13) + '@react-native-community/cli-config': 13.6.9(encoding@0.1.13) + '@react-native-community/cli-debugger-ui': 13.6.9 + '@react-native-community/cli-doctor': 13.6.9(encoding@0.1.13) + '@react-native-community/cli-hermes': 13.6.9(encoding@0.1.13) + '@react-native-community/cli-server-api': 13.6.9(encoding@0.1.13) + '@react-native-community/cli-tools': 13.6.9(encoding@0.1.13) + '@react-native-community/cli-types': 13.6.9 + chalk: 4.1.2 + commander: 9.5.0 + deepmerge: 4.3.1 + execa: 5.1.1 + find-up: 4.1.0 + fs-extra: 8.1.0 + graceful-fs: 4.2.11 + prompts: 2.4.2 + semver: 7.6.3 + transitivePeerDependencies: + - encoding + + '@react-native/assets-registry@0.74.87': {} + + '@react-native/babel-plugin-codegen@0.74.87(@babel/preset-env@7.29.7(@babel/core@7.29.7))': + dependencies: + '@react-native/codegen': 0.74.87(@babel/preset-env@7.29.7(@babel/core@7.29.7)) + transitivePeerDependencies: + - '@babel/preset-env' + - supports-color + + '@react-native/babel-preset@0.74.87(@babel/preset-env@7.29.7(@babel/core@7.29.7))': + dependencies: + '@babel/core': 7.26.0 + '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.26.0) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.26.0) + '@babel/plugin-proposal-export-default-from': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-proposal-logical-assignment-operators': 7.20.7(@babel/core@7.26.0) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.26.0) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.26.0) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.26.0) + '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.26.0) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.26.0) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-export-default-from': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-syntax-flow': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-flow-strip-types': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-react-display-name': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-runtime': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-typescript': 7.26.3(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.0) + '@babel/template': 7.25.9 + '@react-native/babel-plugin-codegen': 0.74.87(@babel/preset-env@7.29.7(@babel/core@7.29.7)) + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.26.0) + react-refresh: 0.14.2 + transitivePeerDependencies: + - '@babel/preset-env' + - supports-color + + '@react-native/codegen@0.74.87(@babel/preset-env@7.29.7(@babel/core@7.29.7))': + dependencies: + '@babel/parser': 7.26.3 + '@babel/preset-env': 7.29.7(@babel/core@7.29.7) + glob: 7.2.3 + hermes-parser: 0.19.1 + invariant: 2.2.4 + jscodeshift: 0.14.0(@babel/preset-env@7.29.7(@babel/core@7.29.7)) + mkdirp: 0.5.6 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + + '@react-native/community-cli-plugin@0.74.87(@babel/preset-env@7.29.7(@babel/core@7.29.7))(encoding@0.1.13)': + dependencies: + '@react-native-community/cli-server-api': 13.6.9(encoding@0.1.13) + '@react-native-community/cli-tools': 13.6.9(encoding@0.1.13) + '@react-native/dev-middleware': 0.74.87(encoding@0.1.13) + '@react-native/metro-babel-transformer': 0.74.87(@babel/preset-env@7.29.7(@babel/core@7.29.7)) + chalk: 4.1.2 + execa: 5.1.1 + metro: 0.80.12 + metro-config: 0.80.12 + metro-core: 0.80.12 + node-fetch: 2.7.0(encoding@0.1.13) + querystring: 0.2.1 + readline: 1.3.0 + transitivePeerDependencies: + - '@babel/preset-env' + - bufferutil + - encoding + - supports-color + - utf-8-validate + + '@react-native/debugger-frontend@0.74.87': {} + + '@react-native/dev-middleware@0.74.87(encoding@0.1.13)': + dependencies: + '@isaacs/ttlcache': 1.4.1 + '@react-native/debugger-frontend': 0.74.87 + '@rnx-kit/chromium-edge-launcher': 1.0.0 + chrome-launcher: 0.15.2 + connect: 3.7.0 + debug: 2.6.9 + node-fetch: 2.7.0(encoding@0.1.13) + nullthrows: 1.1.1 + open: 7.4.2 + selfsigned: 2.4.1 + serve-static: 1.16.2 + temp-dir: 2.0.0 + ws: 6.2.3 + transitivePeerDependencies: + - encoding + + '@react-native/gradle-plugin@0.74.87': {} + + '@react-native/js-polyfills@0.74.87': {} + + '@react-native/metro-babel-transformer@0.74.87(@babel/preset-env@7.29.7(@babel/core@7.29.7))': dependencies: - debug: 4.3.4 - extract-zip: 2.0.1 - progress: 2.0.3 - proxy-agent: 6.3.1 - tar-fs: 3.0.4 - unbzip2-stream: 1.4.3 - yargs: 17.7.2 + '@babel/core': 7.26.0 + '@react-native/babel-preset': 0.74.87(@babel/preset-env@7.29.7(@babel/core@7.29.7)) + hermes-parser: 0.19.1 + nullthrows: 1.1.1 transitivePeerDependencies: + - '@babel/preset-env' - supports-color + '@react-native/normalize-colors@0.74.87': {} + + '@react-native/virtualized-lists@0.74.87(@types/react@18.3.18)(react-native@0.74.5(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@types/react@18.3.18)(encoding@0.1.13)(react@18.2.0))(react@18.2.0)': + dependencies: + invariant: 2.2.4 + nullthrows: 1.1.1 + react: 18.2.0 + react-native: 0.74.5(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@types/react@18.3.18)(encoding@0.1.13)(react@18.2.0) + optionalDependencies: + '@types/react': 18.3.18 + + '@rnx-kit/chromium-edge-launcher@1.0.0': + dependencies: + '@types/node': 18.19.68 + escape-string-regexp: 4.0.0 + is-wsl: 2.2.0 + lighthouse-logger: 1.4.2 + mkdirp: 1.0.4 + rimraf: 3.0.2 + '@rollup/plugin-alias@3.1.9(rollup@2.70.2)': dependencies: rollup: 2.70.2 @@ -8015,7 +11653,7 @@ snapshots: glob: 7.2.3 is-reference: 1.2.1 magic-string: 0.25.9 - resolve: 1.22.8 + resolve: 1.22.10 rollup: 2.70.2 '@rollup/plugin-json@4.1.0(rollup@2.70.2)': @@ -8030,7 +11668,7 @@ snapshots: builtin-modules: 3.3.0 deepmerge: 4.3.1 is-module: 1.0.0 - resolve: 1.22.8 + resolve: 1.22.10 rollup: 2.70.2 '@rollup/plugin-replace@4.0.0(rollup@2.70.2)': @@ -8051,20 +11689,42 @@ snapshots: estree-walker: 2.0.2 picomatch: 2.3.1 + '@sideway/address@4.1.5': + dependencies: + '@hapi/hoek': 9.3.0 + + '@sideway/formula@3.0.1': {} + + '@sideway/pinpoint@2.0.0': {} + + '@sinclair/typebox@0.24.51': {} + '@sinclair/typebox@0.27.8': {} '@sindresorhus/is@4.6.0': {} '@sindresorhus/is@5.6.0': {} + '@sindresorhus/merge-streams@2.3.0': {} + '@sinonjs/commons@1.8.6': dependencies: type-detect: 4.0.8 - '@sinonjs/fake-timers@8.1.0': + '@sinonjs/commons@3.0.1': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/fake-timers@10.3.0': + dependencies: + '@sinonjs/commons': 3.0.1 + + '@sinonjs/fake-timers@9.1.2': dependencies: '@sinonjs/commons': 1.8.6 + '@snowplow/webview-tracker@0.3.1': {} + '@szmarczak/http-timer@4.0.6': dependencies: defer-to-connect: 2.0.1 @@ -8077,8 +11737,8 @@ snapshots: '@testing-library/dom@9.3.4': dependencies: - '@babel/code-frame': 7.24.7 - '@babel/runtime': 7.25.6 + '@babel/code-frame': 7.26.2 + '@babel/runtime': 7.26.0 '@types/aria-query': 5.0.4 aria-query: 5.1.3 chalk: 4.1.2 @@ -8088,6 +11748,8 @@ snapshots: '@tootallnate/once@1.1.2': {} + '@tootallnate/once@2.0.0': {} + '@tootallnate/quickjs-emscripten@0.23.0': {} '@tsconfig/node10@1.0.11': {} @@ -8102,24 +11764,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.25.6 - '@babel/types': 7.25.6 + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.6 '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.25.6 + '@babel/types': 7.26.3 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.25.6 - '@babel/types': 7.25.6 + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 '@types/babel__traverse@7.20.6': dependencies: - '@babel/types': 7.25.6 + '@babel/types': 7.26.3 '@types/cacheable-request@6.0.3': dependencies: @@ -8133,7 +11795,7 @@ snapshots: '@types/node': 14.6.4 '@types/ssh2': 1.15.1 - '@types/dockerode@3.3.31': + '@types/dockerode@3.3.32': dependencies: '@types/docker-modem': 3.0.6 '@types/node': 14.6.4 @@ -8141,7 +11803,7 @@ snapshots: '@types/estree@0.0.39': {} - '@types/estree@1.0.5': {} + '@types/estree@1.0.6': {} '@types/graceful-fs@4.1.9': dependencies: @@ -8159,10 +11821,10 @@ snapshots: dependencies: '@types/istanbul-lib-report': 3.0.3 - '@types/jest@27.4.1': + '@types/jest@28.1.8': dependencies: - jest-matcher-utils: 27.5.1 - pretty-format: 27.5.1 + expect: 28.1.3 + pretty-format: 28.1.3 '@types/jsdom@16.2.15': dependencies: @@ -8180,15 +11842,19 @@ snapshots: '@types/lodash@4.14.202': {} + '@types/node-forge@1.3.11': + dependencies: + '@types/node': 14.6.4 + '@types/node@14.6.4': {} - '@types/node@16.18.106': {} + '@types/node@16.18.122': {} - '@types/node@18.19.48': + '@types/node@18.19.68': dependencies: undici-types: 5.26.5 - '@types/node@20.16.3': + '@types/node@20.17.10': dependencies: undici-types: 6.19.8 @@ -8200,8 +11866,15 @@ snapshots: '@types/prettier@2.7.3': {} + '@types/prop-types@15.7.14': {} + '@types/randomcolor@0.5.9': {} + '@types/react@18.3.18': + dependencies: + '@types/prop-types': 15.7.14 + csstype: 3.1.3 + '@types/resolve@1.17.1': dependencies: '@types/node': 14.6.4 @@ -8212,17 +11885,13 @@ snapshots: '@types/semver@7.5.8': {} - '@types/sha1@1.1.5': - dependencies: - '@types/node': 14.6.4 - '@types/split2@4.2.3': dependencies: '@types/node': 14.6.4 '@types/ssh2@1.15.1': dependencies: - '@types/node': 18.19.48 + '@types/node': 18.19.68 '@types/stack-utils@2.0.3': {} @@ -8232,13 +11901,11 @@ snapshots: '@types/ua-parser-js@0.7.39': {} - '@types/uuid@10.0.0': {} - '@types/vimeo__player@2.16.3': {} '@types/which@2.0.2': {} - '@types/ws@8.5.12': + '@types/ws@8.5.13': dependencies: '@types/node': 14.6.4 @@ -8248,10 +11915,6 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@types/yargs@16.0.9': - dependencies: - '@types/yargs-parser': 21.0.3 - '@types/yargs@17.0.33': dependencies: '@types/yargs-parser': 21.0.3 @@ -8269,7 +11932,7 @@ snapshots: '@typescript-eslint/scope-manager': 5.15.0 '@typescript-eslint/type-utils': 5.15.0(eslint@8.11.0)(typescript@4.6.4) '@typescript-eslint/utils': 5.15.0(eslint@8.11.0)(typescript@4.6.4) - debug: 4.3.6 + debug: 4.4.0 eslint: 8.11.0 functional-red-black-tree: 1.0.1 ignore: 5.3.2 @@ -8286,7 +11949,7 @@ snapshots: '@typescript-eslint/scope-manager': 5.15.0 '@typescript-eslint/types': 5.15.0 '@typescript-eslint/typescript-estree': 5.15.0(typescript@4.6.4) - debug: 4.3.6 + debug: 4.4.0 eslint: 8.11.0 optionalDependencies: typescript: 4.6.4 @@ -8301,7 +11964,7 @@ snapshots: '@typescript-eslint/type-utils@5.15.0(eslint@8.11.0)(typescript@4.6.4)': dependencies: '@typescript-eslint/utils': 5.15.0(eslint@8.11.0)(typescript@4.6.4) - debug: 4.3.6 + debug: 4.4.0 eslint: 8.11.0 tsutils: 3.21.0(typescript@4.6.4) optionalDependencies: @@ -8315,7 +11978,7 @@ snapshots: dependencies: '@typescript-eslint/types': 5.15.0 '@typescript-eslint/visitor-keys': 5.15.0 - debug: 4.3.6 + debug: 4.4.0 globby: 11.1.0 is-glob: 4.0.3 semver: 7.6.3 @@ -8348,25 +12011,25 @@ snapshots: native-promise-only: 0.8.1 weakmap-polyfill: 2.0.4 - '@vitest/pretty-format@2.0.5': + '@vitest/pretty-format@2.1.8': dependencies: tinyrainbow: 1.2.0 '@vitest/snapshot@1.6.0': dependencies: - magic-string: 0.30.11 + magic-string: 0.30.17 pathe: 1.1.2 pretty-format: 29.7.0 - '@vitest/snapshot@2.0.5': + '@vitest/snapshot@2.1.8': dependencies: - '@vitest/pretty-format': 2.0.5 - magic-string: 0.30.11 + '@vitest/pretty-format': 2.1.8 + magic-string: 0.30.17 pathe: 1.1.2 '@wdio/cli@8.39.1(encoding@0.1.13)(typescript@4.6.4)': dependencies: - '@types/node': 20.16.3 + '@types/node': 20.17.10 '@vitest/snapshot': 1.6.0 '@wdio/config': 8.39.0 '@wdio/globals': 8.39.1(encoding@0.1.13)(typescript@4.6.4) @@ -8375,10 +12038,10 @@ snapshots: '@wdio/types': 8.39.0 '@wdio/utils': 8.39.0 async-exit-hook: 2.0.1 - chalk: 5.3.0 + chalk: 5.4.1 chokidar: 3.6.0 cli-spinners: 2.9.2 - dotenv: 16.4.5 + dotenv: 16.4.7 ejs: 3.1.10 execa: 8.0.1 import-meta-resolve: 4.1.0 @@ -8424,13 +12087,13 @@ snapshots: '@wdio/jasmine-framework@8.39.1(encoding@0.1.13)(typescript@4.6.4)': dependencies: - '@types/node': 20.16.3 + '@types/node': 20.17.10 '@wdio/globals': 8.39.1(encoding@0.1.13)(typescript@4.6.4) '@wdio/logger': 8.38.0 '@wdio/types': 8.39.0 '@wdio/utils': 8.39.0 expect-webdriverio: 4.15.4(encoding@0.1.13)(typescript@4.6.4) - jasmine: 5.2.0 + jasmine: 5.5.0 transitivePeerDependencies: - bufferutil - devtools @@ -8441,7 +12104,7 @@ snapshots: '@wdio/local-runner@8.39.1(encoding@0.1.13)(typescript@4.6.4)': dependencies: - '@types/node': 20.16.3 + '@types/node': 20.17.10 '@wdio/logger': 8.38.0 '@wdio/repl': 8.24.12 '@wdio/runner': 8.39.1(encoding@0.1.13)(typescript@4.6.4) @@ -8459,15 +12122,15 @@ snapshots: '@wdio/logger@8.38.0': dependencies: - chalk: 5.3.0 - loglevel: 1.9.1 + chalk: 5.4.1 + loglevel: 1.9.2 loglevel-plugin-prefix: 0.8.4 strip-ansi: 7.1.0 - '@wdio/logger@9.0.4': + '@wdio/logger@9.4.4': dependencies: - chalk: 5.3.0 - loglevel: 1.9.1 + chalk: 5.4.1 + loglevel: 1.9.2 loglevel-plugin-prefix: 0.8.4 strip-ansi: 7.1.0 @@ -8475,19 +12138,19 @@ snapshots: '@wdio/repl@8.24.12': dependencies: - '@types/node': 20.16.3 + '@types/node': 20.17.10 '@wdio/reporter@8.39.0': dependencies: - '@types/node': 20.16.3 + '@types/node': 20.17.10 '@wdio/logger': 8.38.0 '@wdio/types': 8.39.0 diff: 5.2.0 - object-inspect: 1.13.2 + object-inspect: 1.13.3 '@wdio/runner@8.39.1(encoding@0.1.13)(typescript@4.6.4)': dependencies: - '@types/node': 20.16.3 + '@types/node': 20.17.10 '@wdio/config': 8.39.0 '@wdio/globals': 8.39.1(encoding@0.1.13)(typescript@4.6.4) '@wdio/logger': 8.38.0 @@ -8542,7 +12205,7 @@ snapshots: dependencies: '@wdio/reporter': 8.39.0 '@wdio/types': 8.39.0 - chalk: 5.3.0 + chalk: 5.4.1 easy-table: 1.2.0 pretty-ms: 7.0.1 @@ -8550,12 +12213,12 @@ snapshots: dependencies: '@wdio/logger': 8.38.0 '@wdio/types': 8.39.0 - express: 4.19.2 + express: 4.21.2 morgan: 1.10.0 '@wdio/types@8.39.0': dependencies: - '@types/node': 20.16.3 + '@types/node': 20.17.10 '@wdio/utils@8.39.0': dependencies: @@ -8565,10 +12228,10 @@ snapshots: decamelize: 6.0.0 deepmerge-ts: 5.1.0 edgedriver: 5.6.1 - geckodriver: 4.4.4 + geckodriver: 4.5.1 get-port: 7.1.0 import-meta-resolve: 4.1.0 - locate-app: 2.4.37 + locate-app: 2.5.0 safaridriver: 0.1.2 split2: 4.2.0 wait-port: 1.1.0 @@ -8577,7 +12240,7 @@ snapshots: '@wessberg/stringutil@1.0.19': {} - '@zip.js/zip.js@2.7.52': {} + '@zip.js/zip.js@2.7.54': {} abab@2.0.6: {} @@ -8597,37 +12260,29 @@ snapshots: acorn: 7.4.1 acorn-walk: 7.2.0 - acorn-jsx@5.3.2(acorn@8.12.1): + acorn-jsx@5.3.2(acorn@8.14.0): dependencies: - acorn: 8.12.1 - - acorn-walk@7.1.1: {} + acorn: 8.14.0 acorn-walk@7.2.0: {} - acorn-walk@8.3.3: + acorn-walk@8.3.4: dependencies: - acorn: 8.12.1 - - acorn@7.3.1: {} + acorn: 8.14.0 acorn@7.4.1: {} - acorn@8.12.1: {} + acorn@8.14.0: {} agent-base@6.0.2: dependencies: - debug: 4.3.6 + debug: 4.4.0 transitivePeerDependencies: - supports-color - agent-base@7.1.1: - dependencies: - debug: 4.3.6 - transitivePeerDependencies: - - supports-color + agent-base@7.1.3: {} - agentkeepalive@4.5.0: + agentkeepalive@4.6.0: dependencies: humanize-ms: 1.2.1 @@ -8648,6 +12303,8 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + anser@1.4.10: {} + ansi-align@3.0.1: dependencies: string-width: 4.2.3 @@ -8656,11 +12313,19 @@ snapshots: dependencies: type-fest: 0.21.3 + ansi-fragments@0.2.1: + dependencies: + colorette: 1.4.0 + slice-ansi: 2.1.0 + strip-ansi: 5.2.0 + ansi-regex@2.1.1: {} + ansi-regex@4.1.1: {} + ansi-regex@5.0.1: {} - ansi-regex@6.0.1: {} + ansi-regex@6.1.0: {} ansi-styles@3.2.1: dependencies: @@ -8679,6 +12344,8 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 + appdirsjs@1.2.7: {} + aproba@1.2.0: {} archiver-utils@5.0.2: @@ -8689,14 +12356,14 @@ snapshots: lazystream: 1.0.1 lodash: 4.17.21 normalize-path: 3.0.0 - readable-stream: 4.5.2 + readable-stream: 4.6.0 archiver@7.0.1: dependencies: archiver-utils: 5.0.2 async: 3.2.6 buffer-crc32: 1.0.0 - readable-stream: 4.5.2 + readable-stream: 4.6.0 readdir-glob: 1.1.3 tar-stream: 3.1.7 zip-stream: 6.0.1 @@ -8718,14 +12385,22 @@ snapshots: dependencies: deep-equal: 2.2.3 - aria-query@5.3.0: + aria-query@5.3.2: {} + + arkregex@0.0.5: + dependencies: + '@ark/util': 0.56.0 + + arktype@2.2.0: dependencies: - dequal: 2.0.3 + '@ark/schema': 0.56.0 + '@ark/util': 0.56.0 + arkregex: 0.0.5 - array-buffer-byte-length@1.0.1: + array-buffer-byte-length@1.0.2: dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 + call-bound: 1.0.3 + is-array-buffer: 3.0.5 array-find-index@1.0.2: {} @@ -8733,21 +12408,22 @@ snapshots: array-union@2.1.0: {} - arraybuffer.prototype.slice@1.0.3: + arraybuffer.prototype.slice@1.0.4: dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.8 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 + get-intrinsic: 1.2.6 + is-array-buffer: 3.0.5 arrgv@1.0.2: {} arrify@3.0.0: {} + asap@2.0.6: {} + asn1@0.2.6: dependencies: safer-buffer: 2.1.2 @@ -8756,24 +12432,32 @@ snapshots: ast-types@0.13.4: dependencies: - tslib: 2.7.0 + tslib: 2.8.1 + + ast-types@0.15.2: + dependencies: + tslib: 2.8.1 + + astral-regex@1.0.0: {} async-exit-hook@2.0.1: {} + async-limiter@1.0.1: {} + async@3.2.6: {} asynckit@0.4.0: {} ava@5.1.1: dependencies: - acorn: 8.12.1 - acorn-walk: 8.3.3 + acorn: 8.14.0 + acorn-walk: 8.3.4 ansi-styles: 6.2.1 arrgv: 1.0.2 arrify: 3.0.0 callsites: 4.2.0 cbor: 8.1.0 - chalk: 5.3.0 + chalk: 5.4.1 chokidar: 3.6.0 chunkd: 2.0.1 ci-info: 3.9.0 @@ -8784,7 +12468,7 @@ snapshots: common-path-prefix: 3.0.0 concordance: 5.0.4 currently-unhandled: 0.4.1 - debug: 4.3.6 + debug: 4.4.0 del: 7.1.0 emittery: 1.0.3 figures: 5.0.0 @@ -8822,33 +12506,50 @@ snapshots: aws4@1.13.2: {} - axios@1.7.7: + axios@1.7.9: dependencies: - follow-redirects: 1.15.6 - form-data: 4.0.0 + follow-redirects: 1.15.9 + form-data: 4.0.1 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - b4a@1.6.6: {} + b4a@1.6.7: {} + + babel-core@7.0.0-bridge.0(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 + + babel-jest@28.1.3(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 + '@jest/transform': 28.1.3 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 28.1.3(@babel/core@7.26.0) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color - babel-jest@27.5.1(@babel/core@7.25.2): + babel-jest@28.1.3(@babel/core@7.29.7): dependencies: - '@babel/core': 7.25.2 - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 + '@babel/core': 7.29.7 + '@jest/transform': 28.1.3 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 27.5.1(@babel/core@7.25.2) + babel-preset-jest: 28.1.3(@babel/core@7.29.7) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 transitivePeerDependencies: - supports-color + optional: true babel-plugin-istanbul@6.1.1: dependencies: - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.25.9 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 @@ -8856,65 +12557,181 @@ snapshots: transitivePeerDependencies: - supports-color - babel-plugin-jest-hoist@27.5.1: + babel-plugin-jest-hoist@28.1.3: dependencies: - '@babel/template': 7.25.0 - '@babel/types': 7.25.6 + '@babel/template': 7.25.9 + '@babel/types': 7.26.3 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.6 - babel-preset-current-node-syntax@1.1.0(@babel/core@7.25.2): - dependencies: - '@babel/core': 7.25.2 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.2) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) - '@babel/plugin-syntax-import-attributes': 7.25.6(@babel/core@7.25.2) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.2) - - babel-preset-jest@27.5.1(@babel/core@7.25.2): - dependencies: - '@babel/core': 7.25.2 - babel-plugin-jest-hoist: 27.5.1 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.25.2) + babel-plugin-polyfill-corejs2@0.4.12(@babel/core@7.26.0): + dependencies: + '@babel/compat-data': 7.26.3 + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs2@0.4.12(@babel/core@7.29.7): + dependencies: + '@babel/compat-data': 7.26.3 + '@babel/core': 7.29.7 + '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.29.7) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + optional: true + + babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.7): + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/core': 7.29.7 + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0) + core-js-compat: 3.39.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.29.7): + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.29.7) + core-js-compat: 3.39.0 + transitivePeerDependencies: + - supports-color + optional: true + + babel-plugin-polyfill-corejs3@0.14.2(@babel/core@7.29.7): + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7) + core-js-compat: 3.49.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-regenerator@0.6.3(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-regenerator@0.6.3(@babel/core@7.29.7): + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.29.7) + transitivePeerDependencies: + - supports-color + optional: true + + babel-plugin-polyfill-regenerator@0.6.8(@babel/core@7.29.7): + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7) + transitivePeerDependencies: + - supports-color + + babel-plugin-syntax-hermes-parser@0.34.0: + dependencies: + hermes-parser: 0.34.0 + + babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.26.0): + dependencies: + '@babel/plugin-syntax-flow': 7.26.0(@babel/core@7.26.0) + transitivePeerDependencies: + - '@babel/core' + + babel-preset-current-node-syntax@1.1.0(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.26.0) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.0) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.26.0) + '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.26.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.26.0) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.26.0) + + babel-preset-current-node-syntax@1.1.0(@babel/core@7.29.7): + dependencies: + '@babel/core': 7.29.7 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.29.7) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.29.7) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.29.7) + '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.29.7) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.7) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.29.7) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.29.7) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.7) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.7) + optional: true + + babel-preset-jest@28.1.3(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 + babel-plugin-jest-hoist: 28.1.3 + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.0) + + babel-preset-jest@28.1.3(@babel/core@7.29.7): + dependencies: + '@babel/core': 7.29.7 + babel-plugin-jest-hoist: 28.1.3 + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.29.7) + optional: true balanced-match@1.0.2: {} - bare-events@2.4.2: + balanced-match@4.0.4: {} + + bare-events@2.5.0: optional: true - bare-fs@2.3.3: + bare-fs@2.3.5: dependencies: - bare-events: 2.4.2 + bare-events: 2.5.0 bare-path: 2.1.3 - bare-stream: 2.2.0 + bare-stream: 2.6.1 optional: true - bare-os@2.4.2: + bare-os@2.4.4: optional: true bare-path@2.1.3: dependencies: - bare-os: 2.4.2 + bare-os: 2.4.4 optional: true - bare-stream@2.2.0: + bare-stream@2.6.1: dependencies: - streamx: 2.20.0 + streamx: 2.21.1 optional: true base64-js@1.5.1: {} + baseline-browser-mapping@2.10.36: {} + basic-auth@2.0.1: dependencies: safe-buffer: 5.1.2 @@ -8940,7 +12757,7 @@ snapshots: blueimp-md5@2.19.0: {} - body-parser@1.20.2: + body-parser@1.20.3: dependencies: bytes: 3.1.2 content-type: 1.0.5 @@ -8950,7 +12767,7 @@ snapshots: http-errors: 2.0.0 iconv-lite: 0.4.24 on-finished: 2.4.1 - qs: 6.11.0 + qs: 6.13.0 raw-body: 2.5.2 type-is: 1.6.18 unpipe: 1.0.0 @@ -8975,6 +12792,10 @@ snapshots: dependencies: balanced-match: 1.0.2 + brace-expansion@5.0.6: + dependencies: + balanced-match: 4.0.4 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -8992,26 +12813,34 @@ snapshots: '@types/semver': 7.5.8 '@types/ua-parser-js': 0.7.39 browserslist: 4.20.2 - caniuse-lite: 1.0.30001655 + caniuse-lite: 1.0.30001690 isbot: 3.4.5 object-path: 0.11.8 semver: 7.6.3 - ua-parser-js: 1.0.38 + ua-parser-js: 1.0.40 browserslist@4.20.2: dependencies: - caniuse-lite: 1.0.30001655 - electron-to-chromium: 1.5.13 + caniuse-lite: 1.0.30001690 + electron-to-chromium: 1.5.76 escalade: 3.2.0 - node-releases: 2.0.18 - picocolors: 1.1.0 + node-releases: 2.0.19 + picocolors: 1.1.1 + + browserslist@4.24.3: + dependencies: + caniuse-lite: 1.0.30001690 + electron-to-chromium: 1.5.76 + node-releases: 2.0.19 + update-browserslist-db: 1.1.1(browserslist@4.24.3) - browserslist@4.23.3: + browserslist@4.28.2: dependencies: - caniuse-lite: 1.0.30001655 - electron-to-chromium: 1.5.13 - node-releases: 2.0.18 - update-browserslist-db: 1.1.0(browserslist@4.23.3) + baseline-browser-mapping: 2.10.36 + caniuse-lite: 1.0.30001799 + electron-to-chromium: 1.5.372 + node-releases: 2.0.47 + update-browserslist-db: 1.2.3(browserslist@4.28.2) bs-logger@0.2.6: dependencies: @@ -9100,14 +12929,33 @@ snapshots: normalize-url: 6.1.0 responselike: 2.0.1 - call-bind@1.0.7: + call-bind-apply-helpers@1.0.1: dependencies: - es-define-property: 1.0.0 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + get-intrinsic: 1.2.6 set-function-length: 1.2.2 + call-bound@1.0.3: + dependencies: + call-bind-apply-helpers: 1.0.1 + get-intrinsic: 1.2.6 + + caller-callsite@2.0.0: + dependencies: + callsites: 2.0.0 + + caller-path@2.0.0: + dependencies: + caller-callsite: 2.0.0 + + callsites@2.0.0: {} + callsites@3.1.0: {} callsites@4.2.0: {} @@ -9115,18 +12963,20 @@ snapshots: camel-case@4.1.2: dependencies: pascal-case: 3.1.2 - tslib: 2.7.0 + tslib: 2.8.1 camelcase@5.3.1: {} camelcase@6.3.0: {} - caniuse-lite@1.0.30001655: {} + caniuse-lite@1.0.30001690: {} + + caniuse-lite@1.0.30001799: {} capital-case@1.0.4: dependencies: no-case: 3.0.4 - tslib: 2.7.0 + tslib: 2.8.1 upper-case-first: 2.0.2 caseless@0.12.0: {} @@ -9146,7 +12996,7 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.3.0: {} + chalk@5.4.1: {} change-case@4.1.2: dependencies: @@ -9161,14 +13011,12 @@ snapshots: path-case: 3.0.4 sentence-case: 3.0.4 snake-case: 3.0.4 - tslib: 2.7.0 + tslib: 2.8.1 char-regex@1.0.2: {} chardet@0.7.0: {} - charenc@0.0.2: {} - chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -9185,13 +13033,20 @@ snapshots: chownr@2.0.0: {} - chromedriver@129.0.4: + chrome-launcher@0.15.2: + dependencies: + '@types/node': 14.6.4 + escape-string-regexp: 4.0.0 + is-wsl: 2.2.0 + lighthouse-logger: 1.4.2 + + chromedriver@131.0.4: dependencies: '@testim/chrome-version': 1.1.4 - axios: 1.7.7 + axios: 1.7.9 compare-versions: 6.1.1 extract-zip: 2.0.1 - proxy-agent: 6.4.0 + proxy-agent: 6.5.0 proxy-from-env: 1.1.0 tcp-port-used: 1.0.2 transitivePeerDependencies: @@ -9211,7 +13066,7 @@ snapshots: ci-parallel-vars@1.0.1: {} - cjs-module-lexer@1.4.0: {} + cjs-module-lexer@1.4.1: {} clean-stack@2.2.0: {} @@ -9236,11 +13091,11 @@ snapshots: cli-width@4.1.0: {} - cliui@7.0.4: + cliui@6.0.0: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 + wrap-ansi: 6.2.0 cliui@8.0.1: dependencies: @@ -9248,24 +13103,24 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - clone-buffer@1.0.0: {} + cliui@9.0.1: + dependencies: + string-width: 7.2.0 + strip-ansi: 7.1.0 + wrap-ansi: 9.0.2 + + clone-deep@4.0.1: + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 clone-response@1.0.3: dependencies: mimic-response: 1.0.1 - clone-stats@1.0.0: {} - clone@1.0.4: {} - clone@2.1.2: {} - - cloneable-readable@1.1.3: - dependencies: - inherits: 2.0.4 - process-nextick-args: 2.0.1 - readable-stream: 2.3.8 - co@4.6.0: {} code-excerpt@4.0.0: @@ -9288,12 +13143,16 @@ snapshots: color-name@1.1.4: {} + colorette@1.4.0: {} + colors@1.4.0: {} combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 + command-exists@1.2.9: {} + commander@2.20.3: {} commander@9.5.0: {} @@ -9317,7 +13176,11 @@ snapshots: crc32-stream: 6.0.0 is-stream: 2.0.1 normalize-path: 3.0.0 - readable-stream: 4.5.2 + readable-stream: 4.6.0 + + compressible@2.0.18: + dependencies: + mime-db: 1.53.0 compressing@1.10.1: dependencies: @@ -9326,11 +13189,21 @@ snapshots: get-ready: 1.0.0 iconv-lite: 0.5.2 mkdirp: 0.5.6 - pump: 3.0.0 + pump: 3.0.2 streamifier: 0.1.1 tar-stream: 1.6.2 yazl: 2.5.1 + compression@1.7.5: + dependencies: + bytes: 3.1.2 + compressible: 2.0.18 + debug: 2.6.9 + negotiator: 0.6.4 + on-headers: 1.0.2 + safe-buffer: 5.2.1 + vary: 1.1.2 + concat-map@0.0.1: {} concordance@5.0.4: @@ -9344,12 +13217,19 @@ snapshots: semver: 7.6.3 well-known-symbols: 2.0.0 + connect@3.7.0: + dependencies: + debug: 2.6.9 + finalhandler: 1.1.2 + parseurl: 1.3.3 + utils-merge: 1.0.1 + console-control-strings@1.1.0: {} constant-case@3.0.4: dependencies: no-case: 3.0.4 - tslib: 2.7.0 + tslib: 2.8.1 upper-case: 2.0.2 content-disposition@0.5.4: @@ -9366,16 +13246,31 @@ snapshots: cookie-signature@1.0.6: {} - cookie@0.6.0: {} + cookie@0.7.1: {} + + core-js-compat@3.39.0: + dependencies: + browserslist: 4.24.3 + + core-js-compat@3.49.0: + dependencies: + browserslist: 4.28.2 core-util-is@1.0.2: {} core-util-is@1.0.3: {} + cosmiconfig@5.2.1: + dependencies: + import-fresh: 2.0.0 + is-directory: 0.3.1 + js-yaml: 3.14.1 + parse-json: 4.0.0 + cpu-features@0.0.10: dependencies: buildcheck: 0.0.6 - nan: 2.20.0 + nan: 2.22.0 optional: true crc-32@1.2.2: {} @@ -9383,7 +13278,7 @@ snapshots: crc32-stream@6.0.0: dependencies: crc-32: 1.2.2 - readable-stream: 4.5.2 + readable-stream: 4.6.0 create-require@1.1.1: {} @@ -9393,7 +13288,7 @@ snapshots: transitivePeerDependencies: - encoding - cross-spawn@6.0.5: + cross-spawn@6.0.6: dependencies: nice-try: 1.0.5 path-key: 2.0.1 @@ -9401,7 +13296,7 @@ snapshots: shebang-command: 1.2.0 which: 1.3.1 - cross-spawn@7.0.3: + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 @@ -9409,22 +13304,22 @@ snapshots: crosspath@1.0.0: dependencies: - '@types/node': 16.18.106 - - crypt@0.0.2: {} + '@types/node': 16.18.122 - css-shorthand-properties@1.1.1: {} + css-shorthand-properties@1.1.2: {} css-value@0.0.1: {} cssom@0.3.8: {} - cssom@0.4.4: {} + cssom@0.5.0: {} cssstyle@2.3.0: dependencies: cssom: 0.3.8 + csstype@3.1.3: {} + currently-unhandled@0.4.1: dependencies: array-find-index: 1.0.2 @@ -9437,34 +13332,36 @@ snapshots: data-uri-to-buffer@6.0.2: {} - data-urls@2.0.0: + data-urls@3.0.2: dependencies: abab: 2.0.6 - whatwg-mimetype: 2.3.0 - whatwg-url: 8.7.0 + whatwg-mimetype: 3.0.0 + whatwg-url: 11.0.0 - data-view-buffer@1.0.1: + data-view-buffer@1.0.2: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - is-data-view: 1.0.1 + is-data-view: 1.0.2 - data-view-byte-length@1.0.1: + data-view-byte-length@1.0.2: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - is-data-view: 1.0.1 + is-data-view: 1.0.2 - data-view-byte-offset@1.0.0: + data-view-byte-offset@1.0.1: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - is-data-view: 1.0.1 + is-data-view: 1.0.2 date-time@3.1.0: dependencies: time-zone: 1.0.0 + dayjs@1.11.13: {} + debug@2.6.9: dependencies: ms: 2.0.0 @@ -9477,9 +13374,15 @@ snapshots: dependencies: ms: 2.1.2 - debug@4.3.6: + debug@4.4.0: dependencies: - ms: 2.1.2 + ms: 2.1.3 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decamelize@1.2.0: {} decamelize@6.0.0: {} @@ -9493,26 +13396,28 @@ snapshots: dedent@0.7.0: {} + dedent@1.7.2: {} + deep-equal@2.2.3: dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 es-get-iterator: 1.1.3 - get-intrinsic: 1.2.4 - is-arguments: 1.1.1 - is-array-buffer: 3.0.4 - is-date-object: 1.0.5 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 + get-intrinsic: 1.2.6 + is-arguments: 1.2.0 + is-array-buffer: 3.0.5 + is-date-object: 1.1.0 + is-regex: 1.2.1 + is-shared-array-buffer: 1.0.4 isarray: 2.0.5 object-is: 1.1.6 object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - side-channel: 1.0.6 - which-boxed-primitive: 1.0.2 + object.assign: 4.1.7 + regexp.prototype.flags: 1.5.3 + side-channel: 1.1.0 + which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.15 + which-typed-array: 1.1.18 deep-is@0.1.4: {} @@ -9528,9 +13433,9 @@ snapshots: define-data-property@1.1.4: dependencies: - es-define-property: 1.0.0 + es-define-property: 1.0.1 es-errors: 1.3.0 - gopd: 1.0.1 + gopd: 1.2.0 define-properties@1.2.1: dependencies: @@ -9555,13 +13460,23 @@ snapshots: rimraf: 3.0.2 slash: 4.0.0 + del@8.0.1: + dependencies: + globby: 14.1.0 + is-glob: 4.0.3 + is-path-cwd: 3.0.0 + is-path-inside: 4.0.0 + p-map: 7.0.4 + presentable-error: 0.0.1 + slash: 5.1.0 + delayed-stream@1.0.0: {} delegates@1.0.0: {} - depd@2.0.0: {} + denodeify@1.2.1: {} - dequal@2.0.3: {} + depd@2.0.0: {} destroy@1.2.0: {} @@ -9571,7 +13486,7 @@ snapshots: devtools-protocol@0.0.1302984: {} - diff-sequences@27.5.1: {} + diff-sequences@28.1.1: {} diff-sequences@29.6.3: {} @@ -9585,10 +13500,10 @@ snapshots: docker-modem@3.0.8: dependencies: - debug: 4.3.6 + debug: 4.4.0 readable-stream: 3.6.2 split-ca: 1.0.1 - ssh2: 1.15.0 + ssh2: 1.16.0 transitivePeerDependencies: - supports-color @@ -9606,16 +13521,22 @@ snapshots: dom-accessibility-api@0.5.16: {} - domexception@2.0.1: + domexception@4.0.0: dependencies: - webidl-conversions: 5.0.0 + webidl-conversions: 7.0.0 dot-case@3.0.4: dependencies: no-case: 3.0.4 - tslib: 2.7.0 + tslib: 2.8.1 - dotenv@16.4.5: {} + dotenv@16.4.7: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 duplexer@0.1.1: {} @@ -9642,10 +13563,10 @@ snapshots: edgedriver@5.6.1: dependencies: '@wdio/logger': 8.38.0 - '@zip.js/zip.js': 2.7.52 + '@zip.js/zip.js': 2.7.54 decamelize: 6.0.0 edge-paths: 3.0.5 - fast-xml-parser: 4.5.0 + fast-xml-parser: 4.5.1 node-fetch: 3.3.2 which: 4.0.0 @@ -9655,18 +13576,24 @@ snapshots: dependencies: jake: 10.9.2 - electron-to-chromium@1.5.13: {} + electron-to-chromium@1.5.372: {} + + electron-to-chromium@1.5.76: {} - emittery@0.8.1: {} + emittery@0.10.2: {} emittery@1.0.3: {} + emoji-regex@10.6.0: {} + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} encodeurl@1.0.2: {} + encodeurl@2.0.0: {} + encoding@0.1.13: dependencies: iconv-lite: 0.6.3 @@ -9682,78 +13609,90 @@ snapshots: env-paths@2.2.1: {} + envinfo@7.14.0: {} + err-code@2.0.3: {} error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - es-abstract@1.23.3: + error-stack-parser@2.1.4: + dependencies: + stackframe: 1.3.4 + + errorhandler@1.5.1: + dependencies: + accepts: 1.3.8 + escape-html: 1.0.3 + + es-abstract@1.23.8: dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 + call-bind: 1.0.8 + call-bound: 1.0.3 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 es-errors: 1.3.0 es-object-atoms: 1.0.0 es-set-tostringtag: 2.0.3 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.2.6 + get-symbol-description: 1.1.0 globalthis: 1.0.4 - gopd: 1.0.1 + gopd: 1.2.0 has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 + has-proto: 1.2.0 + has-symbols: 1.1.0 hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 is-callable: 1.2.7 - is-data-view: 1.0.1 - is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.2 + is-data-view: 1.0.2 + is-regex: 1.2.1 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.0 + math-intrinsics: 1.1.0 + object-inspect: 1.13.3 object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.3 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.18 - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 + es-define-property@1.0.1: {} es-errors@1.3.0: {} es-get-iterator@1.1.3: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - is-arguments: 1.1.1 + call-bind: 1.0.8 + get-intrinsic: 1.2.6 + has-symbols: 1.1.0 + is-arguments: 1.2.0 is-map: 2.0.3 is-set: 2.0.3 - is-string: 1.0.7 + is-string: 1.1.1 isarray: 2.0.5 - stop-iteration-iterator: 1.0.0 + stop-iteration-iterator: 1.1.0 es-object-atoms@1.0.0: dependencies: @@ -9761,15 +13700,15 @@ snapshots: es-set-tostringtag@2.0.3: dependencies: - get-intrinsic: 1.2.4 + get-intrinsic: 1.2.6 has-tostringtag: 1.0.2 hasown: 2.0.2 - es-to-primitive@1.2.1: + es-to-primitive@1.3.0: dependencies: is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 + is-date-object: 1.1.0 + is-symbol: 1.1.1 escalade@3.2.0: {} @@ -9828,8 +13767,8 @@ snapshots: '@humanwhocodes/config-array': 0.9.5 ajv: 6.12.6 chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.6 + cross-spawn: 7.0.6 + debug: 4.4.0 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -9864,8 +13803,8 @@ snapshots: espree@9.6.1: dependencies: - acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} @@ -9888,8 +13827,6 @@ snapshots: estree-walker@1.0.1: {} - estree-walker@2.0.1: {} - estree-walker@2.0.2: {} esutils@2.0.3: {} @@ -9902,7 +13839,7 @@ snapshots: execa@5.1.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 6.0.1 human-signals: 2.1.0 is-stream: 2.0.1 @@ -9914,7 +13851,7 @@ snapshots: execa@8.0.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 8.0.1 human-signals: 5.0.0 is-stream: 3.0.0 @@ -9928,7 +13865,7 @@ snapshots: expect-webdriverio@4.15.4(encoding@0.1.13)(typescript@4.6.4): dependencies: - '@vitest/snapshot': 2.0.5 + '@vitest/snapshot': 2.1.8 expect: 29.7.0 jest-matcher-utils: 29.7.0 lodash.isequal: 4.5.0 @@ -9944,12 +13881,13 @@ snapshots: - typescript - utf-8-validate - expect@27.5.1: + expect@28.1.3: dependencies: - '@jest/types': 27.5.1 - jest-get-type: 27.5.1 - jest-matcher-utils: 27.5.1 - jest-message-util: 27.5.1 + '@jest/expect-utils': 28.1.3 + jest-get-type: 28.0.2 + jest-matcher-utils: 28.1.3 + jest-message-util: 28.1.3 + jest-util: 28.1.3 expect@29.7.0: dependencies: @@ -9959,34 +13897,36 @@ snapshots: jest-message-util: 29.7.0 jest-util: 29.7.0 - express@4.19.2: + exponential-backoff@3.1.1: {} + + express@4.21.2: dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.2 + body-parser: 1.20.3 content-disposition: 0.5.4 content-type: 1.0.5 - cookie: 0.6.0 + cookie: 0.7.1 cookie-signature: 1.0.6 debug: 2.6.9 depd: 2.0.0 - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 - finalhandler: 1.2.0 + finalhandler: 1.3.1 fresh: 0.5.2 http-errors: 2.0.0 - merge-descriptors: 1.0.1 + merge-descriptors: 1.0.3 methods: 1.1.2 on-finished: 2.4.1 parseurl: 1.3.3 - path-to-regexp: 0.1.7 + path-to-regexp: 0.1.12 proxy-addr: 2.0.7 - qs: 6.11.0 + qs: 6.13.0 range-parser: 1.2.1 safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 + send: 0.19.0 + serve-static: 1.16.2 setprototypeof: 1.2.0 statuses: 2.0.1 type-is: 1.6.18 @@ -10003,7 +13943,7 @@ snapshots: extract-zip@2.0.1: dependencies: - debug: 4.3.6 + debug: 4.4.0 get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -10013,6 +13953,8 @@ snapshots: extsprintf@1.3.0: {} + fast-base64-decode@1.0.0: {} + fast-deep-equal@2.0.1: {} fast-deep-equal@3.1.3: {} @@ -10029,15 +13971,23 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} - fast-xml-parser@4.5.0: + fast-xml-parser@4.5.1: dependencies: strnum: 1.0.5 - fastq@1.17.1: + fastq@1.18.0: dependencies: reusify: 1.0.4 @@ -10081,16 +14031,36 @@ snapshots: filter-obj@1.1.0: {} - finalhandler@1.2.0: + finalhandler@1.1.2: dependencies: debug: 2.6.9 encodeurl: 1.0.2 escape-html: 1.0.3 + on-finished: 2.3.0 + parseurl: 1.3.3 + statuses: 1.5.0 + unpipe: 1.0.0 + + finalhandler@1.3.1: + dependencies: + debug: 2.6.9 + encodeurl: 2.0.0 + escape-html: 1.0.3 on-finished: 2.4.1 parseurl: 1.3.3 statuses: 2.0.1 unpipe: 1.0.0 + find-cache-dir@2.1.0: + dependencies: + commondir: 1.0.1 + make-dir: 2.1.0 + pkg-dir: 3.0.0 + + find-up@3.0.0: + dependencies: + locate-path: 3.0.0 + find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -10108,15 +14078,19 @@ snapshots: flat-cache@3.2.0: dependencies: - flatted: 3.3.1 + flatted: 3.3.2 keyv: 4.5.4 rimraf: 3.0.2 - flatted@3.3.1: {} + flatted@3.3.2: {} + + flow-enums-runtime@0.0.6: {} + + flow-parser@0.257.1: {} flushwritable@1.0.0: {} - follow-redirects@1.15.6: {} + follow-redirects@1.15.9: {} for-each@0.3.3: dependencies: @@ -10124,7 +14098,7 @@ snapshots: foreground-child@3.3.0: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 signal-exit: 4.1.0 forever-agent@0.6.1: {} @@ -10137,13 +14111,7 @@ snapshots: combined-stream: 1.0.8 mime-types: 2.1.35 - form-data@3.0.1: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - - form-data@4.0.0: + form-data@4.0.1: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 @@ -10165,6 +14133,18 @@ snapshots: jsonfile: 6.1.0 universalify: 2.0.1 + fs-extra@11.3.5: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + fs-minipass@2.1.0: dependencies: minipass: 3.3.6 @@ -10176,12 +14156,14 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.6: + function.prototype.name@1.1.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-abstract: 1.23.3 functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 functional-red-black-tree@1.0.1: {} @@ -10202,13 +14184,13 @@ snapshots: dependencies: globule: 1.3.4 - geckodriver@4.4.4: + geckodriver@4.5.1: dependencies: - '@wdio/logger': 9.0.4 - '@zip.js/zip.js': 2.7.52 + '@wdio/logger': 9.4.4 + '@zip.js/zip.js': 2.7.54 decamelize: 6.0.0 http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.5 + https-proxy-agent: 7.0.6 node-fetch: 3.3.2 tar-fs: 3.0.6 which: 4.0.0 @@ -10219,13 +14201,20 @@ snapshots: get-caller-file@2.0.5: {} - get-intrinsic@1.2.4: + get-east-asian-width@1.6.0: {} + + get-intrinsic@1.2.6: dependencies: + call-bind-apply-helpers: 1.0.1 + dunder-proto: 1.0.1 + es-define-property: 1.0.1 es-errors: 1.3.0 + es-object-atoms: 1.0.0 function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 + gopd: 1.2.0 + has-symbols: 1.1.0 hasown: 2.0.2 + math-intrinsics: 1.1.0 get-package-type@0.1.0: {} @@ -10235,24 +14224,23 @@ snapshots: get-stream@5.2.0: dependencies: - pump: 3.0.0 + pump: 3.0.2 get-stream@6.0.1: {} get-stream@8.0.1: {} - get-symbol-description@1.0.2: + get-symbol-description@1.1.0: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.4 + get-intrinsic: 1.2.6 - get-uri@6.0.3: + get-uri@6.0.4: dependencies: basic-ftp: 5.0.5 data-uri-to-buffer: 6.0.2 - debug: 4.3.6 - fs-extra: 11.2.0 + debug: 4.4.0 transitivePeerDependencies: - supports-color @@ -10274,15 +14262,21 @@ snapshots: jackspeak: 3.4.3 minimatch: 9.0.5 minipass: 7.1.2 - package-json-from-dist: 1.0.0 + package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + glob@13.0.6: + dependencies: + minimatch: 10.2.5 + minipass: 7.1.3 + path-scurry: 2.0.2 + glob@7.1.7: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 3.0.8 + minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 @@ -10313,7 +14307,7 @@ snapshots: globalthis@1.0.4: dependencies: define-properties: 1.2.1 - gopd: 1.0.1 + gopd: 1.2.0 globby@11.1.0: dependencies: @@ -10332,38 +14326,22 @@ snapshots: merge2: 1.4.1 slash: 4.0.0 + globby@14.1.0: + dependencies: + '@sindresorhus/merge-streams': 2.3.0 + fast-glob: 3.3.3 + ignore: 7.0.5 + path-type: 6.0.0 + slash: 5.1.0 + unicorn-magic: 0.3.0 + globule@1.3.4: dependencies: glob: 7.1.7 lodash: 4.17.21 minimatch: 3.0.8 - google-closure-compiler-java@20210808.0.0: {} - - google-closure-compiler-linux@20210808.0.0: - optional: true - - google-closure-compiler-osx@20210808.0.0: - optional: true - - google-closure-compiler-windows@20210808.0.0: - optional: true - - google-closure-compiler@20210808.0.0: - dependencies: - chalk: 2.4.2 - google-closure-compiler-java: 20210808.0.0 - minimist: 1.2.8 - vinyl: 2.2.1 - vinyl-sourcemaps-apply: 0.2.1 - optionalDependencies: - google-closure-compiler-linux: 20210808.0.0 - google-closure-compiler-osx: 20210808.0.0 - google-closure-compiler-windows: 20210808.0.0 - - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.4 + gopd@1.2.0: {} got@11.8.6: dependencies: @@ -10408,7 +14386,7 @@ snapshots: ajv: 6.12.6 har-schema: 2.0.0 - has-bigints@1.0.2: {} + has-bigints@1.1.0: {} has-flag@3.0.0: {} @@ -10416,15 +14394,17 @@ snapshots: has-property-descriptors@1.0.2: dependencies: - es-define-property: 1.0.0 + es-define-property: 1.0.1 - has-proto@1.0.3: {} + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 - has-symbols@1.0.3: {} + has-symbols@1.1.0: {} has-tostringtag@1.0.2: dependencies: - has-symbols: 1.0.3 + has-symbols: 1.1.0 has-unicode@2.0.1: {} @@ -10440,10 +14420,32 @@ snapshots: header-case@2.0.4: dependencies: capital-case: 1.0.4 - tslib: 2.7.0 + tslib: 2.8.1 helpertypes@0.0.18: {} + hermes-estree@0.19.1: {} + + hermes-estree@0.23.1: {} + + hermes-estree@0.34.0: {} + + hermes-parser@0.19.1: + dependencies: + hermes-estree: 0.19.1 + + hermes-parser@0.23.1: + dependencies: + hermes-estree: 0.23.1 + + hermes-parser@0.34.0: + dependencies: + hermes-estree: 0.34.0 + + hermes-profile-transformer@0.0.6: + dependencies: + source-map: 0.7.4 + hosted-git-info@2.8.9: {} hosted-git-info@4.1.0: @@ -10454,9 +14456,9 @@ snapshots: dependencies: lru-cache: 10.4.3 - html-encoding-sniffer@2.0.1: + html-encoding-sniffer@3.0.0: dependencies: - whatwg-encoding: 1.0.5 + whatwg-encoding: 2.0.0 html-escaper@2.0.2: {} @@ -10474,14 +14476,22 @@ snapshots: dependencies: '@tootallnate/once': 1.1.2 agent-base: 6.0.2 - debug: 4.3.6 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + + http-proxy-agent@5.0.0: + dependencies: + '@tootallnate/once': 2.0.0 + agent-base: 6.0.2 + debug: 4.4.0 transitivePeerDependencies: - supports-color http-proxy-agent@7.0.2: dependencies: - agent-base: 7.1.1 - debug: 4.3.6 + agent-base: 7.1.3 + debug: 4.4.0 transitivePeerDependencies: - supports-color @@ -10504,14 +14514,14 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.6 + debug: 4.4.0 transitivePeerDependencies: - supports-color - https-proxy-agent@7.0.5: + https-proxy-agent@7.0.6: dependencies: - agent-base: 7.1.1 - debug: 4.3.6 + agent-base: 7.1.3 + debug: 4.4.0 transitivePeerDependencies: - supports-color @@ -10534,7 +14544,6 @@ snapshots: iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 - optional: true ieee754@1.2.1: {} @@ -10546,8 +14555,19 @@ snapshots: ignore@5.3.2: {} + ignore@7.0.5: {} + + image-size@1.2.0: + dependencies: + queue: 6.0.2 + immediate@3.0.6: {} + import-fresh@2.0.0: + dependencies: + caller-path: 2.0.0 + resolve-from: 3.0.0 + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 @@ -10583,7 +14603,7 @@ snapshots: dependencies: '@ljharb/through': 2.3.13 ansi-escapes: 4.3.2 - chalk: 5.3.0 + chalk: 5.4.1 cli-cursor: 3.1.0 cli-width: 4.1.0 external-editor: 3.1.0 @@ -10597,11 +14617,15 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 6.2.0 - internal-slot@1.0.7: + internal-slot@1.1.0: dependencies: es-errors: 1.3.0 hasown: 2.0.2 - side-channel: 1.0.6 + side-channel: 1.1.0 + + invariant@2.2.4: + dependencies: + loose-envify: 1.4.0 ip-address@9.0.5: dependencies: @@ -10616,29 +14640,34 @@ snapshots: irregular-plurals@3.5.0: {} - is-arguments@1.1.1: + is-arguments@1.2.0: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 has-tostringtag: 1.0.2 - is-array-buffer@3.0.4: + is-array-buffer@3.0.5: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.2.6 is-arrayish@0.2.1: {} - is-bigint@1.0.4: + is-async-function@2.0.0: + dependencies: + has-tostringtag: 1.0.2 + + is-bigint@1.1.0: dependencies: - has-bigints: 1.0.2 + has-bigints: 1.1.0 is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 - is-boolean-object@1.1.2: + is-boolean-object@1.2.1: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 has-tostringtag: 1.0.2 is-callable@1.2.7: {} @@ -10647,32 +14676,49 @@ snapshots: dependencies: ci-info: 2.0.0 - is-core-module@2.15.1: + is-core-module@2.16.1: dependencies: hasown: 2.0.2 - is-data-view@1.0.1: + is-data-view@1.0.2: dependencies: - is-typed-array: 1.1.13 + call-bound: 1.0.3 + get-intrinsic: 1.2.6 + is-typed-array: 1.1.15 - is-date-object@1.0.5: + is-date-object@1.1.0: dependencies: + call-bound: 1.0.3 has-tostringtag: 1.0.2 + is-directory@0.3.1: {} + + is-docker@2.2.1: {} + is-error@2.2.2: {} is-extglob@2.1.1: {} + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.3 + is-fullwidth-code-point@1.0.0: dependencies: number-is-nan: 1.0.1 + is-fullwidth-code-point@2.0.0: {} + is-fullwidth-code-point@3.0.0: {} is-fullwidth-code-point@4.0.0: {} is-generator-fn@2.1.0: {} + is-generator-function@1.0.10: + dependencies: + has-tostringtag: 1.0.2 + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 @@ -10685,10 +14731,9 @@ snapshots: is-module@1.0.0: {} - is-negative-zero@2.0.3: {} - - is-number-object@1.0.7: + is-number-object@1.1.1: dependencies: + call-bound: 1.0.3 has-tostringtag: 1.0.2 is-number@7.0.0: {} @@ -10697,8 +14742,14 @@ snapshots: is-path-inside@4.0.0: {} + is-plain-obj@2.1.0: {} + is-plain-obj@4.1.0: {} + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + is-plain-object@5.0.0: {} is-potential-custom-element-name@1.0.1: {} @@ -10707,34 +14758,39 @@ snapshots: is-reference@1.2.1: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 - is-regex@1.1.4: + is-regex@1.2.1: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 + gopd: 1.2.0 has-tostringtag: 1.0.2 + hasown: 2.0.2 is-set@2.0.3: {} - is-shared-array-buffer@1.0.3: + is-shared-array-buffer@1.0.4: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 is-stream@2.0.1: {} is-stream@3.0.0: {} - is-string@1.0.7: + is-string@1.1.1: dependencies: + call-bound: 1.0.3 has-tostringtag: 1.0.2 - is-symbol@1.0.4: + is-symbol@1.1.1: dependencies: - has-symbols: 1.0.3 + call-bound: 1.0.3 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 - is-typed-array@1.1.13: + is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.15 + which-typed-array: 1.1.18 is-typedarray@1.0.0: {} @@ -10746,14 +14802,20 @@ snapshots: is-weakmap@2.0.2: {} - is-weakref@1.0.2: + is-weakref@1.1.0: + dependencies: + call-bound: 1.0.3 + + is-weakset@2.0.4: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 + get-intrinsic: 1.2.6 - is-weakset@2.0.3: + is-wsl@1.1.0: {} + + is-wsl@2.2.0: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + is-docker: 2.2.1 is2@2.0.9: dependencies: @@ -10771,14 +14833,18 @@ snapshots: isexe@3.1.1: {} + isexe@4.0.0: {} + + isobject@3.0.1: {} + isstream@0.1.2: {} istanbul-lib-coverage@3.2.2: {} istanbul-lib-instrument@5.2.1: dependencies: - '@babel/core': 7.25.2 - '@babel/parser': 7.25.6 + '@babel/core': 7.26.0 + '@babel/parser': 7.26.3 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -10793,7 +14859,7 @@ snapshots: istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.3.6 + debug: 4.4.0 istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -10817,159 +14883,176 @@ snapshots: filelist: 1.0.4 minimatch: 3.1.2 - jasmine-core@5.2.0: {} + jasmine-core@5.5.0: {} - jasmine@5.2.0: + jasmine@5.5.0: dependencies: glob: 10.4.5 - jasmine-core: 5.2.0 + jasmine-core: 5.5.0 - jest-changed-files@27.5.1: + jest-changed-files@28.1.3: dependencies: - '@jest/types': 27.5.1 execa: 5.1.1 - throat: 6.0.2 + p-limit: 3.1.0 - jest-circus@27.5.1: + jest-circus@28.1.3: dependencies: - '@jest/environment': 27.5.1 - '@jest/test-result': 27.5.1 - '@jest/types': 27.5.1 + '@jest/environment': 28.1.3 + '@jest/expect': 28.1.3 + '@jest/test-result': 28.1.3 + '@jest/types': 28.1.3 '@types/node': 14.6.4 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 - expect: 27.5.1 is-generator-fn: 2.1.0 - jest-each: 27.5.1 - jest-matcher-utils: 27.5.1 - jest-message-util: 27.5.1 - jest-runtime: 27.5.1 - jest-snapshot: 27.5.1 - jest-util: 27.5.1 - pretty-format: 27.5.1 + jest-each: 28.1.3 + jest-matcher-utils: 28.1.3 + jest-message-util: 28.1.3 + jest-runtime: 28.1.3 + jest-snapshot: 28.1.3 + jest-util: 28.1.3 + p-limit: 3.1.0 + pretty-format: 28.1.3 slash: 3.0.0 stack-utils: 2.0.6 - throat: 6.0.2 transitivePeerDependencies: - supports-color - jest-cli@27.5.1(ts-node@10.9.2(@types/node@14.6.4)(typescript@4.6.4)): + jest-cli@28.1.3(@types/node@14.6.4)(ts-node@10.9.2(@types/node@14.6.4)(typescript@4.6.4)): dependencies: - '@jest/core': 27.5.1(ts-node@10.9.2(@types/node@14.6.4)(typescript@4.6.4)) - '@jest/test-result': 27.5.1 - '@jest/types': 27.5.1 + '@jest/core': 28.1.3(ts-node@10.9.2(@types/node@14.6.4)(typescript@4.6.4)) + '@jest/test-result': 28.1.3 + '@jest/types': 28.1.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 import-local: 3.2.0 - jest-config: 27.5.1(ts-node@10.9.2(@types/node@14.6.4)(typescript@4.6.4)) - jest-util: 27.5.1 - jest-validate: 27.5.1 + jest-config: 28.1.3(@types/node@14.6.4)(ts-node@10.9.2(@types/node@14.6.4)(typescript@4.6.4)) + jest-util: 28.1.3 + jest-validate: 28.1.3 prompts: 2.4.2 - yargs: 16.2.0 + yargs: 17.7.2 transitivePeerDependencies: - - bufferutil - - canvas + - '@types/node' - supports-color - ts-node - - utf-8-validate - jest-cli@27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)): + jest-cli@28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)): dependencies: - '@jest/core': 27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)) - '@jest/test-result': 27.5.1 - '@jest/types': 27.5.1 + '@jest/core': 28.1.3(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) + '@jest/test-result': 28.1.3 + '@jest/types': 28.1.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 import-local: 3.2.0 - jest-config: 27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)) - jest-util: 27.5.1 - jest-validate: 27.5.1 + jest-config: 28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) + jest-util: 28.1.3 + jest-validate: 28.1.3 prompts: 2.4.2 - yargs: 16.2.0 + yargs: 17.7.2 transitivePeerDependencies: - - bufferutil - - canvas + - '@types/node' - supports-color - ts-node - - utf-8-validate - jest-config@27.5.1(ts-node@10.9.2(@types/node@14.6.4)(typescript@4.6.4)): + jest-config@28.1.3(@types/node@14.6.4)(ts-node@10.9.2(@types/node@14.6.4)(typescript@4.6.4)): dependencies: - '@babel/core': 7.25.2 - '@jest/test-sequencer': 27.5.1 - '@jest/types': 27.5.1 - babel-jest: 27.5.1(@babel/core@7.25.2) + '@babel/core': 7.26.0 + '@jest/test-sequencer': 28.1.3 + '@jest/types': 28.1.3 + babel-jest: 28.1.3(@babel/core@7.26.0) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 glob: 7.2.3 graceful-fs: 4.2.11 - jest-circus: 27.5.1 - jest-environment-jsdom: 27.5.1 - jest-environment-node: 27.5.1 - jest-get-type: 27.5.1 - jest-jasmine2: 27.5.1 - jest-regex-util: 27.5.1 - jest-resolve: 27.5.1 - jest-runner: 27.5.1 - jest-util: 27.5.1 - jest-validate: 27.5.1 + jest-circus: 28.1.3 + jest-environment-node: 28.1.3 + jest-get-type: 28.0.2 + jest-regex-util: 28.0.2 + jest-resolve: 28.1.3 + jest-runner: 28.1.3 + jest-util: 28.1.3 + jest-validate: 28.1.3 micromatch: 4.0.8 parse-json: 5.2.0 - pretty-format: 27.5.1 + pretty-format: 28.1.3 slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: + '@types/node': 14.6.4 ts-node: 10.9.2(@types/node@14.6.4)(typescript@4.6.4) transitivePeerDependencies: - - bufferutil - - canvas - supports-color - - utf-8-validate - jest-config@27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)): + jest-config@28.1.3(@types/node@14.6.4)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)): dependencies: - '@babel/core': 7.25.2 - '@jest/test-sequencer': 27.5.1 - '@jest/types': 27.5.1 - babel-jest: 27.5.1(@babel/core@7.25.2) + '@babel/core': 7.26.0 + '@jest/test-sequencer': 28.1.3 + '@jest/types': 28.1.3 + babel-jest: 28.1.3(@babel/core@7.26.0) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 glob: 7.2.3 graceful-fs: 4.2.11 - jest-circus: 27.5.1 - jest-environment-jsdom: 27.5.1 - jest-environment-node: 27.5.1 - jest-get-type: 27.5.1 - jest-jasmine2: 27.5.1 - jest-regex-util: 27.5.1 - jest-resolve: 27.5.1 - jest-runner: 27.5.1 - jest-util: 27.5.1 - jest-validate: 27.5.1 + jest-circus: 28.1.3 + jest-environment-node: 28.1.3 + jest-get-type: 28.0.2 + jest-regex-util: 28.0.2 + jest-resolve: 28.1.3 + jest-runner: 28.1.3 + jest-util: 28.1.3 + jest-validate: 28.1.3 micromatch: 4.0.8 parse-json: 5.2.0 - pretty-format: 27.5.1 + pretty-format: 28.1.3 slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - ts-node: 10.9.2(@types/node@20.16.3)(typescript@4.6.4) + '@types/node': 14.6.4 + ts-node: 10.9.2(@types/node@20.17.10)(typescript@4.6.4) transitivePeerDependencies: - - bufferutil - - canvas - supports-color - - utf-8-validate - jest-diff@27.5.1: + jest-config@28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)): dependencies: + '@babel/core': 7.26.0 + '@jest/test-sequencer': 28.1.3 + '@jest/types': 28.1.3 + babel-jest: 28.1.3(@babel/core@7.26.0) chalk: 4.1.2 - diff-sequences: 27.5.1 - jest-get-type: 27.5.1 - pretty-format: 27.5.1 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 28.1.3 + jest-environment-node: 28.1.3 + jest-get-type: 28.0.2 + jest-regex-util: 28.0.2 + jest-resolve: 28.1.3 + jest-runner: 28.1.3 + jest-util: 28.1.3 + jest-validate: 28.1.3 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 28.1.3 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 20.17.10 + ts-node: 10.9.2(@types/node@20.17.10)(typescript@4.6.4) + transitivePeerDependencies: + - supports-color + + jest-diff@28.1.3: + dependencies: + chalk: 4.1.2 + diff-sequences: 28.1.1 + jest-get-type: 28.0.2 + pretty-format: 28.1.3 jest-diff@29.7.0: dependencies: @@ -10978,100 +15061,87 @@ snapshots: jest-get-type: 29.6.3 pretty-format: 29.7.0 - jest-docblock@27.5.1: + jest-docblock@28.1.1: dependencies: detect-newline: 3.1.0 - jest-each@27.5.1: + jest-each@28.1.3: dependencies: - '@jest/types': 27.5.1 + '@jest/types': 28.1.3 chalk: 4.1.2 - jest-get-type: 27.5.1 - jest-util: 27.5.1 - pretty-format: 27.5.1 + jest-get-type: 28.0.2 + jest-util: 28.1.3 + pretty-format: 28.1.3 - jest-environment-jsdom-global@3.0.0(jest-environment-jsdom@27.5.1): + jest-environment-jsdom-global@4.0.0(jest-environment-jsdom@28.1.3): dependencies: - jest-environment-jsdom: 27.5.1 + jest-environment-jsdom: 28.1.3 - jest-environment-jsdom@27.5.1: + jest-environment-jsdom@28.1.3: dependencies: - '@jest/environment': 27.5.1 - '@jest/fake-timers': 27.5.1 - '@jest/types': 27.5.1 + '@jest/environment': 28.1.3 + '@jest/fake-timers': 28.1.3 + '@jest/types': 28.1.3 + '@types/jsdom': 16.2.15 '@types/node': 14.6.4 - jest-mock: 27.5.1 - jest-util: 27.5.1 - jsdom: 16.7.0 + jest-mock: 28.1.3 + jest-util: 28.1.3 + jsdom: 19.0.0 transitivePeerDependencies: - bufferutil - canvas - supports-color - utf-8-validate - jest-environment-node@27.5.1: + jest-environment-node@28.1.3: dependencies: - '@jest/environment': 27.5.1 - '@jest/fake-timers': 27.5.1 - '@jest/types': 27.5.1 + '@jest/environment': 28.1.3 + '@jest/fake-timers': 28.1.3 + '@jest/types': 28.1.3 + '@types/node': 14.6.4 + jest-mock: 28.1.3 + jest-util: 28.1.3 + + jest-environment-node@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 '@types/node': 14.6.4 - jest-mock: 27.5.1 - jest-util: 27.5.1 + jest-mock: 29.7.0 + jest-util: 29.7.0 - jest-get-type@27.5.1: {} + jest-get-type@28.0.2: {} jest-get-type@29.6.3: {} - jest-haste-map@27.5.1: + jest-haste-map@28.1.3: dependencies: - '@jest/types': 27.5.1 + '@jest/types': 28.1.3 '@types/graceful-fs': 4.1.9 '@types/node': 14.6.4 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 - jest-regex-util: 27.5.1 - jest-serializer: 27.5.1 - jest-util: 27.5.1 - jest-worker: 27.5.1 + jest-regex-util: 28.0.2 + jest-util: 28.1.3 + jest-worker: 28.1.3 micromatch: 4.0.8 walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 - jest-jasmine2@27.5.1: - dependencies: - '@jest/environment': 27.5.1 - '@jest/source-map': 27.5.1 - '@jest/test-result': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 14.6.4 - chalk: 4.1.2 - co: 4.6.0 - expect: 27.5.1 - is-generator-fn: 2.1.0 - jest-each: 27.5.1 - jest-matcher-utils: 27.5.1 - jest-message-util: 27.5.1 - jest-runtime: 27.5.1 - jest-snapshot: 27.5.1 - jest-util: 27.5.1 - pretty-format: 27.5.1 - throat: 6.0.2 - transitivePeerDependencies: - - supports-color - - jest-leak-detector@27.5.1: + jest-leak-detector@28.1.3: dependencies: - jest-get-type: 27.5.1 - pretty-format: 27.5.1 + jest-get-type: 28.0.2 + pretty-format: 28.1.3 - jest-matcher-utils@27.5.1: + jest-matcher-utils@28.1.3: dependencies: chalk: 4.1.2 - jest-diff: 27.5.1 - jest-get-type: 27.5.1 - pretty-format: 27.5.1 + jest-diff: 28.1.3 + jest-get-type: 28.0.2 + pretty-format: 28.1.3 jest-matcher-utils@29.7.0: dependencies: @@ -11082,7 +15152,7 @@ snapshots: jest-message-util@26.6.2: dependencies: - '@babel/code-frame': 7.24.7 + '@babel/code-frame': 7.26.2 '@jest/types': 26.6.2 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -11092,21 +15162,21 @@ snapshots: slash: 3.0.0 stack-utils: 2.0.6 - jest-message-util@27.5.1: + jest-message-util@28.1.3: dependencies: - '@babel/code-frame': 7.24.7 - '@jest/types': 27.5.1 + '@babel/code-frame': 7.26.2 + '@jest/types': 28.1.3 '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 micromatch: 4.0.8 - pretty-format: 27.5.1 + pretty-format: 28.1.3 slash: 3.0.0 stack-utils: 2.0.6 jest-message-util@29.7.0: dependencies: - '@babel/code-frame': 7.24.7 + '@babel/code-frame': 7.26.2 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -11116,122 +15186,119 @@ snapshots: slash: 3.0.0 stack-utils: 2.0.6 - jest-mock@27.5.1: + jest-mock@28.1.3: + dependencies: + '@jest/types': 28.1.3 + '@types/node': 14.6.4 + + jest-mock@29.7.0: dependencies: - '@jest/types': 27.5.1 + '@jest/types': 29.6.3 '@types/node': 14.6.4 + jest-util: 29.7.0 - jest-pnp-resolver@1.2.3(jest-resolve@27.5.1): + jest-pnp-resolver@1.2.3(jest-resolve@28.1.3): optionalDependencies: - jest-resolve: 27.5.1 + jest-resolve: 28.1.3 - jest-regex-util@27.5.1: {} + jest-regex-util@28.0.2: {} - jest-resolve-dependencies@27.5.1: + jest-resolve-dependencies@28.1.3: dependencies: - '@jest/types': 27.5.1 - jest-regex-util: 27.5.1 - jest-snapshot: 27.5.1 + jest-regex-util: 28.0.2 + jest-snapshot: 28.1.3 transitivePeerDependencies: - supports-color - jest-resolve@27.5.1: + jest-resolve@28.1.3: dependencies: - '@jest/types': 27.5.1 chalk: 4.1.2 graceful-fs: 4.2.11 - jest-haste-map: 27.5.1 - jest-pnp-resolver: 1.2.3(jest-resolve@27.5.1) - jest-util: 27.5.1 - jest-validate: 27.5.1 - resolve: 1.22.8 + jest-haste-map: 28.1.3 + jest-pnp-resolver: 1.2.3(jest-resolve@28.1.3) + jest-util: 28.1.3 + jest-validate: 28.1.3 + resolve: 1.22.10 resolve.exports: 1.1.1 slash: 3.0.0 - jest-runner@27.5.1: + jest-runner@28.1.3: dependencies: - '@jest/console': 27.5.1 - '@jest/environment': 27.5.1 - '@jest/test-result': 27.5.1 - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 + '@jest/console': 28.1.3 + '@jest/environment': 28.1.3 + '@jest/test-result': 28.1.3 + '@jest/transform': 28.1.3 + '@jest/types': 28.1.3 '@types/node': 14.6.4 chalk: 4.1.2 - emittery: 0.8.1 + emittery: 0.10.2 graceful-fs: 4.2.11 - jest-docblock: 27.5.1 - jest-environment-jsdom: 27.5.1 - jest-environment-node: 27.5.1 - jest-haste-map: 27.5.1 - jest-leak-detector: 27.5.1 - jest-message-util: 27.5.1 - jest-resolve: 27.5.1 - jest-runtime: 27.5.1 - jest-util: 27.5.1 - jest-worker: 27.5.1 - source-map-support: 0.5.21 - throat: 6.0.2 + jest-docblock: 28.1.1 + jest-environment-node: 28.1.3 + jest-haste-map: 28.1.3 + jest-leak-detector: 28.1.3 + jest-message-util: 28.1.3 + jest-resolve: 28.1.3 + jest-runtime: 28.1.3 + jest-util: 28.1.3 + jest-watcher: 28.1.3 + jest-worker: 28.1.3 + p-limit: 3.1.0 + source-map-support: 0.5.13 transitivePeerDependencies: - - bufferutil - - canvas - supports-color - - utf-8-validate - jest-runtime@27.5.1: + jest-runtime@28.1.3: dependencies: - '@jest/environment': 27.5.1 - '@jest/fake-timers': 27.5.1 - '@jest/globals': 27.5.1 - '@jest/source-map': 27.5.1 - '@jest/test-result': 27.5.1 - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 + '@jest/environment': 28.1.3 + '@jest/fake-timers': 28.1.3 + '@jest/globals': 28.1.3 + '@jest/source-map': 28.1.2 + '@jest/test-result': 28.1.3 + '@jest/transform': 28.1.3 + '@jest/types': 28.1.3 chalk: 4.1.2 - cjs-module-lexer: 1.4.0 + cjs-module-lexer: 1.4.1 collect-v8-coverage: 1.0.2 execa: 5.1.1 glob: 7.2.3 graceful-fs: 4.2.11 - jest-haste-map: 27.5.1 - jest-message-util: 27.5.1 - jest-mock: 27.5.1 - jest-regex-util: 27.5.1 - jest-resolve: 27.5.1 - jest-snapshot: 27.5.1 - jest-util: 27.5.1 + jest-haste-map: 28.1.3 + jest-message-util: 28.1.3 + jest-mock: 28.1.3 + jest-regex-util: 28.0.2 + jest-resolve: 28.1.3 + jest-snapshot: 28.1.3 + jest-util: 28.1.3 slash: 3.0.0 strip-bom: 4.0.0 transitivePeerDependencies: - supports-color - jest-serializer@27.5.1: - dependencies: - '@types/node': 14.6.4 - graceful-fs: 4.2.11 - - jest-snapshot@27.5.1: + jest-snapshot@28.1.3: dependencies: - '@babel/core': 7.25.2 - '@babel/generator': 7.25.6 - '@babel/plugin-syntax-typescript': 7.25.4(@babel/core@7.25.2) - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 + '@babel/core': 7.26.0 + '@babel/generator': 7.26.3 + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 + '@jest/expect-utils': 28.1.3 + '@jest/transform': 28.1.3 + '@jest/types': 28.1.3 '@types/babel__traverse': 7.20.6 '@types/prettier': 2.7.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.25.2) + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.0) chalk: 4.1.2 - expect: 27.5.1 + expect: 28.1.3 graceful-fs: 4.2.11 - jest-diff: 27.5.1 - jest-get-type: 27.5.1 - jest-haste-map: 27.5.1 - jest-matcher-utils: 27.5.1 - jest-message-util: 27.5.1 - jest-util: 27.5.1 + jest-diff: 28.1.3 + jest-get-type: 28.0.2 + jest-haste-map: 28.1.3 + jest-matcher-utils: 28.1.3 + jest-message-util: 28.1.3 + jest-util: 28.1.3 natural-compare: 1.4.0 - pretty-format: 27.5.1 + pretty-format: 28.1.3 semver: 7.6.3 transitivePeerDependencies: - supports-color @@ -11254,9 +15321,9 @@ snapshots: is-ci: 2.0.0 micromatch: 4.0.8 - jest-util@27.5.1: + jest-util@28.1.3: dependencies: - '@jest/types': 27.5.1 + '@jest/types': 28.1.3 '@types/node': 14.6.4 chalk: 4.1.2 ci-info: 3.9.0 @@ -11272,23 +15339,33 @@ snapshots: graceful-fs: 4.2.11 picomatch: 2.3.1 - jest-validate@27.5.1: + jest-validate@28.1.3: dependencies: - '@jest/types': 27.5.1 + '@jest/types': 28.1.3 camelcase: 6.3.0 chalk: 4.1.2 - jest-get-type: 27.5.1 + jest-get-type: 28.0.2 leven: 3.1.0 - pretty-format: 27.5.1 + pretty-format: 28.1.3 + + jest-validate@29.7.0: + dependencies: + '@jest/types': 29.6.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.6.3 + leven: 3.1.0 + pretty-format: 29.7.0 - jest-watcher@27.5.1: + jest-watcher@28.1.3: dependencies: - '@jest/test-result': 27.5.1 - '@jest/types': 27.5.1 + '@jest/test-result': 28.1.3 + '@jest/types': 28.1.3 '@types/node': 14.6.4 ansi-escapes: 4.3.2 chalk: 4.1.2 - jest-util: 27.5.1 + emittery: 0.10.2 + jest-util: 28.1.3 string-length: 4.0.2 jest-worker@26.6.2: @@ -11297,35 +15374,48 @@ snapshots: merge-stream: 2.0.0 supports-color: 7.2.0 - jest-worker@27.5.1: + jest-worker@28.1.3: + dependencies: + '@types/node': 14.6.4 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jest-worker@29.7.0: dependencies: '@types/node': 14.6.4 + jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@27.5.1(ts-node@10.9.2(@types/node@14.6.4)(typescript@4.6.4)): + jest@28.1.3(@types/node@14.6.4)(ts-node@10.9.2(@types/node@14.6.4)(typescript@4.6.4)): dependencies: - '@jest/core': 27.5.1(ts-node@10.9.2(@types/node@14.6.4)(typescript@4.6.4)) + '@jest/core': 28.1.3(ts-node@10.9.2(@types/node@14.6.4)(typescript@4.6.4)) + '@jest/types': 28.1.3 import-local: 3.2.0 - jest-cli: 27.5.1(ts-node@10.9.2(@types/node@14.6.4)(typescript@4.6.4)) + jest-cli: 28.1.3(@types/node@14.6.4)(ts-node@10.9.2(@types/node@14.6.4)(typescript@4.6.4)) transitivePeerDependencies: - - bufferutil - - canvas + - '@types/node' - supports-color - ts-node - - utf-8-validate - jest@27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)): + jest@28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)): dependencies: - '@jest/core': 27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)) + '@jest/core': 28.1.3(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) + '@jest/types': 28.1.3 import-local: 3.2.0 - jest-cli: 27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)) + jest-cli: 28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) transitivePeerDependencies: - - bufferutil - - canvas + - '@types/node' - supports-color - ts-node - - utf-8-validate + + joi@17.13.3: + dependencies: + '@hapi/hoek': 9.3.0 + '@hapi/topo': 5.1.0 + '@sideway/address': 4.1.5 + '@sideway/formula': 3.0.1 + '@sideway/pinpoint': 2.0.0 js-cleanup@1.2.0: dependencies: @@ -11350,41 +15440,72 @@ snapshots: jsbn@1.1.0: {} - jsdom@16.7.0: + jsc-android@250231.0.0: {} + + jsc-safe-url@0.2.4: {} + + jscodeshift@0.14.0(@babel/preset-env@7.29.7(@babel/core@7.29.7)): + dependencies: + '@babel/core': 7.26.0 + '@babel/parser': 7.26.3 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.26.0) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.26.0) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.26.0) + '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.0) + '@babel/preset-env': 7.29.7(@babel/core@7.29.7) + '@babel/preset-flow': 7.25.9(@babel/core@7.26.0) + '@babel/preset-typescript': 7.26.0(@babel/core@7.26.0) + '@babel/register': 7.25.9(@babel/core@7.26.0) + babel-core: 7.0.0-bridge.0(@babel/core@7.26.0) + chalk: 4.1.2 + flow-parser: 0.257.1 + graceful-fs: 4.2.11 + micromatch: 4.0.8 + neo-async: 2.6.2 + node-dir: 0.1.17 + recast: 0.21.5 + temp: 0.8.4 + write-file-atomic: 2.4.3 + transitivePeerDependencies: + - supports-color + + jsdom@19.0.0: dependencies: abab: 2.0.6 - acorn: 8.12.1 + acorn: 8.14.0 acorn-globals: 6.0.0 - cssom: 0.4.4 + cssom: 0.5.0 cssstyle: 2.3.0 - data-urls: 2.0.0 + data-urls: 3.0.2 decimal.js: 10.4.3 - domexception: 2.0.1 + domexception: 4.0.0 escodegen: 2.1.0 - form-data: 3.0.1 - html-encoding-sniffer: 2.0.1 - http-proxy-agent: 4.0.1 + form-data: 4.0.1 + html-encoding-sniffer: 3.0.0 + http-proxy-agent: 5.0.0 https-proxy-agent: 5.0.1 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.12 + nwsapi: 2.2.16 parse5: 6.0.1 saxes: 5.0.1 symbol-tree: 3.2.4 tough-cookie: 4.1.4 w3c-hr-time: 1.0.2 - w3c-xmlserializer: 2.0.0 - webidl-conversions: 6.1.0 - whatwg-encoding: 1.0.5 - whatwg-mimetype: 2.3.0 - whatwg-url: 8.7.0 - ws: 7.5.10 - xml-name-validator: 3.0.0 + w3c-xmlserializer: 3.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 2.0.0 + whatwg-mimetype: 3.0.0 + whatwg-url: 10.0.0 + ws: 8.18.0 + xml-name-validator: 4.0.0 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - jsesc@2.5.2: {} + jsesc@3.0.2: {} + + jsesc@3.1.0: {} json-buffer@3.0.1: {} @@ -11404,6 +15525,10 @@ snapshots: json5@2.2.3: {} + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + jsonfile@6.1.0: dependencies: universalify: 2.0.1 @@ -11432,8 +15557,12 @@ snapshots: dependencies: json-buffer: 3.0.1 + kind-of@6.0.3: {} + kleur@3.0.3: {} + kleur@4.1.5: {} + ky@0.33.3: {} lazystream@1.0.1: @@ -11451,6 +15580,11 @@ snapshots: dependencies: immediate: 3.0.6 + lighthouse-logger@1.4.2: + dependencies: + debug: 2.6.9 + marky: 1.2.5 + lines-and-columns@1.2.4: {} lines-and-columns@2.0.4: {} @@ -11464,11 +15598,16 @@ snapshots: load-json-file@7.0.1: {} - locate-app@2.4.37: + locate-app@2.5.0: dependencies: - '@promptbook/utils': 0.70.0-1 - type-fest: 2.13.0 - userhome: 1.0.0 + '@promptbook/utils': 0.69.5 + type-fest: 4.26.0 + userhome: 1.0.1 + + locate-path@3.0.0: + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 locate-path@5.0.0: dependencies: @@ -11484,6 +15623,8 @@ snapshots: lodash.clonedeep@4.5.0: {} + lodash.debounce@4.0.8: {} + lodash.flattendeep@4.4.0: {} lodash.isequal@4.5.0: {} @@ -11494,6 +15635,8 @@ snapshots: lodash.pickby@4.6.0: {} + lodash.throttle@4.1.1: {} + lodash.union@4.6.0: {} lodash.zip@4.2.0: {} @@ -11505,13 +15648,23 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 + logkitty@0.7.1: + dependencies: + ansi-fragments: 0.2.1 + dayjs: 1.11.13 + yargs: 15.4.1 + loglevel-plugin-prefix@0.8.4: {} - loglevel@1.9.1: {} + loglevel@1.9.2: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 lower-case@2.0.2: dependencies: - tslib: 2.7.0 + tslib: 2.8.1 lowercase-keys@2.0.0: {} @@ -11519,6 +15672,8 @@ snapshots: lru-cache@10.4.3: {} + lru-cache@11.5.1: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -11543,10 +15698,15 @@ snapshots: dependencies: sourcemap-codec: 1.4.8 - magic-string@0.30.11: + magic-string@0.30.17: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + make-dir@2.1.0: + dependencies: + pify: 4.0.1 + semver: 5.7.2 + make-dir@4.0.0: dependencies: semver: 7.6.3 @@ -11555,7 +15715,7 @@ snapshots: make-fetch-happen@9.1.0: dependencies: - agentkeepalive: 4.5.0 + agentkeepalive: 4.6.0 cacache: 15.3.0 http-cache-semantics: 4.1.1 http-proxy-agent: 4.0.1 @@ -11567,7 +15727,7 @@ snapshots: minipass-fetch: 1.4.1 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 - negotiator: 0.6.3 + negotiator: 0.6.4 promise-retry: 2.0.1 socks-proxy-agent: 6.2.1 ssri: 8.0.1 @@ -11582,6 +15742,8 @@ snapshots: dependencies: p-defer: 1.0.0 + marky@1.2.5: {} + matcher@5.0.0: dependencies: escape-string-regexp: 5.0.0 @@ -11590,6 +15752,8 @@ snapshots: dependencies: '@arr/every': 1.0.1 + math-intrinsics@1.1.0: {} + md5-hex@3.0.1: dependencies: blueimp-md5: 2.19.0 @@ -11601,15 +15765,197 @@ snapshots: map-age-cleaner: 0.1.3 mimic-fn: 4.0.0 + memoize-one@5.2.1: {} + memorystream@0.3.1: {} - merge-descriptors@1.0.1: {} + merge-descriptors@1.0.3: {} + + merge-options@3.0.4: + dependencies: + is-plain-obj: 2.1.0 merge-stream@2.0.0: {} merge2@1.4.1: {} - methods@1.1.2: {} + methods@1.1.2: {} + + metro-babel-transformer@0.80.12: + dependencies: + '@babel/core': 7.26.0 + flow-enums-runtime: 0.0.6 + hermes-parser: 0.23.1 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + + metro-cache-key@0.80.12: + dependencies: + flow-enums-runtime: 0.0.6 + + metro-cache@0.80.12: + dependencies: + exponential-backoff: 3.1.1 + flow-enums-runtime: 0.0.6 + metro-core: 0.80.12 + + metro-config@0.80.12: + dependencies: + connect: 3.7.0 + cosmiconfig: 5.2.1 + flow-enums-runtime: 0.0.6 + jest-validate: 29.7.0 + metro: 0.80.12 + metro-cache: 0.80.12 + metro-core: 0.80.12 + metro-runtime: 0.80.12 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + metro-core@0.80.12: + dependencies: + flow-enums-runtime: 0.0.6 + lodash.throttle: 4.1.1 + metro-resolver: 0.80.12 + + metro-file-map@0.80.12: + dependencies: + anymatch: 3.1.3 + debug: 2.6.9 + fb-watchman: 2.0.2 + flow-enums-runtime: 0.0.6 + graceful-fs: 4.2.11 + invariant: 2.2.4 + jest-worker: 29.7.0 + micromatch: 4.0.8 + node-abort-controller: 3.1.1 + nullthrows: 1.1.1 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + + metro-minify-terser@0.80.12: + dependencies: + flow-enums-runtime: 0.0.6 + terser: 5.37.0 + + metro-resolver@0.80.12: + dependencies: + flow-enums-runtime: 0.0.6 + + metro-runtime@0.80.12: + dependencies: + '@babel/runtime': 7.26.0 + flow-enums-runtime: 0.0.6 + + metro-source-map@0.80.12: + dependencies: + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 + flow-enums-runtime: 0.0.6 + invariant: 2.2.4 + metro-symbolicate: 0.80.12 + nullthrows: 1.1.1 + ob1: 0.80.12 + source-map: 0.5.7 + vlq: 1.0.1 + transitivePeerDependencies: + - supports-color + + metro-symbolicate@0.80.12: + dependencies: + flow-enums-runtime: 0.0.6 + invariant: 2.2.4 + metro-source-map: 0.80.12 + nullthrows: 1.1.1 + source-map: 0.5.7 + through2: 2.0.5 + vlq: 1.0.1 + transitivePeerDependencies: + - supports-color + + metro-transform-plugins@0.80.12: + dependencies: + '@babel/core': 7.26.0 + '@babel/generator': 7.26.3 + '@babel/template': 7.25.9 + '@babel/traverse': 7.26.4 + flow-enums-runtime: 0.0.6 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + + metro-transform-worker@0.80.12: + dependencies: + '@babel/core': 7.26.0 + '@babel/generator': 7.26.3 + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 + flow-enums-runtime: 0.0.6 + metro: 0.80.12 + metro-babel-transformer: 0.80.12 + metro-cache: 0.80.12 + metro-cache-key: 0.80.12 + metro-minify-terser: 0.80.12 + metro-source-map: 0.80.12 + metro-transform-plugins: 0.80.12 + nullthrows: 1.1.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + metro@0.80.12: + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/core': 7.26.0 + '@babel/generator': 7.26.3 + '@babel/parser': 7.26.3 + '@babel/template': 7.25.9 + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 + accepts: 1.3.8 + chalk: 4.1.2 + ci-info: 2.0.0 + connect: 3.7.0 + debug: 2.6.9 + denodeify: 1.2.1 + error-stack-parser: 2.1.4 + flow-enums-runtime: 0.0.6 + graceful-fs: 4.2.11 + hermes-parser: 0.23.1 + image-size: 1.2.0 + invariant: 2.2.4 + jest-worker: 29.7.0 + jsc-safe-url: 0.2.4 + lodash.throttle: 4.1.1 + metro-babel-transformer: 0.80.12 + metro-cache: 0.80.12 + metro-cache-key: 0.80.12 + metro-config: 0.80.12 + metro-core: 0.80.12 + metro-file-map: 0.80.12 + metro-resolver: 0.80.12 + metro-runtime: 0.80.12 + metro-source-map: 0.80.12 + metro-symbolicate: 0.80.12 + metro-transform-plugins: 0.80.12 + metro-transform-worker: 0.80.12 + mime-types: 2.1.35 + nullthrows: 1.1.1 + serialize-error: 2.1.0 + source-map: 0.5.7 + strip-ansi: 6.0.1 + throat: 5.0.0 + ws: 7.5.10 + yargs: 17.7.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate micro-spelling-correcter@1.1.1: {} @@ -11620,12 +15966,16 @@ snapshots: mime-db@1.52.0: {} + mime-db@1.53.0: {} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 mime@1.6.0: {} + mime@2.6.0: {} + mimic-fn@2.1.0: {} mimic-fn@4.0.0: {} @@ -11638,6 +15988,10 @@ snapshots: minimalistic-assert@1.0.1: {} + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.6 + minimatch@3.0.8: dependencies: brace-expansion: 1.1.11 @@ -11693,6 +16047,8 @@ snapshots: minipass@7.1.2: {} + minipass@7.1.3: {} + minizlib@2.1.2: dependencies: minipass: 3.3.6 @@ -11710,7 +16066,7 @@ snapshots: module-details-from-path@1.0.3: {} - moment-timezone@0.5.45: + moment-timezone@0.5.46: dependencies: moment: 2.30.1 @@ -11734,7 +16090,7 @@ snapshots: mute-stream@1.0.0: {} - nan@2.20.0: + nan@2.22.0: optional: true native-promise-only@0.8.1: {} @@ -11743,6 +16099,10 @@ snapshots: negotiator@0.6.3: {} + negotiator@0.6.4: {} + + neo-async@2.6.2: {} + netmask@2.0.2: {} nice-try@1.0.5: {} @@ -11750,7 +16110,15 @@ snapshots: no-case@3.0.4: dependencies: lower-case: 2.0.2 - tslib: 2.7.0 + tslib: 2.8.1 + + nocache@3.0.4: {} + + node-abort-controller@3.1.1: {} + + node-dir@0.1.17: + dependencies: + minimatch: 3.1.2 node-domexception@1.0.0: {} @@ -11766,6 +16134,8 @@ snapshots: fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 + node-forge@1.3.1: {} + node-gyp@7.1.2: dependencies: env-paths: 2.2.1 @@ -11781,7 +16151,11 @@ snapshots: node-int64@0.4.0: {} - node-releases@2.0.18: {} + node-releases@2.0.19: {} + + node-releases@2.0.47: {} + + node-stream-zip@1.15.0: {} nofilter@3.1.0: {} @@ -11792,7 +16166,7 @@ snapshots: normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.8 + resolve: 1.22.10 semver: 5.7.2 validate-npm-package-license: 3.0.4 @@ -11853,12 +16227,12 @@ snapshots: dependencies: ansi-styles: 3.2.1 chalk: 2.4.2 - cross-spawn: 6.0.5 + cross-spawn: 6.0.6 memorystream: 0.3.1 minimatch: 3.1.2 pidtree: 0.3.1 read-pkg: 3.0.0 - shell-quote: 1.8.1 + shell-quote: 1.8.2 string.prototype.padend: 3.1.6 npm-run-path@4.0.1: @@ -11876,30 +16250,38 @@ snapshots: gauge: 2.7.4 set-blocking: 2.0.0 + nullthrows@1.1.1: {} + number-is-nan@1.0.1: {} - nwsapi@2.2.12: {} + nwsapi@2.2.16: {} oauth-sign@0.9.0: {} + ob1@0.80.12: + dependencies: + flow-enums-runtime: 0.0.6 + object-assign@4.1.1: {} - object-inspect@1.13.2: {} + object-inspect@1.13.3: {} object-is@1.1.6: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 object-keys@1.1.1: {} object-path@0.11.8: {} - object.assign@4.1.5: + object.assign@4.1.7: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - has-symbols: 1.0.3 + es-object-atoms: 1.0.0 + has-symbols: 1.1.0 object-keys: 1.1.1 on-finished@2.3.0: @@ -11924,6 +16306,15 @@ snapshots: dependencies: mimic-fn: 4.0.0 + open@6.4.0: + dependencies: + is-wsl: 1.1.0 + + open@7.4.2: + dependencies: + is-docker: 2.2.1 + is-wsl: 2.2.0 + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -11947,6 +16338,12 @@ snapshots: os-tmpdir@1.0.2: {} + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.2.6 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + p-cancelable@2.1.1: {} p-cancelable@3.0.0: {} @@ -11969,6 +16366,10 @@ snapshots: dependencies: yocto-queue: 1.1.1 + p-locate@3.0.0: + dependencies: + p-limit: 2.3.0 + p-locate@4.1.0: dependencies: p-limit: 2.3.0 @@ -11989,20 +16390,22 @@ snapshots: dependencies: aggregate-error: 4.0.1 + p-map@7.0.4: {} + p-timeout@5.1.0: {} p-try@2.2.0: {} - pac-proxy-agent@7.0.2: + pac-proxy-agent@7.1.0: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 - agent-base: 7.1.1 - debug: 4.3.6 - get-uri: 6.0.3 + agent-base: 7.1.3 + debug: 4.4.0 + get-uri: 6.0.4 http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.5 + https-proxy-agent: 7.0.6 pac-resolver: 7.0.1 - socks-proxy-agent: 8.0.4 + socks-proxy-agent: 8.0.5 transitivePeerDependencies: - supports-color @@ -12011,7 +16414,7 @@ snapshots: degenerator: 5.0.1 netmask: 2.0.2 - package-json-from-dist@1.0.0: {} + package-json-from-dist@1.0.1: {} package-name-regex@2.0.5: {} @@ -12044,7 +16447,7 @@ snapshots: param-case@3.0.4: dependencies: dot-case: 3.0.4 - tslib: 2.7.0 + tslib: 2.8.1 parent-module@1.0.1: dependencies: @@ -12057,14 +16460,14 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.24.7 + '@babel/code-frame': 7.26.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 parse-json@7.1.1: dependencies: - '@babel/code-frame': 7.24.7 + '@babel/code-frame': 7.26.2 error-ex: 1.3.2 json-parse-even-better-errors: 3.0.2 lines-and-columns: 2.0.4 @@ -12081,12 +16484,14 @@ snapshots: pascal-case@3.1.2: dependencies: no-case: 3.0.4 - tslib: 2.7.0 + tslib: 2.8.1 path-case@3.0.4: dependencies: dot-case: 3.0.4 - tslib: 2.7.0 + tslib: 2.8.1 + + path-exists@3.0.0: {} path-exists@4.0.0: {} @@ -12107,7 +16512,12 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 - path-to-regexp@0.1.7: {} + path-scurry@2.0.2: + dependencies: + lru-cache: 11.5.1 + minipass: 7.1.3 + + path-to-regexp@0.1.12: {} path-type@3.0.0: dependencies: @@ -12115,6 +16525,8 @@ snapshots: path-type@4.0.0: {} + path-type@6.0.0: {} + path@0.12.7: dependencies: process: 0.11.10 @@ -12128,7 +16540,7 @@ snapshots: performance-now@2.1.0: {} - picocolors@1.1.0: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -12136,6 +16548,8 @@ snapshots: pify@3.0.0: {} + pify@4.0.1: {} + pirates@4.0.6: {} pkg-conf@4.0.0: @@ -12143,6 +16557,10 @@ snapshots: find-up: 6.3.0 load-json-file: 7.0.1 + pkg-dir@3.0.0: + dependencies: + find-up: 3.0.0 + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 @@ -12164,6 +16582,8 @@ snapshots: prelude-ls@1.2.1: {} + presentable-error@0.0.1: {} + pretty-format@26.6.2: dependencies: '@jest/types': 26.6.2 @@ -12177,6 +16597,13 @@ snapshots: ansi-styles: 5.2.0 react-is: 17.0.2 + pretty-format@28.1.3: + dependencies: + '@jest/schemas': 28.1.3 + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 18.3.1 + pretty-format@29.7.0: dependencies: '@jest/schemas': 29.6.3 @@ -12204,6 +16631,10 @@ snapshots: err-code: 2.0.3 retry: 0.12.0 + promise@8.3.0: + dependencies: + asap: 2.0.6 + prompts@2.4.2: dependencies: kleur: 3.0.3 @@ -12216,48 +16647,50 @@ snapshots: proxy-agent@6.3.0: dependencies: - agent-base: 7.1.1 - debug: 4.3.6 + agent-base: 7.1.3 + debug: 4.4.0 http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.5 + https-proxy-agent: 7.0.6 lru-cache: 7.18.3 - pac-proxy-agent: 7.0.2 + pac-proxy-agent: 7.1.0 proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.4 + socks-proxy-agent: 8.0.5 transitivePeerDependencies: - supports-color proxy-agent@6.3.1: dependencies: - agent-base: 7.1.1 - debug: 4.3.6 + agent-base: 7.1.3 + debug: 4.4.0 http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.5 + https-proxy-agent: 7.0.6 lru-cache: 7.18.3 - pac-proxy-agent: 7.0.2 + pac-proxy-agent: 7.1.0 proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.4 + socks-proxy-agent: 8.0.5 transitivePeerDependencies: - supports-color - proxy-agent@6.4.0: + proxy-agent@6.5.0: dependencies: - agent-base: 7.1.1 - debug: 4.3.6 + agent-base: 7.1.3 + debug: 4.4.0 http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.5 + https-proxy-agent: 7.0.6 lru-cache: 7.18.3 - pac-proxy-agent: 7.0.2 + pac-proxy-agent: 7.1.0 proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.4 + socks-proxy-agent: 8.0.5 transitivePeerDependencies: - supports-color proxy-from-env@1.1.0: {} - psl@1.9.0: {} + psl@1.15.0: + dependencies: + punycode: 2.3.1 - pump@3.0.0: + pump@3.0.2: dependencies: end-of-stream: 1.4.4 once: 1.4.0 @@ -12280,9 +16713,9 @@ snapshots: - supports-color - utf-8-validate - qs@6.11.0: + qs@6.13.0: dependencies: - side-channel: 1.0.6 + side-channel: 1.1.0 qs@6.5.3: {} @@ -12295,12 +16728,18 @@ snapshots: split-on-first: 1.1.0 strict-uri-encode: 2.0.0 + querystring@0.2.1: {} + querystringify@2.2.0: {} queue-microtask@1.2.3: {} queue-tick@1.0.1: {} + queue@6.0.2: + dependencies: + inherits: 2.0.4 + quick-lru@5.1.1: {} randombytes@2.1.0: @@ -12318,10 +16757,118 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 + react-devtools-core@5.3.2: + dependencies: + shell-quote: 1.8.2 + ws: 7.5.10 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + react-is@17.0.2: {} react-is@18.3.1: {} + react-native-builder-bob@0.42.1: + dependencies: + '@babel/core': 7.29.7 + '@babel/plugin-transform-flow-strip-types': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-strict-mode': 7.29.7(@babel/core@7.29.7) + '@babel/preset-env': 7.29.7(@babel/core@7.29.7) + '@babel/preset-react': 7.29.7(@babel/core@7.29.7) + '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7) + '@jridgewell/sourcemap-codec': 1.5.5 + arktype: 2.2.0 + babel-plugin-syntax-hermes-parser: 0.34.0 + browserslist: 4.28.2 + cross-spawn: 7.0.6 + dedent: 1.7.2 + del: 8.0.1 + escape-string-regexp: 5.0.0 + fs-extra: 11.3.5 + glob: 13.0.6 + json5: 2.2.3 + kleur: 4.1.5 + prompts: 2.4.2 + react-native-monorepo-config: 0.3.5 + typescript: 6.0.3 + which: 6.0.1 + yargs: 18.0.0 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + react-native-get-random-values@1.11.0(react-native@0.74.5(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@types/react@18.3.18)(encoding@0.1.13)(react@18.2.0)): + dependencies: + fast-base64-decode: 1.0.0 + react-native: 0.74.5(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@types/react@18.3.18)(encoding@0.1.13)(react@18.2.0) + + react-native-monorepo-config@0.3.5: + dependencies: + escape-string-regexp: 5.0.0 + fast-glob: 3.3.3 + + react-native@0.74.5(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@types/react@18.3.18)(encoding@0.1.13)(react@18.2.0): + dependencies: + '@jest/create-cache-key-function': 29.7.0 + '@react-native-community/cli': 13.6.9(encoding@0.1.13) + '@react-native-community/cli-platform-android': 13.6.9(encoding@0.1.13) + '@react-native-community/cli-platform-ios': 13.6.9(encoding@0.1.13) + '@react-native/assets-registry': 0.74.87 + '@react-native/codegen': 0.74.87(@babel/preset-env@7.29.7(@babel/core@7.29.7)) + '@react-native/community-cli-plugin': 0.74.87(@babel/preset-env@7.29.7(@babel/core@7.29.7))(encoding@0.1.13) + '@react-native/gradle-plugin': 0.74.87 + '@react-native/js-polyfills': 0.74.87 + '@react-native/normalize-colors': 0.74.87 + '@react-native/virtualized-lists': 0.74.87(@types/react@18.3.18)(react-native@0.74.5(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@types/react@18.3.18)(encoding@0.1.13)(react@18.2.0))(react@18.2.0) + abort-controller: 3.0.0 + anser: 1.4.10 + ansi-regex: 5.0.1 + base64-js: 1.5.1 + chalk: 4.1.2 + event-target-shim: 5.0.1 + flow-enums-runtime: 0.0.6 + invariant: 2.2.4 + jest-environment-node: 29.7.0 + jsc-android: 250231.0.0 + memoize-one: 5.2.1 + metro-runtime: 0.80.12 + metro-source-map: 0.80.12 + mkdirp: 0.5.6 + nullthrows: 1.1.1 + pretty-format: 26.6.2 + promise: 8.3.0 + react: 18.2.0 + react-devtools-core: 5.3.2 + react-refresh: 0.14.2 + react-shallow-renderer: 16.15.0(react@18.2.0) + regenerator-runtime: 0.13.11 + scheduler: 0.24.0-canary-efb381bbf-20230505 + stacktrace-parser: 0.1.10 + whatwg-fetch: 3.6.20 + ws: 6.2.3 + yargs: 17.7.2 + optionalDependencies: + '@types/react': 18.3.18 + transitivePeerDependencies: + - '@babel/preset-env' + - bufferutil + - encoding + - supports-color + - utf-8-validate + + react-refresh@0.14.2: {} + + react-shallow-renderer@16.15.0(react@18.2.0): + dependencies: + object-assign: 4.1.1 + react: 18.2.0 + react-is: 18.3.1 + + react@18.2.0: + dependencies: + loose-envify: 1.4.0 + read-package-json-fast@2.0.3: dependencies: json-parse-even-better-errors: 2.3.1 @@ -12344,7 +16891,7 @@ snapshots: '@types/normalize-package-data': 2.4.4 normalize-package-data: 6.0.2 parse-json: 7.1.1 - type-fest: 4.26.0 + type-fest: 4.31.0 readable-stream@2.3.8: dependencies: @@ -12362,7 +16909,7 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 - readable-stream@4.5.2: + readable-stream@4.6.0: dependencies: abort-controller: 3.0.0 buffer: 6.0.3 @@ -12378,24 +16925,80 @@ snapshots: dependencies: picomatch: 2.3.1 + readline@1.3.0: {} + + recast@0.21.5: + dependencies: + ast-types: 0.15.2 + esprima: 4.0.1 + source-map: 0.6.1 + tslib: 2.8.1 + recursive-readdir@2.2.3: dependencies: minimatch: 3.1.2 + reflect.getprototypeof@1.0.9: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + dunder-proto: 1.0.1 + es-abstract: 1.23.8 + es-errors: 1.3.0 + get-intrinsic: 1.2.6 + gopd: 1.2.0 + which-builtin-type: 1.2.1 + + regenerate-unicode-properties@10.2.0: + dependencies: + regenerate: 1.4.2 + + regenerate-unicode-properties@10.2.2: + dependencies: + regenerate: 1.4.2 + + regenerate@1.4.2: {} + + regenerator-runtime@0.13.11: {} + regenerator-runtime@0.14.1: {} - regexp.prototype.flags@1.5.2: + regexp.prototype.flags@1.5.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-errors: 1.3.0 set-function-name: 2.0.2 regexpp@3.2.0: {} - remove-trailing-separator@1.1.0: {} + regexpu-core@6.2.0: + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.2.0 + regjsgen: 0.8.0 + regjsparser: 0.12.0 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.2.0 + + regexpu-core@6.4.0: + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.2.2 + regjsgen: 0.8.0 + regjsparser: 0.13.1 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.2.1 + + regjsgen@0.8.0: {} + + regjsparser@0.12.0: + dependencies: + jsesc: 3.0.2 - replace-ext@1.0.1: {} + regjsparser@0.13.1: + dependencies: + jsesc: 3.1.0 request@2.88.2: dependencies: @@ -12422,6 +17025,8 @@ snapshots: require-directory@2.1.1: {} + require-main-filename@2.0.0: {} + requires-port@1.0.0: {} resolve-alpn@1.2.1: {} @@ -12430,15 +17035,24 @@ snapshots: dependencies: resolve-from: 5.0.0 + resolve-from@3.0.0: {} + resolve-from@4.0.0: {} resolve-from@5.0.0: {} resolve.exports@1.1.1: {} - resolve@1.22.8: + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + resolve@1.22.12: dependencies: - is-core-module: 2.15.1 + es-errors: 1.3.0 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -12465,6 +17079,10 @@ snapshots: rgb2hex@0.2.5: {} + rimraf@2.6.3: + dependencies: + glob: 7.2.3 + rimraf@3.0.2: dependencies: glob: 7.2.3 @@ -12477,14 +17095,14 @@ snapshots: rollup-plugin-filesize@9.1.2: dependencies: - '@babel/runtime': 7.25.6 + '@babel/runtime': 7.26.0 boxen: 5.1.2 brotli-size: 4.0.0 colors: 1.4.0 filesize: 6.4.0 gzip-size: 6.0.0 pacote: 11.3.5 - terser: 5.31.6 + terser: 5.37.0 transitivePeerDependencies: - supports-color @@ -12509,17 +17127,17 @@ snapshots: rollup-plugin-terser@7.0.2(rollup@2.70.2): dependencies: - '@babel/code-frame': 7.24.7 + '@babel/code-frame': 7.26.2 jest-worker: 26.6.2 rollup: 2.70.2 serialize-javascript: 4.0.0 - terser: 5.31.6 + terser: 5.37.0 - rollup-plugin-ts@2.0.7(@babel/core@7.25.2)(@babel/runtime@7.25.6)(rollup@2.70.2)(typescript@4.6.4): + rollup-plugin-ts@2.0.7(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.25.9(@babel/core@7.29.7))(@babel/preset-env@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.26.0)(rollup@2.70.2)(typescript@4.6.4): dependencies: '@rollup/pluginutils': 4.2.1 '@wessberg/stringutil': 1.0.19 - browserslist: 4.23.3 + browserslist: 4.24.3 browserslist-generator: 1.0.66 chalk: 4.1.2 compatfactory: 0.0.13(typescript@4.6.4) @@ -12527,11 +17145,13 @@ snapshots: magic-string: 0.26.7 rollup: 2.70.2 ts-clone-node: 0.3.32(typescript@4.6.4) - tslib: 2.7.0 + tslib: 2.8.1 typescript: 4.6.4 optionalDependencies: - '@babel/core': 7.25.2 - '@babel/runtime': 7.25.6 + '@babel/core': 7.29.7 + '@babel/plugin-transform-runtime': 7.25.9(@babel/core@7.29.7) + '@babel/preset-env': 7.29.7(@babel/core@7.29.7) + '@babel/runtime': 7.26.0 rollup-pluginutils@2.8.2: dependencies: @@ -12549,28 +17169,34 @@ snapshots: rxjs@7.8.1: dependencies: - tslib: 2.7.0 + tslib: 2.8.1 safaridriver@0.0.6: {} safaridriver@0.1.2: {} - safe-array-concat@1.1.2: + safe-array-concat@1.1.3: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.2.6 + has-symbols: 1.1.0 isarray: 2.0.5 safe-buffer@5.1.2: {} safe-buffer@5.2.1: {} - safe-regex-test@1.0.3: + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - is-regex: 1.1.4 + is-regex: 1.2.1 safer-buffer@2.1.2: {} @@ -12578,7 +17204,7 @@ snapshots: dependencies: change-case: 4.1.2 compressing: 1.10.1 - form-data: 4.0.0 + form-data: 4.0.1 got: 11.8.6 hash.js: 1.1.7 query-string: 7.1.3 @@ -12589,13 +17215,22 @@ snapshots: dependencies: xmlchars: 2.2.0 + scheduler@0.24.0-canary-efb381bbf-20230505: + dependencies: + loose-envify: 1.4.0 + + selfsigned@2.4.1: + dependencies: + '@types/node-forge': 1.3.11 + node-forge: 1.3.1 + semver@5.7.2: {} semver@6.3.1: {} semver@7.6.3: {} - send@0.18.0: + send@0.19.0: dependencies: debug: 2.6.9 depd: 2.0.0 @@ -12614,13 +17249,15 @@ snapshots: sentence-case@3.0.4: dependencies: no-case: 3.0.4 - tslib: 2.7.0 + tslib: 2.8.1 upper-case-first: 2.0.2 serialize-error@11.0.3: dependencies: type-fest: 2.19.0 + serialize-error@2.1.0: {} + serialize-error@7.0.1: dependencies: type-fest: 0.13.1 @@ -12629,12 +17266,12 @@ snapshots: dependencies: randombytes: 2.1.0 - serve-static@1.15.0: + serve-static@1.16.2: dependencies: - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 parseurl: 1.3.3 - send: 0.18.0 + send: 0.19.0 set-blocking@2.0.0: {} @@ -12643,8 +17280,8 @@ snapshots: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 + get-intrinsic: 1.2.6 + gopd: 1.2.0 has-property-descriptors: 1.0.2 set-function-name@2.0.2: @@ -12658,10 +17295,9 @@ snapshots: setprototypeof@1.2.0: {} - sha1@1.1.1: + shallow-clone@3.0.1: dependencies: - charenc: 0.0.2 - crypt: 0.0.2 + kind-of: 6.0.3 shebang-command@1.2.0: dependencies: @@ -12675,14 +17311,35 @@ snapshots: shebang-regex@3.0.0: {} - shell-quote@1.8.1: {} + shell-quote@1.8.2: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.6 + object-inspect: 1.13.3 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.6 + object-inspect: 1.13.3 + side-channel-map: 1.0.1 - side-channel@1.0.6: + side-channel@1.1.0: dependencies: - call-bind: 1.0.7 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.2 + object-inspect: 1.13.3 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 signal-exit@3.0.7: {} @@ -12696,6 +17353,14 @@ snapshots: slash@4.0.0: {} + slash@5.1.0: {} + + slice-ansi@2.1.0: + dependencies: + ansi-styles: 3.2.1 + astral-regex: 1.0.0 + is-fullwidth-code-point: 2.0.0 + slice-ansi@5.0.0: dependencies: ansi-styles: 6.2.1 @@ -12706,20 +17371,20 @@ snapshots: snake-case@3.0.4: dependencies: dot-case: 3.0.4 - tslib: 2.7.0 + tslib: 2.8.1 socks-proxy-agent@6.2.1: dependencies: agent-base: 6.0.2 - debug: 4.3.6 + debug: 4.4.0 socks: 2.8.3 transitivePeerDependencies: - supports-color - socks-proxy-agent@8.0.4: + socks-proxy-agent@8.0.5: dependencies: - agent-base: 7.1.1 - debug: 4.3.6 + agent-base: 7.1.3 + debug: 4.4.0 socks: 2.8.3 transitivePeerDependencies: - supports-color @@ -12729,6 +17394,11 @@ snapshots: ip-address: 9.0.5 smart-buffer: 4.2.0 + source-map-support@0.5.13: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 @@ -12742,7 +17412,7 @@ snapshots: sourcemap-codec@1.4.8: {} - spacetrim@0.11.39: {} + spacetrim@0.11.59: {} spdx-compare@1.0.0: dependencies: @@ -12786,13 +17456,13 @@ snapshots: sprintf-js@1.1.3: {} - ssh2@1.15.0: + ssh2@1.16.0: dependencies: asn1: 0.2.6 bcrypt-pbkdf: 1.0.2 optionalDependencies: cpu-features: 0.0.10 - nan: 2.20.0 + nan: 2.22.0 sshpk@1.18.0: dependencies: @@ -12814,23 +17484,32 @@ snapshots: dependencies: escape-string-regexp: 2.0.0 + stackframe@1.3.4: {} + + stacktrace-parser@0.1.10: + dependencies: + type-fest: 0.7.1 + + statuses@1.5.0: {} + statuses@2.0.1: {} - stop-iteration-iterator@1.0.0: + stop-iteration-iterator@1.1.0: dependencies: - internal-slot: 1.0.7 + es-errors: 1.3.0 + internal-slot: 1.1.0 stream-buffers@3.0.3: {} streamifier@0.1.1: {} - streamx@2.20.0: + streamx@2.21.1: dependencies: fast-fifo: 1.3.2 queue-tick: 1.0.1 - text-decoder: 1.1.1 + text-decoder: 1.2.3 optionalDependencies: - bare-events: 2.4.2 + bare-events: 2.5.0 strict-uri-encode@2.0.0: {} @@ -12857,29 +17536,39 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.6.0 + strip-ansi: 7.1.0 + string.prototype.padend@3.1.6: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.8 es-object-atoms: 1.0.0 - string.prototype.trim@1.2.9: + string.prototype.trim@1.2.10: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.8 es-object-atoms: 1.0.0 + has-property-descriptors: 1.0.2 - string.prototype.trimend@1.0.8: + string.prototype.trimend@1.0.9: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 es-object-atoms: 1.0.0 string.prototype.trimstart@1.0.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-object-atoms: 1.0.0 @@ -12895,13 +17584,17 @@ snapshots: dependencies: ansi-regex: 2.1.1 + strip-ansi@5.2.0: + dependencies: + ansi-regex: 4.1.1 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 strip-ansi@7.1.0: dependencies: - ansi-regex: 6.0.1 + ansi-regex: 6.1.0 strip-bom@3.0.0: {} @@ -12915,6 +17608,8 @@ snapshots: strnum@1.0.5: {} + sudo-prompt@9.2.1: {} + supertap@3.0.1: dependencies: indent-string: 5.0.0 @@ -12947,21 +17642,21 @@ snapshots: dependencies: chownr: 1.1.4 mkdirp-classic: 0.5.3 - pump: 3.0.0 + pump: 3.0.2 tar-stream: 2.2.0 tar-fs@3.0.4: dependencies: mkdirp-classic: 0.5.3 - pump: 3.0.0 + pump: 3.0.2 tar-stream: 3.1.7 tar-fs@3.0.6: dependencies: - pump: 3.0.0 + pump: 3.0.2 tar-stream: 3.1.7 optionalDependencies: - bare-fs: 2.3.3 + bare-fs: 2.3.5 bare-path: 2.1.3 tar-stream@1.6.2: @@ -12984,9 +17679,9 @@ snapshots: tar-stream@3.1.7: dependencies: - b4a: 1.6.6 + b4a: 1.6.7 fast-fifo: 1.3.2 - streamx: 2.20.0 + streamx: 2.21.1 tar@6.2.1: dependencies: @@ -13004,17 +17699,23 @@ snapshots: transitivePeerDependencies: - supports-color + temp-dir@2.0.0: {} + temp-dir@3.0.0: {} + temp@0.8.4: + dependencies: + rimraf: 2.6.3 + terminal-link@2.1.1: dependencies: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - terser@5.31.6: + terser@5.37.0: dependencies: '@jridgewell/source-map': 0.3.6 - acorn: 8.12.1 + acorn: 8.14.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -13024,13 +17725,18 @@ snapshots: glob: 7.2.3 minimatch: 3.1.2 - text-decoder@1.1.1: + text-decoder@1.2.3: dependencies: - b4a: 1.6.6 + b4a: 1.6.7 text-table@0.2.0: {} - throat@6.0.2: {} + throat@5.0.0: {} + + through2@2.0.5: + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 through@2.3.8: {} @@ -13046,8 +17752,6 @@ snapshots: to-buffer@1.1.1: {} - to-fast-properties@2.0.0: {} - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -13056,19 +17760,19 @@ snapshots: tough-cookie@2.5.0: dependencies: - psl: 1.9.0 + psl: 1.15.0 punycode: 2.3.1 tough-cookie@4.1.4: dependencies: - psl: 1.9.0 + psl: 1.15.0 punycode: 2.3.1 universalify: 0.2.0 url-parse: 1.5.10 tr46@0.0.3: {} - tr46@2.1.0: + tr46@3.0.0: dependencies: punycode: 2.3.1 @@ -13081,39 +17785,39 @@ snapshots: compatfactory: 0.0.13(typescript@4.6.4) typescript: 4.6.4 - ts-jest@27.1.5(@babel/core@7.25.2)(@types/jest@27.4.1)(babel-jest@27.5.1(@babel/core@7.25.2))(jest@27.5.1(ts-node@10.9.2(@types/node@14.6.4)(typescript@4.6.4)))(typescript@4.6.4): + ts-jest@28.0.8(@babel/core@7.29.7)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.29.7))(jest@28.1.3(@types/node@14.6.4)(ts-node@10.9.2(@types/node@14.6.4)(typescript@4.6.4)))(typescript@4.6.4): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 27.5.1(ts-node@10.9.2(@types/node@14.6.4)(typescript@4.6.4)) - jest-util: 27.5.1 + jest: 28.1.3(@types/node@14.6.4)(ts-node@10.9.2(@types/node@14.6.4)(typescript@4.6.4)) + jest-util: 28.1.3 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.6.3 typescript: 4.6.4 - yargs-parser: 20.2.9 + yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.25.2 - '@types/jest': 27.4.1 - babel-jest: 27.5.1(@babel/core@7.25.2) + '@babel/core': 7.29.7 + '@jest/types': 28.1.3 + babel-jest: 28.1.3(@babel/core@7.29.7) - ts-jest@27.1.5(@babel/core@7.25.2)(@types/jest@27.4.1)(babel-jest@27.5.1(@babel/core@7.25.2))(jest@27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)))(typescript@4.6.4): + ts-jest@28.0.8(@babel/core@7.29.7)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.29.7))(jest@28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)))(typescript@4.6.4): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 27.5.1(ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4)) - jest-util: 27.5.1 + jest: 28.1.3(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4)) + jest-util: 28.1.3 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.6.3 typescript: 4.6.4 - yargs-parser: 20.2.9 + yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.25.2 - '@types/jest': 27.4.1 - babel-jest: 27.5.1(@babel/core@7.25.2) + '@babel/core': 7.29.7 + '@jest/types': 28.1.3 + babel-jest: 28.1.3(@babel/core@7.29.7) ts-node@10.9.2(@types/node@14.6.4)(typescript@4.6.4): dependencies: @@ -13123,8 +17827,8 @@ snapshots: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 14.6.4 - acorn: 8.12.1 - acorn-walk: 8.3.3 + acorn: 8.14.0 + acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 @@ -13133,16 +17837,16 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - ts-node@10.9.2(@types/node@20.16.3)(typescript@4.6.4): + ts-node@10.9.2(@types/node@20.17.10)(typescript@4.6.4): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.16.3 - acorn: 8.12.1 - acorn-walk: 8.3.3 + '@types/node': 20.17.10 + acorn: 8.14.0 + acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 @@ -13154,7 +17858,7 @@ snapshots: tslib@1.14.1: {} - tslib@2.7.0: {} + tslib@2.8.1: {} tsutils@3.21.0(typescript@4.6.4): dependencies: @@ -13181,7 +17885,7 @@ snapshots: type-fest@0.21.3: {} - type-fest@2.13.0: {} + type-fest@0.7.1: {} type-fest@2.19.0: {} @@ -13189,57 +17893,58 @@ snapshots: type-fest@4.26.0: {} + type-fest@4.31.0: {} + type-is@1.6.18: dependencies: media-typer: 0.3.0 mime-types: 2.1.35 - typed-array-buffer@1.0.2: + typed-array-buffer@1.0.3: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - is-typed-array: 1.1.13 + is-typed-array: 1.1.15 - typed-array-byte-length@1.0.1: + typed-array-byte-length@1.0.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 - typed-array-byte-offset@1.0.2: + typed-array-byte-offset@1.0.4: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.7 + call-bind: 1.0.8 for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.9 - typed-array-length@1.0.6: + typed-array-length@1.0.7: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 + gopd: 1.2.0 + is-typed-array: 1.1.15 possible-typed-array-names: 1.0.0 - - typedarray-to-buffer@3.1.5: - dependencies: - is-typedarray: 1.0.0 + reflect.getprototypeof: 1.0.9 typescript@4.6.4: {} - ua-parser-js@1.0.38: {} + typescript@6.0.3: {} + + ua-parser-js@1.0.40: {} - unbox-primitive@1.0.2: + unbox-primitive@1.1.0: dependencies: - call-bind: 1.0.7 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 + call-bound: 1.0.3 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 unbzip2-stream@1.4.3: dependencies: @@ -13250,6 +17955,21 @@ snapshots: undici-types@6.19.8: {} + unicode-canonical-property-names-ecmascript@2.0.1: {} + + unicode-match-property-ecmascript@2.0.0: + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.1 + unicode-property-aliases-ecmascript: 2.1.0 + + unicode-match-property-value-ecmascript@2.2.0: {} + + unicode-match-property-value-ecmascript@2.2.1: {} + + unicode-property-aliases-ecmascript@2.1.0: {} + + unicorn-magic@0.3.0: {} + unique-filename@1.1.1: dependencies: unique-slug: 2.0.2 @@ -13258,25 +17978,33 @@ snapshots: dependencies: imurmurhash: 0.1.4 + universalify@0.1.2: {} + universalify@0.2.0: {} universalify@2.0.1: {} unpipe@1.0.0: {} - update-browserslist-db@1.1.0(browserslist@4.23.3): + update-browserslist-db@1.1.1(browserslist@4.24.3): + dependencies: + browserslist: 4.24.3 + escalade: 3.2.0 + picocolors: 1.1.1 + + update-browserslist-db@1.2.3(browserslist@4.28.2): dependencies: - browserslist: 4.23.3 + browserslist: 4.28.2 escalade: 3.2.0 - picocolors: 1.1.0 + picocolors: 1.1.1 upper-case-first@2.0.2: dependencies: - tslib: 2.7.0 + tslib: 2.8.1 upper-case@2.0.2: dependencies: - tslib: 2.7.0 + tslib: 2.8.1 uri-js@4.4.1: dependencies: @@ -13287,7 +18015,7 @@ snapshots: querystringify: 2.2.0 requires-port: 1.0.0 - userhome@1.0.0: {} + userhome@1.0.1: {} util-deprecate@1.0.2: {} @@ -13297,21 +18025,19 @@ snapshots: utils-merge@1.0.1: {} - uuid@10.0.0: {} + uuid@11.1.1: {} uuid@3.4.0: {} - uuid@8.1.0: {} - v8-compile-cache-lib@3.0.1: {} v8-compile-cache@2.4.0: {} - v8-to-istanbul@8.1.1: + v8-to-istanbul@9.3.0: dependencies: + '@jridgewell/trace-mapping': 0.3.25 '@types/istanbul-lib-coverage': 2.0.6 - convert-source-map: 1.9.0 - source-map: 0.7.4 + convert-source-map: 2.0.0 validate-npm-package-license@3.0.4: dependencies: @@ -13330,32 +18056,21 @@ snapshots: core-util-is: 1.0.2 extsprintf: 1.3.0 - vinyl-sourcemaps-apply@0.2.1: - dependencies: - source-map: 0.5.7 - - vinyl@2.2.1: - dependencies: - clone: 2.1.2 - clone-buffer: 1.0.0 - clone-stats: 1.0.0 - cloneable-readable: 1.1.3 - remove-trailing-separator: 1.1.0 - replace-ext: 1.0.1 + vlq@1.0.1: {} w3c-hr-time@1.0.2: dependencies: browser-process-hrtime: 1.0.0 - w3c-xmlserializer@2.0.0: + w3c-xmlserializer@3.0.0: dependencies: - xml-name-validator: 3.0.0 + xml-name-validator: 4.0.0 wait-port@1.1.0: dependencies: chalk: 4.1.2 commander: 9.5.0 - debug: 4.3.6 + debug: 4.4.0 transitivePeerDependencies: - supports-color @@ -13367,7 +18082,7 @@ snapshots: dependencies: defaults: 1.0.4 - wdio-chromedriver-service@8.1.1(@wdio/types@8.39.0)(chromedriver@129.0.4)(webdriverio@8.39.1(encoding@0.1.13)(typescript@4.6.4)): + wdio-chromedriver-service@8.1.1(@wdio/types@8.39.0)(chromedriver@131.0.4)(webdriverio@8.39.1(encoding@0.1.13)(typescript@4.6.4)): dependencies: '@wdio/logger': 8.38.0 fs-extra: 11.2.0 @@ -13376,7 +18091,7 @@ snapshots: webdriverio: 8.39.1(encoding@0.1.13)(typescript@4.6.4) optionalDependencies: '@wdio/types': 8.39.0 - chromedriver: 129.0.4 + chromedriver: 131.0.4 transitivePeerDependencies: - supports-color @@ -13411,12 +18126,12 @@ snapshots: web-streams-polyfill@3.3.3: {} - web-vitals@3.3.2: {} + web-vitals@4.2.4: {} webdriver@8.39.0: dependencies: - '@types/node': 20.16.3 - '@types/ws': 8.5.12 + '@types/node': 20.17.10 + '@types/ws': 8.5.13 '@wdio/config': 8.39.0 '@wdio/logger': 8.38.0 '@wdio/protocols': 8.38.0 @@ -13433,7 +18148,7 @@ snapshots: webdriverio@8.39.1(encoding@0.1.13)(typescript@4.6.4): dependencies: - '@types/node': 20.16.3 + '@types/node': 20.17.10 '@wdio/config': 8.39.0 '@wdio/logger': 8.38.0 '@wdio/protocols': 8.38.0 @@ -13441,8 +18156,8 @@ snapshots: '@wdio/types': 8.39.0 '@wdio/utils': 8.39.0 archiver: 7.0.1 - aria-query: 5.3.0 - css-shorthand-properties: 1.1.1 + aria-query: 5.3.2 + css-shorthand-properties: 1.1.2 css-value: 0.0.1 devtools-protocol: 0.0.1302984 grapheme-splitter: 1.0.4 @@ -13467,52 +18182,73 @@ snapshots: webidl-conversions@3.0.1: {} - webidl-conversions@5.0.0: {} - - webidl-conversions@6.1.0: {} + webidl-conversions@7.0.0: {} well-known-symbols@2.0.0: {} - whatwg-encoding@1.0.5: + whatwg-encoding@2.0.0: dependencies: - iconv-lite: 0.4.24 + iconv-lite: 0.6.3 whatwg-fetch@3.6.20: {} - whatwg-mimetype@2.3.0: {} + whatwg-mimetype@3.0.0: {} + + whatwg-url@10.0.0: + dependencies: + tr46: 3.0.0 + webidl-conversions: 7.0.0 + + whatwg-url@11.0.0: + dependencies: + tr46: 3.0.0 + webidl-conversions: 7.0.0 whatwg-url@5.0.0: dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - whatwg-url@8.7.0: + which-boxed-primitive@1.1.1: dependencies: - lodash: 4.17.21 - tr46: 2.1.0 - webidl-conversions: 6.1.0 + is-bigint: 1.1.0 + is-boolean-object: 1.2.1 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 - which-boxed-primitive@1.0.2: + which-builtin-type@1.2.1: dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 + call-bound: 1.0.3 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.0.0 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.0.10 + is-regex: 1.2.1 + is-weakref: 1.1.0 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.18 which-collection@1.0.2: dependencies: is-map: 2.0.3 is-set: 2.0.3 is-weakmap: 2.0.2 - is-weakset: 2.0.3 + is-weakset: 2.0.4 + + which-module@2.0.1: {} - which-typed-array@1.1.15: + which-typed-array@1.1.18: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 for-each: 0.3.3 - gopd: 1.0.1 + gopd: 1.2.0 has-tostringtag: 1.0.2 which@1.3.1: @@ -13527,9 +18263,13 @@ snapshots: dependencies: isexe: 3.1.1 + which@6.0.1: + dependencies: + isexe: 4.0.0 + wide-align@1.1.5: dependencies: - string-width: 1.0.2 + string-width: 4.2.3 widest-line@3.1.0: dependencies: @@ -13555,51 +18295,78 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.0 + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.1 + string-width: 7.2.0 + strip-ansi: 7.1.0 + wrappy@1.0.2: {} - write-file-atomic@3.0.3: + write-file-atomic@2.4.3: + dependencies: + graceful-fs: 4.2.11 + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + + write-file-atomic@4.0.2: dependencies: imurmurhash: 0.1.4 - is-typedarray: 1.0.0 signal-exit: 3.0.7 - typedarray-to-buffer: 3.1.5 write-file-atomic@5.0.1: dependencies: imurmurhash: 0.1.4 signal-exit: 4.1.0 + ws@6.2.3: + dependencies: + async-limiter: 1.0.1 + ws@7.5.10: {} ws@8.13.0: {} ws@8.18.0: {} - xml-name-validator@3.0.0: {} + xml-name-validator@4.0.0: {} xmlchars@2.2.0: {} xtend@4.0.2: {} + y18n@4.0.3: {} + y18n@5.0.8: {} yallist@3.1.1: {} yallist@4.0.0: {} - yargs-parser@20.2.9: {} + yaml@2.6.1: {} + + yargs-parser@18.1.3: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 yargs-parser@21.1.1: {} - yargs@16.2.0: + yargs-parser@22.0.0: {} + + yargs@15.4.1: dependencies: - cliui: 7.0.4 - escalade: 3.2.0 + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 get-caller-file: 2.0.5 require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 yargs@17.7.1: dependencies: @@ -13621,6 +18388,15 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + yargs@18.0.0: + dependencies: + cliui: 9.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + string-width: 7.2.0 + y18n: 5.0.8 + yargs-parser: 22.0.0 + yauzl@2.10.0: dependencies: buffer-crc32: 0.2.13 @@ -13640,4 +18416,4 @@ snapshots: dependencies: archiver-utils: 5.0.2 compress-commons: 6.0.2 - readable-stream: 4.5.2 + readable-stream: 4.6.0 diff --git a/common/config/rush/repo-state.json b/common/config/rush/repo-state.json index ccb6e240d..08792e831 100644 --- a/common/config/rush/repo-state.json +++ b/common/config/rush/repo-state.json @@ -1,5 +1,5 @@ // DO NOT MODIFY THIS FILE MANUALLY BUT DO COMMIT IT. It is generated and used by Rush. { - "pnpmShrinkwrapHash": "6693fc661ad5b6461d8a0fbbecf81c5f61d703bb", + "pnpmShrinkwrapHash": "abc453596eaf2cd7ff26dca182f8e42042b6326e", "preferredVersionsHash": "bf21a9e8fbc5a3846fb05b4fa0859e0917b2202f" } diff --git a/common/config/rush/version-policies.json b/common/config/rush/version-policies.json index 92e3774de..62b952eca 100644 --- a/common/config/rush/version-policies.json +++ b/common/config/rush/version-policies.json @@ -2,7 +2,6 @@ * This is configuration file is used for advanced publishing configurations with Rush. * For full documentation, please see https://rushjs.io */ - /** * A list of version policy definitions. A "version policy" is a custom package versioning * strategy that affects "rush change", "rush version", and "rush publish". The strategy applies @@ -20,21 +19,18 @@ * SemVer range is usually restricted to a single version. */ "definitionName": "lockStepVersion", - /** * (Required) The name that will be used for the "versionPolicyName" field in rush.json. * This name is also used command-line parameters such as "--version-policy" * and "--to-version-policy". */ "policyName": "tracker", - /** * (Required) The current version. All packages belonging to the set should have this version * in the current branch. When bumping versions, Rush uses this to determine the next version. * (The "version" field in package.json is NOT considered.) */ - "version": "4.0.2", - + "version": "4.10.1", /** * (Required) The type of bump that will be performed when publishing the next release. * When creating a release branch in Git, this field should be updated according to the @@ -44,4 +40,4 @@ */ "nextBump": "patch" } -] +] diff --git a/libraries/browser-tracker-core/CHANGELOG.json b/libraries/browser-tracker-core/CHANGELOG.json index 3cb5aee16..27fdbd31a 100644 --- a/libraries/browser-tracker-core/CHANGELOG.json +++ b/libraries/browser-tracker-core/CHANGELOG.json @@ -1,6 +1,253 @@ { "name": "@snowplow/browser-tracker-core", "entries": [ + { + "version": "4.10.1", + "tag": "@snowplow/browser-tracker-core_v4.10.1", + "date": "Wed, 19 Aug 2026 14:26:05 GMT", + "comments": {} + }, + { + "version": "4.10.0", + "tag": "@snowplow/browser-tracker-core_v4.10.0", + "date": "Mon, 27 Jul 2026 13:52:14 GMT", + "comments": { + "minor": [ + { + "comment": "Add disableSessionContextWithinWebView option to suppress client_session entity in hybrid native+WebView deployments" + } + ], + "none": [ + { + "comment": "Add preserveOriginalReferrer tracker configuration option for SPA referrer tracking" + } + ], + "patch": [ + { + "comment": "Remove forced layout read from tracker initialization: replace init-time getBrowserProperties() call with direct non-layout reads; defer the first readBrowserProperties() to first event build time." + } + ] + } + }, + { + "version": "4.9.0", + "tag": "@snowplow/browser-tracker-core_v4.9.0", + "date": "Tue, 21 Jul 2026 14:53:08 GMT", + "comments": { + "patch": [ + { + "comment": "Support non-alphabetic characters in URL scheme detection and keep the detected scheme within the atomic schema length limit (close #1238)" + } + ] + } + }, + { + "version": "4.8.4", + "tag": "@snowplow/browser-tracker-core_v4.8.4", + "date": "Thu, 02 Jul 2026 10:07:52 GMT", + "comments": {} + }, + { + "version": "4.8.3", + "tag": "@snowplow/browser-tracker-core_v4.8.3", + "date": "Tue, 30 Jun 2026 14:22:03 GMT", + "comments": { + "none": [ + { + "comment": "Update uuid to v11 and remove closure-compiler from the build pipeline" + } + ] + } + }, + { + "version": "4.8.2", + "tag": "@snowplow/browser-tracker-core_v4.8.2", + "date": "Wed, 17 Jun 2026 12:30:12 GMT", + "comments": {} + }, + { + "version": "4.8.1", + "tag": "@snowplow/browser-tracker-core_v4.8.1", + "date": "Wed, 13 May 2026 09:26:05 GMT", + "comments": {} + }, + { + "version": "4.8.0", + "tag": "@snowplow/browser-tracker-core_v4.8.0", + "date": "Tue, 28 Apr 2026 07:56:22 GMT", + "comments": { + "none": [ + { + "comment": "Add opt-in activity metrics tracking with activity_metrics entity" + } + ] + } + }, + { + "version": "4.7.0", + "tag": "@snowplow/browser-tracker-core_v4.7.0", + "date": "Wed, 01 Apr 2026 12:59:29 GMT", + "comments": { + "none": [ + { + "comment": "Replace SHA1 buffer polyfill with lightweight implementation" + } + ] + } + }, + { + "version": "4.6.9", + "tag": "@snowplow/browser-tracker-core_v4.6.9", + "date": "Mon, 16 Mar 2026 15:43:06 GMT", + "comments": {} + }, + { + "version": "4.6.8", + "tag": "@snowplow/browser-tracker-core_v4.6.8", + "date": "Tue, 28 Oct 2025 09:46:42 GMT", + "comments": {} + }, + { + "version": "4.6.7", + "tag": "@snowplow/browser-tracker-core_v4.6.7", + "date": "Tue, 07 Oct 2025 14:53:36 GMT", + "comments": { + "none": [ + { + "comment": "Fix SecurityError when accessing localStorage in restricted browser environments" + } + ] + } + }, + { + "version": "4.6.6", + "tag": "@snowplow/browser-tracker-core_v4.6.6", + "date": "Tue, 26 Aug 2025 08:42:28 GMT", + "comments": { + "none": [ + { + "comment": "Unify browser dimension checks to avoid including NaN values" + }, + { + "comment": "Truncate browser context hardwareConcurrency value to prevent invalid events" + } + ] + } + }, + { + "version": "4.6.5", + "tag": "@snowplow/browser-tracker-core_v4.6.5", + "date": "Wed, 25 Jun 2025 21:16:46 GMT", + "comments": {} + }, + { + "version": "4.6.4", + "tag": "@snowplow/browser-tracker-core_v4.6.4", + "date": "Wed, 25 Jun 2025 12:08:50 GMT", + "comments": {} + }, + { + "version": "4.6.3", + "tag": "@snowplow/browser-tracker-core_v4.6.3", + "date": "Thu, 29 May 2025 19:52:07 GMT", + "comments": { + "none": [ + { + "comment": "Resume sessions when disabling anonymous tracking that was already tracking session state" + } + ] + } + }, + { + "version": "4.6.2", + "tag": "@snowplow/browser-tracker-core_v4.6.2", + "date": "Tue, 20 May 2025 07:39:05 GMT", + "comments": {} + }, + { + "version": "4.6.1", + "tag": "@snowplow/browser-tracker-core_v4.6.1", + "date": "Tue, 06 May 2025 13:10:51 GMT", + "comments": {} + }, + { + "version": "4.6.0", + "tag": "@snowplow/browser-tracker-core_v4.6.0", + "date": "Thu, 01 May 2025 09:58:59 GMT", + "comments": { + "none": [ + { + "comment": "Add `cookieExtensionService` argument as replacement for `idService`, deprecated `idService`" + } + ] + } + }, + { + "version": "4.5.0", + "tag": "@snowplow/browser-tracker-core_v4.5.0", + "date": "Fri, 04 Apr 2025 09:21:23 GMT", + "comments": { + "none": [ + { + "comment": "Avoid undelivered notifications error (#1335)" + } + ] + } + }, + { + "version": "4.4.0", + "tag": "@snowplow/browser-tracker-core_v4.4.0", + "date": "Thu, 20 Mar 2025 12:14:34 GMT", + "comments": {} + }, + { + "version": "4.3.1", + "tag": "@snowplow/browser-tracker-core_v4.3.1", + "date": "Tue, 21 Jan 2025 11:09:42 GMT", + "comments": {} + }, + { + "version": "4.3.0", + "tag": "@snowplow/browser-tracker-core_v4.3.0", + "date": "Mon, 20 Jan 2025 11:45:13 GMT", + "comments": {} + }, + { + "version": "4.2.0", + "tag": "@snowplow/browser-tracker-core_v4.2.0", + "date": "Mon, 13 Jan 2025 08:30:05 GMT", + "comments": {} + }, + { + "version": "4.1.0", + "tag": "@snowplow/browser-tracker-core_v4.1.0", + "date": "Thu, 28 Nov 2024 10:57:30 GMT", + "comments": { + "none": [ + { + "comment": "Add appVersion configuration option to track a context entity with the application version" + } + ] + } + }, + { + "version": "4.0.4", + "tag": "@snowplow/browser-tracker-core_v4.0.4", + "date": "Thu, 21 Nov 2024 09:06:36 GMT", + "comments": {} + }, + { + "version": "4.0.3", + "tag": "@snowplow/browser-tracker-core_v4.0.3", + "date": "Wed, 20 Nov 2024 09:30:31 GMT", + "comments": { + "none": [ + { + "comment": "Serialize new session cookie synchronously to avoid overlapping sessions (#1381)" + } + ] + } + }, { "version": "4.0.2", "tag": "@snowplow/browser-tracker-core_v4.0.2", diff --git a/libraries/browser-tracker-core/CHANGELOG.md b/libraries/browser-tracker-core/CHANGELOG.md index b37d52613..dc3c53960 100644 --- a/libraries/browser-tracker-core/CHANGELOG.md +++ b/libraries/browser-tracker-core/CHANGELOG.md @@ -1,6 +1,174 @@ # Change Log - @snowplow/browser-tracker-core -This log was last generated on Mon, 11 Nov 2024 15:46:34 GMT and should not be manually modified. +This log was last generated on Wed, 19 Aug 2026 14:26:05 GMT and should not be manually modified. + +## 4.10.1 +Wed, 19 Aug 2026 14:26:05 GMT + +_Version update only_ + +## 4.10.0 +Mon, 27 Jul 2026 13:52:14 GMT + +### Minor changes + +- Add disableSessionContextWithinWebView option to suppress client_session entity in hybrid native+WebView deployments + +### Patches + +- Remove forced layout read from tracker initialization: replace init-time getBrowserProperties() call with direct non-layout reads; defer the first readBrowserProperties() to first event build time. + +### Updates + +- Add preserveOriginalReferrer tracker configuration option for SPA referrer tracking + +## 4.9.0 +Tue, 21 Jul 2026 14:53:08 GMT + +### Patches + +- Support non-alphabetic characters in URL scheme detection and keep the detected scheme within the atomic schema length limit (close #1238) + +## 4.8.4 +Thu, 02 Jul 2026 10:07:52 GMT + +_Version update only_ + +## 4.8.3 +Tue, 30 Jun 2026 14:22:03 GMT + +### Updates + +- Update uuid to v11 and remove closure-compiler from the build pipeline + +## 4.8.2 +Wed, 17 Jun 2026 12:30:12 GMT + +_Version update only_ + +## 4.8.1 +Wed, 13 May 2026 09:26:05 GMT + +_Version update only_ + +## 4.8.0 +Tue, 28 Apr 2026 07:56:22 GMT + +### Updates + +- Add opt-in activity metrics tracking with activity_metrics entity + +## 4.7.0 +Wed, 01 Apr 2026 12:59:29 GMT + +### Updates + +- Replace SHA1 buffer polyfill with lightweight implementation + +## 4.6.9 +Mon, 16 Mar 2026 15:43:06 GMT + +_Version update only_ + +## 4.6.8 +Tue, 28 Oct 2025 09:46:42 GMT + +_Version update only_ + +## 4.6.7 +Tue, 07 Oct 2025 14:53:36 GMT + +### Updates + +- Fix SecurityError when accessing localStorage in restricted browser environments + +## 4.6.6 +Tue, 26 Aug 2025 08:42:28 GMT + +### Updates + +- Unify browser dimension checks to avoid including NaN values +- Truncate browser context hardwareConcurrency value to prevent invalid events + +## 4.6.5 +Wed, 25 Jun 2025 21:16:46 GMT + +_Version update only_ + +## 4.6.4 +Wed, 25 Jun 2025 12:08:50 GMT + +_Version update only_ + +## 4.6.3 +Thu, 29 May 2025 19:52:07 GMT + +### Updates + +- Resume sessions when disabling anonymous tracking that was already tracking session state + +## 4.6.2 +Tue, 20 May 2025 07:39:05 GMT + +_Version update only_ + +## 4.6.1 +Tue, 06 May 2025 13:10:51 GMT + +_Version update only_ + +## 4.6.0 +Thu, 01 May 2025 09:58:59 GMT + +### Updates + +- Add `cookieExtensionService` argument as replacement for `idService`, deprecated `idService` + +## 4.5.0 +Fri, 04 Apr 2025 09:21:23 GMT + +### Updates + +- Avoid undelivered notifications error (#1335) + +## 4.4.0 +Thu, 20 Mar 2025 12:14:34 GMT + +_Version update only_ + +## 4.3.1 +Tue, 21 Jan 2025 11:09:42 GMT + +_Version update only_ + +## 4.3.0 +Mon, 20 Jan 2025 11:45:13 GMT + +_Version update only_ + +## 4.2.0 +Mon, 13 Jan 2025 08:30:05 GMT + +_Version update only_ + +## 4.1.0 +Thu, 28 Nov 2024 10:57:30 GMT + +### Updates + +- Add appVersion configuration option to track a context entity with the application version + +## 4.0.4 +Thu, 21 Nov 2024 09:06:36 GMT + +_Version update only_ + +## 4.0.3 +Wed, 20 Nov 2024 09:30:31 GMT + +### Updates + +- Serialize new session cookie synchronously to avoid overlapping sessions (#1381) ## 4.0.2 Mon, 11 Nov 2024 15:46:34 GMT diff --git a/libraries/browser-tracker-core/CLAUDE.md b/libraries/browser-tracker-core/CLAUDE.md new file mode 100644 index 000000000..d77dbccd0 --- /dev/null +++ b/libraries/browser-tracker-core/CLAUDE.md @@ -0,0 +1,452 @@ +# Browser Tracker Core Library - CLAUDE.md + +## Module Overview + +The `@snowplow/browser-tracker-core` library provides browser-specific tracking functionality built on top of tracker-core. It handles DOM interactions, browser storage, cookies, and browser-specific event tracking features. + +## Core Responsibilities + +- **Browser Detection**: User agent, viewport, screen detection +- **Storage Management**: Cookies, localStorage, sessionStorage +- **DOM Helpers**: Cross-domain linking, form tracking utilities +- **Session Management**: Session tracking and storage +- **Page View Tracking**: Page view IDs and activity tracking +- **Browser Plugins**: Plugin system for browser features + +## Architecture Patterns + +### Browser Plugin Pattern +```typescript +// ✅ Correct: Typed plugin interface +export interface BrowserPlugin { + activateBrowserPlugin?: (tracker: BrowserTracker) => void; + contexts?: () => Array; + logger?: (logger: Logger) => void; + beforeTrack?: (payloadBuilder: PayloadBuilder) => void; + afterTrack?: (payload: Payload) => void; +} + +// ❌ Wrong: Untyped plugin +const plugin = { activate: (t: any) => {} }; +``` + +### Tracker State Management +```typescript +// ✅ Correct: Shared state pattern +export interface SharedState { + bufferFlushers: Array<(sync?: boolean) => void>; + hasLoaded: boolean; + registeredOnLoadHandlers: Array; + contextProviders: Array; +} + +// ❌ Wrong: Global variables +let trackerState = {}; // Avoid global state +``` + +### Storage Abstraction Pattern +```typescript +// ✅ Correct: Storage interface +export interface Storage { + getItem(key: string): string | null; + setItem(key: string, value: string): void; + removeItem(key: string): void; +} + +// ❌ Wrong: Direct localStorage access +localStorage.setItem('key', 'value'); // Use abstraction +``` + +## Critical Import Patterns + +### Browser-Specific Exports +```typescript +// index.ts - Browser features +export * from './tracker/types'; +export * from './helpers'; +export * from './detectors'; +export * from './proxies'; +export * from './plugins'; +export * from './state'; +export { Tracker } from './tracker'; +``` + +### Helper Utilities +```typescript +// ✅ Correct: Import from helpers +import { getCookieValue, setCookie } from './helpers'; + +// ❌ Wrong: Reimplementing browser utils +function getCookie(name: string) { /* custom */ } +``` + +## Cookie Management + +### Cookie Storage Pattern +```typescript +// ✅ Correct: Use cookie storage abstraction +export class CookieStorage implements Storage { + constructor( + private cookieName: string, + private cookieDomain?: string, + private cookieLifetime?: number + ) {} + + setItem(key: string, value: string): void { + setCookie(this.cookieName, value, this.cookieLifetime); + } +} + +// ❌ Wrong: Direct document.cookie manipulation +document.cookie = `name=value; domain=.example.com`; +``` + +### ID Cookie Pattern +```typescript +// Standard ID cookie structure +interface IdCookie { + userId: string; // Domain user ID + sessionId: string; // Session ID + sessionIndex: number; // Session count + eventIndex: number; // Event count in session + lastActivity: number; // Last activity timestamp +} +``` + +## Session Management + +### Session Storage Pattern +```typescript +// ✅ Correct: Session data structure +export interface SessionData { + sessionId: string; + previousSessionId?: string; + sessionIndex: number; + userId: string; + firstEventId?: string; + firstEventTimestamp?: number; +} + +// ❌ Wrong: Unstructured session data +const session = { id: '123', data: {} }; +``` + +### Activity Tracking +```typescript +// Activity callback configuration +export interface ActivityTrackingConfiguration { + minimumVisitLength: number; + heartbeatDelay: number; + callback?: ActivityCallback; +} +``` + +## DOM Interaction Patterns + +### Cross-Domain Linking +```typescript +// ✅ Correct: Decorator pattern +export function decorateQuerystring( + url: string, + name: string, + value: string +): string { + const [urlPath, anchor] = url.split('#'); + const [basePath, queries] = urlPath.split('?'); + // ... decoration logic + return decorated; +} + +// ❌ Wrong: String concatenation +url += '?_sp=' + value; // Fragile +``` + +### Form Element Helpers +```typescript +// Get form element values safely +export function getElementValue(element: HTMLElement): string | null { + if (element instanceof HTMLInputElement) { + return element.value; + } + if (element instanceof HTMLTextAreaElement) { + return element.value; + } + return null; +} +``` + +## Browser Detection + +### Detector Functions +```typescript +// ✅ Correct: Feature detection +export function hasLocalStorage(): boolean { + try { + const test = 'localStorage'; + localStorage.setItem(test, test); + localStorage.removeItem(test); + return true; + } catch (e) { + return false; + } +} + +// ❌ Wrong: Assume availability +if (localStorage) { /* use it */ } // May throw +``` + +### Browser Properties +```typescript +// Standard browser context +export interface BrowserProperties { + viewport: [number, number]; + documentSize: [number, number]; + resolution: [number, number]; + colorDepth: number; + devicePixelRatio: number; + cookieEnabled: boolean; + online: boolean; + browserLanguage: string; + documentLanguage: string; + webdriver: boolean; +} +``` + +## Event Queue Management + +### Out Queue Pattern +```typescript +// ✅ Correct: Managed queue with retry +export class OutQueue { + constructor( + private readonly maxQueueSize: number, + private readonly eventStore: EventStore + ) {} + + enqueue(event: Payload): void { + if (this.queue.length >= this.maxQueueSize) { + this.flush(); + } + this.queue.push(event); + } +} + +// ❌ Wrong: Unbounded array +const events = []; // No size management +``` + +## Common Patterns + +### Page View ID Generation +```typescript +// ✅ Correct: UUID per page view +import { v4 as uuid } from 'uuid'; +export function generatePageViewId(): string { + return uuid(); +} + +// ❌ Wrong: Sequential IDs +let pvId = 0; +function getPageViewId() { return ++pvId; } +``` + +### Local Storage Event Store +```typescript +// Event persistence pattern +export class LocalStorageEventStore implements EventStore { + constructor(private readonly key: string) {} + + async add(event: EventStorePayload): Promise { + const events = this.getAll(); + events.push(event); + localStorage.setItem(this.key, JSON.stringify(events)); + return events.length; + } +} +``` + +## Testing Patterns + +### Test Directory Structure +``` +test/ +├── tracker/ # Tracker-specific tests +│ ├── cookie_storage.test.ts +│ ├── page_view.test.ts +│ └── session_data.test.ts +├── helpers/ # Helper function tests +├── detectors.test.ts # Browser detection tests +└── __snapshots__/ # Jest snapshots +``` + +### Mock Browser APIs +```typescript +// Mock storage for tests +class MockStorage implements Storage { + private store: Record = {}; + + getItem(key: string): string | null { + return this.store[key] || null; + } + + setItem(key: string, value: string): void { + this.store[key] = value; + } + + clear(): void { + this.store = {}; + } +} + +// Mock document properties +jest.spyOn(document, 'title', 'get').mockReturnValue('Test Page'); +jest.spyOn(document, 'referrer', 'get').mockReturnValue('https://referrer.com'); +``` + +### DOM Testing +```typescript +// ✅ Correct: Setup and teardown DOM +beforeEach(() => { + document.body.innerHTML = ` +
+ + +
+ `; +}); + +afterEach(() => { + document.body.innerHTML = ''; + jest.clearAllMocks(); +}); + +// ❌ Wrong: Leave DOM dirty +beforeEach(() => { + document.body.innerHTML += '
test
'; // Accumulates +}); +``` + +### Testing Browser Detection +```typescript +// ✅ Correct: Mock browser features +describe('Browser detection', () => { + it('detects localStorage support', () => { + const mockSetItem = jest.fn(); + Object.defineProperty(window, 'localStorage', { + value: { setItem: mockSetItem, removeItem: jest.fn() }, + writable: true + }); + + expect(hasLocalStorage()).toBe(true); + }); + + it('handles localStorage errors', () => { + Object.defineProperty(window, 'localStorage', { + value: { + setItem: () => { throw new Error('Quota exceeded'); } + }, + writable: true + }); + + expect(hasLocalStorage()).toBe(false); + }); +}); +``` + +### Cookie Testing +```typescript +// ✅ Correct: Test cookie operations +describe('Cookie management', () => { + beforeEach(() => { + // Clear cookies + document.cookie.split(';').forEach(c => { + document.cookie = c.replace(/^ +/, '') + .replace(/=.*/, '=;expires=' + new Date().toUTCString()); + }); + }); + + it('sets and retrieves cookies', () => { + setCookie('test', 'value', 86400); + expect(getCookieValue('test')).toBe('value'); + }); +}); +``` + +### Testing Helper Pattern +```typescript +// Common test helper in test/helpers.ts +export function createTracker(config?: Partial) { + const eventStore = newInMemoryEventStore(); + return addTracker('sp', 'sp', 'js-test', '', new SharedState(), { + eventStore, + ...config + }); +} + +// Usage in tests +it('tracks page view', () => { + const tracker = createTracker(); + tracker.trackPageView(); + // Assert... +}); +``` + +## File Organization + +``` +browser-tracker-core/ +├── src/ +│ ├── index.ts # Public exports +│ ├── snowplow.ts # Main tracker factory +│ ├── state.ts # Shared state +│ ├── plugins.ts # Plugin system +│ ├── proxies.ts # Proxy tracking +│ ├── detectors.ts # Browser detection +│ ├── helpers/ +│ │ ├── index.ts # Helper exports +│ │ ├── browser_props.ts +│ │ ├── cross_domain.ts +│ │ └── storage.ts +│ └── tracker/ +│ ├── index.ts # Tracker implementation +│ ├── types.ts # TypeScript types +│ ├── cookie_storage.ts +│ ├── id_cookie.ts +│ ├── out_queue.ts +│ └── local_storage_event_store.ts +└── test/ + └── [module].test.ts +``` + +## Quick Reference + +### Essential Imports +```typescript +import { + BrowserTracker, + BrowserPlugin, + SharedState, + ActivityTrackingConfiguration, + PageViewEvent, + getCookieValue, + decorateQuerystring, + hasLocalStorage +} from '@snowplow/browser-tracker-core'; +``` + +### Plugin Development Checklist +- [ ] Implement `BrowserPlugin` interface +- [ ] Store tracker reference in `activateBrowserPlugin` +- [ ] Clean up resources in cleanup hooks +- [ ] Handle browser API failures gracefully +- [ ] Test with different storage configurations + +## Contributing to CLAUDE.md + +When modifying browser-tracker-core: + +1. **Test browser compatibility** across major browsers +2. **Handle storage failures** gracefully +3. **Respect privacy settings** (cookies, storage) +4. **Maintain IE11 compatibility** if required +5. **Document browser-specific behavior** \ No newline at end of file diff --git a/libraries/browser-tracker-core/package.json b/libraries/browser-tracker-core/package.json index 8859d828b..374aef366 100644 --- a/libraries/browser-tracker-core/package.json +++ b/libraries/browser-tracker-core/package.json @@ -1,6 +1,6 @@ { "name": "@snowplow/browser-tracker-core", - "version": "4.0.2", + "version": "4.10.1", "description": "Core functionality for Snowplow Browser trackers", "homepage": "http://bit.ly/sp-js", "bugs": "https://github.com/snowplow/snowplow-javascript-tracker/issues", @@ -23,31 +23,27 @@ }, "dependencies": { "@snowplow/tracker-core": "workspace:*", - "sha1": "^1.1.1", "tslib": "^2.3.1", - "uuid": "^10.0.0" + "uuid": "^11.1.1" }, "devDependencies": { - "@ampproject/rollup-plugin-closure-compiler": "~0.27.0", "@rollup/plugin-commonjs": "~21.0.2", "@rollup/plugin-node-resolve": "~13.1.3", - "@types/jest": "~27.4.1", + "@types/jest": "~28.1.1", "@types/jsdom": "~16.2.14", - "@types/sha1": "~1.1.3", - "@types/uuid": "^10.0.0", "@typescript-eslint/eslint-plugin": "~5.15.0", "@typescript-eslint/parser": "~5.15.0", "eslint": "~8.11.0", - "jest": "~27.5.1", - "jest-environment-jsdom": "~27.5.1", - "jest-environment-jsdom-global": "~3.0.0", + "jest": "~28.1.3", + "jest-environment-jsdom": "~28.1.3", + "jest-environment-jsdom-global": "~4.0.0", "jest-standard-reporter": "~2.0.0", "rollup": "~2.70.1", "rollup-plugin-cleanup": "~3.2.1", "rollup-plugin-license": "~2.6.1", "rollup-plugin-terser": "~7.0.2", "rollup-plugin-ts": "~2.0.5", - "ts-jest": "~27.1.3", + "ts-jest": "~28.0.8", "typescript": "~4.6.2", "@testing-library/dom": "~9.3.1", "whatwg-fetch": "~3.6.20" diff --git a/libraries/browser-tracker-core/rollup.config.js b/libraries/browser-tracker-core/rollup.config.js index bc7e0d95b..3f02fc230 100644 --- a/libraries/browser-tracker-core/rollup.config.js +++ b/libraries/browser-tracker-core/rollup.config.js @@ -32,7 +32,6 @@ import { nodeResolve } from '@rollup/plugin-node-resolve'; import commonjs from '@rollup/plugin-commonjs'; import ts from 'rollup-plugin-ts'; // Prefered over @rollup/plugin-typescript as it bundles .d.ts files import { banner } from '../../banner'; -import compiler from '@ampproject/rollup-plugin-closure-compiler'; import { terser } from 'rollup-plugin-terser'; import cleanup from 'rollup-plugin-cleanup'; import pkg from './package.json'; @@ -50,7 +49,7 @@ export default [ }, { input: './src/index.ts', - plugins: [...umdPlugins, compiler(), terser(), cleanup({ comments: 'none' }), banner()], + plugins: [...umdPlugins, terser(), cleanup({ comments: 'none' }), banner()], output: [{ file: pkg.main.replace('.js', '.min.js'), format: 'umd', sourcemap: true, name: umdName }], }, { diff --git a/libraries/browser-tracker-core/src/helpers/browser_props.ts b/libraries/browser-tracker-core/src/helpers/browser_props.ts index 4deb313a1..6af2b45d7 100644 --- a/libraries/browser-tracker-core/src/helpers/browser_props.ts +++ b/libraries/browser-tracker-core/src/helpers/browser_props.ts @@ -18,20 +18,26 @@ function useResizeObserver(): boolean { } let resizeObserverInitialized = false; +let readBrowserPropertiesTask: number | null = null; function initializeResizeObserver() { if (resizeObserverInitialized) { return; } - if(!document || !document.body || !document.documentElement) { + if (!document || !document.body || !document.documentElement) { return; } resizeObserverInitialized = true; - const resizeObserver = new ResizeObserver((entries) => { - for (let entry of entries) { - if (entry.target === document.body || entry.target === document.documentElement) { + const resizeObserver = new ResizeObserver(() => { + if (!readBrowserPropertiesTask) { + // The browser property lookup causes a forced synchronous layout when offsets/sizes are + // queried. It's possible that the forced synchronous layout causes the ResizeObserver + // to be fired again, leading to an infinite loop and the "ResizeObserver loop completed + // with undelivered notifications" error. + readBrowserPropertiesTask = requestAnimationFrame(() => { + readBrowserPropertiesTask = null; cachedProperties = readBrowserProperties(); - } + }); } }); resizeObserver.observe(document.body); @@ -40,8 +46,15 @@ function initializeResizeObserver() { let cachedProperties: BrowserProperties; -/* Separator used for dimension values e.g. widthxheight */ -const DIMENSION_SEPARATOR = 'x'; +/** + * Resets module-level browser property state. Used in tests to prevent state bleed between test cases. + * @internal + */ +export function resetBrowserPropertiesState() { + cachedProperties = undefined as any; + resizeObserverInitialized = false; + readBrowserPropertiesTask = null; +} /** * Gets various browser properties (that are expensive to read!) @@ -52,6 +65,9 @@ const DIMENSION_SEPARATOR = 'x'; */ export function getBrowserProperties() { if (!useResizeObserver()) { + // TODO: per-event forced reflow — each call re-reads layout geometry (offsetWidth, scrollHeight, + // etc.) for browsers without ResizeObserver. ResizeObserver has been in all major browsers since + // 2020 so this is an edge-case path. File a separate ticket to address if needed. return readBrowserProperties(); } @@ -69,9 +85,9 @@ export function getBrowserProperties() { */ function readBrowserProperties(): BrowserProperties { return { - viewport: floorDimensionFields(detectViewport()), - documentSize: floorDimensionFields(detectDocumentSize()), - resolution: floorDimensionFields(detectScreenResolution()), + viewport: detectViewport(), + documentSize: detectDocumentSize(), + resolution: detectScreenResolution(), colorDepth: screen.colorDepth, devicePixelRatio: window.devicePixelRatio, cookiesEnabled: window.navigator.cookieEnabled, @@ -80,7 +96,7 @@ function readBrowserProperties(): BrowserProperties { documentLanguage: document.documentElement.lang, webdriver: window.navigator.webdriver, deviceMemory: (window.navigator as any).deviceMemory, - hardwareConcurrency: (window.navigator as any).hardwareConcurrency, + hardwareConcurrency: Math.floor(window.navigator.hardwareConcurrency) || undefined, }; } @@ -103,7 +119,7 @@ function detectViewport() { height = e['clientHeight']; } - return Math.max(0, width) + DIMENSION_SEPARATOR + Math.max(0, height); + return makeDimension(Math.max(0, width), Math.max(0, height)); } /** @@ -118,21 +134,21 @@ function detectDocumentSize() { be = document.body, // document.body may not have rendered, so check whether be.offsetHeight is null bodyHeight = be ? Math.max(be.offsetHeight, be.scrollHeight) : 0; - var w = Math.max(de.clientWidth, de.offsetWidth, de.scrollWidth); - var h = Math.max(de.clientHeight, de.offsetHeight, de.scrollHeight, bodyHeight); - return isNaN(w) || isNaN(h) ? '' : w + DIMENSION_SEPARATOR + h; + + return makeDimension( + Math.max(de.clientWidth, de.offsetWidth, de.scrollWidth), + Math.max(de.clientHeight, de.offsetHeight, de.scrollHeight, bodyHeight) + ); } function detectScreenResolution() { - return screen.width + DIMENSION_SEPARATOR + screen.height; + return makeDimension(screen.width, screen.height); } -export function floorDimensionFields(field?: string | null) { - return ( - field && - field - .split(DIMENSION_SEPARATOR) - .map((dimension) => Math.floor(Number(dimension))) - .join(DIMENSION_SEPARATOR) - ); +export function makeDimension(width: number, height: number): string | null { + if (isNaN(width) || isNaN(height)) { + return null; + } + + return Math.floor(width) + 'x' + Math.floor(height); } diff --git a/libraries/browser-tracker-core/src/helpers/sha1.ts b/libraries/browser-tracker-core/src/helpers/sha1.ts new file mode 100644 index 000000000..af6a8c5ea --- /dev/null +++ b/libraries/browser-tracker-core/src/helpers/sha1.ts @@ -0,0 +1,98 @@ +/** + * Pure-JS SHA-1 implementation (FIPS 180-4). + * Replaces the `sha1` npm package to avoid pulling in a Node.js `Buffer` + * polyfill (~28 KB) when bundled for the browser. + */ +/** Compute SHA-1 hex digest of a UTF-8 string (FIPS 180-4). */ +export function sha1(message: string): string { + // Encode UTF-8 + const bytes: number[] = []; + for (let i = 0; i < message.length; i++) { + let c = message.charCodeAt(i); + if (c < 0x80) { + bytes.push(c); + } else if (c < 0x800) { + bytes.push(0xc0 | (c >> 6), 0x80 | (c & 0x3f)); + } else if (c >= 0xd800 && c <= 0xdbff && i + 1 < message.length) { + const next = message.charCodeAt(++i); + c = 0x10000 + ((c & 0x3ff) << 10) + (next & 0x3ff); + bytes.push(0xf0 | (c >> 18), 0x80 | ((c >> 12) & 0x3f), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f)); + } else { + bytes.push(0xe0 | (c >> 12), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f)); + } + } + + // Pre-processing: pad to 512-bit blocks + const bitLen = bytes.length * 8; + bytes.push(0x80); + while (bytes.length % 64 !== 56) bytes.push(0); + // Append length as 64-bit big-endian (high 32 bits always 0 for strings < 512 MB) + bytes.push(0, 0, 0, 0); + bytes.push((bitLen >>> 24) & 0xff, (bitLen >>> 16) & 0xff, (bitLen >>> 8) & 0xff, bitLen & 0xff); + + // Initialize hash values + let h0 = 0x67452301; + let h1 = 0xefcdab89; + let h2 = 0x98badcfe; + let h3 = 0x10325476; + let h4 = 0xc3d2e1f0; + + // Process each 512-bit block + const w = new Array(80); + for (let offset = 0; offset < bytes.length; offset += 64) { + for (let i = 0; i < 16; i++) { + w[i] = + (bytes[offset + i * 4] << 24) | + (bytes[offset + i * 4 + 1] << 16) | + (bytes[offset + i * 4 + 2] << 8) | + bytes[offset + i * 4 + 3]; + } + for (let i = 16; i < 80; i++) { + const n = w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16]; + w[i] = (n << 1) | (n >>> 31); + } + + let a = h0, + b = h1, + c = h2, + d = h3, + e = h4; + + for (let i = 0; i < 80; i++) { + let f: number, k: number; + if (i < 20) { + f = (b & c) | (~b & d); + k = 0x5a827999; + } else if (i < 40) { + f = b ^ c ^ d; + k = 0x6ed9eba1; + } else if (i < 60) { + f = (b & c) | (b & d) | (c & d); + k = 0x8f1bbcdc; + } else { + f = b ^ c ^ d; + k = 0xca62c1d6; + } + const temp = (((a << 5) | (a >>> 27)) + f + e + k + w[i]) | 0; + e = d; + d = c; + c = (b << 30) | (b >>> 2); + b = a; + a = temp; + } + + h0 = (h0 + a) | 0; + h1 = (h1 + b) | 0; + h2 = (h2 + c) | 0; + h3 = (h3 + d) | 0; + h4 = (h4 + e) | 0; + } + + // Produce hex digest + let hex = ''; + for (const h of [h0, h1, h2, h3, h4]) { + const part = (h >>> 0).toString(16); + hex += (part.length < 8 ? '00000000'.slice(part.length) : '') + part; + } + return hex; +} diff --git a/libraries/browser-tracker-core/src/tracker/cookie_storage.ts b/libraries/browser-tracker-core/src/tracker/cookie_storage.ts index b7b2dfd07..8e329ae62 100644 --- a/libraries/browser-tracker-core/src/tracker/cookie_storage.ts +++ b/libraries/browser-tracker-core/src/tracker/cookie_storage.ts @@ -44,6 +44,11 @@ export interface CookieStorage { * @param secure - Boolean to specify if cookie should be secure */ deleteCookie(name: string, path?: string, domainName?: string, sameSite?: string, secure?: boolean): void; + + /** + * Write all pending cookies. + */ + flush(): void; } export interface AsyncCookieStorage extends CookieStorage { @@ -51,11 +56,6 @@ export interface AsyncCookieStorage extends CookieStorage { * Clear the cookie storage cache (does not delete any cookies) */ clearCache(): void; - - /** - * Write all pending cookies. - */ - flush(): void; } interface Cookie { @@ -203,5 +203,6 @@ export const syncCookieStorage: CookieStorage = { cookie(name, value, ttl, path, domain, samesite, secure); return document.cookie.indexOf(`${name}=`) !== -1; }, - deleteCookie + deleteCookie, + flush: () => {}, }; diff --git a/libraries/browser-tracker-core/src/tracker/index.ts b/libraries/browser-tracker-core/src/tracker/index.ts index 555b0a240..5521ea9a6 100755 --- a/libraries/browser-tracker-core/src/tracker/index.ts +++ b/libraries/browser-tracker-core/src/tracker/index.ts @@ -7,7 +7,7 @@ import { SelfDescribingJson, LOG, } from '@snowplow/tracker-core'; -import hash from 'sha1'; +import { sha1 as hash } from '../helpers/sha1'; import { v4 as uuid } from 'uuid'; import { decorateQuerystring, @@ -35,6 +35,7 @@ import { PageViewEvent, ActivityCallback, ActivityCallbackData, + ActivityMetrics, TrackerConfiguration, BrowserTracker, ActivityTrackingConfiguration, @@ -65,8 +66,14 @@ import { emptyIdCookie, eventIndexFromIdCookie, } from './id_cookie'; -import { CLIENT_SESSION_SCHEMA, WEB_PAGE_SCHEMA, BROWSER_CONTEXT_SCHEMA } from './schemata'; -import { getBrowserProperties } from '../helpers/browser_props'; +import { + CLIENT_SESSION_SCHEMA, + WEB_PAGE_SCHEMA, + BROWSER_CONTEXT_SCHEMA, + APPLICATION_CONTEXT_SCHEMA, + ACTIVITY_METRICS_SCHEMA, +} from './schemata'; +import { getBrowserProperties, makeDimension } from '../helpers/browser_props'; import { asyncCookieStorage, syncCookieStorage } from './cookie_storage'; declare global { @@ -88,6 +95,8 @@ type ActivityConfig = { configHeartBeatTimer: number; /** The setInterval identifier */ activityInterval?: number; + /** Whether activity metrics tracking is enabled for this configuration */ + activityMetrics?: boolean; }; /** The configurations for the two types of Activity Tracking */ @@ -149,13 +158,13 @@ export function Tracker( if (typeof config.anonymousTracking === 'boolean') { return false; } - return config.anonymousTracking?.withSessionTracking === true ?? false; + return config.anonymousTracking?.withSessionTracking === true; }, getAnonymousServerTracking = (config: TrackerConfiguration) => { if (typeof config.anonymousTracking === 'boolean') { return false; } - return config.anonymousTracking?.withServerAnonymisation === true ?? false; + return config.anonymousTracking?.withServerAnonymisation === true; }, getAnonymousTracking = (config: TrackerConfiguration) => !!config.anonymousTracking, isBrowserContextAvailable = trackerConfiguration?.contexts?.browser ?? false, @@ -203,6 +212,8 @@ export function Tracker( configPlatform = trackerConfiguration.platform ?? 'web', // Site ID configTrackerSiteId = trackerConfiguration.appId ?? '', + // Application version + configAppVersion = trackerConfiguration.appVersion, // Document URL configCustomUrl: string, // Document title @@ -262,6 +273,14 @@ export function Tracker( maxXOffset: number, minYOffset: number, maxYOffset: number, + // Activity metrics tracking state + activityMetricsState = { + metrics: { mouseDistance: 0, scrollDistance: 0, keyPresses: 0, clicks: 0, touches: 0 } as ActivityMetrics, + lastMouseX: undefined as number | undefined, + lastMouseY: undefined as number | undefined, + lastScrollX: undefined as number | undefined, + lastScrollY: undefined as number | undefined, + }, // Domain hash value domainHash: string, // Domain unique user ID @@ -297,6 +316,7 @@ export function Tracker( configurations: {}, }, configSessionContext = trackerConfiguration.contexts?.session ?? false, + configDisableSessionInWebView = trackerConfiguration.disableSessionContextWithinWebView ?? false, toOptoutByCookie: string | boolean, onSessionUpdateCallback = trackerConfiguration.onSessionUpdateCallback, manualSessionUpdateCalled = false, @@ -308,7 +328,10 @@ export function Tracker( configCookieDomain = findRootDomain(configCookieSameSite, configCookieSecure); } - const { browserLanguage, resolution, colorDepth, cookiesEnabled } = getBrowserProperties(); + const cookiesEnabled = window.navigator.cookieEnabled; + const colorDepth = screen.colorDepth; + const browserLanguage = window.navigator.language || (window.navigator as any).userLanguage; + const resolution = makeDimension(screen.width, screen.height); const timeZone = getTimeZone(); // Set up unchanging name-value pairs @@ -323,6 +346,20 @@ export function Tracker( core.addPayloadPair('cd', colorDepth); if (timeZone) core.addPayloadPair('tz', timeZone); + // Add the application version context entity + if (configAppVersion) { + core.addPlugin({ + plugin: { + contexts: () => [ + { + schema: APPLICATION_CONTEXT_SCHEMA, + data: { version: configAppVersion }, + }, + ], + }, + }); + } + /* * Initialize tracker */ @@ -330,6 +367,10 @@ export function Tracker( initializeIdsAndCookies(); + if (trackerConfiguration.preserveOriginalReferrer && configReferrerUrl) { + customReferrer = configReferrerUrl; + } + if (trackerConfiguration.crossDomainLinker) { decorateLinks(trackerConfiguration.crossDomainLinker); } @@ -423,10 +464,20 @@ export function Tracker( * Extract scheme/protocol from URL */ function getProtocolScheme(url: string) { - const e = new RegExp('^([a-z]+):'), + // RFC 3986: scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ), case-insensitive. + // A stricter [a-z]+ pattern misclassifies schemes such as chrome-extension as + // relative references, which then get appended to the base URL. + const e = new RegExp('^([a-z][a-z0-9+\\-.]*):', 'i'), matches = e.exec(url); - return matches ? matches[1] : null; + // The atomic event schema caps the url scheme at 16 characters + // (page_urlscheme / refr_urlscheme, maxLength 16). A longer scheme would only + // produce an event that fails validation downstream, so treat such URLs as + // relative references (the prior behaviour) rather than absolute URLs. + // Ref: com.snowplowanalytics.snowplow/atomic/jsonschema/1-0-0 + const MAX_SCHEME_LENGTH = 16; + + return matches && matches[1].length <= MAX_SCHEME_LENGTH ? matches[1] : null; } /* @@ -498,17 +549,67 @@ export function Tracker( * Process all "activity" events. * For performance, this function must have low overhead. */ - function activityHandler() { + function activityHandler(event?: Event) { const now = new Date(); lastActivityTime = now.getTime(); + + if (isActivityMetricsEnabled() && event) { + switch (event.type) { + case 'mousemove': { + const me = event as MouseEvent; + if (activityMetricsState.lastMouseX !== undefined && activityMetricsState.lastMouseY !== undefined) { + const dx = me.clientX - activityMetricsState.lastMouseX; + const dy = me.clientY - activityMetricsState.lastMouseY; + activityMetricsState.metrics.mouseDistance += Math.sqrt(dx * dx + dy * dy); + } + activityMetricsState.lastMouseX = me.clientX; + activityMetricsState.lastMouseY = me.clientY; + break; + } + case 'click': + activityMetricsState.metrics.clicks++; + break; + case 'keydown': + activityMetricsState.metrics.keyPresses++; + break; + case 'touchstart': + activityMetricsState.metrics.touches++; + break; + // scroll handled in scrollHandler + } + } } /* * Process all "scroll" events. */ function scrollHandler() { - updateMaxScrolls(); activityHandler(); + + const offsets = getPageOffsets(); + + const x = offsets[0]; + if (x < minXOffset) { + minXOffset = x; + } else if (x > maxXOffset) { + maxXOffset = x; + } + + const y = offsets[1]; + if (y < minYOffset) { + minYOffset = y; + } else if (y > maxYOffset) { + maxYOffset = y; + } + + if (isActivityMetricsEnabled()) { + if (activityMetricsState.lastScrollX !== undefined && activityMetricsState.lastScrollY !== undefined) { + activityMetricsState.metrics.scrollDistance += + Math.abs(x - activityMetricsState.lastScrollX) + Math.abs(y - activityMetricsState.lastScrollY); + } + activityMetricsState.lastScrollX = x; + activityMetricsState.lastScrollY = y; + } } /* @@ -539,24 +640,35 @@ export function Tracker( } /* - * Check the max scroll levels, updating as necessary + * Whether activity metrics tracking is enabled for any active configuration */ - function updateMaxScrolls() { - const offsets = getPageOffsets(); + function isActivityMetricsEnabled(): boolean { + return !!( + activityTrackingConfig.configurations.pagePing?.activityMetrics || + activityTrackingConfig.configurations.callback?.activityMetrics + ); + } - const x = offsets[0]; - if (x < minXOffset) { - minXOffset = x; - } else if (x > maxXOffset) { - maxXOffset = x; - } + /* + * Reset activity metrics accumulators and position trackers + */ + function resetActivityMetricsState() { + activityMetricsState.metrics = { mouseDistance: 0, scrollDistance: 0, keyPresses: 0, clicks: 0, touches: 0 }; + activityMetricsState.lastMouseX = undefined; + activityMetricsState.lastMouseY = undefined; + activityMetricsState.lastScrollX = undefined; + activityMetricsState.lastScrollY = undefined; + } - const y = offsets[1]; - if (y < minYOffset) { - minYOffset = y; - } else if (y > maxYOffset) { - maxYOffset = y; - } + /* + * Return a snapshot of current activity metrics + */ + function getActivityMetrics(): ActivityMetrics { + return { + ...activityMetricsState.metrics, + mouseDistance: Math.round(activityMetricsState.metrics.mouseDistance), + scrollDistance: Math.round(activityMetricsState.metrics.scrollDistance), + }; } /* @@ -701,6 +813,11 @@ export function Tracker( // Update currentVisitTs updateNowTsInIdCookie(idCookie); setDomainUserIdCookie(idCookie); + + if (!eventIndexFromIdCookie(idCookie)) { + // Synchronously update the cookies to persist the new session ASAP + cookieStorage.flush(); + } } } @@ -906,7 +1023,11 @@ export function Tracker( configStateStorageStrategy, configAnonymousTracking ); - if (configSessionContext && (!configAnonymousTracking || configAnonymousSessionTracking)) { + if ( + configSessionContext && + (!configAnonymousTracking || configAnonymousSessionTracking) && + !(configDisableSessionInWebView && isInWebView()) + ) { addSessionContextToPayload(payloadBuilder, clientSession); } @@ -920,6 +1041,9 @@ export function Tracker( onSessionUpdateCallback && !manualSessionUpdateCalled ) { + // Synchronously update the cookies to persist the new session ASAP + cookieStorage.flush(); + onSessionUpdateCallback(clientSession); manualSessionUpdateCalled = false; } @@ -930,6 +1054,21 @@ export function Tracker( }; } + /** + * Returns true when the page is running inside a Snowplow V2 WebView interface. + * Mirrors the three-interface check in @snowplow/webview-tracker without introducing + * a package dependency on browser-tracker-core. + */ + function isInWebView(): boolean { + return !!( + (window as any).SnowplowWebInterfaceV2 || + ((window as any).webkit && + (window as any).webkit.messageHandlers && + (window as any).webkit.messageHandlers.snowplowV2) || + (window as any).ReactNativeWebView + ); + } + function addSessionContextToPayload(payloadBuilder: PayloadBuilder, clientSession: ClientSession) { let sessionContext: SelfDescribingJson = { schema: CLIENT_SESSION_SCHEMA, @@ -969,6 +1108,10 @@ export function Tracker( const clientSession = clientSessionFromIdCookie(idCookie, configStateStorageStrategy, configAnonymousTracking); setDomainUserIdCookie(idCookie); const sessionIdentifierPersisted = setSessionCookie(); + + // Synchronously update the cookies to persist the new session ASAP + cookieStorage.flush(); + if (sessionIdentifierPersisted && onSessionUpdateCallback) { manualSessionUpdateCalled = true; onSessionUpdateCallback(clientSession); @@ -1070,6 +1213,7 @@ export function Tracker( // Capture our initial scroll points resetMaxScrolls(); + resetActivityMetricsState(); // Add event handlers; cross-browser compatibility here varies significantly // @see http://quirksmode.org/dom/events @@ -1098,6 +1242,7 @@ export function Tracker( if (activityTrackingConfig.enabled && (resetActivityTrackingOnPageView || installingActivityTracking)) { // Periodic check for activity. lastActivityTime = now.getTime(); + resetActivityMetricsState(); let key: keyof ActivityConfigurations; for (key in activityTrackingConfig.configurations) { @@ -1119,8 +1264,16 @@ export function Tracker( ) { const executePagePing = (cb: ActivityCallback, context: Array) => { refreshUrl(); - cb({ context, pageViewId: getPageViewId(), minXOffset, minYOffset, maxXOffset, maxYOffset }); + let activityMetrics: ActivityMetrics | undefined; + if (isActivityMetricsEnabled()) { + activityMetrics = getActivityMetrics(); + context = context.concat([{ schema: ACTIVITY_METRICS_SCHEMA, data: activityMetrics }]); + } + cb({ context, pageViewId: getPageViewId(), minXOffset, minYOffset, maxXOffset, maxYOffset, activityMetrics }); resetMaxScrolls(); + if (isActivityMetricsEnabled()) { + resetActivityMetricsState(); + } }; const timeout = () => { @@ -1164,6 +1317,7 @@ export function Tracker( configMinimumVisitLength: minimumVisitLength * 1000, configHeartBeatTimer: heartbeatDelay * 1000, callback, + activityMetrics: configuration.activityMetrics, }; } @@ -1204,6 +1358,10 @@ export function Tracker( } activityTrackingConfig.configurations[actionKey] = undefined; + + if (!activityTrackingConfig.configurations.pagePing && !activityTrackingConfig.configurations.callback) { + resetActivityMetricsState(); + } } const apiMethods = { @@ -1233,6 +1391,10 @@ export function Tracker( return loadDomainUserIdCookie(); }, + getDomainSessionId: function () { + return memorizedSessionId || sessionIdFromIdCookie(loadDomainUserIdCookie()); + }, + setReferrerUrl: function (url: string) { customReferrer = url; }, @@ -1351,10 +1513,23 @@ export function Tracker( }, disableAnonymousTracking: function (configuration?: DisableAnonymousTrackingConfiguration) { + /* + Flag for if the state storage strategy has changed and we are currently storing session state (anonymously or not). + Because the strategy changes, the below call to initializeIdsAndCookies will fail to see that a session is currently in progress and start a new one. + Detect this state, and once we've updated settings, bump the session cookie with the new strategy to ensure it exists before loading the ID cookie, which will resume the session. + */ + const shouldResumeSession = + configuration?.stateStorageStrategy && // a new strategy was defined (otherwise will already resume) + configuration.stateStorageStrategy !== configStateStorageStrategy && // new strategy is different to old one (otherwise will already resume) + (!configAnonymousTracking || configAnonymousSessionTracking) && // we were previously tracking session IDs (otherwise nothing to resume) + getSnowplowCookieValue('ses'); // and we currently have a session in progress (otherwise we want a new session anyway) + trackerConfiguration.anonymousTracking = false; toggleAnonymousTracking(configuration); + if (shouldResumeSession) setSessionCookie(); // ensure session cookie exists with new strategy + initializeIdsAndCookies(); outQueue.executeQueue(); // There might be some events in the queue we've been unable to send in anonymous mode diff --git a/libraries/browser-tracker-core/src/tracker/local_storage_event_store.ts b/libraries/browser-tracker-core/src/tracker/local_storage_event_store.ts index 52f7db9aa..b6e554aa4 100644 --- a/libraries/browser-tracker-core/src/tracker/local_storage_event_store.ts +++ b/libraries/browser-tracker-core/src/tracker/local_storage_event_store.ts @@ -21,9 +21,14 @@ export function newLocalStorageEventStore({ function newInMemoryEventStoreFromLocalStorage() { if (useLocalStorage) { - const localStorageQueue = window.localStorage.getItem(queueName); - const events: EventStorePayload[] = localStorageQueue ? JSON.parse(localStorageQueue) : []; - return newInMemoryEventStore({ maxSize: maxLocalStorageQueueSize, events }); + try { + const localStorageQueue = window.localStorage.getItem(queueName); + const events: EventStorePayload[] = localStorageQueue ? JSON.parse(localStorageQueue) : []; + return newInMemoryEventStore({ maxSize: maxLocalStorageQueueSize, events }); + } catch (e) { + console.error('Failed to access localStorage when initializing event store:', e); + return newInMemoryEventStore({ maxSize: maxLocalStorageQueueSize }); + } } else { return newInMemoryEventStore({ maxSize: maxLocalStorageQueueSize }); } @@ -34,7 +39,11 @@ export function newLocalStorageEventStore({ function sync(): Promise { if (useLocalStorage) { return getAll().then((events) => { - window.localStorage.setItem(queueName, JSON.stringify(events)); + try { + window.localStorage.setItem(queueName, JSON.stringify(events)); + } catch (e) { + console.error('Failed to persist events to localStorage:', e); + } }); } else { return Promise.resolve(); diff --git a/libraries/browser-tracker-core/src/tracker/schemata.ts b/libraries/browser-tracker-core/src/tracker/schemata.ts index 59e0482d4..2d6019f42 100644 --- a/libraries/browser-tracker-core/src/tracker/schemata.ts +++ b/libraries/browser-tracker-core/src/tracker/schemata.ts @@ -1,3 +1,5 @@ export const WEB_PAGE_SCHEMA = 'iglu:com.snowplowanalytics.snowplow/web_page/jsonschema/1-0-0'; export const BROWSER_CONTEXT_SCHEMA = 'iglu:com.snowplowanalytics.snowplow/browser_context/jsonschema/2-0-0'; export const CLIENT_SESSION_SCHEMA = 'iglu:com.snowplowanalytics.snowplow/client_session/jsonschema/1-0-2'; +export const APPLICATION_CONTEXT_SCHEMA = 'iglu:com.snowplowanalytics.snowplow/application/jsonschema/1-0-0'; +export const ACTIVITY_METRICS_SCHEMA = 'iglu:com.snowplowanalytics.snowplow/activity_metrics/jsonschema/1-0-0'; diff --git a/libraries/browser-tracker-core/src/tracker/types.ts b/libraries/browser-tracker-core/src/tracker/types.ts index 2e95aa451..f2a83b297 100755 --- a/libraries/browser-tracker-core/src/tracker/types.ts +++ b/libraries/browser-tracker-core/src/tracker/types.ts @@ -117,6 +117,12 @@ export type TrackerConfiguration = { sessionCookieTimeout?: number; /** The app id to send with each event */ appId?: string; + /** + * Version of the application tracked as a context entity with all events. + * Can be a semver-like structure (e.g 1.1.0) or a Git commit SHA hash. + * Entity schema: iglu:com.snowplowanalytics.snowplow/application/jsonschema/1-0-0 + */ + appVersion?: string; /** * The platform the event is being sent from * @defaultValue web @@ -191,6 +197,26 @@ export type TrackerConfiguration = { */ preservePageViewIdForUrl?: PreservePageViewIdForUrl; + /** + * When enabled, the original external referrer captured at tracker initialisation is frozen and + * used as the referrer for all subsequent page view events in the same session, including + * client-side navigations in single-page applications (SPAs). + * + * Without this option, each SPA navigation sets the referrer to the previous internal route, + * making it difficult to determine how the user originally arrived at the site across their + * session. Enable this option to preserve the original external referrer (e.g. google.com) + * across all `trackPageView` calls. + * + * If `document.referrer` is empty at initialisation (e.g. direct navigation), this option + * has no effect and the default per-navigation referrer chain behaviour applies. + * + * Setting `setReferrerUrl` after initialisation will override this value, as `customReferrer` + * always takes precedence. + * + * @defaultValue false + */ + preserveOriginalReferrer?: boolean; + /** * Whether to write the cookies synchronously. * This can be useful for testing purposes to ensure that the cookies are written before the test continues. @@ -199,6 +225,22 @@ export type TrackerConfiguration = { * @defaultValue false */ synchronousCookieWrite?: boolean; + /** + * When set to `true`, the tracker will not attach the `client_session` context entity to events + * when running inside a mobile WebView (i.e. when a Snowplow V2 WebView interface is detected). + * + * In hybrid native+WebView deployments the mobile SDK already contributes its own `client_session` + * entity. Allowing a second one from the JavaScript tracker causes duplicate-session problems in + * downstream modelling (e.g. dbt-snowplow-unified). Setting this option suppresses the JavaScript + * tracker's copy while the `contexts.session` flag can remain `true`. + * + * Detection uses the same three V2 interface checks as `@snowplow/webview-tracker`: + * `window.SnowplowWebInterfaceV2`, `window.webkit?.messageHandlers?.snowplowV2`, and + * `window.ReactNativeWebView`. + * + * @defaultValue false + */ + disableSessionContextWithinWebView?: boolean; } & EmitterConfigurationBase & LocalStorageEventStoreConfigurationBase; @@ -221,11 +263,30 @@ export type ActivityCallbackData = { maxXOffset: number; /** The maximum Y scroll position for the current page view */ maxYOffset: number; + /** Activity metrics accumulated since the last ping (only when activityMetrics is enabled) */ + activityMetrics?: ActivityMetrics; }; /** The callback for enableActivityTrackingCallback */ export type ActivityCallback = (data: ActivityCallbackData) => void; +/** + * Quantitative activity metrics accumulated between page pings. + * Attached as a context entity when activityMetrics is enabled. + */ +export type ActivityMetrics = { + /** Cumulative Euclidean mouse distance in pixels from mousemove events */ + mouseDistance: number; + /** Cumulative |deltaX|+|deltaY| scroll distance in pixels */ + scrollDistance: number; + /** Count of keydown events */ + keyPresses: number; + /** Count of click events */ + clicks: number; + /** Count of touchstart events */ + touches: number; +}; + /** * The base configuration for activity tracking */ @@ -234,6 +295,8 @@ export interface ActivityTrackingConfiguration { minimumVisitLength: number; /** The interval at which the callback will be fired */ heartbeatDelay: number; + /** Enable activity metrics to attach an activity_metrics entity to each page ping */ + activityMetrics?: boolean; } /** @@ -378,6 +441,13 @@ export interface BrowserTracker { */ getDomainUserInfo: () => ParsedIdCookie; + /** + * Get the current domain session ID (from first party cookie) + * + * @returns Domain session ID + */ + getDomainSessionId: () => string; + /** * Override referrer * diff --git a/libraries/browser-tracker-core/test/browser_props.test.ts b/libraries/browser-tracker-core/test/browser_props.test.ts index 238c99ecb..8e300eed8 100644 --- a/libraries/browser-tracker-core/test/browser_props.test.ts +++ b/libraries/browser-tracker-core/test/browser_props.test.ts @@ -1,23 +1,148 @@ -import { floorDimensionFields, getBrowserProperties } from '../src/helpers/browser_props'; +import { makeDimension, getBrowserProperties, resetBrowserPropertiesState } from '../src/helpers/browser_props'; describe('Browser props', () => { - it('floorDimensionFields correctly floors dimension type values', () => { + it('makeDimension correctly floors dimension type values', () => { const testDimensions = '100x100'; - expect(floorDimensionFields(testDimensions)).toEqual(testDimensions); + expect(makeDimension(100, 100)).toEqual(testDimensions); }); - it('floorDimensionFields correctly floors dimension type values with fractional numbers', () => { - const testFractionalDimensions = '100.2x100.1'; - expect(floorDimensionFields(testFractionalDimensions)).toEqual('100x100'); + it('makeDimension correctly floors dimension type values with fractional numbers', () => { + expect(makeDimension(100.2, 100.1)).toEqual('100x100'); + }); + + it('makeDimension correctly drops invalid values', () => { + expect(makeDimension(undefined as any, 100.1)).toEqual(null); + expect(makeDimension(NaN, 1)).toEqual(null); }); describe('#getBrowserProperties', () => { + describe('caching behavior (modern browsers with ResizeObserver)', () => { + let savedResizeObserver: any; + + beforeEach(() => { + savedResizeObserver = (window as any).ResizeObserver; + // Provide a minimal ResizeObserver so the caching path is exercised + (window as any).ResizeObserver = class MockResizeObserver { + constructor(_cb: ResizeObserverCallback) {} + observe() {} + unobserve() {} + disconnect() {} + }; + resetBrowserPropertiesState(); + }); + + afterEach(() => { + (window as any).ResizeObserver = savedResizeObserver; + resetBrowserPropertiesState(); + jest.restoreAllMocks(); + }); + + it('returns the same cached reference on successive calls', () => { + const first = getBrowserProperties(); + const second = getBrowserProperties(); + expect(second).toBe(first); + }); + + it('reset clears the cache so the next call re-reads browser properties', () => { + getBrowserProperties(); + resetBrowserPropertiesState(); + const fresh = getBrowserProperties(); + expect(fresh).toBeDefined(); + expect(fresh.cookiesEnabled).toBeDefined(); + }); + + it('rAF callback triggered by ResizeObserver updates cachedProperties', () => { + let capturedResizeCallback: ResizeObserverCallback | undefined; + let capturedRafCallback: FrameRequestCallback | undefined; + + // Override the mock to capture the ResizeObserver callback so we can trigger it manually + (window as any).ResizeObserver = class CaptureResizeObserver { + constructor(cb: ResizeObserverCallback) { + capturedResizeCallback = cb; + } + observe() {} + unobserve() {} + disconnect() {} + }; + resetBrowserPropertiesState(); + + jest.spyOn(window, 'requestAnimationFrame').mockImplementation((cb) => { + capturedRafCallback = cb; + return 1; + }); + + const first = getBrowserProperties(); // populates cache + wires up ResizeObserver + + // Trigger the ResizeObserver callback to schedule a rAF + expect(capturedResizeCallback).toBeDefined(); + capturedResizeCallback!([], {} as ResizeObserver); + expect(capturedRafCallback).toBeDefined(); + + // rAF has been scheduled but not yet fired — cache still holds the original value + const beforeRaf = getBrowserProperties(); + expect(beforeRaf).toBe(first); + + // Fire the rAF callback to simulate the cache update + capturedRafCallback!(performance.now()); + + // Cache was refreshed by the rAF callback + const afterRaf = getBrowserProperties(); + expect(afterRaf).toBeDefined(); + }); + }); + + describe('old-browser fallback (no ResizeObserver)', () => { + let savedResizeObserver: any; + + beforeEach(() => { + savedResizeObserver = (window as any).ResizeObserver; + delete (window as any).ResizeObserver; + resetBrowserPropertiesState(); + }); + + afterEach(() => { + (window as any).ResizeObserver = savedResizeObserver; + resetBrowserPropertiesState(); + }); + + it('calls readBrowserProperties on every invocation — no caching', () => { + const first = getBrowserProperties(); + const second = getBrowserProperties(); + // Without ResizeObserver caching each call returns a fresh object + expect(second).not.toBe(first); + }); + }); + describe('with undefined document', () => { + let originalDocument: typeof document; + let savedResizeObserver: any; + beforeAll(() => { + originalDocument = document; + savedResizeObserver = (window as any).ResizeObserver; + + // Ensure the caching path is taken so initializeResizeObserver() guards against undefined document + (window as any).ResizeObserver = class MockResizeObserver { + constructor(_cb: ResizeObserverCallback) {} + observe() {} + unobserve() {} + disconnect() {} + }; + + // Pre-populate cache while document is still available + resetBrowserPropertiesState(); + getBrowserProperties(); + // @ts-expect-error document = undefined; }); - + + afterAll(() => { + document = originalDocument; + (window as any).ResizeObserver = savedResizeObserver; + resetBrowserPropertiesState(); + }); + it('does not invoke the resize observer if the document is null', () => { const browserProperties = getBrowserProperties(); expect(browserProperties).not.toEqual(null); diff --git a/libraries/browser-tracker-core/test/helpers/index.ts b/libraries/browser-tracker-core/test/helpers/index.ts index cff0d8bfb..e59a175b0 100644 --- a/libraries/browser-tracker-core/test/helpers/index.ts +++ b/libraries/browser-tracker-core/test/helpers/index.ts @@ -75,8 +75,12 @@ export function createTestSessionIdCookie(params?: CreateTestSessionIdCookie) { return `_sp_ses.${domainHash}=*; Expires=; Path=/; SameSite=Lax; Secure;`; } -export function createTracker(configuration?: TrackerConfiguration, sharedState?: SharedState) { +export function createTracker( + configuration?: TrackerConfiguration, + sharedState?: SharedState, + syncCookieWrite: boolean = true +) { let id = 'sp-' + Math.random(); - configuration = { ...configuration, synchronousCookieWrite: true }; + configuration = { ...configuration, synchronousCookieWrite: syncCookieWrite }; return addTracker(id, id, '', '', sharedState ?? new SharedState(), configuration); } diff --git a/libraries/browser-tracker-core/test/helpers/sha1.test.ts b/libraries/browser-tracker-core/test/helpers/sha1.test.ts new file mode 100644 index 000000000..291ee99a5 --- /dev/null +++ b/libraries/browser-tracker-core/test/helpers/sha1.test.ts @@ -0,0 +1,37 @@ +import { sha1 } from '../../src/helpers/sha1'; + +describe('sha1', () => { + // RFC 3174 test vectors + test('empty string', () => { + expect(sha1('')).toBe('da39a3ee5e6b4b0d3255bfef95601890afd80709'); + }); + + test('"abc"', () => { + expect(sha1('abc')).toBe('a9993e364706816aba3e25717850c26c9cd0d89d'); + }); + + test('"The quick brown fox jumps over the lazy dog"', () => { + expect(sha1('The quick brown fox jumps over the lazy dog')).toBe('2fd4e1c67a2d28fced849ee1bb76e7391b93eb12'); + }); + + test('multi-block message', () => { + expect(sha1('abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq')).toBe( + '84983e441c3bd26ebaae4aa1f95129e5e54670f1' + ); + }); + + // Domain hash use case — must match output of sha1 npm package v1.1.1 + test('domain hash: "example.com/"', () => { + expect(sha1('example.com/')).toBe('880970443b82bdca0439e34c62e6c667277c2b39'); + expect(sha1('example.com/').slice(0, 4)).toBe('8809'); + }); + + test('domain hash: "localhost/"', () => { + expect(sha1('localhost/')).toBe('1fffd42e9a20211889ebfae87a84665b392c19a4'); + expect(sha1('localhost/').slice(0, 4)).toBe('1fff'); + }); + + test('returns 40-char lowercase hex string', () => { + expect(sha1('anything')).toMatch(/^[0-9a-f]{40}$/); + }); +}); diff --git a/libraries/browser-tracker-core/test/id_cookie.test.ts b/libraries/browser-tracker-core/test/id_cookie.test.ts index a3749d608..0638f4b50 100644 --- a/libraries/browser-tracker-core/test/id_cookie.test.ts +++ b/libraries/browser-tracker-core/test/id_cookie.test.ts @@ -31,7 +31,7 @@ import * as uuid from 'uuid'; jest.mock('uuid'); const MOCK_UUID = '123456789'; -jest.spyOn(uuid, 'v4').mockReturnValue(MOCK_UUID); +(jest.spyOn(uuid, 'v4') as jest.SpyInstance).mockReturnValue(MOCK_UUID); import { payloadBuilder } from '@snowplow/tracker-core'; import { @@ -173,7 +173,7 @@ describe('startNewIdCookieSession', () => { let before = sessionIdFromIdCookie(idCookie); - jest.spyOn(uuid, 'v4').mockReturnValueOnce('another_random_uuid'); + (jest.spyOn(uuid, 'v4') as jest.SpyInstance).mockReturnValueOnce('another_random_uuid'); startNewIdCookieSession(idCookie); let after = sessionIdFromIdCookie(idCookie); diff --git a/libraries/browser-tracker-core/test/out_queue.test.ts b/libraries/browser-tracker-core/test/out_queue.test.ts index aae8e4667..dfc2081ae 100644 --- a/libraries/browser-tracker-core/test/out_queue.test.ts +++ b/libraries/browser-tracker-core/test/out_queue.test.ts @@ -193,8 +193,8 @@ describe('OutQueueManager', () => { }); }); - describe('idService requests', () => { - const idServiceEndpoint = 'http://example.com/id'; + describe('cookieExtensionService requests', () => { + const cookieExtensionServiceEndpoint = 'http://example.com/id'; const getQuerystring = (p: object) => '?' + @@ -203,33 +203,33 @@ describe('OutQueueManager', () => { .join('&'); describe('GET requests', () => { - let createGetQueue = () => newOutQueue( - { - endpoint: 'http://example.com', - trackerId: 'sp', - eventMethod: 'get', - useStm: false, - maxLocalStorageQueueSize: maxQueueSize, - eventStore, - customFetch, - idService: idServiceEndpoint, - }, - new SharedState() - ); - + let createGetQueue = () => + newOutQueue( + { + endpoint: 'http://example.com', + trackerId: 'sp', + eventMethod: 'get', + useStm: false, + maxLocalStorageQueueSize: maxQueueSize, + eventStore, + customFetch, + cookieExtensionService: cookieExtensionServiceEndpoint, + }, + new SharedState() + ); - it('should first execute the idService request and in the same `enqueueRequest` the tracking request', async () => { + it('should first execute the cookieExtensionService request and in the same `enqueueRequest` the tracking request', async () => { const request = { e: 'pv', eid: '65cb78de-470c-4764-8c10-02bd79477a3a' }; const getQueue = createGetQueue(); await getQueue.enqueueRequest(request); expect(requests).toHaveLength(2); - expect(requests[0].url).toEqual(idServiceEndpoint); + expect(requests[0].url).toEqual(cookieExtensionServiceEndpoint); expect(requests[1].url).toEqual('http://example.com/i' + getQuerystring(request)); }); - it('should first execute the idService request and in the same `enqueueRequest` the tracking request irregardless of failure of the idService endpoint', async () => { + it('should first execute the cookieExtensionService request and in the same `enqueueRequest` the tracking request irregardless of failure of the cookieExtensionService endpoint', async () => { const request = { e: 'pv', eid: '65cb78de-470c-4764-8c10-02bd79477a3a' }; const getQueue = createGetQueue(); @@ -237,33 +237,34 @@ describe('OutQueueManager', () => { await getQueue.enqueueRequest(request); expect(requests).toHaveLength(2); - expect(requests[0].url).toEqual(idServiceEndpoint); + expect(requests[0].url).toEqual(cookieExtensionServiceEndpoint); expect(requests[1].url).toEqual('http://example.com/i' + getQuerystring(request)); expect(await eventStore.count()).toEqual(1); }); }); describe('POST requests', () => { - let createPostQueue = () => newOutQueue( - { - endpoint: 'http://example.com', - trackerId: 'sp', - eventMethod: 'post', - eventStore, - customFetch, - idService: idServiceEndpoint, - }, - new SharedState() - ); + let createPostQueue = () => + newOutQueue( + { + endpoint: 'http://example.com', + trackerId: 'sp', + eventMethod: 'post', + eventStore, + customFetch, + cookieExtensionService: cookieExtensionServiceEndpoint, + }, + new SharedState() + ); - it('should first execute the idService request and in the same `enqueueRequest` the tracking request irregardless of failure of the idService endpoint', async () => { + it('should first execute the cookieExtensionService request and in the same `enqueueRequest` the tracking request irregardless of failure of the cookieExtensionService endpoint', async () => { const request = { e: 'pv', eid: '65cb78de-470c-4764-8c10-02bd79477a3a' }; const postQueue = createPostQueue(); await postQueue.enqueueRequest(request); expect(requests).toHaveLength(2); - expect(requests[0].url).toEqual(idServiceEndpoint); + expect(requests[0].url).toEqual(cookieExtensionServiceEndpoint); expect(requests[1].url).toEqual('http://example.com/com.snowplowanalytics.snowplow/tp2'); }); }); @@ -271,17 +272,18 @@ describe('OutQueueManager', () => { describe('retryFailures = true', () => { const request = { e: 'pv', eid: '65cb78de-470c-4764-8c10-02bd79477a3a' }; - let createOutQueue = () => newOutQueue( - { - endpoint: 'http://example.com', - trackerId: 'sp', - eventMethod: 'post', - retryFailedRequests: true, - eventStore, - customFetch, - }, - new SharedState() - ); + let createOutQueue = () => + newOutQueue( + { + endpoint: 'http://example.com', + trackerId: 'sp', + eventMethod: 'post', + retryFailedRequests: true, + eventStore, + customFetch, + }, + new SharedState() + ); it('should remain in queue on failure', async () => { let outQueue = createOutQueue(); @@ -295,17 +297,18 @@ describe('OutQueueManager', () => { describe('retryFailures = false', () => { const request = { e: 'pv', eid: '65cb78de-470c-4764-8c10-02bd79477a3a' }; - let createOutQueue = () => newOutQueue( - { - endpoint: 'http://example.com', - trackerId: 'sp', - eventMethod: 'post', - retryFailedRequests: false, - eventStore, - customFetch, - }, - new SharedState() - ); + let createOutQueue = () => + newOutQueue( + { + endpoint: 'http://example.com', + trackerId: 'sp', + eventMethod: 'post', + retryFailedRequests: false, + eventStore, + customFetch, + }, + new SharedState() + ); it('should remove from queue on failure', async () => { let outQueue = createOutQueue(); @@ -441,23 +444,23 @@ describe('OutQueueManager', () => { describe('onRequestFailure', () => { const request = { e: 'pv', eid: '65cb78de-470c-4764-8c10-02bd79477a3a' }; - const createQueue = (args: createQueueArgs) => - newOutQueue( - { - endpoint: 'http://example.com', - trackerId: 'sp', - eventMethod: args.method, - maxPostBytes: args.maxPostBytes, - maxGetBytes: args.maxGetBytes, - maxLocalStorageQueueSize: maxQueueSize, - onRequestSuccess: args.onSuccess, - onRequestFailure: args.onFailure, - dontRetryStatusCodes: [500], - customFetch, - eventStore, - }, - new SharedState() - ); + const createQueue = (args: createQueueArgs) => + newOutQueue( + { + endpoint: 'http://example.com', + trackerId: 'sp', + eventMethod: args.method, + maxPostBytes: args.maxPostBytes, + maxGetBytes: args.maxGetBytes, + maxLocalStorageQueueSize: maxQueueSize, + onRequestSuccess: args.onSuccess, + onRequestFailure: args.onFailure, + dontRetryStatusCodes: [500], + customFetch, + eventStore, + }, + new SharedState() + ); describe('POST requests', () => { const method = 'post'; diff --git a/libraries/browser-tracker-core/test/tracker/activity_metrics.test.ts b/libraries/browser-tracker-core/test/tracker/activity_metrics.test.ts new file mode 100644 index 000000000..ccf3beb36 --- /dev/null +++ b/libraries/browser-tracker-core/test/tracker/activity_metrics.test.ts @@ -0,0 +1,335 @@ +import { createTracker } from '../helpers'; +import { Payload } from '@snowplow/tracker-core'; +import { ActivityCallbackData } from '../../src'; + +jest.useFakeTimers(); + +describe('Activity metrics', () => { + const ACTIVITY_METRICS_SCHEMA = 'iglu:com.snowplowanalytics.snowplow/activity_metrics/jsonschema/1-0-0'; + + beforeAll(() => { + jest.spyOn(document, 'title', 'get').mockReturnValue('Test Page'); + }); + + afterEach(() => { + jest.clearAllTimers(); + }); + + afterAll(() => { + jest.restoreAllMocks(); + }); + + function getTrackedPayloads() { + const payloads: Payload[] = []; + const tracker = createTracker({ + plugins: [ + { + afterTrack: (payload) => { + payloads.push(payload); + }, + }, + ], + }); + return { tracker: tracker!, payloads }; + } + + function getPagePings(payloads: Payload[]) { + return payloads.filter((p) => p.e === 'pp'); + } + + function getContextEntities(payload: Payload): Array<{ schema: string; data: unknown }> { + const co = payload.co as string | undefined; + if (!co) return []; + return JSON.parse(co).data ?? []; + } + + /** + * The heartbeat check is `lastActivityTime + configHeartBeatTimer > now`. + * Activity must happen strictly within the heartbeat window (not at its start). + * We advance 1s, dispatch events (so lastActivityTime is now+1s), then advance the rest. + */ + function simulateActivityInWindow(events: Event[], heartbeatMs: number) { + jest.advanceTimersByTime(1000); + events.forEach((e) => document.dispatchEvent(e)); + jest.advanceTimersByTime(heartbeatMs - 1000); + } + + it('accumulates metrics from simulated DOM events', () => { + const { tracker, payloads } = getTrackedPayloads(); + tracker.enableActivityTracking({ + minimumVisitLength: 0, + heartbeatDelay: 10, + activityMetrics: true, + }); + tracker.trackPageView(); + + simulateActivityInWindow( + [ + new MouseEvent('mousemove', { clientX: 0, clientY: 0 }), + new MouseEvent('mousemove', { clientX: 3, clientY: 4 }), + new MouseEvent('click'), + new MouseEvent('click'), + new KeyboardEvent('keydown'), + new KeyboardEvent('keydown'), + new KeyboardEvent('keydown'), + new Event('touchstart'), + ], + 10_000 + ); + + const pings = getPagePings(payloads); + expect(pings.length).toBe(1); + + const entities = getContextEntities(pings[0]); + const metricsEntity = entities.find((e) => e.schema === ACTIVITY_METRICS_SCHEMA); + expect(metricsEntity).toBeDefined(); + + const data = metricsEntity!.data as Record; + expect(data.mouseDistance).toBe(5); // sqrt(9+16)=5 + expect(data.clicks).toBe(2); + expect(data.keyPresses).toBe(3); + expect(data.touches).toBe(1); + }); + + it('resets metrics after each ping', () => { + const { tracker, payloads } = getTrackedPayloads(); + tracker.enableActivityTracking({ + minimumVisitLength: 0, + heartbeatDelay: 10, + activityMetrics: true, + }); + tracker.trackPageView(); + + // First heartbeat + simulateActivityInWindow([new MouseEvent('click'), new MouseEvent('click')], 10_000); + + // Second heartbeat + simulateActivityInWindow([new MouseEvent('click')], 10_000); + + const pings = getPagePings(payloads); + expect(pings.length).toBe(2); + + const data1 = getContextEntities(pings[0]).find((e) => e.schema === ACTIVITY_METRICS_SCHEMA)!.data as Record< + string, + number + >; + const data2 = getContextEntities(pings[1]).find((e) => e.schema === ACTIVITY_METRICS_SCHEMA)!.data as Record< + string, + number + >; + + expect(data1.clicks).toBe(2); + expect(data2.clicks).toBe(1); + }); + + it('does not attach entity when activityMetrics is not set', () => { + const { tracker, payloads } = getTrackedPayloads(); + tracker.enableActivityTracking({ + minimumVisitLength: 0, + heartbeatDelay: 10, + }); + tracker.trackPageView(); + + simulateActivityInWindow([new MouseEvent('click')], 10_000); + + const pings = getPagePings(payloads); + expect(pings.length).toBe(1); + + const entities = getContextEntities(pings[0]); + const metricsEntity = entities.find((e) => e.schema === ACTIVITY_METRICS_SCHEMA); + expect(metricsEntity).toBeUndefined(); + }); + + it('calculates mouse distance as Euclidean sum', () => { + const { tracker, payloads } = getTrackedPayloads(); + tracker.enableActivityTracking({ + minimumVisitLength: 0, + heartbeatDelay: 10, + activityMetrics: true, + }); + tracker.trackPageView(); + + // Move from (0,0) to (3,4) then to (3,14) + simulateActivityInWindow( + [ + new MouseEvent('mousemove', { clientX: 0, clientY: 0 }), + new MouseEvent('mousemove', { clientX: 3, clientY: 4 }), // distance 5 + new MouseEvent('mousemove', { clientX: 3, clientY: 14 }), // distance 10 + ], + 10_000 + ); + + const pings = getPagePings(payloads); + expect(pings.length).toBe(1); + + const data = getContextEntities(pings[0]).find((e) => e.schema === ACTIVITY_METRICS_SCHEMA)!.data as Record< + string, + number + >; + expect(data.mouseDistance).toBe(15); // 5 + 10 + }); + + it('populates activityMetrics in callback data', () => { + let callbackData: ActivityCallbackData | undefined; + const tracker = createTracker({ + plugins: [{ afterTrack: () => {} }], + }); + + tracker!.enableActivityTrackingCallback({ + minimumVisitLength: 0, + heartbeatDelay: 10, + activityMetrics: true, + callback: (data) => { + callbackData = data; + }, + }); + tracker!.trackPageView(); + + simulateActivityInWindow([new MouseEvent('click'), new MouseEvent('click')], 10_000); + + expect(callbackData).toBeDefined(); + expect(callbackData!.activityMetrics).toBeDefined(); + expect(callbackData!.activityMetrics!.clicks).toBe(2); + }); + + it('resets metrics on new trackPageView', () => { + const { tracker, payloads } = getTrackedPayloads(); + tracker.enableActivityTracking({ + minimumVisitLength: 0, + heartbeatDelay: 10, + activityMetrics: true, + }); + tracker.trackPageView(); + + // Accumulate some clicks (advance a bit so they register in heartbeat) + jest.advanceTimersByTime(1000); + document.dispatchEvent(new MouseEvent('click')); + document.dispatchEvent(new MouseEvent('click')); + + // New page view resets metrics and restarts intervals + tracker.trackPageView(); + + // Only one new click after the new page view + simulateActivityInWindow([new MouseEvent('click')], 10_000); + + const pings = getPagePings(payloads); + expect(pings.length).toBe(1); + + const data = getContextEntities(pings[0]).find((e) => e.schema === ACTIVITY_METRICS_SCHEMA)!.data as Record< + string, + number + >; + expect(data.clicks).toBe(1); + }); + + it('first mousemove sets position but does not add distance', () => { + const { tracker, payloads } = getTrackedPayloads(); + tracker.enableActivityTracking({ + minimumVisitLength: 0, + heartbeatDelay: 10, + activityMetrics: true, + }); + tracker.trackPageView(); + + // Only one mousemove — should set position but not add distance + simulateActivityInWindow([new MouseEvent('mousemove', { clientX: 100, clientY: 200 })], 10_000); + + const pings = getPagePings(payloads); + expect(pings.length).toBe(1); + + const data = getContextEntities(pings[0]).find((e) => e.schema === ACTIVITY_METRICS_SCHEMA)!.data as Record< + string, + number + >; + expect(data.mouseDistance).toBe(0); + }); + + it('updatePageActivity does not fabricate metrics', () => { + const { tracker, payloads } = getTrackedPayloads(); + tracker.enableActivityTracking({ + minimumVisitLength: 0, + heartbeatDelay: 10, + activityMetrics: true, + }); + tracker.trackPageView(); + + // updatePageActivity without a real event — advance partially so heartbeat detects it + jest.advanceTimersByTime(1000); + tracker.updatePageActivity(); + jest.advanceTimersByTime(9000); + + const pings = getPagePings(payloads); + expect(pings.length).toBe(1); + + const data = getContextEntities(pings[0]).find((e) => e.schema === ACTIVITY_METRICS_SCHEMA)!.data as Record< + string, + number + >; + expect(data.mouseDistance).toBe(0); + expect(data.clicks).toBe(0); + expect(data.keyPresses).toBe(0); + expect(data.touches).toBe(0); + expect(data.scrollDistance).toBe(0); + }); + + it('attaches activity_metrics entity to callback context when using activityMetrics', () => { + let callbackData: ActivityCallbackData | undefined; + const tracker = createTracker({ + plugins: [{ afterTrack: () => {} }], + }); + + tracker!.enableActivityTrackingCallback({ + minimumVisitLength: 0, + heartbeatDelay: 10, + activityMetrics: true, + callback: (data) => { + callbackData = data; + }, + }); + tracker!.trackPageView(); + + jest.advanceTimersByTime(1000); + document.dispatchEvent(new MouseEvent('click')); + document.dispatchEvent(new MouseEvent('click')); + jest.advanceTimersByTime(9000); + + expect(callbackData).toBeDefined(); + const metricsEntity = callbackData!.context.find( + (e) => e.schema === ACTIVITY_METRICS_SCHEMA + ); + expect(metricsEntity).toBeDefined(); + expect((metricsEntity!.data as Record).clicks).toBe(2); + }); + + it('does not overcount mouse distance across ping windows', () => { + let callbackData: ActivityCallbackData[] = []; + const tracker = createTracker({ + plugins: [{ afterTrack: () => {} }], + }); + + tracker!.enableActivityTrackingCallback({ + minimumVisitLength: 0, + heartbeatDelay: 10, + activityMetrics: true, + callback: (data) => { + callbackData.push(data); + }, + }); + tracker!.trackPageView(); + + // First window: move from 0 to 10 + jest.advanceTimersByTime(1000); + document.dispatchEvent(new MouseEvent('mousemove', { clientX: 0, clientY: 0 })); + document.dispatchEvent(new MouseEvent('mousemove', { clientX: 10, clientY: 0 })); + jest.advanceTimersByTime(9000); + + // Second window: single move to 20 — after position reset, this sets baseline only + jest.advanceTimersByTime(1000); + document.dispatchEvent(new MouseEvent('mousemove', { clientX: 20, clientY: 0 })); + jest.advanceTimersByTime(9000); + + expect(callbackData.length).toBe(2); + expect(callbackData[0].activityMetrics!.mouseDistance).toBe(10); + expect(callbackData[1].activityMetrics!.mouseDistance).toBe(0); + }); +}); diff --git a/libraries/browser-tracker-core/test/tracker/application_context.test.ts b/libraries/browser-tracker-core/test/tracker/application_context.test.ts new file mode 100644 index 000000000..f490dd262 --- /dev/null +++ b/libraries/browser-tracker-core/test/tracker/application_context.test.ts @@ -0,0 +1,44 @@ +import { APPLICATION_CONTEXT_SCHEMA } from '../../src/tracker/schemata'; +import { createTracker } from '../helpers'; + +describe('Application context:', () => { + it('Adds the entity when the appVersion option is configured', (done) => { + const tracker = createTracker({ + appVersion: '1.0.2-beta.2', + plugins: [ + { + filter: (payload) => { + const { data: payloadData } = JSON.parse(payload.co as string); + const appContext = payloadData.find((context: any) => context.schema.match(APPLICATION_CONTEXT_SCHEMA)); + expect(appContext).toBeTruthy(); + expect(appContext.data.version).toBe('1.0.2-beta.2'); + done(); + return false; + }, + }, + ], + }); + + tracker?.trackPageView(); + }); + + it('Does not attach the entity if not configured', (done) => { + const tracker = createTracker({ + plugins: [ + { + filter: (payload) => { + const { data: payloadData } = JSON.parse(payload.co as string); + const applicationContext = payloadData.find((context: any) => + context.schema.match(APPLICATION_CONTEXT_SCHEMA) + ); + expect(applicationContext).toBeUndefined(); + done(); + return false + }, + }, + ], + }); + + tracker?.trackPageView(); + }); +}); diff --git a/libraries/browser-tracker-core/test/tracker/cross_domain.test.ts b/libraries/browser-tracker-core/test/tracker/cross_domain.test.ts index cf7748e9f..68e76fdc6 100644 --- a/libraries/browser-tracker-core/test/tracker/cross_domain.test.ts +++ b/libraries/browser-tracker-core/test/tracker/cross_domain.test.ts @@ -1,7 +1,7 @@ import * as uuid from 'uuid'; jest.mock('uuid'); const MOCK_UUID = '123456789'; -jest.spyOn(uuid, 'v4').mockReturnValue(MOCK_UUID); +(jest.spyOn(uuid, 'v4') as jest.SpyInstance).mockReturnValue(MOCK_UUID); import { createTracker } from '../helpers'; import { getByText, queryByText, waitFor } from '@testing-library/dom'; @@ -22,7 +22,7 @@ describe('Cross-domain linking: ', () => { const standardDate = new Date(2023, 1, 1); beforeAll(() => { - jest.useFakeTimers('modern'); + jest.useFakeTimers(); jest.setSystemTime(standardDate); }); diff --git a/libraries/browser-tracker-core/test/tracker/local_storage_event_store.test.ts b/libraries/browser-tracker-core/test/tracker/local_storage_event_store.test.ts new file mode 100644 index 000000000..2c1ceebcf --- /dev/null +++ b/libraries/browser-tracker-core/test/tracker/local_storage_event_store.test.ts @@ -0,0 +1,181 @@ +/* + * Copyright (c) 2022 Snowplow Analytics Ltd, 2010 Anthon Pang + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +import { newLocalStorageEventStore } from '../../src/tracker/local_storage_event_store'; + +describe('LocalStorageEventStore', () => { + const trackerId = 'test-tracker'; + + beforeEach(() => { + localStorage.clear(); + }); + + it('should create an event store with useLocalStorage enabled', async () => { + const eventStore = newLocalStorageEventStore({ + trackerId, + useLocalStorage: true, + }); + + expect(await eventStore.count()).toBe(0); + }); + + it('should create an event store with useLocalStorage disabled', async () => { + const eventStore = newLocalStorageEventStore({ + trackerId, + useLocalStorage: false, + }); + + expect(await eventStore.count()).toBe(0); + }); + + it('should add and retrieve events when localStorage is accessible', async () => { + const eventStore = newLocalStorageEventStore({ + trackerId, + useLocalStorage: true, + }); + + const event = { payload: { e: 'pv', eid: 'test-event-id' } }; + await eventStore.add(event); + + expect(await eventStore.count()).toBe(1); + const events = await eventStore.getAllPayloads(); + expect(events[0]).toMatchObject(event.payload); + }); + + it('should handle SecurityError when accessing localStorage.getItem', () => { + const originalGetItem = Storage.prototype.getItem; + Storage.prototype.getItem = jest.fn(() => { + throw new DOMException('The operation is insecure.', 'SecurityError'); + }); + + // Should not throw an error, but should create an empty in-memory store + const eventStore = newLocalStorageEventStore({ + trackerId, + useLocalStorage: true, + }); + + expect(eventStore).toBeDefined(); + expect(eventStore.count).toBeDefined(); + + Storage.prototype.getItem = originalGetItem; + }); + + it('should handle SecurityError when accessing localStorage.setItem', async () => { + const originalSetItem = Storage.prototype.setItem; + Storage.prototype.setItem = jest.fn(() => { + throw new DOMException('The operation is insecure.', 'SecurityError'); + }); + + const eventStore = newLocalStorageEventStore({ + trackerId, + useLocalStorage: true, + }); + + const event = { payload: { e: 'pv', eid: 'test-event-id' } }; + + // Should not throw an error, even though setItem fails + await expect(eventStore.add(event)).resolves.toBeDefined(); + + // Event should still be in the in-memory store + expect(await eventStore.count()).toBe(1); + + Storage.prototype.setItem = originalSetItem; + }); + + it('should gracefully handle errors when both getItem and setItem throw SecurityError', async () => { + const originalGetItem = Storage.prototype.getItem; + const originalSetItem = Storage.prototype.setItem; + + Storage.prototype.getItem = jest.fn(() => { + throw new DOMException('The operation is insecure.', 'SecurityError'); + }); + Storage.prototype.setItem = jest.fn(() => { + throw new DOMException('The operation is insecure.', 'SecurityError'); + }); + + const eventStore = newLocalStorageEventStore({ + trackerId, + useLocalStorage: true, + }); + + const event = { payload: { e: 'pv', eid: 'test-event-id' } }; + await eventStore.add(event); + + // Event should be in the in-memory store + expect(await eventStore.count()).toBe(1); + const events = await eventStore.getAllPayloads(); + expect(events[0]).toMatchObject(event.payload); + + Storage.prototype.getItem = originalGetItem; + Storage.prototype.setItem = originalSetItem; + }); + + it('should persist events to localStorage when accessible', async () => { + const eventStore = newLocalStorageEventStore({ + trackerId, + useLocalStorage: true, + }); + + const event = { payload: { e: 'pv', eid: 'test-event-id' } }; + await eventStore.add(event); + + // Check that the event was persisted to localStorage + const queueName = `snowplowOutQueue_${trackerId}`; + const stored = localStorage.getItem(queueName); + expect(stored).toBeDefined(); + expect(JSON.parse(stored!)).toHaveLength(1); + }); + + it('should load events from localStorage on initialization', () => { + const queueName = `snowplowOutQueue_${trackerId}`; + const events = [{ payload: { e: 'pv', eid: 'event-1' } }, { payload: { e: 'pv', eid: 'event-2' } }]; + localStorage.setItem(queueName, JSON.stringify(events)); + + const eventStore = newLocalStorageEventStore({ + trackerId, + useLocalStorage: true, + }); + + expect(eventStore.count()).resolves.toBe(2); + }); + + it('should not load from localStorage when useLocalStorage is false', () => { + const queueName = `snowplowOutQueue_${trackerId}`; + const events = [{ payload: { e: 'pv', eid: 'event-1' } }, { payload: { e: 'pv', eid: 'event-2' } }]; + localStorage.setItem(queueName, JSON.stringify(events)); + + const eventStore = newLocalStorageEventStore({ + trackerId, + useLocalStorage: false, + }); + + expect(eventStore.count()).resolves.toBe(0); + }); +}); diff --git a/libraries/browser-tracker-core/test/tracker/page_view.test.ts b/libraries/browser-tracker-core/test/tracker/page_view.test.ts index 42d752d2d..0a56c5e97 100644 --- a/libraries/browser-tracker-core/test/tracker/page_view.test.ts +++ b/libraries/browser-tracker-core/test/tracker/page_view.test.ts @@ -28,6 +28,7 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import * as browserProps from '../../src/helpers/browser_props'; import { createTracker } from '../helpers'; describe('Tracker API: page views', () => { @@ -55,6 +56,49 @@ describe('Tracker API: page views', () => { expect(titles).toEqual(['Title override', 'Page title 1']); }); + it('setCustomUrl keeps a URL whose scheme contains a hyphen (e.g. a browser extension)', () => { + let urls: string[] = []; + const tracker = createTracker({ + plugins: [ + { + afterTrack: (payload) => { + urls.push(payload.url as string); + }, + }, + ], + }); + + // chrome-extension is 16 chars, which is within the atomic event schema's + // 16-char scheme limit, so it is a real, schema-valid scheme the tracker + // must preserve as an absolute URL rather than resolve against the page. + tracker?.setCustomUrl('chrome-extension://abcdefg/index.html'); + tracker?.trackPageView(); + + expect(urls[0]).toBe('chrome-extension://abcdefg/index.html'); + }); + + it('setCustomUrl does not treat an over-length scheme as absolute (schema caps scheme at 16 chars)', () => { + let urls: string[] = []; + const tracker = createTracker({ + plugins: [ + { + afterTrack: (payload) => { + urls.push(payload.url as string); + }, + }, + ], + }); + + // safari-web-extension is 20 chars, exceeding the atomic event schema's + // 16-char scheme limit. Treating it as absolute would only produce an event + // that fails validation downstream, so it must be handled as a relative + // reference (resolved against the page) instead of preserved verbatim. + tracker?.setCustomUrl('safari-web-extension://abcdefg/index.html'); + tracker?.trackPageView(); + + expect(urls[0]).not.toBe('safari-web-extension://abcdefg/index.html'); + }); + it('Uses custom page title set using setDocumentTitle until overriden again', () => { let titles: string[] = []; const tracker = createTracker({ @@ -100,4 +144,31 @@ describe('Tracker API: page views', () => { expect(titles).toEqual(['Explicit title', 'Page title 1']); }); + + describe('getBrowserProperties deferred init', () => { + let getBrowserPropertiesSpy: jest.SpyInstance; + + beforeEach(() => { + browserProps.resetBrowserPropertiesState(); + getBrowserPropertiesSpy = jest.spyOn(browserProps, 'getBrowserProperties'); + }); + + afterEach(() => { + jest.restoreAllMocks(); + browserProps.resetBrowserPropertiesState(); + }); + + it('does not call getBrowserProperties during tracker construction', () => { + createTracker(); + expect(getBrowserPropertiesSpy).not.toHaveBeenCalled(); + }); + + it('calls getBrowserProperties exactly once on the first trackPageView (default config)', () => { + const tracker = createTracker(); + getBrowserPropertiesSpy.mockClear(); + + tracker?.trackPageView(); + expect(getBrowserPropertiesSpy).toHaveBeenCalledTimes(1); + }); + }); }); diff --git a/libraries/browser-tracker-core/test/tracker/referrer.test.ts b/libraries/browser-tracker-core/test/tracker/referrer.test.ts new file mode 100644 index 000000000..732ae419b --- /dev/null +++ b/libraries/browser-tracker-core/test/tracker/referrer.test.ts @@ -0,0 +1,169 @@ +/* + * Copyright (c) 2022 Snowplow Analytics Ltd, 2010 Anthon Pang + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +import { createTracker } from '../helpers'; + +const EXTERNAL_REFERRER = 'https://www.google.com/search?q=snowplow'; + +/** + * Simulate a SPA client-side navigation by updating window.location + * without a page reload, and advancing the tracker's internal URL state. + */ +function navigateTo(path: string) { + window.history.pushState({}, '', path); +} + +describe('Tracker API: preserveOriginalReferrer', () => { + let referrerSpy: jest.SpyInstance; + + beforeEach(() => { + // Reset URL to a known starting point before each test + window.history.pushState({}, '', '/test/page.html'); + referrerSpy = jest.spyOn(document, 'referrer', 'get').mockReturnValue(EXTERNAL_REFERRER); + }); + + afterEach(() => { + jest.restoreAllMocks(); + }); + + it('freezes the original external referrer across SPA navigations when enabled', () => { + const referrers: string[] = []; + const tracker = createTracker({ + preserveOriginalReferrer: true, + plugins: [ + { + afterTrack: (payload) => { + referrers.push(payload.refr as string); + }, + }, + ], + }); + + // First page view — referrer should be the external referrer + tracker?.trackPageView(); + + // Simulate SPA navigation to a different route + navigateTo('/test/about.html'); + tracker?.trackPageView(); + + // Simulate another SPA navigation + navigateTo('/test/contact.html'); + tracker?.trackPageView(); + + // All three page views should report the original external referrer + expect(referrers).toHaveLength(3); + expect(referrers[0]).toBe(EXTERNAL_REFERRER); + expect(referrers[1]).toBe(EXTERNAL_REFERRER); + expect(referrers[2]).toBe(EXTERNAL_REFERRER); + }); + + it('is a no-op when document.referrer is empty at init (direct navigation)', () => { + // Override the referrer spy to return empty string (direct navigation) + referrerSpy.mockReturnValue(''); + + const referrers: string[] = []; + const tracker = createTracker({ + preserveOriginalReferrer: true, + plugins: [ + { + afterTrack: (payload) => { + referrers.push((payload.refr as string) ?? ''); + }, + }, + ], + }); + + // First page view — no external referrer, so refr is empty + tracker?.trackPageView(); + const firstRefr = referrers[0]; + + // Navigate to a new route — now the previous internal URL becomes the referrer + navigateTo('/test/about.html'); + tracker?.trackPageView(); + + // The second page view should have the previous internal URL as referrer + // (not frozen to empty string), proving the no-op behaviour + expect(referrers).toHaveLength(2); + expect(firstRefr ?? '').toBe(''); + // The second referrer should be set to the previous page's URL (internal chain intact) + expect(referrers[1]).toContain('/test/page.html'); + }); + + it('allows setReferrerUrl to override the preserved referrer after init', () => { + const referrers: string[] = []; + const tracker = createTracker({ + preserveOriginalReferrer: true, + plugins: [ + { + afterTrack: (payload) => { + referrers.push(payload.refr as string); + }, + }, + ], + }); + + // Override with an explicit custom referrer after init + tracker?.setReferrerUrl('https://custom.com/landing'); + tracker?.trackPageView(); + + navigateTo('/test/about.html'); + tracker?.trackPageView(); + + // The explicit setReferrerUrl call wins (last-write-wins on customReferrer) + expect(referrers[0]).toBe('https://custom.com/landing'); + expect(referrers[1]).toBe('https://custom.com/landing'); + }); + + it('does not affect SPA referrer chain when option is absent', () => { + const referrers: string[] = []; + const tracker = createTracker({ + // preserveOriginalReferrer not set — default behaviour + plugins: [ + { + afterTrack: (payload) => { + referrers.push((payload.refr as string) ?? ''); + }, + }, + ], + }); + + // First page view uses document.referrer + tracker?.trackPageView(); + + // Navigate — second page view should use the previous internal URL as referrer + navigateTo('/test/about.html'); + tracker?.trackPageView(); + + expect(referrers).toHaveLength(2); + expect(referrers[0]).toBe(EXTERNAL_REFERRER); + // After SPA navigation the referrer becomes the previous internal URL + expect(referrers[1]).toContain('/test/page.html'); + }); +}); diff --git a/libraries/browser-tracker-core/test/tracker/session_data.test.ts b/libraries/browser-tracker-core/test/tracker/session_data.test.ts index 2994063ba..d4b7277db 100644 --- a/libraries/browser-tracker-core/test/tracker/session_data.test.ts +++ b/libraries/browser-tracker-core/test/tracker/session_data.test.ts @@ -31,11 +31,11 @@ import * as uuid from 'uuid'; jest.mock('uuid'); const MOCK_UUID = '123456789'; -jest.spyOn(uuid, 'v4').mockReturnValue(MOCK_UUID); +(jest.spyOn(uuid, 'v4') as jest.SpyInstance).mockReturnValue(MOCK_UUID); import { createTestIdCookie, createTestSessionIdCookie, createTracker } from '../helpers'; -jest.useFakeTimers('modern'); +jest.useFakeTimers(); describe('Tracker API: ', () => { let cookieJar: string; @@ -57,6 +57,15 @@ describe('Tracker API: ', () => { jest.clearAllMocks(); }); + it('Writes cookies synchronously on session change', () => { + const tracker = createTracker(undefined, undefined, false); // async cookie writes enabled + + expect(cookieJar).toContain('_sp_ses'); + + tracker?.newSession(); + expect(cookieJar).toContain(tracker?.getDomainUserInfo().slice(1).join('.')); + }); + it('Sets initial domain session index on first session', () => { const tracker = createTracker(); @@ -122,6 +131,30 @@ describe('Tracker API: ', () => { expect(tracker?.getDomainSessionIndex()).toEqual(2); }); + it('Returns the current domain session id from an existing session', () => { + const sessionId = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee'; + document.cookie = createTestIdCookie({ sessionId }) + ' ' + createTestSessionIdCookie(); + const tracker = createTracker(); + + expect(tracker?.getDomainSessionId()).toEqual(sessionId); + }); + + it('Returns a newly generated domain session id on a new session', () => { + const tracker = createTracker(); + + expect(tracker?.getDomainSessionId()).toEqual(MOCK_UUID); + }); + + it('Returns the updated domain session id after newSession()', () => { + const sessionId = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee'; + document.cookie = createTestIdCookie({ sessionId }) + ' ' + createTestSessionIdCookie(); + const tracker = createTracker(); + expect(tracker?.getDomainSessionId()).toEqual(sessionId); + + tracker?.newSession(); + expect(tracker?.getDomainSessionId()).toEqual(MOCK_UUID); + }); + it('Adds the client session context entity when enabled', (done) => { const tracker = createTracker({ contexts: { session: true }, @@ -180,6 +213,71 @@ describe('Tracker API: ', () => { tracker?.trackPageView(); }); + describe('disableSessionContextWithinWebView', () => { + afterEach(() => { + delete (window as any).ReactNativeWebView; + }); + + it('Suppresses client_session entity when in WebView and option is enabled', (done) => { + (window as any).ReactNativeWebView = { postMessage: () => {} }; + const tracker = createTracker({ + contexts: { session: true }, + encodeBase64: false, + disableSessionContextWithinWebView: true, + plugins: [ + { + afterTrack: (payload) => { + let context = payload.co as string; + expect(context).not.toContain('client_session'); + done(); + }, + }, + ], + }); + + tracker?.trackPageView(); + }); + + it('Includes client_session entity when in WebView but option is explicitly false', (done) => { + (window as any).ReactNativeWebView = { postMessage: () => {} }; + const tracker = createTracker({ + contexts: { session: true }, + encodeBase64: false, + disableSessionContextWithinWebView: false, + plugins: [ + { + afterTrack: (payload) => { + let context = payload.co as string; + expect(context).toContain('client_session'); + done(); + }, + }, + ], + }); + + tracker?.trackPageView(); + }); + + it('Includes client_session entity when in WebView but option is absent (backward compat)', (done) => { + (window as any).ReactNativeWebView = { postMessage: () => {} }; + const tracker = createTracker({ + contexts: { session: true }, + encodeBase64: false, + plugins: [ + { + afterTrack: (payload) => { + let context = payload.co as string; + expect(context).toContain('client_session'); + done(); + }, + }, + ], + }); + + tracker?.trackPageView(); + }); + }); + describe('onSessionUpdateCallback functionality', () => { beforeEach(() => { const standardDate = new Date('2023-01-01T00:00:00Z'); diff --git a/libraries/tracker-core/CHANGELOG.json b/libraries/tracker-core/CHANGELOG.json index fc664d552..21bd1a4e4 100644 --- a/libraries/tracker-core/CHANGELOG.json +++ b/libraries/tracker-core/CHANGELOG.json @@ -1,6 +1,186 @@ { "name": "@snowplow/tracker-core", "entries": [ + { + "version": "4.10.1", + "tag": "@snowplow/tracker-core_v4.10.1", + "date": "Wed, 19 Aug 2026 14:26:05 GMT", + "comments": {} + }, + { + "version": "4.10.0", + "tag": "@snowplow/tracker-core_v4.10.0", + "date": "Mon, 27 Jul 2026 13:52:14 GMT", + "comments": {} + }, + { + "version": "4.9.0", + "tag": "@snowplow/tracker-core_v4.9.0", + "date": "Tue, 21 Jul 2026 14:53:08 GMT", + "comments": {} + }, + { + "version": "4.8.4", + "tag": "@snowplow/tracker-core_v4.8.4", + "date": "Thu, 02 Jul 2026 10:07:52 GMT", + "comments": {} + }, + { + "version": "4.8.3", + "tag": "@snowplow/tracker-core_v4.8.3", + "date": "Tue, 30 Jun 2026 14:22:03 GMT", + "comments": { + "none": [ + { + "comment": "Update uuid to v11 and remove closure-compiler from the build pipeline" + } + ] + } + }, + { + "version": "4.8.2", + "tag": "@snowplow/tracker-core_v4.8.2", + "date": "Wed, 17 Jun 2026 12:30:12 GMT", + "comments": {} + }, + { + "version": "4.8.1", + "tag": "@snowplow/tracker-core_v4.8.1", + "date": "Wed, 13 May 2026 09:26:05 GMT", + "comments": {} + }, + { + "version": "4.8.0", + "tag": "@snowplow/tracker-core_v4.8.0", + "date": "Tue, 28 Apr 2026 07:56:22 GMT", + "comments": {} + }, + { + "version": "4.7.0", + "tag": "@snowplow/tracker-core_v4.7.0", + "date": "Wed, 01 Apr 2026 12:59:29 GMT", + "comments": {} + }, + { + "version": "4.6.9", + "tag": "@snowplow/tracker-core_v4.6.9", + "date": "Mon, 16 Mar 2026 15:43:06 GMT", + "comments": {} + }, + { + "version": "4.6.8", + "tag": "@snowplow/tracker-core_v4.6.8", + "date": "Tue, 28 Oct 2025 09:46:42 GMT", + "comments": {} + }, + { + "version": "4.6.7", + "tag": "@snowplow/tracker-core_v4.6.7", + "date": "Tue, 07 Oct 2025 14:53:36 GMT", + "comments": {} + }, + { + "version": "4.6.6", + "tag": "@snowplow/tracker-core_v4.6.6", + "date": "Tue, 26 Aug 2025 08:42:28 GMT", + "comments": {} + }, + { + "version": "4.6.5", + "tag": "@snowplow/tracker-core_v4.6.5", + "date": "Wed, 25 Jun 2025 21:16:46 GMT", + "comments": {} + }, + { + "version": "4.6.4", + "tag": "@snowplow/tracker-core_v4.6.4", + "date": "Wed, 25 Jun 2025 12:08:50 GMT", + "comments": {} + }, + { + "version": "4.6.3", + "tag": "@snowplow/tracker-core_v4.6.3", + "date": "Thu, 29 May 2025 19:52:07 GMT", + "comments": {} + }, + { + "version": "4.6.2", + "tag": "@snowplow/tracker-core_v4.6.2", + "date": "Tue, 20 May 2025 07:39:05 GMT", + "comments": {} + }, + { + "version": "4.6.1", + "tag": "@snowplow/tracker-core_v4.6.1", + "date": "Tue, 06 May 2025 13:10:51 GMT", + "comments": {} + }, + { + "version": "4.6.0", + "tag": "@snowplow/tracker-core_v4.6.0", + "date": "Thu, 01 May 2025 09:58:59 GMT", + "comments": { + "none": [ + { + "comment": "Add `cookieExtensionService` argument as replacement for `idService`, deprecate `idService`" + } + ] + } + }, + { + "version": "4.5.0", + "tag": "@snowplow/tracker-core_v4.5.0", + "date": "Fri, 04 Apr 2025 09:21:23 GMT", + "comments": {} + }, + { + "version": "4.4.0", + "tag": "@snowplow/tracker-core_v4.4.0", + "date": "Thu, 20 Mar 2025 12:14:34 GMT", + "comments": {} + }, + { + "version": "4.3.1", + "tag": "@snowplow/tracker-core_v4.3.1", + "date": "Tue, 21 Jan 2025 11:09:42 GMT", + "comments": {} + }, + { + "version": "4.3.0", + "tag": "@snowplow/tracker-core_v4.3.0", + "date": "Mon, 20 Jan 2025 11:45:13 GMT", + "comments": {} + }, + { + "version": "4.2.0", + "tag": "@snowplow/tracker-core_v4.2.0", + "date": "Mon, 13 Jan 2025 08:30:05 GMT", + "comments": { + "none": [ + { + "comment": "Add new tracker for React Native (#1371)" + } + ] + } + }, + { + "version": "4.1.0", + "tag": "@snowplow/tracker-core_v4.1.0", + "date": "Thu, 28 Nov 2024 10:57:30 GMT", + "comments": {} + }, + { + "version": "4.0.4", + "tag": "@snowplow/tracker-core_v4.0.4", + "date": "Thu, 21 Nov 2024 09:06:36 GMT", + "comments": {} + }, + { + "version": "4.0.3", + "tag": "@snowplow/tracker-core_v4.0.3", + "date": "Wed, 20 Nov 2024 09:30:31 GMT", + "comments": {} + }, { "version": "4.0.2", "tag": "@snowplow/tracker-core_v4.0.2", diff --git a/libraries/tracker-core/CHANGELOG.md b/libraries/tracker-core/CHANGELOG.md index 1718ca0a2..52ebcbbfa 100644 --- a/libraries/tracker-core/CHANGELOG.md +++ b/libraries/tracker-core/CHANGELOG.md @@ -1,6 +1,147 @@ # Change Log - @snowplow/tracker-core -This log was last generated on Mon, 11 Nov 2024 15:46:34 GMT and should not be manually modified. +This log was last generated on Wed, 19 Aug 2026 14:26:05 GMT and should not be manually modified. + +## 4.10.1 +Wed, 19 Aug 2026 14:26:05 GMT + +_Version update only_ + +## 4.10.0 +Mon, 27 Jul 2026 13:52:14 GMT + +_Version update only_ + +## 4.9.0 +Tue, 21 Jul 2026 14:53:08 GMT + +_Version update only_ + +## 4.8.4 +Thu, 02 Jul 2026 10:07:52 GMT + +_Version update only_ + +## 4.8.3 +Tue, 30 Jun 2026 14:22:03 GMT + +### Updates + +- Update uuid to v11 and remove closure-compiler from the build pipeline + +## 4.8.2 +Wed, 17 Jun 2026 12:30:12 GMT + +_Version update only_ + +## 4.8.1 +Wed, 13 May 2026 09:26:05 GMT + +_Version update only_ + +## 4.8.0 +Tue, 28 Apr 2026 07:56:22 GMT + +_Version update only_ + +## 4.7.0 +Wed, 01 Apr 2026 12:59:29 GMT + +_Version update only_ + +## 4.6.9 +Mon, 16 Mar 2026 15:43:06 GMT + +_Version update only_ + +## 4.6.8 +Tue, 28 Oct 2025 09:46:42 GMT + +_Version update only_ + +## 4.6.7 +Tue, 07 Oct 2025 14:53:36 GMT + +_Version update only_ + +## 4.6.6 +Tue, 26 Aug 2025 08:42:28 GMT + +_Version update only_ + +## 4.6.5 +Wed, 25 Jun 2025 21:16:46 GMT + +_Version update only_ + +## 4.6.4 +Wed, 25 Jun 2025 12:08:50 GMT + +_Version update only_ + +## 4.6.3 +Thu, 29 May 2025 19:52:07 GMT + +_Version update only_ + +## 4.6.2 +Tue, 20 May 2025 07:39:05 GMT + +_Version update only_ + +## 4.6.1 +Tue, 06 May 2025 13:10:51 GMT + +_Version update only_ + +## 4.6.0 +Thu, 01 May 2025 09:58:59 GMT + +### Updates + +- Add `cookieExtensionService` argument as replacement for `idService`, deprecate `idService` + +## 4.5.0 +Fri, 04 Apr 2025 09:21:23 GMT + +_Version update only_ + +## 4.4.0 +Thu, 20 Mar 2025 12:14:34 GMT + +_Version update only_ + +## 4.3.1 +Tue, 21 Jan 2025 11:09:42 GMT + +_Version update only_ + +## 4.3.0 +Mon, 20 Jan 2025 11:45:13 GMT + +_Version update only_ + +## 4.2.0 +Mon, 13 Jan 2025 08:30:05 GMT + +### Updates + +- Add new tracker for React Native (#1371) + +## 4.1.0 +Thu, 28 Nov 2024 10:57:30 GMT + +_Version update only_ + +## 4.0.4 +Thu, 21 Nov 2024 09:06:36 GMT + +_Version update only_ + +## 4.0.3 +Wed, 20 Nov 2024 09:30:31 GMT + +_Version update only_ ## 4.0.2 Mon, 11 Nov 2024 15:46:34 GMT diff --git a/libraries/tracker-core/CLAUDE.md b/libraries/tracker-core/CLAUDE.md new file mode 100644 index 000000000..02de6dc77 --- /dev/null +++ b/libraries/tracker-core/CLAUDE.md @@ -0,0 +1,384 @@ +# Tracker Core Library - CLAUDE.md + +## Module Overview + +The `@snowplow/tracker-core` library provides platform-agnostic event tracking functionality. It contains the fundamental building blocks for constructing Snowplow events, managing contexts, and handling payloads. This is the foundation that all platform-specific trackers build upon. + +## Core Responsibilities + +- **Event Builders**: Functions to construct typed Snowplow events +- **Payload Management**: JSON and form-encoded payload construction +- **Context Handling**: Global and conditional context providers +- **Plugin System**: Core plugin architecture and lifecycle +- **Emitter Logic**: Event batching and request management + +## Architecture Patterns + +### Event Builder Pattern +All events follow a consistent builder pattern that returns a `PayloadBuilder`: + +```typescript +// ✅ Correct: Use typed builders +export function buildPageView(event: PageViewEvent): PayloadBuilder { + const { pageUrl, pageTitle, referrer } = event; + return payloadBuilder() + .add('e', 'pv') + .add('url', pageUrl) + .add('page', pageTitle) + .add('refr', referrer); +} + +// ❌ Wrong: Manual payload construction +function makePageView(url: string) { + return { e: 'pv', url }; // Don't build manually +} +``` + +### Self-Describing JSON Pattern +```typescript +// ✅ Correct: Strongly typed SDJ +export type SelfDescribingJson> = { + schema: string; + data: T extends any[] ? never : T; +}; + +// ❌ Wrong: Loose typing +type Event = { schema: any; data: any }; +``` + +### Timestamp ADT Pattern +```typescript +// ✅ Correct: Use discriminated union +export type Timestamp = TrueTimestamp | DeviceTimestamp | number; +export interface TrueTimestamp { + readonly type: 'ttm'; + readonly value: number; +} + +// ❌ Wrong: Ambiguous timestamp types +type Timestamp = number | { value: number }; +``` + +## Critical Import Patterns + +### Public API Exports +```typescript +// index.ts - Centralized exports +export * from './core'; +export * from './contexts'; +export * from './payload'; +export * from './emitter'; +export * from './plugins'; +export { buildPageView, buildStructEvent } from './events'; +``` + +### Internal Module Structure +```typescript +// ✅ Correct: Import from sibling modules +import { PayloadBuilder } from './payload'; +import { SelfDescribingJson } from './core'; + +// ❌ Wrong: Circular dependencies +import { something } from '../index'; // Avoid +``` + +## Event Building Standards + +### Standard Event Properties +```typescript +// Every event builder should accept CommonEventProperties +export interface CommonEventProperties> { + context?: Array> | null; + timestamp?: Timestamp | null; +} +``` + +### Event Factory Pattern +```typescript +// Standard event builder structure +export function buildCustomEvent( + event: CustomEventData +): PayloadBuilder { + return payloadBuilder() + .add('e', 'ue') // Event type + .addJson('ue_px', 'ue_pr', { + schema: EVENT_SCHEMA, + data: processEventData(event) + }); +} +``` + +## Context Management + +### Global Context Pattern +```typescript +// ✅ Correct: Conditional context provider +export type ConditionalContextProvider = + [ContextFilter, ContextPrimitive | ContextGenerator]; + +const globalContext: ConditionalContextProvider = [ + (event) => event.eventType === 'pv', // Filter + { schema: '...', data: {...} } // Context +]; + +// ❌ Wrong: Unfiltered global contexts +const context = { schema: '...', data: {...} }; // No filtering +``` + +### Plugin Context Integration +```typescript +// Plugin contexts are merged with global contexts +export function pluginContexts(): PluginContexts { + return { + addPluginContexts: (contexts: Array) => { + // Contexts added by plugins + } + }; +} +``` + +## Emitter Architecture + +### Event Store Pattern +```typescript +// Event storage abstraction +export interface EventStore { + add(payload: EventStorePayload): Promise; + count(): Promise; + getAll(): Promise; + removeHead(count: number): Promise; +} +``` + +### Request Building +```typescript +// Batch request construction +export class EmitterRequest { + constructor( + events: EmitterEvent[], + byteLimit: number + ) { + this.batch = this.buildBatch(events, byteLimit); + } +} +``` + +## Common Patterns + +### UUID Generation +```typescript +// ✅ Correct: Use uuid v4 +import { v4 as uuid } from 'uuid'; +const eventId = uuid(); + +// ❌ Wrong: Custom ID generation +const id = Math.random().toString(36); +``` + +### Base64 Encoding +```typescript +// Use the provided base64 utilities +import { base64urlencode } from './base64'; +const encoded = base64urlencode(jsonString); +``` + +### Logger Pattern +```typescript +// Conditional logging +import { LOG } from './logger'; +LOG.error('Error message', error); +LOG.warn('Warning message'); +``` + +## Testing Patterns + +### Mock Payload Builders +```typescript +// Test helper pattern +function createMockPayloadBuilder(): PayloadBuilder { + return payloadBuilder() + .add('aid', 'test-app') + .add('p', 'web'); +} +``` + +### Event Validation +```typescript +// Validate event structure in tests +expect(event.build()).toMatchObject({ + e: 'ue', + ue_pr: expect.stringContaining('schema') +}); +``` + +## Testing Patterns + +### Test Directory Structure +``` +test/ +├── core.test.ts # Core tracker tests +├── payload.test.ts # Payload builder tests +├── contexts.test.ts # Context management tests +├── emitter/ # Emitter-specific tests +└── __snapshots__/ # Jest snapshots +``` + +### In-Memory Event Store Pattern +```typescript +// ✅ Correct: Use in-memory store for testing +import { newInMemoryEventStore } from '@snowplow/tracker-core'; + +describe('Event tracking', () => { + let eventStore: EventStore; + + beforeEach(() => { + eventStore = newInMemoryEventStore(); + }); + + it('stores events correctly', () => { + const tracker = new TrackerCore({ eventStore }); + tracker.track(buildPageView({ pageUrl: 'test' })); + + const events = eventStore.getEvents(); + expect(events).toHaveLength(1); + expect(events[0].e).toBe('pv'); + }); +}); +``` + +### Payload Builder Testing +```typescript +// ✅ Correct: Test payload construction +describe('PayloadBuilder', () => { + it('builds valid Snowplow payload', () => { + const payload = new PayloadBuilder() + .add('e', 'pv') + .add('url', 'http://example.com') + .add('page', 'Home') + .build(); + + expect(payload).toEqual({ + e: 'pv', + url: 'http://example.com', + page: 'Home' + }); + }); + + it('encodes base64 for self-describing events', () => { + const payload = buildSelfDescribingEvent({ + event: { + schema: 'iglu:com.example/test/jsonschema/1-0-0', + data: { key: 'value' } + } + }); + + const built = payload.build(); + expect(built.ue_pr).toBeDefined(); + const decoded = JSON.parse(Buffer.from(built.ue_pr, 'base64').toString()); + expect(decoded.data.schema).toBe('iglu:com.example/test/jsonschema/1-0-0'); + }); +}); +``` + +### Context Testing +```typescript +// ✅ Correct: Test context providers +describe('Context management', () => { + it('adds global contexts to events', () => { + const contextProvider = () => [{ + schema: 'iglu:com.example/context/jsonschema/1-0-0', + data: { contextKey: 'contextValue' } + }]; + + const tracker = new TrackerCore({ + contextProviders: [contextProvider] + }); + + const payload = tracker.track(buildPageView({ pageUrl: 'test' })); + const contexts = JSON.parse(Buffer.from(payload.co, 'base64').toString()); + + expect(contexts.data).toContainEqual( + expect.objectContaining({ + data: { contextKey: 'contextValue' } + }) + ); + }); +}); +``` + +### Event Builder Testing Pattern +```typescript +// ✅ Correct: Test custom event builders +function buildCustomEvent(data: CustomEventData): PayloadBuilder { + return new PayloadBuilder() + .add('e', 'ue') + .add('ue_pr', buildSelfDescribingJson({ + schema: CUSTOM_EVENT_SCHEMA, + data + })); +} + +describe('Custom event builder', () => { + it('creates valid self-describing event', () => { + const event = buildCustomEvent({ field: 'value' }); + const payload = event.build(); + + expect(payload.e).toBe('ue'); + expect(JSON.parse(Buffer.from(payload.ue_pr, 'base64').toString())) + .toMatchSnapshot(); + }); +}); +``` + +## File Organization + +``` +tracker-core/ +├── src/ +│ ├── index.ts # Public API exports +│ ├── core.ts # Core types and tracker +│ ├── payload.ts # Payload builder +│ ├── contexts.ts # Context management +│ ├── plugins.ts # Plugin system +│ ├── base64.ts # Encoding utilities +│ ├── logger.ts # Logging +│ ├── schemata.ts # Schema constants +│ └── emitter/ +│ ├── index.ts # Emitter exports +│ ├── emitter_event.ts +│ └── emitter_request.ts +└── test/ + └── [module].test.ts +``` + +## Quick Reference + +### Essential Imports +```typescript +import { + PayloadBuilder, + SelfDescribingJson, + CommonEventProperties, + buildSelfDescribingEvent, + buildPageView, + buildStructEvent, + TrackerCore +} from '@snowplow/tracker-core'; +``` + +### Event Builder Checklist +- [ ] Accept event-specific data interface +- [ ] Return `PayloadBuilder` +- [ ] Add event type with `.add('e', 'type')` +- [ ] Handle optional CommonEventProperties +- [ ] Export from index.ts + +## Contributing to CLAUDE.md + +When modifying tracker-core patterns: + +1. **Maintain backward compatibility** - This is a core library +2. **Update type exports** when adding new interfaces +3. **Follow builder pattern** for new event types +4. **Test payload structure** thoroughly +5. **Document schema changes** in schemata.ts \ No newline at end of file diff --git a/libraries/tracker-core/package.json b/libraries/tracker-core/package.json index d8469b459..7cae0a65d 100644 --- a/libraries/tracker-core/package.json +++ b/libraries/tracker-core/package.json @@ -1,6 +1,6 @@ { "name": "@snowplow/tracker-core", - "version": "4.0.2", + "version": "4.10.1", "description": "Core functionality for Snowplow JavaScript trackers", "keywords": [ "tracking", @@ -45,15 +45,13 @@ }, "dependencies": { "tslib": "^2.3.1", - "uuid": "^10.0.0" + "uuid": "^11.1.1" }, "devDependencies": { - "@ampproject/rollup-plugin-closure-compiler": "~0.27.0", "@rollup/plugin-commonjs": "~21.0.2", "@rollup/plugin-json": "~4.1.0", "@rollup/plugin-node-resolve": "~13.1.3", "@types/node": "~14.6.0", - "@types/uuid": "^10.0.0", "@typescript-eslint/eslint-plugin": "~5.15.0", "@typescript-eslint/parser": "~5.15.0", "ava": "~5.1.1", diff --git a/libraries/tracker-core/rollup.config.js b/libraries/tracker-core/rollup.config.js index 1a7544981..42c391285 100644 --- a/libraries/tracker-core/rollup.config.js +++ b/libraries/tracker-core/rollup.config.js @@ -33,7 +33,6 @@ import commonjs from '@rollup/plugin-commonjs'; import json from '@rollup/plugin-json'; import ts from 'rollup-plugin-ts'; // Prefered over @rollup/plugin-typescript as it bundles .d.ts files import { banner } from '../../banner'; -import compiler from '@ampproject/rollup-plugin-closure-compiler'; import { terser } from 'rollup-plugin-terser'; import cleanup from 'rollup-plugin-cleanup'; import pkg from './package.json'; @@ -51,7 +50,7 @@ export default [ }, { input: './src/index.ts', - plugins: [...umdPlugins, compiler(), terser(), cleanup({ comments: 'none' }), banner()], + plugins: [...umdPlugins, terser(), cleanup({ comments: 'none' }), banner()], output: [{ file: pkg['umd:main'].replace('.js', '.min.js'), format: 'umd', sourcemap: true, name: umdName }], }, { diff --git a/libraries/tracker-core/src/core.ts b/libraries/tracker-core/src/core.ts index 0dfff0d59..cbe78a044 100644 --- a/libraries/tracker-core/src/core.ts +++ b/libraries/tracker-core/src/core.ts @@ -157,6 +157,13 @@ export interface TrackerCore { */ addPayloadPair: (key: string, value: unknown) => void; + /** + * Deactivate tracker core including all plugins. + * This is useful for cleaning up resources or listeners that have been created. + * Once deactivated, the tracker won't be able to track any events. + */ + deactivate(): void; + /** * Get current base64 encoding state */ @@ -387,6 +394,11 @@ export function trackerCore(configuration: CoreConfiguration = {}): TrackerCore context?: Array> | null, timestamp?: Timestamp | null ): Payload | undefined { + if (!active) { + LOG.error('Track called on deactivated tracker'); + return undefined; + } + pb.withJsonProcessor(payloadJsonProcessor(encodeBase64)); pb.add('eid', uuid()); pb.addDict(payloadPairs); @@ -539,6 +551,7 @@ export function trackerCore(configuration: CoreConfiguration = {}): TrackerCore return core; } + let active = true; const { base64, corePlugins, callback } = configuration, plugins = corePlugins ?? [], partialCore = newCore(base64 ?? true, plugins, callback), @@ -550,6 +563,13 @@ export function trackerCore(configuration: CoreConfiguration = {}): TrackerCore plugin.logger?.(LOG); plugin.activateCorePlugin?.(core); }, + deactivate: () => { + plugins.forEach((plugin) => { + plugin.deactivatePlugin?.(core); + }); + plugins.length = 0; + active = false; + } }; plugins?.forEach((plugin) => { diff --git a/libraries/tracker-core/src/emitter/index.ts b/libraries/tracker-core/src/emitter/index.ts index 0b7bfc783..35e3649e8 100644 --- a/libraries/tracker-core/src/emitter/index.ts +++ b/libraries/tracker-core/src/emitter/index.ts @@ -107,11 +107,15 @@ export interface EmitterConfigurationBase { */ dontRetryStatusCodes?: number[]; /** - * Id service full URL. This URL will be added to the queue and will be called using a GET method. + * Cookie extension service full URL. This URL will be added to the queue and will be called using a GET method. * This option is there to allow the service URL to be called in order to set any required identifiers e.g. extra cookies. * * The request respects the `anonymousTracking` option, including the SP-Anonymous header if needed, and any additional custom headers from the customHeaders option. */ + cookieExtensionService?: string; + /** + * @deprecated Use `cookieExtensionService` instead. + */ idService?: string; /** * Indicates that the request should be allowed to outlive the webpage that initiated it. @@ -208,6 +212,7 @@ export function newEmitter({ serverAnonymization, connectionTimeout, keepalive, + cookieExtensionService, idService, dontRetryStatusCodes = [], retryStatusCodes = [], @@ -219,7 +224,10 @@ export function newEmitter({ eventStore = newInMemoryEventStore({}), credentials, }: EmitterConfiguration): Emitter { - let idServiceCalled = false; + /* `cookieExtensionService` gets priority until `idService` is completely removed. */ + cookieExtensionService = cookieExtensionService || idService; + + let cookieExtensionServiceCalled = false; let flushInProgress = false; const usePost = eventMethod.toLowerCase() === 'post'; dontRetryStatusCodes = dontRetryStatusCodes.concat([400, 401, 403, 410, 422]); @@ -349,10 +357,10 @@ export function newEmitter({ } } - async function callIdService() { - if (idService && !idServiceCalled) { - idServiceCalled = true; - const request = new Request(idService, { method: 'GET' }); + async function callCookieExtensionService() { + if (cookieExtensionService && !cookieExtensionServiceCalled) { + cookieExtensionServiceCalled = true; + const request = new Request(cookieExtensionService, { method: 'GET' }); await customFetch(request); } } @@ -372,7 +380,7 @@ export function newEmitter({ } async function continueFlush() { - await callIdService(); + await callCookieExtensionService(); const request = newEmitterRequestWithConfig(); const eventStoreIterator = eventStore.iterator(); diff --git a/libraries/tracker-core/src/plugins.ts b/libraries/tracker-core/src/plugins.ts index 4d1f6c2d9..7a8b11b52 100644 --- a/libraries/tracker-core/src/plugins.ts +++ b/libraries/tracker-core/src/plugins.ts @@ -43,6 +43,11 @@ export interface CorePlugin { * Use to capture the specific core instance for each instance of a core plugin */ activateCorePlugin?: (core: TrackerCore) => void; + /** + * Called when the tracker is being destroyed. + * Should be used to clean up any resources or listeners that the plugin has created. + */ + deactivatePlugin?: (core: TrackerCore) => void; /** * Called before the `filter` method is called and before the trackerCore callback fires (if the filter passes) * @param payloadBuilder - The payloadBuilder which will be sent to the callback, can be modified diff --git a/libraries/tracker-core/test/core.ts b/libraries/tracker-core/test/core.ts index aac62a570..226e9dc7e 100644 --- a/libraries/tracker-core/test/core.ts +++ b/libraries/tracker-core/test/core.ts @@ -70,6 +70,10 @@ function compare(result: Payload, expected: Payload, t: ExecutionContext) { t.deepEqual(result, expected); } +test.before(() => { + console.error = () => {}; // Silence console.error globally +}); + test('tracker.track API should return the eid attribute', (t) => { const pageUrl = 'http://www.example.com'; const pageTitle = 'title page'; @@ -1034,3 +1038,47 @@ test('filter is passed full payload including dynamic context', (t) => { t.assert(countTracked === 1); }); + +test('doesnt track any events on deactivated tracker', (t) => { + let countTracked = 0; + const tracker = trackerCore({ + corePlugins: [ + { + afterTrack: () => { + countTracked += 1; + }, + }, + ], + }); + + tracker.deactivate(); + + t.falsy( + tracker.track( + buildPageView({ + pageUrl: 'http://www.example.com', + pageTitle: 'title page', + referrer: 'https://www.google.com', + }) + ) + ); + + t.assert(countTracked === 0); +}); + +test('deactivates plugins on deactivated tracker', (t) => { + let pluginDeactivated = false; + const tracker = trackerCore({ + corePlugins: [ + { + deactivatePlugin: () => { + pluginDeactivated = true; + } + }, + ], + }); + + tracker.deactivate(); + + t.assert(pluginDeactivated); +}); diff --git a/libraries/tracker-core/test/emitter/index.test.ts b/libraries/tracker-core/test/emitter/index.test.ts index 22c10ee23..0371224ef 100644 --- a/libraries/tracker-core/test/emitter/index.test.ts +++ b/libraries/tracker-core/test/emitter/index.test.ts @@ -1,7 +1,7 @@ import test from 'ava'; import { newEmitter, Emitter } from '../../src/emitter'; -import { newInMemoryEventStore } from "../../src/event_store"; +import { newInMemoryEventStore } from '../../src/event_store'; function createMockFetch(status: number, requests: Request[]) { return async (input: Request) => { @@ -15,7 +15,7 @@ test.before(() => { console.error = () => {}; // Silence console.error globally }); -test("input adds an event to the event store", async (t) => { +test('input adds an event to the event store', async (t) => { const requests: Request[] = []; const mockFetch = createMockFetch(200, requests); const eventStore = newInMemoryEventStore({}); @@ -26,7 +26,7 @@ test("input adds an event to the event store", async (t) => { eventStore, }); - await emitter.input({ e: "pv" }); + await emitter.input({ e: 'pv' }); t.is(await eventStore.count(), 1); t.is(requests.length, 0); @@ -288,7 +288,7 @@ test('makes a request to the id service only once', async (t) => { const emitter: Emitter = newEmitter({ endpoint: 'https://example.com', customFetch: mockFetch, - idService: 'https://id-example.com', + cookieExtensionService: 'https://id-example.com', }); await emitter.input({ e: 'pv' }); @@ -325,7 +325,7 @@ test('adds a timeout to the request', async (t) => { endpoint: 'https://example.com', customFetch: mockFetch, connectionTimeout: 100, - eventStore + eventStore, }); await emitter.input({ e: 'pv' }); diff --git a/plugins/CLAUDE.md b/plugins/CLAUDE.md new file mode 100644 index 000000000..a78aba399 --- /dev/null +++ b/plugins/CLAUDE.md @@ -0,0 +1,413 @@ +# Browser Plugins - CLAUDE.md + +## Plugin Architecture Overview + +Browser plugins extend the core tracking functionality with feature-specific capabilities. Each plugin follows a consistent pattern for registration, state management, and API exposure. Plugins are self-contained modules that integrate seamlessly with the tracker lifecycle. + +## Core Plugin Pattern + +### Plugin Structure Template +```typescript +// ✅ Correct: Standard plugin structure +import { BrowserPlugin, BrowserTracker } from '@snowplow/browser-tracker-core'; + +const _trackers: Record = {}; + +export function MyPlugin(): BrowserPlugin { + return { + activateBrowserPlugin: (tracker) => { + _trackers[tracker.id] = tracker; + } + }; +} + +// ❌ Wrong: Global state without cleanup +let tracker: BrowserTracker; // Global leak +``` + +### API Function Pattern +```typescript +// ✅ Correct: Dispatch to registered trackers +export function trackMyEvent( + event: MyEvent & CommonEventProperties, + trackers: Array = Object.keys(_trackers) +) { + dispatchToTrackersInCollection(trackers, _trackers, (t) => { + t.core.track(buildMyEvent(event), event.context, event.timestamp); + }); +} + +// ❌ Wrong: Single tracker assumption +export function trackEvent(event: MyEvent) { + tracker.track(event); // Which tracker? +} +``` + +## Plugin Categories + +### 1. Event Tracking Plugins +Plugins that add new event types: +- `browser-plugin-ad-tracking`: Ad impressions, clicks, conversions +- `browser-plugin-media-tracking`: Video/audio player events +- `browser-plugin-ecommerce`: Transaction and item tracking +- `browser-plugin-error-tracking`: JavaScript error capture + +### 2. Context Enhancement Plugins +Plugins that add contextual data: +- `browser-plugin-client-hints`: Browser client hints +- `browser-plugin-timezone`: Timezone information +- `browser-plugin-geolocation`: Location data +- `browser-plugin-ga-cookies`: Google Analytics cookies + +### 3. Behavior Tracking Plugins +Plugins that track user interactions: +- `browser-plugin-form-tracking`: Form interactions +- `browser-plugin-link-click-tracking`: Link clicks +- `browser-plugin-button-click-tracking`: Button clicks +- `browser-plugin-element-tracking`: General element visibility + +### 4. Performance Plugins +Plugins for performance monitoring: +- `browser-plugin-performance-timing`: Page load performance +- `browser-plugin-web-vitals`: Core Web Vitals +- `browser-plugin-performance-navigation-timing`: Navigation timing + +## Common Plugin Patterns + +### Schema Definition +```typescript +// schemata.ts - Centralized schemas +export const AD_CLICK_SCHEMA = + 'iglu:com.snowplowanalytics.snowplow/ad_click/jsonschema/1-0-0'; +export const AD_IMPRESSION_SCHEMA = + 'iglu:com.snowplowanalytics.snowplow/ad_impression/jsonschema/1-0-0'; +``` + +### Event Builder Integration +```typescript +// ✅ Correct: Use core builders +import { buildSelfDescribingEvent } from '@snowplow/tracker-core'; + +function buildAdClick(event: AdClickEvent): PayloadBuilder { + return buildSelfDescribingEvent({ + event: { + schema: AD_CLICK_SCHEMA, + data: cleanAdClickData(event) + } + }); +} + +// ❌ Wrong: Custom payload construction +function buildAdClick(event: AdClickEvent) { + return { e: 'ue', data: event }; // Non-standard +} +``` + +### Configuration Options +```typescript +// ✅ Correct: Typed configuration +export interface MediaTrackingConfiguration { + captureEvents?: MediaEventType[]; + boundaries?: number[]; + volumeChangeTrackingInterval?: number; +} + +export function MediaTrackingPlugin( + config: MediaTrackingConfiguration = {} +): BrowserPlugin { + const settings = { ...defaultConfig, ...config }; + // Plugin implementation +} + +// ❌ Wrong: Untyped config +export function Plugin(config: any) { } +``` + +### DOM Observer Pattern +```typescript +// ✅ Correct: Managed observers +export function FormTrackingPlugin(): BrowserPlugin { + let observer: MutationObserver | null = null; + + return { + activateBrowserPlugin: (tracker) => { + observer = new MutationObserver(handleMutations); + observer.observe(document, { childList: true }); + }, + contexts: () => { + // Cleanup on context request if needed + observer?.disconnect(); + return []; + } + }; +} + +// ❌ Wrong: Unmanaged observers +new MutationObserver(callback).observe(document, {}); // Leak +``` + +## Plugin State Management + +### Tracker Registry +```typescript +// ✅ Correct: Scoped tracker storage +const _trackers: Record = {}; +const _configurations: WeakMap = new WeakMap(); + +// ❌ Wrong: Global configuration +let globalConfig: Config; // Affects all trackers +``` + +### Element Tracking State +```typescript +// ✅ Correct: WeakMap for DOM references +const elementStates = new WeakMap(); + +// ❌ Wrong: Memory leak potential +const elementStates: Map = new Map(); +``` + +## Event API Standards + +### Standard Event Interface +```typescript +// ✅ Correct: Consistent event structure +export interface MediaPlayerEvent { + currentTime: number; + duration?: number; + ended: boolean; + loop: boolean; + muted: boolean; + paused: boolean; + playbackRate: number; + volume: number; +} + +// ❌ Wrong: Inconsistent naming +export interface VideoData { + time: number; // Should be currentTime + length?: number; // Should be duration +} +``` + +### Optional Properties Pattern +```typescript +// ✅ Correct: Clear optionality +export interface AdClickEvent { + targetUrl: string; + clickId?: string; + costModel?: 'cpa' | 'cpc' | 'cpm'; + cost?: number; + bannerId?: string; + zoneId?: string; + impressionId?: string; + advertiserId?: string; + campaignId?: string; +} + +// ❌ Wrong: Everything optional +export interface AdEvent { + targetUrl?: string; // Required field as optional +} +``` + +## Context Building + +### Dynamic Context Pattern +```typescript +// ✅ Correct: Context from current state +export function getMediaContext(player: HTMLMediaElement): SelfDescribingJson { + return { + schema: MEDIA_PLAYER_SCHEMA, + data: { + currentTime: player.currentTime, + duration: player.duration || null, + ended: player.ended, + paused: player.paused + } + }; +} + +// ❌ Wrong: Stale context +const context = { /* captured once */ }; +``` + +## Testing Plugin Patterns + +### Test File Organization +``` +plugin/test/ +├── events.test.ts # Event tracking tests +├── contexts.test.ts # Context builder tests +├── api.test.ts # Public API tests +└── __snapshots__/ # Jest snapshot files +``` + +### Mock Tracker Setup +```typescript +// Standard test setup with event store +import { addTracker, SharedState } from '@snowplow/browser-tracker-core'; +import { newInMemoryEventStore } from '@snowplow/tracker-core'; + +describe('MyPlugin', () => { + let eventStore = newInMemoryEventStore(); + + beforeEach(() => { + SharedState.clear(); + eventStore = newInMemoryEventStore(); + addTracker('sp', 'sp', 'js-test', '', new SharedState(), { + eventStore, + plugins: [MyPlugin()] + }); + }); +}); +``` + +### Event Extraction Utilities +```typescript +// Common lodash/fp patterns for test assertions +import F from 'lodash/fp'; + +const getUEEvents = F.compose( + F.filter(F.compose(F.eq('ue'), F.get('e'))) +); + +const extractEventProperties = F.map( + F.compose( + F.get('data'), + (cx: string) => JSON.parse(cx), + F.get('ue_pr') + ) +); + +// Extract specific schema events +const extractUeEvent = (schema: string) => ({ + from: F.compose( + F.first, + F.filter(F.compose(F.eq(schema), F.get('schema'))), + F.flatten, + extractEventProperties, + getUEEvents + ) +}); +``` + +### Event Verification Patterns +```typescript +// ✅ Correct: Verify event schema and data +it('tracks ad click with correct schema', () => { + trackAdClick({ targetUrl: 'https://example.com' }); + + const events = eventStore.getEvents(); + const adClickEvent = extractUeEvent(AD_CLICK_SCHEMA).from(events); + + expect(adClickEvent).toMatchObject({ + targetUrl: 'https://example.com' + }); +}); + +// ❌ Wrong: Testing implementation details +it('calls internal function', () => { + expect(internalFunction).toHaveBeenCalled(); // Don't test internals +}); +``` + +### Context Testing +```typescript +// ✅ Correct: Test context generation +it('generates media player context', () => { + const player = document.createElement('video'); + player.currentTime = 30; + player.duration = 100; + + const context = buildMediaContext(player); + expect(context.data).toMatchObject({ + currentTime: 30, + duration: 100 + }); +}); +``` + +### Snapshot Testing for Complex Objects +```typescript +// ✅ Correct: Snapshot for schema validation +it('builds correct event structure', () => { + const event = buildAdClickEvent({ + targetUrl: 'https://example.com', + clickId: '123' + }); + expect(event).toMatchSnapshot(); +}); +``` + +## Plugin Development Checklist + +- [ ] Implement `BrowserPlugin` interface +- [ ] Create tracker registry with `_trackers` +- [ ] Define TypeScript interfaces for events +- [ ] Add schema constants to `schemata.ts` +- [ ] Implement tracking functions with `dispatchToTrackersInCollection` +- [ ] Export both plugin and API functions from index.ts +- [ ] Handle configuration options with defaults +- [ ] Clean up resources (observers, timers) properly +- [ ] Add comprehensive Jest tests +- [ ] Document usage in README.md + +## Common Pitfalls + +### 1. Forgetting Tracker Registration +```typescript +// ❌ Wrong: API without plugin +import { trackAdClick } from '@snowplow/browser-plugin-ad-tracking'; +trackAdClick(event); // Error: _trackers empty + +// ✅ Correct: Register plugin first +import { AdTrackingPlugin } from '@snowplow/browser-plugin-ad-tracking'; +newTracker('sp', 'collector', { plugins: [AdTrackingPlugin()] }); +``` + +### 2. Memory Leaks +```typescript +// ❌ Wrong: Unremoved listeners +element.addEventListener('click', handler); + +// ✅ Correct: Cleanup in plugin lifecycle +return { + activateBrowserPlugin: (tracker) => { + element.addEventListener('click', handler); + }, + contexts: () => { + element.removeEventListener('click', handler); + return []; + } +}; +``` + +## Quick Reference + +### Plugin File Structure +``` +browser-plugin-[name]/ +├── src/ +│ ├── index.ts # Plugin & API exports +│ ├── api.ts # Tracking functions +│ ├── types.ts # TypeScript interfaces +│ ├── schemata.ts # Schema constants +│ └── contexts.ts # Context builders +├── test/ +│ └── [name].test.ts # Jest tests +├── package.json +├── tsconfig.json +├── rollup.config.js +└── README.md +``` + +## Contributing to CLAUDE.md + +When creating or modifying plugins: + +1. **Follow the standard plugin pattern** for consistency +2. **Export all public types** from index.ts +3. **Use workspace protocol** for dependencies +4. **Test with multiple trackers** to ensure isolation +5. **Document configuration options** clearly \ No newline at end of file diff --git a/plugins/browser-plugin-ad-tracking/CHANGELOG.json b/plugins/browser-plugin-ad-tracking/CHANGELOG.json index 5bf9dde1f..ff860b51c 100644 --- a/plugins/browser-plugin-ad-tracking/CHANGELOG.json +++ b/plugins/browser-plugin-ad-tracking/CHANGELOG.json @@ -1,6 +1,174 @@ { "name": "@snowplow/browser-plugin-ad-tracking", "entries": [ + { + "version": "4.10.1", + "tag": "@snowplow/browser-plugin-ad-tracking_v4.10.1", + "date": "Wed, 19 Aug 2026 14:26:05 GMT", + "comments": {} + }, + { + "version": "4.10.0", + "tag": "@snowplow/browser-plugin-ad-tracking_v4.10.0", + "date": "Mon, 27 Jul 2026 13:52:14 GMT", + "comments": {} + }, + { + "version": "4.9.0", + "tag": "@snowplow/browser-plugin-ad-tracking_v4.9.0", + "date": "Tue, 21 Jul 2026 14:53:08 GMT", + "comments": {} + }, + { + "version": "4.8.4", + "tag": "@snowplow/browser-plugin-ad-tracking_v4.8.4", + "date": "Thu, 02 Jul 2026 10:07:52 GMT", + "comments": {} + }, + { + "version": "4.8.3", + "tag": "@snowplow/browser-plugin-ad-tracking_v4.8.3", + "date": "Tue, 30 Jun 2026 14:22:03 GMT", + "comments": { + "none": [ + { + "comment": "Update uuid to v11 and remove closure-compiler from the build pipeline" + } + ] + } + }, + { + "version": "4.8.2", + "tag": "@snowplow/browser-plugin-ad-tracking_v4.8.2", + "date": "Wed, 17 Jun 2026 12:30:12 GMT", + "comments": {} + }, + { + "version": "4.8.1", + "tag": "@snowplow/browser-plugin-ad-tracking_v4.8.1", + "date": "Wed, 13 May 2026 09:26:05 GMT", + "comments": {} + }, + { + "version": "4.8.0", + "tag": "@snowplow/browser-plugin-ad-tracking_v4.8.0", + "date": "Tue, 28 Apr 2026 07:56:22 GMT", + "comments": {} + }, + { + "version": "4.7.0", + "tag": "@snowplow/browser-plugin-ad-tracking_v4.7.0", + "date": "Wed, 01 Apr 2026 12:59:29 GMT", + "comments": {} + }, + { + "version": "4.6.9", + "tag": "@snowplow/browser-plugin-ad-tracking_v4.6.9", + "date": "Mon, 16 Mar 2026 15:43:06 GMT", + "comments": {} + }, + { + "version": "4.6.8", + "tag": "@snowplow/browser-plugin-ad-tracking_v4.6.8", + "date": "Tue, 28 Oct 2025 09:46:42 GMT", + "comments": {} + }, + { + "version": "4.6.7", + "tag": "@snowplow/browser-plugin-ad-tracking_v4.6.7", + "date": "Tue, 07 Oct 2025 14:53:36 GMT", + "comments": {} + }, + { + "version": "4.6.6", + "tag": "@snowplow/browser-plugin-ad-tracking_v4.6.6", + "date": "Tue, 26 Aug 2025 08:42:27 GMT", + "comments": {} + }, + { + "version": "4.6.5", + "tag": "@snowplow/browser-plugin-ad-tracking_v4.6.5", + "date": "Wed, 25 Jun 2025 21:16:46 GMT", + "comments": {} + }, + { + "version": "4.6.4", + "tag": "@snowplow/browser-plugin-ad-tracking_v4.6.4", + "date": "Wed, 25 Jun 2025 12:08:50 GMT", + "comments": {} + }, + { + "version": "4.6.3", + "tag": "@snowplow/browser-plugin-ad-tracking_v4.6.3", + "date": "Thu, 29 May 2025 19:52:07 GMT", + "comments": {} + }, + { + "version": "4.6.2", + "tag": "@snowplow/browser-plugin-ad-tracking_v4.6.2", + "date": "Tue, 20 May 2025 07:39:05 GMT", + "comments": {} + }, + { + "version": "4.6.1", + "tag": "@snowplow/browser-plugin-ad-tracking_v4.6.1", + "date": "Tue, 06 May 2025 13:10:51 GMT", + "comments": {} + }, + { + "version": "4.6.0", + "tag": "@snowplow/browser-plugin-ad-tracking_v4.6.0", + "date": "Thu, 01 May 2025 09:58:59 GMT", + "comments": {} + }, + { + "version": "4.5.0", + "tag": "@snowplow/browser-plugin-ad-tracking_v4.5.0", + "date": "Fri, 04 Apr 2025 09:21:23 GMT", + "comments": {} + }, + { + "version": "4.4.0", + "tag": "@snowplow/browser-plugin-ad-tracking_v4.4.0", + "date": "Thu, 20 Mar 2025 12:14:34 GMT", + "comments": {} + }, + { + "version": "4.3.1", + "tag": "@snowplow/browser-plugin-ad-tracking_v4.3.1", + "date": "Tue, 21 Jan 2025 11:09:42 GMT", + "comments": {} + }, + { + "version": "4.3.0", + "tag": "@snowplow/browser-plugin-ad-tracking_v4.3.0", + "date": "Mon, 20 Jan 2025 11:45:13 GMT", + "comments": {} + }, + { + "version": "4.2.0", + "tag": "@snowplow/browser-plugin-ad-tracking_v4.2.0", + "date": "Mon, 13 Jan 2025 08:30:05 GMT", + "comments": {} + }, + { + "version": "4.1.0", + "tag": "@snowplow/browser-plugin-ad-tracking_v4.1.0", + "date": "Thu, 28 Nov 2024 10:57:30 GMT", + "comments": {} + }, + { + "version": "4.0.4", + "tag": "@snowplow/browser-plugin-ad-tracking_v4.0.4", + "date": "Thu, 21 Nov 2024 09:06:36 GMT", + "comments": {} + }, + { + "version": "4.0.3", + "tag": "@snowplow/browser-plugin-ad-tracking_v4.0.3", + "date": "Wed, 20 Nov 2024 09:30:31 GMT", + "comments": {} + }, { "version": "4.0.2", "tag": "@snowplow/browser-plugin-ad-tracking_v4.0.2", diff --git a/plugins/browser-plugin-ad-tracking/CHANGELOG.md b/plugins/browser-plugin-ad-tracking/CHANGELOG.md index 99f840b4f..e6a979387 100644 --- a/plugins/browser-plugin-ad-tracking/CHANGELOG.md +++ b/plugins/browser-plugin-ad-tracking/CHANGELOG.md @@ -1,6 +1,143 @@ # Change Log - @snowplow/browser-plugin-ad-tracking -This log was last generated on Mon, 11 Nov 2024 15:46:33 GMT and should not be manually modified. +This log was last generated on Wed, 19 Aug 2026 14:26:05 GMT and should not be manually modified. + +## 4.10.1 +Wed, 19 Aug 2026 14:26:05 GMT + +_Version update only_ + +## 4.10.0 +Mon, 27 Jul 2026 13:52:14 GMT + +_Version update only_ + +## 4.9.0 +Tue, 21 Jul 2026 14:53:08 GMT + +_Version update only_ + +## 4.8.4 +Thu, 02 Jul 2026 10:07:52 GMT + +_Version update only_ + +## 4.8.3 +Tue, 30 Jun 2026 14:22:03 GMT + +### Updates + +- Update uuid to v11 and remove closure-compiler from the build pipeline + +## 4.8.2 +Wed, 17 Jun 2026 12:30:12 GMT + +_Version update only_ + +## 4.8.1 +Wed, 13 May 2026 09:26:05 GMT + +_Version update only_ + +## 4.8.0 +Tue, 28 Apr 2026 07:56:22 GMT + +_Version update only_ + +## 4.7.0 +Wed, 01 Apr 2026 12:59:29 GMT + +_Version update only_ + +## 4.6.9 +Mon, 16 Mar 2026 15:43:06 GMT + +_Version update only_ + +## 4.6.8 +Tue, 28 Oct 2025 09:46:42 GMT + +_Version update only_ + +## 4.6.7 +Tue, 07 Oct 2025 14:53:36 GMT + +_Version update only_ + +## 4.6.6 +Tue, 26 Aug 2025 08:42:27 GMT + +_Version update only_ + +## 4.6.5 +Wed, 25 Jun 2025 21:16:46 GMT + +_Version update only_ + +## 4.6.4 +Wed, 25 Jun 2025 12:08:50 GMT + +_Version update only_ + +## 4.6.3 +Thu, 29 May 2025 19:52:07 GMT + +_Version update only_ + +## 4.6.2 +Tue, 20 May 2025 07:39:05 GMT + +_Version update only_ + +## 4.6.1 +Tue, 06 May 2025 13:10:51 GMT + +_Version update only_ + +## 4.6.0 +Thu, 01 May 2025 09:58:59 GMT + +_Version update only_ + +## 4.5.0 +Fri, 04 Apr 2025 09:21:23 GMT + +_Version update only_ + +## 4.4.0 +Thu, 20 Mar 2025 12:14:34 GMT + +_Version update only_ + +## 4.3.1 +Tue, 21 Jan 2025 11:09:42 GMT + +_Version update only_ + +## 4.3.0 +Mon, 20 Jan 2025 11:45:13 GMT + +_Version update only_ + +## 4.2.0 +Mon, 13 Jan 2025 08:30:05 GMT + +_Version update only_ + +## 4.1.0 +Thu, 28 Nov 2024 10:57:30 GMT + +_Version update only_ + +## 4.0.4 +Thu, 21 Nov 2024 09:06:36 GMT + +_Version update only_ + +## 4.0.3 +Wed, 20 Nov 2024 09:30:31 GMT + +_Version update only_ ## 4.0.2 Mon, 11 Nov 2024 15:46:33 GMT diff --git a/plugins/browser-plugin-ad-tracking/package.json b/plugins/browser-plugin-ad-tracking/package.json index 6559b26df..34f2595a6 100644 --- a/plugins/browser-plugin-ad-tracking/package.json +++ b/plugins/browser-plugin-ad-tracking/package.json @@ -1,6 +1,6 @@ { "name": "@snowplow/browser-plugin-ad-tracking", - "version": "4.0.2", + "version": "4.10.1", "description": "Ad tracking for Snowplow", "homepage": "http://bit.ly/sp-js", "bugs": "https://github.com/snowplow/snowplow-javascript-tracker/issues", @@ -27,18 +27,17 @@ "tslib": "^2.3.1" }, "devDependencies": { - "@ampproject/rollup-plugin-closure-compiler": "~0.27.0", "@rollup/plugin-commonjs": "~21.0.2", "@rollup/plugin-node-resolve": "~13.1.3", - "@types/jest": "~27.4.1", + "@types/jest": "~28.1.1", "@types/jsdom": "~16.2.14", "@types/lodash": "~4.14.180", "@typescript-eslint/eslint-plugin": "~5.15.0", "@typescript-eslint/parser": "~5.15.0", "eslint": "~8.11.0", - "jest": "~27.5.1", - "jest-environment-jsdom": "~27.5.1", - "jest-environment-jsdom-global": "~3.0.0", + "jest": "~28.1.3", + "jest-environment-jsdom": "~28.1.3", + "jest-environment-jsdom-global": "~4.0.0", "jest-standard-reporter": "~2.0.0", "lodash": "~4.17.21", "rollup": "~2.70.1", @@ -46,10 +45,10 @@ "rollup-plugin-license": "~2.6.1", "rollup-plugin-terser": "~7.0.2", "rollup-plugin-ts": "~2.0.5", - "ts-jest": "~27.1.3", + "ts-jest": "~28.0.8", "typescript": "~4.6.2" }, "peerDependencies": { - "@snowplow/browser-tracker": "~4.0.2" + "@snowplow/browser-tracker": "~4.10.1" } } diff --git a/plugins/browser-plugin-ad-tracking/rollup.config.js b/plugins/browser-plugin-ad-tracking/rollup.config.js index 396a09090..ed975dc0b 100644 --- a/plugins/browser-plugin-ad-tracking/rollup.config.js +++ b/plugins/browser-plugin-ad-tracking/rollup.config.js @@ -32,7 +32,6 @@ import { nodeResolve } from '@rollup/plugin-node-resolve'; import commonjs from '@rollup/plugin-commonjs'; import ts from 'rollup-plugin-ts'; // Prefered over @rollup/plugin-typescript as it bundles .d.ts files import { banner } from '../../banner'; -import compiler from '@ampproject/rollup-plugin-closure-compiler'; import { terser } from 'rollup-plugin-terser'; import cleanup from 'rollup-plugin-cleanup'; import pkg from './package.json'; @@ -51,7 +50,7 @@ export default [ }, { input: './src/index.ts', - plugins: [...umdPlugins, compiler(), terser(), cleanup({ comments: 'none' }), banner()], + plugins: [...umdPlugins, terser(), cleanup({ comments: 'none' }), banner()], treeshake: { moduleSideEffects: ['sha1'] }, output: [{ file: pkg.main.replace('.js', '.min.js'), format: 'umd', sourcemap: true, name: umdName }], }, diff --git a/plugins/browser-plugin-bot-detection/CHANGELOG.json b/plugins/browser-plugin-bot-detection/CHANGELOG.json new file mode 100644 index 000000000..7b1832143 --- /dev/null +++ b/plugins/browser-plugin-bot-detection/CHANGELOG.json @@ -0,0 +1,77 @@ +{ + "name": "@snowplow/browser-plugin-bot-detection", + "entries": [ + { + "version": "4.10.1", + "tag": "@snowplow/browser-plugin-bot-detection_v4.10.1", + "date": "Wed, 19 Aug 2026 14:26:05 GMT", + "comments": { + "none": [ + { + "comment": "Exclude BotD's spurious plugins-length headless Chrome detector" + } + ] + } + }, + { + "version": "4.10.0", + "tag": "@snowplow/browser-plugin-bot-detection_v4.10.0", + "date": "Mon, 27 Jul 2026 13:52:14 GMT", + "comments": {} + }, + { + "version": "4.9.0", + "tag": "@snowplow/browser-plugin-bot-detection_v4.9.0", + "date": "Tue, 21 Jul 2026 14:53:08 GMT", + "comments": {} + }, + { + "version": "4.8.4", + "tag": "@snowplow/browser-plugin-bot-detection_v4.8.4", + "date": "Thu, 02 Jul 2026 10:07:52 GMT", + "comments": {} + }, + { + "version": "4.8.3", + "tag": "@snowplow/browser-plugin-bot-detection_v4.8.3", + "date": "Tue, 30 Jun 2026 14:22:03 GMT", + "comments": { + "none": [ + { + "comment": "Update uuid to v11 and remove closure-compiler from the build pipeline" + } + ] + } + }, + { + "version": "4.8.2", + "tag": "@snowplow/browser-plugin-bot-detection_v4.8.2", + "date": "Wed, 17 Jun 2026 12:30:12 GMT", + "comments": {} + }, + { + "version": "4.8.1", + "tag": "@snowplow/browser-plugin-bot-detection_v4.8.1", + "date": "Wed, 13 May 2026 09:26:05 GMT", + "comments": {} + }, + { + "version": "4.8.0", + "tag": "@snowplow/browser-plugin-bot-detection_v4.8.0", + "date": "Tue, 28 Apr 2026 07:56:22 GMT", + "comments": {} + }, + { + "version": "4.7.0", + "tag": "@snowplow/browser-plugin-bot-detection_v4.7.0", + "date": "Wed, 01 Apr 2026 12:59:29 GMT", + "comments": { + "minor": [ + { + "comment": "Add browser-plugin-bot-detection plugin wrapping FingerprintJS BotD for client-side bot detection" + } + ] + } + } + ] +} diff --git a/plugins/browser-plugin-bot-detection/CHANGELOG.md b/plugins/browser-plugin-bot-detection/CHANGELOG.md new file mode 100644 index 000000000..4543c2868 --- /dev/null +++ b/plugins/browser-plugin-bot-detection/CHANGELOG.md @@ -0,0 +1,55 @@ +# Change Log - @snowplow/browser-plugin-bot-detection + +This log was last generated on Wed, 19 Aug 2026 14:26:05 GMT and should not be manually modified. + +## 4.10.1 +Wed, 19 Aug 2026 14:26:05 GMT + +### Updates + +- Exclude BotD's spurious plugins-length headless Chrome detector + +## 4.10.0 +Mon, 27 Jul 2026 13:52:14 GMT + +_Version update only_ + +## 4.9.0 +Tue, 21 Jul 2026 14:53:08 GMT + +_Version update only_ + +## 4.8.4 +Thu, 02 Jul 2026 10:07:52 GMT + +_Version update only_ + +## 4.8.3 +Tue, 30 Jun 2026 14:22:03 GMT + +### Updates + +- Update uuid to v11 and remove closure-compiler from the build pipeline + +## 4.8.2 +Wed, 17 Jun 2026 12:30:12 GMT + +_Version update only_ + +## 4.8.1 +Wed, 13 May 2026 09:26:05 GMT + +_Version update only_ + +## 4.8.0 +Tue, 28 Apr 2026 07:56:22 GMT + +_Version update only_ + +## 4.7.0 +Wed, 01 Apr 2026 12:59:29 GMT + +### Minor changes + +- Add browser-plugin-bot-detection plugin wrapping FingerprintJS BotD for client-side bot detection + diff --git a/plugins/browser-plugin-bot-detection/LICENSE b/plugins/browser-plugin-bot-detection/LICENSE new file mode 100644 index 000000000..76f1946ea --- /dev/null +++ b/plugins/browser-plugin-bot-detection/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2022 Snowplow Analytics Ltd, 2010 Anthon Pang +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/plugins/browser-plugin-bot-detection/README.md b/plugins/browser-plugin-bot-detection/README.md new file mode 100644 index 000000000..6a30a4f0a --- /dev/null +++ b/plugins/browser-plugin-bot-detection/README.md @@ -0,0 +1,59 @@ +# Snowplow Bot Detection + +[![npm version][npm-image]][npm-url] +[![License][license-image]](LICENSE) + +Browser Plugin to be used with `@snowplow/browser-tracker`. + +Detects bots client-side using [FingerprintJS BotD](https://github.com/fingerprintjs/BotD) and attaches the result as a `client_side_bot_detection` context entity to all tracked events. + +## Maintainer quick start + +Part of the Snowplow JavaScript Tracker monorepo. +Build with [Node.js](https://nodejs.org/en/) (18 - 20) and [Rush](https://rushjs.io/). + +### Setup repository + +```bash +npm install -g @microsoft/rush +git clone https://github.com/snowplow/snowplow-javascript-tracker.git +rush update +``` + +## Package Installation + +With npm: + +```bash +npm install @snowplow/browser-plugin-bot-detection +``` + +## Usage + +Initialize your tracker with the BotDetectionPlugin: + +```js +import { newTracker } from '@snowplow/browser-tracker'; +import { BotDetectionPlugin } from '@snowplow/browser-plugin-bot-detection'; + +newTracker('sp1', '{{collector}}', { plugins: [ BotDetectionPlugin() ] }); +``` + +Once detection completes, a `client_side_bot_detection` context entity will be attached to all subsequent events with the following fields: + +- `bot` (boolean): Whether a bot was detected. +- `kind` (string | null): The type of bot detected (e.g. `"selenium"`, `"phantomjs"`), or `null` if no bot was found. + +## Copyright and license + +Licensed and distributed under the [BSD 3-Clause License](LICENSE) ([An OSI Approved License][osi]). + +Copyright (c) 2022 Snowplow Analytics Ltd, 2010 Anthon Pang. + +All rights reserved. + +[npm-url]: https://www.npmjs.com/package/@snowplow/browser-plugin-bot-detection +[npm-image]: https://img.shields.io/npm/v/@snowplow/browser-plugin-bot-detection +[docs]: https://docs.snowplowanalytics.com/docs/collecting-data/collecting-from-own-applications/javascript-tracker/ +[osi]: https://opensource.org/licenses/BSD-3-Clause +[license-image]: https://img.shields.io/npm/l/@snowplow/browser-plugin-bot-detection diff --git a/plugins/browser-plugin-bot-detection/jest.config.js b/plugins/browser-plugin-bot-detection/jest.config.js new file mode 100644 index 000000000..87d15da9b --- /dev/null +++ b/plugins/browser-plugin-bot-detection/jest.config.js @@ -0,0 +1,6 @@ +module.exports = { + preset: 'ts-jest', + reporters: ['jest-standard-reporter'], + setupFilesAfterEnv: ['../../setupTestGlobals.ts'], + testEnvironment: 'jest-environment-jsdom-global', +}; diff --git a/plugins/browser-plugin-bot-detection/package.json b/plugins/browser-plugin-bot-detection/package.json new file mode 100644 index 000000000..b6ba8a261 --- /dev/null +++ b/plugins/browser-plugin-bot-detection/package.json @@ -0,0 +1,53 @@ +{ + "name": "@snowplow/browser-plugin-bot-detection", + "version": "4.10.1", + "description": "Detects bots client-side using FingerprintJS BotD and attaches the result as a context entity.", + "homepage": "https://github.com/snowplow/snowplow-javascript-tracker", + "bugs": "https://github.com/snowplow/snowplow-javascript-tracker/issues", + "repository": { + "type": "git", + "url": "https://github.com/snowplow/snowplow-javascript-tracker.git" + }, + "license": "BSD-3-Clause", + "author": "Snowplow Analytics Ltd (https://snowplow.io/)", + "sideEffects": false, + "main": "./dist/index.umd.js", + "module": "./dist/index.module.js", + "types": "./dist/index.module.d.ts", + "files": [ + "dist" + ], + "scripts": { + "build": "rollup -c --silent --failAfterWarnings", + "test": "jest" + }, + "dependencies": { + "@fingerprintjs/botd": "2.0.0", + "@snowplow/browser-tracker-core": "workspace:*", + "@snowplow/tracker-core": "workspace:*", + "tslib": "^2.3.1" + }, + "devDependencies": { + "@rollup/plugin-commonjs": "~21.0.2", + "@rollup/plugin-node-resolve": "~13.1.3", + "@types/jest": "~28.1.1", + "@types/jsdom": "~16.2.14", + "@typescript-eslint/eslint-plugin": "~5.15.0", + "@typescript-eslint/parser": "~5.15.0", + "eslint": "~8.11.0", + "jest": "~28.1.3", + "jest-environment-jsdom": "~28.1.3", + "jest-environment-jsdom-global": "~4.0.0", + "jest-standard-reporter": "~2.0.0", + "rollup": "~2.70.1", + "rollup-plugin-cleanup": "~3.2.1", + "rollup-plugin-license": "~2.6.1", + "rollup-plugin-terser": "~7.0.2", + "rollup-plugin-ts": "~2.0.5", + "ts-jest": "~28.0.8", + "typescript": "~4.6.2" + }, + "peerDependencies": { + "@snowplow/browser-tracker": "~4.10.1" + } +} diff --git a/plugins/browser-plugin-bot-detection/rollup.config.js b/plugins/browser-plugin-bot-detection/rollup.config.js new file mode 100644 index 000000000..f9d815c79 --- /dev/null +++ b/plugins/browser-plugin-bot-detection/rollup.config.js @@ -0,0 +1,36 @@ +import { nodeResolve } from '@rollup/plugin-node-resolve'; +import commonjs from '@rollup/plugin-commonjs'; +import ts from 'rollup-plugin-ts'; // Preferred over @rollup/plugin-typescript as it bundles .d.ts files +import { banner } from '../../banner'; +import { terser } from 'rollup-plugin-terser'; +import cleanup from 'rollup-plugin-cleanup'; +import pkg from './package.json'; +import { builtinModules } from 'module'; + +const umdPlugins = [nodeResolve({ browser: true }), commonjs(), ts()]; +const umdName = 'snowplowBotDetection'; + +export default [ + // CommonJS (for Node) and ES module (for bundlers) build. + { + input: './src/index.ts', + plugins: [...umdPlugins, banner()], + treeshake: { moduleSideEffects: ['sha1'] }, + output: [{ file: pkg.main, format: 'umd', sourcemap: true, name: umdName }], + }, + { + input: './src/index.ts', + plugins: [...umdPlugins, terser(), cleanup({ comments: 'none' }), banner()], + treeshake: { moduleSideEffects: ['sha1'] }, + output: [{ file: pkg.main.replace('.js', '.min.js'), format: 'umd', sourcemap: true, name: umdName }], + }, + { + input: './src/index.ts', + external: [...builtinModules, ...Object.keys(pkg.dependencies), ...Object.keys(pkg.devDependencies)], + plugins: [ + ts(), // so Rollup can convert TypeScript to JavaScript + banner(), + ], + output: [{ file: pkg.module, format: 'es', sourcemap: true }], + }, +]; diff --git a/plugins/browser-plugin-bot-detection/src/detectors.ts b/plugins/browser-plugin-bot-detection/src/detectors.ts new file mode 100644 index 000000000..d3332e4dd --- /dev/null +++ b/plugins/browser-plugin-bot-detection/src/detectors.ts @@ -0,0 +1,13 @@ +import { detectors } from '@fingerprintjs/botd'; + +type Detector = (typeof detectors)[keyof typeof detectors]; + +/** + * BotD's default detectors, minus `detectPluginsLengthInconsistency`. + * + * This detector is considered spurious, see https://github.com/fingerprintjs/BotD/pull/194. + * + * TODO: remove once the PR is merged upstream. + */ +export const activeDetectors: Record = { ...detectors }; +delete activeDetectors.detectPluginsLengthInconsistency; diff --git a/plugins/browser-plugin-bot-detection/src/index.ts b/plugins/browser-plugin-bot-detection/src/index.ts new file mode 100644 index 000000000..653faab7a --- /dev/null +++ b/plugins/browser-plugin-bot-detection/src/index.ts @@ -0,0 +1,35 @@ +import { BrowserPlugin } from '@snowplow/browser-tracker-core'; +import { LOG } from '@snowplow/tracker-core'; +import { collect, detect, sources } from '@fingerprintjs/botd'; +import { CLIENT_SIDE_BOT_DETECTION_SCHEMA } from './schemata'; +import { activeDetectors } from './detectors'; +import { BotDetectionContextData } from './types'; + +export { BotDetectionContextData, BotKind } from './types'; + +let contextData: BotDetectionContextData | undefined; +let detectionStarted = false; + +export function BotDetectionPlugin(): BrowserPlugin { + return { + activateBrowserPlugin: () => { + if (!detectionStarted) { + detectionStarted = true; + // Equivalent to BotD's `load().then((d) => d.detect())`, + // but with our own detector set (see `./detectors`) + collect(sources) + .then((components) => detect(components, activeDetectors)[1]) + .then((result) => { + contextData = result.bot ? { bot: true, kind: result.botKind } : { bot: false, kind: null }; + }) + .catch((err) => LOG.error('BotDetectionPlugin: BotD collect/detect failed', err)); + } + }, + contexts: () => { + if (contextData) { + return [{ schema: CLIENT_SIDE_BOT_DETECTION_SCHEMA, data: contextData }]; + } + return []; + }, + }; +} diff --git a/plugins/browser-plugin-bot-detection/src/schemata.ts b/plugins/browser-plugin-bot-detection/src/schemata.ts new file mode 100644 index 000000000..af05d9f6a --- /dev/null +++ b/plugins/browser-plugin-bot-detection/src/schemata.ts @@ -0,0 +1,2 @@ +export const CLIENT_SIDE_BOT_DETECTION_SCHEMA = + 'iglu:com.snowplowanalytics.snowplow/client_side_bot_detection/jsonschema/1-0-0'; diff --git a/plugins/browser-plugin-bot-detection/src/types.ts b/plugins/browser-plugin-bot-detection/src/types.ts new file mode 100644 index 000000000..f374b478d --- /dev/null +++ b/plugins/browser-plugin-bot-detection/src/types.ts @@ -0,0 +1,25 @@ +export type BotKind = + | 'awesomium' + | 'cef' + | 'cefsharp' + | 'coachjs' + | 'electron' + | 'fminer' + | 'geb' + | 'nightmarejs' + | 'phantomas' + | 'phantomjs' + | 'rhino' + | 'selenium' + | 'sequentum' + | 'slimerjs' + | 'webdriverio' + | 'webdriver' + | 'headless_chrome' + | 'unknown'; + +export interface BotDetectionContextData { + [key: string]: unknown; + bot: boolean; + kind: BotKind | null; +} diff --git a/plugins/browser-plugin-bot-detection/test/bot-detection.test.ts b/plugins/browser-plugin-bot-detection/test/bot-detection.test.ts new file mode 100644 index 000000000..df857d49c --- /dev/null +++ b/plugins/browser-plugin-bot-detection/test/bot-detection.test.ts @@ -0,0 +1,149 @@ +import { buildLinkClick, trackerCore } from '@snowplow/tracker-core'; +import { BrowserTracker } from '@snowplow/browser-tracker-core'; +import { setImmediate } from 'timers'; + +const flushPromises = () => new Promise(setImmediate); + +let mockDetectResult: any = { bot: false }; +let mockCollectReject: Error | null = null; +let mockDetectThrow: Error | null = null; + +jest.mock('@fingerprintjs/botd', () => ({ + ...jest.requireActual('@fingerprintjs/botd'), + collect: () => { + if (mockCollectReject) { + return Promise.reject(mockCollectReject); + } + return Promise.resolve({}); + }, + detect: () => { + if (mockDetectThrow) { + throw mockDetectThrow; + } + return [{}, mockDetectResult]; + }, +})); + +describe('BotDetectionPlugin', () => { + beforeEach(() => { + jest.resetModules(); + mockDetectResult = { bot: false }; + mockCollectReject = null; + mockDetectThrow = null; + }); + + it('attaches bot context when a bot is detected', async () => { + mockDetectResult = { bot: true, botKind: 'selenium' }; + + const { BotDetectionPlugin } = require('../src'); + const plugin = BotDetectionPlugin(); + + const core = trackerCore({ + corePlugins: [plugin], + callback: (payloadBuilder) => { + const json = payloadBuilder.getJson().filter((e) => e.keyIfEncoded === 'cx'); + const contexts = json[0]?.json; + expect(contexts).toEqual({ + schema: 'iglu:com.snowplowanalytics.snowplow/contexts/jsonschema/1-0-0', + data: [ + { + schema: 'iglu:com.snowplowanalytics.snowplow/client_side_bot_detection/jsonschema/1-0-0', + data: { bot: true, kind: 'selenium' }, + }, + ], + }); + }, + }); + + plugin.activateBrowserPlugin?.({ core } as BrowserTracker); + await flushPromises(); + + core.track(buildLinkClick({ targetUrl: 'https://example.com' })); + }); + + it('attaches no-bot context when no bot is detected', async () => { + mockDetectResult = { bot: false }; + + const { BotDetectionPlugin } = require('../src'); + const plugin = BotDetectionPlugin(); + + const core = trackerCore({ + corePlugins: [plugin], + callback: (payloadBuilder) => { + const json = payloadBuilder.getJson().filter((e) => e.keyIfEncoded === 'cx'); + const contexts = json[0]?.json; + expect(contexts).toEqual({ + schema: 'iglu:com.snowplowanalytics.snowplow/contexts/jsonschema/1-0-0', + data: [ + { + schema: 'iglu:com.snowplowanalytics.snowplow/client_side_bot_detection/jsonschema/1-0-0', + data: { bot: false, kind: null }, + }, + ], + }); + }, + }); + + plugin.activateBrowserPlugin?.({ core } as BrowserTracker); + await flushPromises(); + + core.track(buildLinkClick({ targetUrl: 'https://example.com' })); + }); + + it('returns empty contexts while detection is pending', () => { + const { BotDetectionPlugin } = require('../src'); + const plugin = BotDetectionPlugin(); + + const core = trackerCore({ + corePlugins: [plugin], + callback: (payloadBuilder) => { + const json = payloadBuilder.getJson().filter((e) => e.keyIfEncoded === 'cx'); + expect(json).toHaveLength(0); + }, + }); + + plugin.activateBrowserPlugin?.({ core } as BrowserTracker); + // Do NOT await — detection is still pending + core.track(buildLinkClick({ targetUrl: 'https://example.com' })); + }); + + it('returns empty contexts when collect() fails', async () => { + mockCollectReject = new Error('collect failed'); + + const { BotDetectionPlugin } = require('../src'); + const plugin = BotDetectionPlugin(); + + const core = trackerCore({ + corePlugins: [plugin], + callback: (payloadBuilder) => { + const json = payloadBuilder.getJson().filter((e) => e.keyIfEncoded === 'cx'); + expect(json).toHaveLength(0); + }, + }); + + plugin.activateBrowserPlugin?.({ core } as BrowserTracker); + await flushPromises(); + + core.track(buildLinkClick({ targetUrl: 'https://example.com' })); + }); + + it('returns empty contexts when detect() fails', async () => { + mockDetectThrow = new Error('detect failed'); + + const { BotDetectionPlugin } = require('../src'); + const plugin = BotDetectionPlugin(); + + const core = trackerCore({ + corePlugins: [plugin], + callback: (payloadBuilder) => { + const json = payloadBuilder.getJson().filter((e) => e.keyIfEncoded === 'cx'); + expect(json).toHaveLength(0); + }, + }); + + plugin.activateBrowserPlugin?.({ core } as BrowserTracker); + await flushPromises(); + + core.track(buildLinkClick({ targetUrl: 'https://example.com' })); + }); +}); diff --git a/plugins/browser-plugin-bot-detection/tsconfig.json b/plugins/browser-plugin-bot-detection/tsconfig.json new file mode 100644 index 000000000..4082f16a5 --- /dev/null +++ b/plugins/browser-plugin-bot-detection/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "../../tsconfig.json" +} diff --git a/plugins/browser-plugin-button-click-tracking/CHANGELOG.json b/plugins/browser-plugin-button-click-tracking/CHANGELOG.json index 9f66898ed..d8af14dbd 100644 --- a/plugins/browser-plugin-button-click-tracking/CHANGELOG.json +++ b/plugins/browser-plugin-button-click-tracking/CHANGELOG.json @@ -1,6 +1,189 @@ { "name": "@snowplow/browser-plugin-button-click-tracking", "entries": [ + { + "version": "4.10.1", + "tag": "@snowplow/browser-plugin-button-click-tracking_v4.10.1", + "date": "Wed, 19 Aug 2026 14:26:05 GMT", + "comments": {} + }, + { + "version": "4.10.0", + "tag": "@snowplow/browser-plugin-button-click-tracking_v4.10.0", + "date": "Mon, 27 Jul 2026 13:52:14 GMT", + "comments": {} + }, + { + "version": "4.9.0", + "tag": "@snowplow/browser-plugin-button-click-tracking_v4.9.0", + "date": "Tue, 21 Jul 2026 14:53:08 GMT", + "comments": {} + }, + { + "version": "4.8.4", + "tag": "@snowplow/browser-plugin-button-click-tracking_v4.8.4", + "date": "Thu, 02 Jul 2026 10:07:52 GMT", + "comments": {} + }, + { + "version": "4.8.3", + "tag": "@snowplow/browser-plugin-button-click-tracking_v4.8.3", + "date": "Tue, 30 Jun 2026 14:22:03 GMT", + "comments": { + "none": [ + { + "comment": "Update uuid to v11 and remove closure-compiler from the build pipeline" + } + ] + } + }, + { + "version": "4.8.2", + "tag": "@snowplow/browser-plugin-button-click-tracking_v4.8.2", + "date": "Wed, 17 Jun 2026 12:30:12 GMT", + "comments": {} + }, + { + "version": "4.8.1", + "tag": "@snowplow/browser-plugin-button-click-tracking_v4.8.1", + "date": "Wed, 13 May 2026 09:26:05 GMT", + "comments": {} + }, + { + "version": "4.8.0", + "tag": "@snowplow/browser-plugin-button-click-tracking_v4.8.0", + "date": "Tue, 28 Apr 2026 07:56:22 GMT", + "comments": {} + }, + { + "version": "4.7.0", + "tag": "@snowplow/browser-plugin-button-click-tracking_v4.7.0", + "date": "Wed, 01 Apr 2026 12:59:29 GMT", + "comments": {} + }, + { + "version": "4.6.9", + "tag": "@snowplow/browser-plugin-button-click-tracking_v4.6.9", + "date": "Mon, 16 Mar 2026 15:43:06 GMT", + "comments": {} + }, + { + "version": "4.6.8", + "tag": "@snowplow/browser-plugin-button-click-tracking_v4.6.8", + "date": "Tue, 28 Oct 2025 09:46:42 GMT", + "comments": {} + }, + { + "version": "4.6.7", + "tag": "@snowplow/browser-plugin-button-click-tracking_v4.6.7", + "date": "Tue, 07 Oct 2025 14:53:36 GMT", + "comments": {} + }, + { + "version": "4.6.6", + "tag": "@snowplow/browser-plugin-button-click-tracking_v4.6.6", + "date": "Tue, 26 Aug 2025 08:42:27 GMT", + "comments": {} + }, + { + "version": "4.6.5", + "tag": "@snowplow/browser-plugin-button-click-tracking_v4.6.5", + "date": "Wed, 25 Jun 2025 21:16:46 GMT", + "comments": {} + }, + { + "version": "4.6.4", + "tag": "@snowplow/browser-plugin-button-click-tracking_v4.6.4", + "date": "Wed, 25 Jun 2025 12:08:50 GMT", + "comments": {} + }, + { + "version": "4.6.3", + "tag": "@snowplow/browser-plugin-button-click-tracking_v4.6.3", + "date": "Thu, 29 May 2025 19:52:07 GMT", + "comments": {} + }, + { + "version": "4.6.2", + "tag": "@snowplow/browser-plugin-button-click-tracking_v4.6.2", + "date": "Tue, 20 May 2025 07:39:05 GMT", + "comments": {} + }, + { + "version": "4.6.1", + "tag": "@snowplow/browser-plugin-button-click-tracking_v4.6.1", + "date": "Tue, 06 May 2025 13:10:51 GMT", + "comments": {} + }, + { + "version": "4.6.0", + "tag": "@snowplow/browser-plugin-button-click-tracking_v4.6.0", + "date": "Thu, 01 May 2025 09:58:59 GMT", + "comments": {} + }, + { + "version": "4.5.0", + "tag": "@snowplow/browser-plugin-button-click-tracking_v4.5.0", + "date": "Fri, 04 Apr 2025 09:21:23 GMT", + "comments": { + "none": [ + { + "comment": "Allow per-tracker disabling" + }, + { + "comment": "Add default label to avoid bad events" + } + ] + } + }, + { + "version": "4.4.0", + "tag": "@snowplow/browser-plugin-button-click-tracking_v4.4.0", + "date": "Thu, 20 Mar 2025 12:14:34 GMT", + "comments": {} + }, + { + "version": "4.3.1", + "tag": "@snowplow/browser-plugin-button-click-tracking_v4.3.1", + "date": "Tue, 21 Jan 2025 11:09:42 GMT", + "comments": {} + }, + { + "version": "4.3.0", + "tag": "@snowplow/browser-plugin-button-click-tracking_v4.3.0", + "date": "Mon, 20 Jan 2025 11:45:13 GMT", + "comments": {} + }, + { + "version": "4.2.0", + "tag": "@snowplow/browser-plugin-button-click-tracking_v4.2.0", + "date": "Mon, 13 Jan 2025 08:30:05 GMT", + "comments": {} + }, + { + "version": "4.1.0", + "tag": "@snowplow/browser-plugin-button-click-tracking_v4.1.0", + "date": "Thu, 28 Nov 2024 10:57:30 GMT", + "comments": { + "none": [ + { + "comment": "Pass clicked element to dynamic context functions for button click tracking plugin (#1368)" + } + ] + } + }, + { + "version": "4.0.4", + "tag": "@snowplow/browser-plugin-button-click-tracking_v4.0.4", + "date": "Thu, 21 Nov 2024 09:06:36 GMT", + "comments": {} + }, + { + "version": "4.0.3", + "tag": "@snowplow/browser-plugin-button-click-tracking_v4.0.3", + "date": "Wed, 20 Nov 2024 09:30:31 GMT", + "comments": {} + }, { "version": "4.0.2", "tag": "@snowplow/browser-plugin-button-click-tracking_v4.0.2", diff --git a/plugins/browser-plugin-button-click-tracking/CHANGELOG.md b/plugins/browser-plugin-button-click-tracking/CHANGELOG.md index 209f5f8ab..1a258b14f 100644 --- a/plugins/browser-plugin-button-click-tracking/CHANGELOG.md +++ b/plugins/browser-plugin-button-click-tracking/CHANGELOG.md @@ -1,6 +1,148 @@ # Change Log - @snowplow/browser-plugin-button-click-tracking -This log was last generated on Mon, 11 Nov 2024 15:46:33 GMT and should not be manually modified. +This log was last generated on Wed, 19 Aug 2026 14:26:05 GMT and should not be manually modified. + +## 4.10.1 +Wed, 19 Aug 2026 14:26:05 GMT + +_Version update only_ + +## 4.10.0 +Mon, 27 Jul 2026 13:52:14 GMT + +_Version update only_ + +## 4.9.0 +Tue, 21 Jul 2026 14:53:08 GMT + +_Version update only_ + +## 4.8.4 +Thu, 02 Jul 2026 10:07:52 GMT + +_Version update only_ + +## 4.8.3 +Tue, 30 Jun 2026 14:22:03 GMT + +### Updates + +- Update uuid to v11 and remove closure-compiler from the build pipeline + +## 4.8.2 +Wed, 17 Jun 2026 12:30:12 GMT + +_Version update only_ + +## 4.8.1 +Wed, 13 May 2026 09:26:05 GMT + +_Version update only_ + +## 4.8.0 +Tue, 28 Apr 2026 07:56:22 GMT + +_Version update only_ + +## 4.7.0 +Wed, 01 Apr 2026 12:59:29 GMT + +_Version update only_ + +## 4.6.9 +Mon, 16 Mar 2026 15:43:06 GMT + +_Version update only_ + +## 4.6.8 +Tue, 28 Oct 2025 09:46:42 GMT + +_Version update only_ + +## 4.6.7 +Tue, 07 Oct 2025 14:53:36 GMT + +_Version update only_ + +## 4.6.6 +Tue, 26 Aug 2025 08:42:27 GMT + +_Version update only_ + +## 4.6.5 +Wed, 25 Jun 2025 21:16:46 GMT + +_Version update only_ + +## 4.6.4 +Wed, 25 Jun 2025 12:08:50 GMT + +_Version update only_ + +## 4.6.3 +Thu, 29 May 2025 19:52:07 GMT + +_Version update only_ + +## 4.6.2 +Tue, 20 May 2025 07:39:05 GMT + +_Version update only_ + +## 4.6.1 +Tue, 06 May 2025 13:10:51 GMT + +_Version update only_ + +## 4.6.0 +Thu, 01 May 2025 09:58:59 GMT + +_Version update only_ + +## 4.5.0 +Fri, 04 Apr 2025 09:21:23 GMT + +### Updates + +- Allow per-tracker disabling +- Add default label to avoid bad events + +## 4.4.0 +Thu, 20 Mar 2025 12:14:34 GMT + +_Version update only_ + +## 4.3.1 +Tue, 21 Jan 2025 11:09:42 GMT + +_Version update only_ + +## 4.3.0 +Mon, 20 Jan 2025 11:45:13 GMT + +_Version update only_ + +## 4.2.0 +Mon, 13 Jan 2025 08:30:05 GMT + +_Version update only_ + +## 4.1.0 +Thu, 28 Nov 2024 10:57:30 GMT + +### Updates + +- Pass clicked element to dynamic context functions for button click tracking plugin (#1368) + +## 4.0.4 +Thu, 21 Nov 2024 09:06:36 GMT + +_Version update only_ + +## 4.0.3 +Wed, 20 Nov 2024 09:30:31 GMT + +_Version update only_ ## 4.0.2 Mon, 11 Nov 2024 15:46:33 GMT diff --git a/plugins/browser-plugin-button-click-tracking/package.json b/plugins/browser-plugin-button-click-tracking/package.json index 617260670..2f63f74dd 100644 --- a/plugins/browser-plugin-button-click-tracking/package.json +++ b/plugins/browser-plugin-button-click-tracking/package.json @@ -1,6 +1,6 @@ { "name": "@snowplow/browser-plugin-button-click-tracking", - "version": "4.0.2", + "version": "4.10.1", "description": "Button Click tracking for Snowplow", "homepage": "https://github.com/snowplow/snowplow-javascript-tracker", "bugs": "https://github.com/snowplow/snowplow-javascript-tracker/issues", @@ -27,18 +27,17 @@ "tslib": "^2.3.1" }, "devDependencies": { - "@ampproject/rollup-plugin-closure-compiler": "~0.27.0", "@rollup/plugin-commonjs": "~21.0.2", "@rollup/plugin-node-resolve": "~13.1.3", - "@types/jest": "~27.4.1", + "@types/jest": "~28.1.1", "@types/jsdom": "~16.2.14", "@types/lodash": "~4.14.180", "@typescript-eslint/eslint-plugin": "~5.15.0", "@typescript-eslint/parser": "~5.15.0", "eslint": "~8.11.0", - "jest": "~27.5.1", - "jest-environment-jsdom": "~27.5.1", - "jest-environment-jsdom-global": "~3.0.0", + "jest": "~28.1.3", + "jest-environment-jsdom": "~28.1.3", + "jest-environment-jsdom-global": "~4.0.0", "jest-standard-reporter": "~2.0.0", "lodash": "~4.17.21", "rollup": "~2.70.1", @@ -46,10 +45,10 @@ "rollup-plugin-license": "~2.6.1", "rollup-plugin-terser": "~7.0.2", "rollup-plugin-ts": "~2.0.5", - "ts-jest": "~27.1.3", + "ts-jest": "~28.0.8", "typescript": "~4.6.2" }, "peerDependencies": { - "@snowplow/browser-tracker": "~4.0.2" + "@snowplow/browser-tracker": "~4.10.1" } } diff --git a/plugins/browser-plugin-button-click-tracking/rollup.config.js b/plugins/browser-plugin-button-click-tracking/rollup.config.js index 5654a26d7..6680f04e5 100644 --- a/plugins/browser-plugin-button-click-tracking/rollup.config.js +++ b/plugins/browser-plugin-button-click-tracking/rollup.config.js @@ -2,7 +2,6 @@ import { nodeResolve } from '@rollup/plugin-node-resolve'; import commonjs from '@rollup/plugin-commonjs'; import ts from 'rollup-plugin-ts'; // Prefered over @rollup/plugin-typescript as it bundles .d.ts files import { banner } from '../../banner'; -import compiler from '@ampproject/rollup-plugin-closure-compiler'; import { terser } from 'rollup-plugin-terser'; import cleanup from 'rollup-plugin-cleanup'; import pkg from './package.json'; @@ -21,7 +20,7 @@ export default [ }, { input: './src/index.ts', - plugins: [...umdPlugins, compiler(), terser(), cleanup({ comments: 'none' }), banner()], + plugins: [...umdPlugins, terser(), cleanup({ comments: 'none' }), banner()], treeshake: { moduleSideEffects: ['sha1'] }, output: [{ file: pkg.main.replace('.js', '.min.js'), format: 'umd', sourcemap: true, name: umdName }], }, diff --git a/plugins/browser-plugin-button-click-tracking/src/api.ts b/plugins/browser-plugin-button-click-tracking/src/api.ts index 51fb16d37..a8aa1bd2c 100644 --- a/plugins/browser-plugin-button-click-tracking/src/api.ts +++ b/plugins/browser-plugin-button-click-tracking/src/api.ts @@ -52,13 +52,19 @@ export function enableButtonClickTracking( ) { // Ensure that click tracking uses the latest configuration // In the case of `enableButtonClickTracking` being called multiple times in a row - disableButtonClickTracking(); + disableButtonClickTracking(trackers); trackers.forEach((trackerId) => { // Store the configuration for this tracker, if it doesn't already exist // This allows us to enable click tracking for a tracker if it has been disabled _listeners[trackerId] = (event: MouseEvent) => { - eventHandler(event, trackerId, filterFunctionFromFilter(configuration.filter), configuration.context); + eventHandler( + event, + trackerId, + filterFunctionFromFilter(configuration.filter), + configuration.defaultLabel, + configuration.context + ); }; const addClickListener = () => { @@ -80,12 +86,12 @@ export function enableButtonClickTracking( * * Can be re-enabled with {@link enableButtonClickTracking} */ -export function disableButtonClickTracking() { - for (const trackerId in _trackers) { +export function disableButtonClickTracking(trackers: Array = Object.keys(_trackers)) { + trackers.forEach((trackerId) => { if (_listeners[trackerId]) { document.removeEventListener('click', _listeners[trackerId], true); } - } + }); } /** @@ -96,13 +102,19 @@ export function disableButtonClickTracking() { * @param filter - The filter function to use for button click tracking * @param context - The dynamic context which will be evaluated for each button click event */ -function eventHandler(event: MouseEvent, trackerId: string, filter: FilterFunction, context?: DynamicContext) { +function eventHandler( + event: MouseEvent, + trackerId: string, + filter: FilterFunction, + defaultLabel?: string | ((element: HTMLElement) => string), + context?: DynamicContext +) { let elem = (event.composed ? event.composedPath()[0] : event.target) as HTMLElement | null; while (elem) { if (elem instanceof HTMLButtonElement || (elem instanceof HTMLInputElement && elem.type === 'button')) { if (filter(elem)) { - const buttonClickEvent = createEventFromButton(elem); - buttonClickEvent.context = resolveDynamicContext(context, buttonClickEvent); + const buttonClickEvent = createEventFromButton(elem, defaultLabel); + buttonClickEvent.context = resolveDynamicContext(context, buttonClickEvent, elem); trackButtonClick(buttonClickEvent, [trackerId]); } // presume nested buttons aren't a thing diff --git a/plugins/browser-plugin-button-click-tracking/src/types.ts b/plugins/browser-plugin-button-click-tracking/src/types.ts index 936e7b7b8..ce750b049 100644 --- a/plugins/browser-plugin-button-click-tracking/src/types.ts +++ b/plugins/browser-plugin-button-click-tracking/src/types.ts @@ -18,6 +18,8 @@ export interface ButtonClickTrackingConfiguration { filter?: Filter; /** The dynamic context which will be evaluated for each button click event */ context?: DynamicContext; + /** A default label to use if one can not be determined by the content or data attributes */ + defaultLabel?: string | ((element: HTMLElement) => string); } /** diff --git a/plugins/browser-plugin-button-click-tracking/src/util.ts b/plugins/browser-plugin-button-click-tracking/src/util.ts index 4c4a99982..078674c2e 100644 --- a/plugins/browser-plugin-button-click-tracking/src/util.ts +++ b/plugins/browser-plugin-button-click-tracking/src/util.ts @@ -42,14 +42,19 @@ export function filterFunctionFromFilter(filter?: Filter): FilterFunction { * @returns The button click event */ export function createEventFromButton( - button: HTMLButtonElement | HTMLInputElement + button: HTMLButtonElement | HTMLInputElement, + defaultLabel?: string | ((element: HTMLElement) => string) ): ButtonClickEvent & CommonEventProperties { let ret = {} as ButtonClickEvent & CommonEventProperties; if (button.tagName === 'INPUT') { ret.label = button.dataset.spButtonLabel || button.value; } else { - ret.label = button.dataset.spButtonLabel || button.innerText; + ret.label = + button.dataset.spButtonLabel || + button.innerText || + (typeof defaultLabel === 'function' ? defaultLabel(button) : defaultLabel) || + '(empty)'; } button.id && (ret.id = button.id); diff --git a/plugins/browser-plugin-button-click-tracking/test/test.test.ts b/plugins/browser-plugin-button-click-tracking/test/test.test.ts index 97b2c47d0..29417dd73 100644 --- a/plugins/browser-plugin-button-click-tracking/test/test.test.ts +++ b/plugins/browser-plugin-button-click-tracking/test/test.test.ts @@ -145,6 +145,31 @@ describe('Button Click Tracking Plugin', () => { expect(createEventFromButton(button)).toEqual(event); }); + it('should use specified default label', () => { + const button = document.createElement('button'); + button.innerText = ''; + button.id = 'testId'; + button.className = 'testClass testClass2'; + button.name = 'testName'; + + const event1 = { + label: 'defaultLabel', + id: 'testId', + classes: ['testClass', 'testClass2'], + name: 'testName', + }; + + expect(createEventFromButton(button, 'defaultLabel')).toEqual(event1); + + const event2 = { + label: 'testClass testClass2', + id: 'testId', + classes: ['testClass', 'testClass2'], + name: 'testName', + }; + expect(createEventFromButton(button, (btn) => btn.className)).toEqual(event2); + }); + it('should prefer the data-sp-button-label attribute over the innerText', () => { const button = document.createElement('button'); button.innerText = 'testLabel'; diff --git a/plugins/browser-plugin-client-hints/CHANGELOG.json b/plugins/browser-plugin-client-hints/CHANGELOG.json index ee6898cba..3837d5317 100644 --- a/plugins/browser-plugin-client-hints/CHANGELOG.json +++ b/plugins/browser-plugin-client-hints/CHANGELOG.json @@ -1,6 +1,174 @@ { "name": "@snowplow/browser-plugin-client-hints", "entries": [ + { + "version": "4.10.1", + "tag": "@snowplow/browser-plugin-client-hints_v4.10.1", + "date": "Wed, 19 Aug 2026 14:26:05 GMT", + "comments": {} + }, + { + "version": "4.10.0", + "tag": "@snowplow/browser-plugin-client-hints_v4.10.0", + "date": "Mon, 27 Jul 2026 13:52:14 GMT", + "comments": {} + }, + { + "version": "4.9.0", + "tag": "@snowplow/browser-plugin-client-hints_v4.9.0", + "date": "Tue, 21 Jul 2026 14:53:08 GMT", + "comments": {} + }, + { + "version": "4.8.4", + "tag": "@snowplow/browser-plugin-client-hints_v4.8.4", + "date": "Thu, 02 Jul 2026 10:07:52 GMT", + "comments": {} + }, + { + "version": "4.8.3", + "tag": "@snowplow/browser-plugin-client-hints_v4.8.3", + "date": "Tue, 30 Jun 2026 14:22:03 GMT", + "comments": { + "none": [ + { + "comment": "Update uuid to v11 and remove closure-compiler from the build pipeline" + } + ] + } + }, + { + "version": "4.8.2", + "tag": "@snowplow/browser-plugin-client-hints_v4.8.2", + "date": "Wed, 17 Jun 2026 12:30:12 GMT", + "comments": {} + }, + { + "version": "4.8.1", + "tag": "@snowplow/browser-plugin-client-hints_v4.8.1", + "date": "Wed, 13 May 2026 09:26:05 GMT", + "comments": {} + }, + { + "version": "4.8.0", + "tag": "@snowplow/browser-plugin-client-hints_v4.8.0", + "date": "Tue, 28 Apr 2026 07:56:22 GMT", + "comments": {} + }, + { + "version": "4.7.0", + "tag": "@snowplow/browser-plugin-client-hints_v4.7.0", + "date": "Wed, 01 Apr 2026 12:59:29 GMT", + "comments": {} + }, + { + "version": "4.6.9", + "tag": "@snowplow/browser-plugin-client-hints_v4.6.9", + "date": "Mon, 16 Mar 2026 15:43:06 GMT", + "comments": {} + }, + { + "version": "4.6.8", + "tag": "@snowplow/browser-plugin-client-hints_v4.6.8", + "date": "Tue, 28 Oct 2025 09:46:42 GMT", + "comments": {} + }, + { + "version": "4.6.7", + "tag": "@snowplow/browser-plugin-client-hints_v4.6.7", + "date": "Tue, 07 Oct 2025 14:53:36 GMT", + "comments": {} + }, + { + "version": "4.6.6", + "tag": "@snowplow/browser-plugin-client-hints_v4.6.6", + "date": "Tue, 26 Aug 2025 08:42:27 GMT", + "comments": {} + }, + { + "version": "4.6.5", + "tag": "@snowplow/browser-plugin-client-hints_v4.6.5", + "date": "Wed, 25 Jun 2025 21:16:46 GMT", + "comments": {} + }, + { + "version": "4.6.4", + "tag": "@snowplow/browser-plugin-client-hints_v4.6.4", + "date": "Wed, 25 Jun 2025 12:08:50 GMT", + "comments": {} + }, + { + "version": "4.6.3", + "tag": "@snowplow/browser-plugin-client-hints_v4.6.3", + "date": "Thu, 29 May 2025 19:52:07 GMT", + "comments": {} + }, + { + "version": "4.6.2", + "tag": "@snowplow/browser-plugin-client-hints_v4.6.2", + "date": "Tue, 20 May 2025 07:39:05 GMT", + "comments": {} + }, + { + "version": "4.6.1", + "tag": "@snowplow/browser-plugin-client-hints_v4.6.1", + "date": "Tue, 06 May 2025 13:10:51 GMT", + "comments": {} + }, + { + "version": "4.6.0", + "tag": "@snowplow/browser-plugin-client-hints_v4.6.0", + "date": "Thu, 01 May 2025 09:58:59 GMT", + "comments": {} + }, + { + "version": "4.5.0", + "tag": "@snowplow/browser-plugin-client-hints_v4.5.0", + "date": "Fri, 04 Apr 2025 09:21:23 GMT", + "comments": {} + }, + { + "version": "4.4.0", + "tag": "@snowplow/browser-plugin-client-hints_v4.4.0", + "date": "Thu, 20 Mar 2025 12:14:34 GMT", + "comments": {} + }, + { + "version": "4.3.1", + "tag": "@snowplow/browser-plugin-client-hints_v4.3.1", + "date": "Tue, 21 Jan 2025 11:09:42 GMT", + "comments": {} + }, + { + "version": "4.3.0", + "tag": "@snowplow/browser-plugin-client-hints_v4.3.0", + "date": "Mon, 20 Jan 2025 11:45:13 GMT", + "comments": {} + }, + { + "version": "4.2.0", + "tag": "@snowplow/browser-plugin-client-hints_v4.2.0", + "date": "Mon, 13 Jan 2025 08:30:05 GMT", + "comments": {} + }, + { + "version": "4.1.0", + "tag": "@snowplow/browser-plugin-client-hints_v4.1.0", + "date": "Thu, 28 Nov 2024 10:57:30 GMT", + "comments": {} + }, + { + "version": "4.0.4", + "tag": "@snowplow/browser-plugin-client-hints_v4.0.4", + "date": "Thu, 21 Nov 2024 09:06:36 GMT", + "comments": {} + }, + { + "version": "4.0.3", + "tag": "@snowplow/browser-plugin-client-hints_v4.0.3", + "date": "Wed, 20 Nov 2024 09:30:31 GMT", + "comments": {} + }, { "version": "4.0.2", "tag": "@snowplow/browser-plugin-client-hints_v4.0.2", diff --git a/plugins/browser-plugin-client-hints/CHANGELOG.md b/plugins/browser-plugin-client-hints/CHANGELOG.md index affcae14c..360cd2154 100644 --- a/plugins/browser-plugin-client-hints/CHANGELOG.md +++ b/plugins/browser-plugin-client-hints/CHANGELOG.md @@ -1,6 +1,143 @@ # Change Log - @snowplow/browser-plugin-client-hints -This log was last generated on Mon, 11 Nov 2024 15:46:33 GMT and should not be manually modified. +This log was last generated on Wed, 19 Aug 2026 14:26:05 GMT and should not be manually modified. + +## 4.10.1 +Wed, 19 Aug 2026 14:26:05 GMT + +_Version update only_ + +## 4.10.0 +Mon, 27 Jul 2026 13:52:14 GMT + +_Version update only_ + +## 4.9.0 +Tue, 21 Jul 2026 14:53:08 GMT + +_Version update only_ + +## 4.8.4 +Thu, 02 Jul 2026 10:07:52 GMT + +_Version update only_ + +## 4.8.3 +Tue, 30 Jun 2026 14:22:03 GMT + +### Updates + +- Update uuid to v11 and remove closure-compiler from the build pipeline + +## 4.8.2 +Wed, 17 Jun 2026 12:30:12 GMT + +_Version update only_ + +## 4.8.1 +Wed, 13 May 2026 09:26:05 GMT + +_Version update only_ + +## 4.8.0 +Tue, 28 Apr 2026 07:56:22 GMT + +_Version update only_ + +## 4.7.0 +Wed, 01 Apr 2026 12:59:29 GMT + +_Version update only_ + +## 4.6.9 +Mon, 16 Mar 2026 15:43:06 GMT + +_Version update only_ + +## 4.6.8 +Tue, 28 Oct 2025 09:46:42 GMT + +_Version update only_ + +## 4.6.7 +Tue, 07 Oct 2025 14:53:36 GMT + +_Version update only_ + +## 4.6.6 +Tue, 26 Aug 2025 08:42:27 GMT + +_Version update only_ + +## 4.6.5 +Wed, 25 Jun 2025 21:16:46 GMT + +_Version update only_ + +## 4.6.4 +Wed, 25 Jun 2025 12:08:50 GMT + +_Version update only_ + +## 4.6.3 +Thu, 29 May 2025 19:52:07 GMT + +_Version update only_ + +## 4.6.2 +Tue, 20 May 2025 07:39:05 GMT + +_Version update only_ + +## 4.6.1 +Tue, 06 May 2025 13:10:51 GMT + +_Version update only_ + +## 4.6.0 +Thu, 01 May 2025 09:58:59 GMT + +_Version update only_ + +## 4.5.0 +Fri, 04 Apr 2025 09:21:23 GMT + +_Version update only_ + +## 4.4.0 +Thu, 20 Mar 2025 12:14:34 GMT + +_Version update only_ + +## 4.3.1 +Tue, 21 Jan 2025 11:09:42 GMT + +_Version update only_ + +## 4.3.0 +Mon, 20 Jan 2025 11:45:13 GMT + +_Version update only_ + +## 4.2.0 +Mon, 13 Jan 2025 08:30:05 GMT + +_Version update only_ + +## 4.1.0 +Thu, 28 Nov 2024 10:57:30 GMT + +_Version update only_ + +## 4.0.4 +Thu, 21 Nov 2024 09:06:36 GMT + +_Version update only_ + +## 4.0.3 +Wed, 20 Nov 2024 09:30:31 GMT + +_Version update only_ ## 4.0.2 Mon, 11 Nov 2024 15:46:33 GMT diff --git a/plugins/browser-plugin-client-hints/jest.config.js b/plugins/browser-plugin-client-hints/jest.config.js index bd3ea4e2a..87d15da9b 100644 --- a/plugins/browser-plugin-client-hints/jest.config.js +++ b/plugins/browser-plugin-client-hints/jest.config.js @@ -1,5 +1,6 @@ module.exports = { preset: 'ts-jest', reporters: ['jest-standard-reporter'], + setupFilesAfterEnv: ['../../setupTestGlobals.ts'], testEnvironment: 'jest-environment-jsdom-global', }; diff --git a/plugins/browser-plugin-client-hints/package.json b/plugins/browser-plugin-client-hints/package.json index 3e443c8ab..6586ced2f 100644 --- a/plugins/browser-plugin-client-hints/package.json +++ b/plugins/browser-plugin-client-hints/package.json @@ -1,6 +1,6 @@ { "name": "@snowplow/browser-plugin-client-hints", - "version": "4.0.2", + "version": "4.10.1", "description": "Attaches Client Hints to Snowplow events", "homepage": "http://bit.ly/sp-js", "bugs": "https://github.com/snowplow/snowplow-javascript-tracker/issues", @@ -26,28 +26,27 @@ "tslib": "^2.3.1" }, "devDependencies": { - "@ampproject/rollup-plugin-closure-compiler": "~0.27.0", "@rollup/plugin-commonjs": "~21.0.2", "@rollup/plugin-node-resolve": "~13.1.3", "@snowplow/tracker-core": "workspace:*", - "@types/jest": "~27.4.1", + "@types/jest": "~28.1.1", "@types/jsdom": "~16.2.14", "@typescript-eslint/eslint-plugin": "~5.15.0", "@typescript-eslint/parser": "~5.15.0", "eslint": "~8.11.0", - "jest": "~27.5.1", - "jest-environment-jsdom": "~27.5.1", - "jest-environment-jsdom-global": "~3.0.0", + "jest": "~28.1.3", + "jest-environment-jsdom": "~28.1.3", + "jest-environment-jsdom-global": "~4.0.0", "jest-standard-reporter": "~2.0.0", "rollup": "~2.70.1", "rollup-plugin-cleanup": "~3.2.1", "rollup-plugin-license": "~2.6.1", "rollup-plugin-terser": "~7.0.2", "rollup-plugin-ts": "~2.0.5", - "ts-jest": "~27.1.3", + "ts-jest": "~28.0.8", "typescript": "~4.6.2" }, "peerDependencies": { - "@snowplow/browser-tracker": "~4.0.2" + "@snowplow/browser-tracker": "~4.10.1" } } diff --git a/plugins/browser-plugin-client-hints/rollup.config.js b/plugins/browser-plugin-client-hints/rollup.config.js index dac6e4d83..f3aa0b7be 100644 --- a/plugins/browser-plugin-client-hints/rollup.config.js +++ b/plugins/browser-plugin-client-hints/rollup.config.js @@ -32,7 +32,6 @@ import { nodeResolve } from '@rollup/plugin-node-resolve'; import commonjs from '@rollup/plugin-commonjs'; import ts from 'rollup-plugin-ts'; // Prefered over @rollup/plugin-typescript as it bundles .d.ts files import { banner } from '../../banner'; -import compiler from '@ampproject/rollup-plugin-closure-compiler'; import { terser } from 'rollup-plugin-terser'; import cleanup from 'rollup-plugin-cleanup'; import pkg from './package.json'; @@ -51,7 +50,7 @@ export default [ }, { input: './src/index.ts', - plugins: [...umdPlugins, compiler(), terser(), cleanup({ comments: 'none' }), banner()], + plugins: [...umdPlugins, terser(), cleanup({ comments: 'none' }), banner()], treeshake: { moduleSideEffects: ['sha1'] }, output: [{ file: pkg.main.replace('.js', '.min.js'), format: 'umd', sourcemap: true, name: umdName }], }, diff --git a/plugins/browser-plugin-debugger/CHANGELOG.json b/plugins/browser-plugin-debugger/CHANGELOG.json index 0b468c788..8e0ed4bdc 100644 --- a/plugins/browser-plugin-debugger/CHANGELOG.json +++ b/plugins/browser-plugin-debugger/CHANGELOG.json @@ -1,6 +1,174 @@ { "name": "@snowplow/browser-plugin-debugger", "entries": [ + { + "version": "4.10.1", + "tag": "@snowplow/browser-plugin-debugger_v4.10.1", + "date": "Wed, 19 Aug 2026 14:26:05 GMT", + "comments": {} + }, + { + "version": "4.10.0", + "tag": "@snowplow/browser-plugin-debugger_v4.10.0", + "date": "Mon, 27 Jul 2026 13:52:14 GMT", + "comments": {} + }, + { + "version": "4.9.0", + "tag": "@snowplow/browser-plugin-debugger_v4.9.0", + "date": "Tue, 21 Jul 2026 14:53:08 GMT", + "comments": {} + }, + { + "version": "4.8.4", + "tag": "@snowplow/browser-plugin-debugger_v4.8.4", + "date": "Thu, 02 Jul 2026 10:07:52 GMT", + "comments": {} + }, + { + "version": "4.8.3", + "tag": "@snowplow/browser-plugin-debugger_v4.8.3", + "date": "Tue, 30 Jun 2026 14:22:03 GMT", + "comments": { + "none": [ + { + "comment": "Update uuid to v11 and remove closure-compiler from the build pipeline" + } + ] + } + }, + { + "version": "4.8.2", + "tag": "@snowplow/browser-plugin-debugger_v4.8.2", + "date": "Wed, 17 Jun 2026 12:30:12 GMT", + "comments": {} + }, + { + "version": "4.8.1", + "tag": "@snowplow/browser-plugin-debugger_v4.8.1", + "date": "Wed, 13 May 2026 09:26:05 GMT", + "comments": {} + }, + { + "version": "4.8.0", + "tag": "@snowplow/browser-plugin-debugger_v4.8.0", + "date": "Tue, 28 Apr 2026 07:56:22 GMT", + "comments": {} + }, + { + "version": "4.7.0", + "tag": "@snowplow/browser-plugin-debugger_v4.7.0", + "date": "Wed, 01 Apr 2026 12:59:29 GMT", + "comments": {} + }, + { + "version": "4.6.9", + "tag": "@snowplow/browser-plugin-debugger_v4.6.9", + "date": "Mon, 16 Mar 2026 15:43:06 GMT", + "comments": {} + }, + { + "version": "4.6.8", + "tag": "@snowplow/browser-plugin-debugger_v4.6.8", + "date": "Tue, 28 Oct 2025 09:46:42 GMT", + "comments": {} + }, + { + "version": "4.6.7", + "tag": "@snowplow/browser-plugin-debugger_v4.6.7", + "date": "Tue, 07 Oct 2025 14:53:36 GMT", + "comments": {} + }, + { + "version": "4.6.6", + "tag": "@snowplow/browser-plugin-debugger_v4.6.6", + "date": "Tue, 26 Aug 2025 08:42:27 GMT", + "comments": {} + }, + { + "version": "4.6.5", + "tag": "@snowplow/browser-plugin-debugger_v4.6.5", + "date": "Wed, 25 Jun 2025 21:16:46 GMT", + "comments": {} + }, + { + "version": "4.6.4", + "tag": "@snowplow/browser-plugin-debugger_v4.6.4", + "date": "Wed, 25 Jun 2025 12:08:50 GMT", + "comments": {} + }, + { + "version": "4.6.3", + "tag": "@snowplow/browser-plugin-debugger_v4.6.3", + "date": "Thu, 29 May 2025 19:52:07 GMT", + "comments": {} + }, + { + "version": "4.6.2", + "tag": "@snowplow/browser-plugin-debugger_v4.6.2", + "date": "Tue, 20 May 2025 07:39:05 GMT", + "comments": {} + }, + { + "version": "4.6.1", + "tag": "@snowplow/browser-plugin-debugger_v4.6.1", + "date": "Tue, 06 May 2025 13:10:51 GMT", + "comments": {} + }, + { + "version": "4.6.0", + "tag": "@snowplow/browser-plugin-debugger_v4.6.0", + "date": "Thu, 01 May 2025 09:58:59 GMT", + "comments": {} + }, + { + "version": "4.5.0", + "tag": "@snowplow/browser-plugin-debugger_v4.5.0", + "date": "Fri, 04 Apr 2025 09:21:23 GMT", + "comments": {} + }, + { + "version": "4.4.0", + "tag": "@snowplow/browser-plugin-debugger_v4.4.0", + "date": "Thu, 20 Mar 2025 12:14:34 GMT", + "comments": {} + }, + { + "version": "4.3.1", + "tag": "@snowplow/browser-plugin-debugger_v4.3.1", + "date": "Tue, 21 Jan 2025 11:09:42 GMT", + "comments": {} + }, + { + "version": "4.3.0", + "tag": "@snowplow/browser-plugin-debugger_v4.3.0", + "date": "Mon, 20 Jan 2025 11:45:13 GMT", + "comments": {} + }, + { + "version": "4.2.0", + "tag": "@snowplow/browser-plugin-debugger_v4.2.0", + "date": "Mon, 13 Jan 2025 08:30:05 GMT", + "comments": {} + }, + { + "version": "4.1.0", + "tag": "@snowplow/browser-plugin-debugger_v4.1.0", + "date": "Thu, 28 Nov 2024 10:57:30 GMT", + "comments": {} + }, + { + "version": "4.0.4", + "tag": "@snowplow/browser-plugin-debugger_v4.0.4", + "date": "Thu, 21 Nov 2024 09:06:36 GMT", + "comments": {} + }, + { + "version": "4.0.3", + "tag": "@snowplow/browser-plugin-debugger_v4.0.3", + "date": "Wed, 20 Nov 2024 09:30:31 GMT", + "comments": {} + }, { "version": "4.0.2", "tag": "@snowplow/browser-plugin-debugger_v4.0.2", diff --git a/plugins/browser-plugin-debugger/CHANGELOG.md b/plugins/browser-plugin-debugger/CHANGELOG.md index 4c5941294..0946791f4 100644 --- a/plugins/browser-plugin-debugger/CHANGELOG.md +++ b/plugins/browser-plugin-debugger/CHANGELOG.md @@ -1,6 +1,143 @@ # Change Log - @snowplow/browser-plugin-debugger -This log was last generated on Mon, 11 Nov 2024 15:46:33 GMT and should not be manually modified. +This log was last generated on Wed, 19 Aug 2026 14:26:05 GMT and should not be manually modified. + +## 4.10.1 +Wed, 19 Aug 2026 14:26:05 GMT + +_Version update only_ + +## 4.10.0 +Mon, 27 Jul 2026 13:52:14 GMT + +_Version update only_ + +## 4.9.0 +Tue, 21 Jul 2026 14:53:08 GMT + +_Version update only_ + +## 4.8.4 +Thu, 02 Jul 2026 10:07:52 GMT + +_Version update only_ + +## 4.8.3 +Tue, 30 Jun 2026 14:22:03 GMT + +### Updates + +- Update uuid to v11 and remove closure-compiler from the build pipeline + +## 4.8.2 +Wed, 17 Jun 2026 12:30:12 GMT + +_Version update only_ + +## 4.8.1 +Wed, 13 May 2026 09:26:05 GMT + +_Version update only_ + +## 4.8.0 +Tue, 28 Apr 2026 07:56:22 GMT + +_Version update only_ + +## 4.7.0 +Wed, 01 Apr 2026 12:59:29 GMT + +_Version update only_ + +## 4.6.9 +Mon, 16 Mar 2026 15:43:06 GMT + +_Version update only_ + +## 4.6.8 +Tue, 28 Oct 2025 09:46:42 GMT + +_Version update only_ + +## 4.6.7 +Tue, 07 Oct 2025 14:53:36 GMT + +_Version update only_ + +## 4.6.6 +Tue, 26 Aug 2025 08:42:27 GMT + +_Version update only_ + +## 4.6.5 +Wed, 25 Jun 2025 21:16:46 GMT + +_Version update only_ + +## 4.6.4 +Wed, 25 Jun 2025 12:08:50 GMT + +_Version update only_ + +## 4.6.3 +Thu, 29 May 2025 19:52:07 GMT + +_Version update only_ + +## 4.6.2 +Tue, 20 May 2025 07:39:05 GMT + +_Version update only_ + +## 4.6.1 +Tue, 06 May 2025 13:10:51 GMT + +_Version update only_ + +## 4.6.0 +Thu, 01 May 2025 09:58:59 GMT + +_Version update only_ + +## 4.5.0 +Fri, 04 Apr 2025 09:21:23 GMT + +_Version update only_ + +## 4.4.0 +Thu, 20 Mar 2025 12:14:34 GMT + +_Version update only_ + +## 4.3.1 +Tue, 21 Jan 2025 11:09:42 GMT + +_Version update only_ + +## 4.3.0 +Mon, 20 Jan 2025 11:45:13 GMT + +_Version update only_ + +## 4.2.0 +Mon, 13 Jan 2025 08:30:05 GMT + +_Version update only_ + +## 4.1.0 +Thu, 28 Nov 2024 10:57:30 GMT + +_Version update only_ + +## 4.0.4 +Thu, 21 Nov 2024 09:06:36 GMT + +_Version update only_ + +## 4.0.3 +Wed, 20 Nov 2024 09:30:31 GMT + +_Version update only_ ## 4.0.2 Mon, 11 Nov 2024 15:46:33 GMT diff --git a/plugins/browser-plugin-debugger/package.json b/plugins/browser-plugin-debugger/package.json index d57db2470..b21559a72 100644 --- a/plugins/browser-plugin-debugger/package.json +++ b/plugins/browser-plugin-debugger/package.json @@ -1,6 +1,6 @@ { "name": "@snowplow/browser-plugin-debugger", - "version": "4.0.2", + "version": "4.10.1", "description": "Debugger for Snowplow", "homepage": "http://bit.ly/sp-js", "bugs": "https://github.com/snowplow/snowplow-javascript-tracker/issues", @@ -28,28 +28,27 @@ "tslib": "^2.3.1" }, "devDependencies": { - "@ampproject/rollup-plugin-closure-compiler": "~0.27.0", "@rollup/plugin-commonjs": "~21.0.2", "@rollup/plugin-node-resolve": "~13.1.3", - "@types/jest": "~27.4.1", + "@types/jest": "~28.1.1", "@types/jsdom": "~16.2.14", "@types/randomcolor": "~0.5.5", "@typescript-eslint/eslint-plugin": "~5.15.0", "@typescript-eslint/parser": "~5.15.0", "eslint": "~8.11.0", - "jest": "~27.5.1", - "jest-environment-jsdom": "~27.5.1", - "jest-environment-jsdom-global": "~3.0.0", + "jest": "~28.1.3", + "jest-environment-jsdom": "~28.1.3", + "jest-environment-jsdom-global": "~4.0.0", "jest-standard-reporter": "~2.0.0", "rollup": "~2.70.1", "rollup-plugin-cleanup": "~3.2.1", "rollup-plugin-license": "~2.6.1", "rollup-plugin-terser": "~7.0.2", "rollup-plugin-ts": "~2.0.5", - "ts-jest": "~27.1.3", + "ts-jest": "~28.0.8", "typescript": "~4.6.2" }, "peerDependencies": { - "@snowplow/browser-tracker": "~4.0.2" + "@snowplow/browser-tracker": "~4.10.1" } } diff --git a/plugins/browser-plugin-debugger/rollup.config.js b/plugins/browser-plugin-debugger/rollup.config.js index 28464b11d..6ae9d968b 100644 --- a/plugins/browser-plugin-debugger/rollup.config.js +++ b/plugins/browser-plugin-debugger/rollup.config.js @@ -32,7 +32,6 @@ import { nodeResolve } from '@rollup/plugin-node-resolve'; import commonjs from '@rollup/plugin-commonjs'; import ts from 'rollup-plugin-ts'; // Prefered over @rollup/plugin-typescript as it bundles .d.ts files import { banner } from '../../banner'; -import compiler from '@ampproject/rollup-plugin-closure-compiler'; import { terser } from 'rollup-plugin-terser'; import cleanup from 'rollup-plugin-cleanup'; import pkg from './package.json'; @@ -51,7 +50,7 @@ export default [ }, { input: './src/index.ts', - plugins: [...umdPlugins, compiler(), terser(), cleanup({ comments: 'none' }), banner()], + plugins: [...umdPlugins, terser(), cleanup({ comments: 'none' }), banner()], treeshake: { moduleSideEffects: ['sha1'] }, output: [{ file: pkg.main.replace('.js', '.min.js'), format: 'umd', sourcemap: true, name: umdName }], }, diff --git a/plugins/browser-plugin-element-tracking/CHANGELOG.json b/plugins/browser-plugin-element-tracking/CHANGELOG.json new file mode 100644 index 000000000..1de2fbc04 --- /dev/null +++ b/plugins/browser-plugin-element-tracking/CHANGELOG.json @@ -0,0 +1,143 @@ +{ + "name": "@snowplow/browser-plugin-element-tracking", + "entries": [ + { + "version": "4.10.1", + "tag": "@snowplow/browser-plugin-element-tracking_v4.10.1", + "date": "Wed, 19 Aug 2026 14:26:05 GMT", + "comments": {} + }, + { + "version": "4.10.0", + "tag": "@snowplow/browser-plugin-element-tracking_v4.10.0", + "date": "Mon, 27 Jul 2026 13:52:14 GMT", + "comments": {} + }, + { + "version": "4.9.0", + "tag": "@snowplow/browser-plugin-element-tracking_v4.9.0", + "date": "Tue, 21 Jul 2026 14:53:08 GMT", + "comments": { + "none": [ + { + "comment": "Fix element tracking plugin sending element_index of 0 on expose_element and obscure_element events" + } + ] + } + }, + { + "version": "4.8.4", + "tag": "@snowplow/browser-plugin-element-tracking_v4.8.4", + "date": "Thu, 02 Jul 2026 10:07:52 GMT", + "comments": {} + }, + { + "version": "4.8.3", + "tag": "@snowplow/browser-plugin-element-tracking_v4.8.3", + "date": "Tue, 30 Jun 2026 14:22:03 GMT", + "comments": { + "none": [ + { + "comment": "Update uuid to v11 and remove closure-compiler from the build pipeline" + } + ] + } + }, + { + "version": "4.8.2", + "tag": "@snowplow/browser-plugin-element-tracking_v4.8.2", + "date": "Wed, 17 Jun 2026 12:30:12 GMT", + "comments": {} + }, + { + "version": "4.8.1", + "tag": "@snowplow/browser-plugin-element-tracking_v4.8.1", + "date": "Wed, 13 May 2026 09:26:05 GMT", + "comments": {} + }, + { + "version": "4.8.0", + "tag": "@snowplow/browser-plugin-element-tracking_v4.8.0", + "date": "Tue, 28 Apr 2026 07:56:22 GMT", + "comments": {} + }, + { + "version": "4.7.0", + "tag": "@snowplow/browser-plugin-element-tracking_v4.7.0", + "date": "Wed, 01 Apr 2026 12:59:29 GMT", + "comments": {} + }, + { + "version": "4.6.9", + "tag": "@snowplow/browser-plugin-element-tracking_v4.6.9", + "date": "Mon, 16 Mar 2026 15:43:06 GMT", + "comments": {} + }, + { + "version": "4.6.8", + "tag": "@snowplow/browser-plugin-element-tracking_v4.6.8", + "date": "Tue, 28 Oct 2025 09:46:42 GMT", + "comments": {} + }, + { + "version": "4.6.7", + "tag": "@snowplow/browser-plugin-element-tracking_v4.6.7", + "date": "Tue, 07 Oct 2025 14:53:36 GMT", + "comments": {} + }, + { + "version": "4.6.6", + "tag": "@snowplow/browser-plugin-element-tracking_v4.6.6", + "date": "Tue, 26 Aug 2025 08:42:27 GMT", + "comments": {} + }, + { + "version": "4.6.5", + "tag": "@snowplow/browser-plugin-element-tracking_v4.6.5", + "date": "Wed, 25 Jun 2025 21:16:46 GMT", + "comments": {} + }, + { + "version": "4.6.4", + "tag": "@snowplow/browser-plugin-element-tracking_v4.6.4", + "date": "Wed, 25 Jun 2025 12:08:50 GMT", + "comments": {} + }, + { + "version": "4.6.3", + "tag": "@snowplow/browser-plugin-element-tracking_v4.6.3", + "date": "Thu, 29 May 2025 19:52:07 GMT", + "comments": {} + }, + { + "version": "4.6.2", + "tag": "@snowplow/browser-plugin-element-tracking_v4.6.2", + "date": "Tue, 20 May 2025 07:39:05 GMT", + "comments": { + "none": [ + { + "comment": "Fix element_content schema implementation." + } + ] + } + }, + { + "version": "4.6.1", + "tag": "@snowplow/browser-plugin-element-tracking_v4.6.1", + "date": "Tue, 06 May 2025 13:10:51 GMT", + "comments": {} + }, + { + "version": "4.6.0", + "tag": "@snowplow/browser-plugin-element-tracking_v4.6.0", + "date": "Thu, 01 May 2025 09:58:59 GMT", + "comments": { + "none": [ + { + "comment": "Create element tracking plugin" + } + ] + } + } + ] +} diff --git a/plugins/browser-plugin-element-tracking/CHANGELOG.md b/plugins/browser-plugin-element-tracking/CHANGELOG.md new file mode 100644 index 000000000..b8047bbb1 --- /dev/null +++ b/plugins/browser-plugin-element-tracking/CHANGELOG.md @@ -0,0 +1,107 @@ +# Change Log - @snowplow/browser-plugin-element-tracking + +This log was last generated on Wed, 19 Aug 2026 14:26:05 GMT and should not be manually modified. + +## 4.10.1 +Wed, 19 Aug 2026 14:26:05 GMT + +_Version update only_ + +## 4.10.0 +Mon, 27 Jul 2026 13:52:14 GMT + +_Version update only_ + +## 4.9.0 +Tue, 21 Jul 2026 14:53:08 GMT + +### Updates + +- Fix element tracking plugin sending element_index of 0 on expose_element and obscure_element events + +## 4.8.4 +Thu, 02 Jul 2026 10:07:52 GMT + +_Version update only_ + +## 4.8.3 +Tue, 30 Jun 2026 14:22:03 GMT + +### Updates + +- Update uuid to v11 and remove closure-compiler from the build pipeline + +## 4.8.2 +Wed, 17 Jun 2026 12:30:12 GMT + +_Version update only_ + +## 4.8.1 +Wed, 13 May 2026 09:26:05 GMT + +_Version update only_ + +## 4.8.0 +Tue, 28 Apr 2026 07:56:22 GMT + +_Version update only_ + +## 4.7.0 +Wed, 01 Apr 2026 12:59:29 GMT + +_Version update only_ + +## 4.6.9 +Mon, 16 Mar 2026 15:43:06 GMT + +_Version update only_ + +## 4.6.8 +Tue, 28 Oct 2025 09:46:42 GMT + +_Version update only_ + +## 4.6.7 +Tue, 07 Oct 2025 14:53:36 GMT + +_Version update only_ + +## 4.6.6 +Tue, 26 Aug 2025 08:42:27 GMT + +_Version update only_ + +## 4.6.5 +Wed, 25 Jun 2025 21:16:46 GMT + +_Version update only_ + +## 4.6.4 +Wed, 25 Jun 2025 12:08:50 GMT + +_Version update only_ + +## 4.6.3 +Thu, 29 May 2025 19:52:07 GMT + +_Version update only_ + +## 4.6.2 +Tue, 20 May 2025 07:39:05 GMT + +### Updates + +- Fix element_content schema implementation. + +## 4.6.1 +Tue, 06 May 2025 13:10:51 GMT + +_Version update only_ + +## 4.6.0 +Thu, 01 May 2025 09:58:59 GMT + +### Updates + +- Create element tracking plugin + diff --git a/plugins/browser-plugin-element-tracking/LICENSE b/plugins/browser-plugin-element-tracking/LICENSE new file mode 100644 index 000000000..a311732d5 --- /dev/null +++ b/plugins/browser-plugin-element-tracking/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2023 Snowplow Analytics Ltd, 2010 Anthon Pang +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/plugins/browser-plugin-element-tracking/README.md b/plugins/browser-plugin-element-tracking/README.md new file mode 100644 index 000000000..c87e8931f --- /dev/null +++ b/plugins/browser-plugin-element-tracking/README.md @@ -0,0 +1,195 @@ +# Snowplow Element Tracking Plugin + +[![npm version][npm-image]][npm-url] +[![License][license-image]](LICENSE) + +Browser Plugin to be used with `@snowplow/browser-tracker`. + +This plugin allows tracking the addition/removal and visibility of page elements. + +## Maintainer quick start + +Part of the Snowplow JavaScript Tracker monorepo. +Build with [Node.js](https://nodejs.org/en/) (18 - 20) and [Rush](https://rushjs.io/). + +### Setup repository + +```bash +npm install -g @microsoft/rush +git clone https://github.com/snowplow/snowplow-javascript-tracker.git +rush update +``` + +## Package Installation + +With npm: + +```bash +npm install @snowplow/browser-plugin-element-tracking +``` + +## Usage + +Initialize your tracker with the SnowplowElementTrackingPlugin and then call `startElementTracking`: + +```js +import { newTracker } from '@snowplow/browser-tracker'; +import { SnowplowElementTrackingPlugin, startElementTracking } from '@snowplow/browser-plugin-element-tracking'; + +newTracker('sp1', '{{collector_url}}', { + appId: 'my-app-id', + plugins: [ SnowplowElementTrackingPlugin() ], +}); + +startElementTracking({ + elements: [ + {selector: '.newsletter-signup'} + ] +}); +``` + +### Configuration + +Configuration occurs primarily via the `elements` setting passed to `startElementTracking`. + +You can pass a single configuration or an array of multiple configurations. + +Each configuration requires a `selector`, with a CSS selector describing the elements the configuration applies to. +All other configuration is optional. + +You can label each configuration with the `name` property (if not specified, the `selector` is used as the `name`). +The `name` is used in the event payloads and matches the `element_name` of any entities specific to the target element(s). + +The settings control triggering events for: + +- `expose_element`: When a selected element enters the viewport, becoming visible +- `obscure_element`: When a selected element exists the viewport, no longer being visible +- `create_element`: When a selected element is created or exists in the document +- `destroy_element`: When a selected element is removed from or no longer found in the document + +Each of these events can be enabled, disabled, or configured more specifically. +By default, only `expose_element` is enabled. + +Rather than trigger events, configurations can also define the selected elements as "components", which can be listed as a `component_parents` entity for other events; or can have their current state attached to other events (such as page pings) via `element_statistics` entities. + +The plugin manages the following custom entities: + +- `element`: This is shared between all the above events. It contains the `element_name` from the matching configuration, and data about the element that generated the event. This includes the element's dimensions, position (relative to the viewport and document), how many elements matched it's selector (and the index of the element in question, if you selector matches multiple elements). It will also contain custom attributes you can extract from the element via the `details` configuration. +- `component_parents`: For the element generating the event, provides a list of components (defined by the `component` setting) that are ancestors of that element. +- `element_content`: You can also attach details about child elements of the element that matches your selector. E.g. you can select a recommendations widget, and then extract details about the individual recommendations within it. +- `element_statistics`: This entity can be attached to other events and provides a snapshot of what this plugin has observed at that point; it includes the current/smallest/largest dimensions so far, how long the element has existed since it was first observed, its current/maximum scroll depth, its total time in view, and how many times it has been visible in the viewport. + +A detailed example configuration follows: + +```javascript +snowplow('startElementTracking', { + elements: [ + // can be a single or array of many configurations; additive, can be called multiple times to add more configurations, but doesn't dedupe + { + selector: '.oncreate', // required: selector for element, relative to document scope by default + name: 'created div', // logical name: can be shared across multiple configs; defaults to `selector` if not specified; this is used in event payloads and as a key to reference entities + create: true, // track an event when the element is added to the DOM (or when plugin loads if already on page) (default: false) + destroy: true, // track an event when the element is removed from the DOM (or when plugin loads if already on page) (default: false) + expose: true, // track an event when the element intersects with the viewport (default: true) + obscure: true, // track an event when the element scrolls out of the viewport (default: false) + details: [ + // details can be extracted from the element and included in the entity + function (element) { + return { example: 'from a function' }; + }, // use a function that returns an object + { attributes: ['class'], selector: true }, // or declarative options; either as a single object or array elements if you want config re-use; this is less flexible but will be useful to Google Tag Manager where functions may not be able to reference DOM elements + { attributes: ['class'] }, // attributes: get the static/default attributes originally defined on the element when created + { properties: ['className'] }, // properties: get the dynamic/current attributes defined on the element + { dataset: ['example'] }, // dataset: extract values from dataset attributes + { child_text: { heading: 'h2' } }, // child_text: for each given name:selector pair, extract the textContent of the first child matching selector, if it has text content use that value with the given name; if there's no matching children it will try shadow children + { selector: true }, // selector: attach the matching CSS selector as an attribute; useful if you're using logical names but want to differentiate + { content: { textType: /text (\S+)/ } }, //content (map of regex patterns to match text against, first capture group used if detected); if no innerText, will try shadow innerText + ], + includeStats: ['page_ping'], // you can include a list of event names here; statistics about elements matching this configuration will be attached as entities to those events; event names don't have to be generated by this plugin so can include built-in events like page_pings or custom events + }, + { selector: 'nav', expose: false, component: true }, // `expose` is true by default so may need disabling; `component` means the name/selector is attached to the component_parents entity list for other events triggered on descendants + { + selector: 'div.toggled', // elements that exist but don't yet match the selector will count as created/destroyed if they later are changed to match it + name: 'mutated div', + create: true, + destroy: true, + expose: false, + obscure: false, + }, + { + selector: '.perpage.toggled', + name: 'perpage mutation', + create: { when: 'pageview' }, // for each type of event you can specify frequency caps for when the event will fire: never, always, once, element, pageview + destroy: { when: 'pageview' }, + /* + the frequency options are "per": + - per never will never track the event, effectively disabling the configuration + - per always will track an event every time it is eligible (e.g. every time on screen when scrolled past) + - per once will only track the event a single time for each configuration for the duration of the plugin instance; this reduces volume since only the first matching element will fire the event + - per element is like once, but for each individually matching element instance + - per pageview is like once, but useful for single-page-applications with long-lasting plugin instances where you may want to track the element on each virtual pageview + */ + expose: false, // `false` is equivalent to `when: never`, and `true` is `when: always` + obscure: false, + }, + { + name: 'recommendations', + selector: '.recommendations', + expose: { + // expose has more options than the other events: + minTimeMillis: 5000, // cumulative time in milliseconds that each matching element should be visible for before considered exposed + minPercentage: 0, // the minimum percentage of the element's area that should be visible before considering exposed; range 0.0 - 1.0 + minSize: 0, // the minimum size the element should be before being considered exposed; this can be used to ignore elements with 0 size + boundaryPixels: 0, // arbitrary margins to apply to the element when calculating minPercentage; can be a number to apply to all sides, 2-element array to specify vertical and horizontal, or 4-element array to specify margins for each size individually + }, + obscure: true, + component: true, + details: { child_text: ['h2'] }, + contents: [ + // content information can be extracted + { + name: 'recommendation-item', // contents can be named too + selector: 'li', // selectors are relative to the parent element + details: { content: { item_name: /.+/ } }, // content item details can be captured too + contents: { name: 'recommendation_image', selector: 'img', details: { attributes: ['alt'] } }, // you can descend contents like a tree + }, + ], + }, + { + name: 'shadow', + selector: 'button.shadow', + shadowSelector: 'shadow-host', // elements within custom components/shadow hosts require their hosts' selectors to be specified + shadowOnly: true, // if the selector could erroneously catch elements outside your shadow hosts, you can restrict it to only match in shadows; by default it will match elements in and out of shadow hosts if they match the selector + }, + ], +}); + +snowplow('getComponentListGenerator', function (componentGenerator, componentGeneratorWithDetail) { + // access a context generator aware of the startElementTracking "components" configuration + // this will attach the component_parents entity to events generated by these plugins that show the component hierarchy + snowplow('enableLinkClickTracking', { context: [componentGenerator] }); + snowplow('enableFormTracking', { context: [componentGenerator] }); + + // componentGeneratorWithDetail will also populate element_detail entities for each component, but may not be directly compatible with the above APIs +}); + +snowplow('endElementTracking', {elements: ['names']}); // stop tracking all configurations with given `name`s +snowplow('endElementTracking', {elementIds: ['id']}); // to be more specific, each configuration can also have an ID to remove explicitly +snowplow('endElementTracking', {filter: (config) => true}); // decide for yourself if the configuration should be removed; must explicitly return `true` to remove; "truthy" values will not count +snowplow('endElementTracking'); // stop tracking all elements and remove listeners +``` + + +## Copyright and license + +Licensed and distributed under the [BSD 3-Clause License](LICENSE) ([An OSI Approved License][osi]). + +Copyright (c) 2024 Snowplow Analytics Ltd. + +All rights reserved. + +[npm-url]: https://www.npmjs.com/package/@snowplow/browser-plugin-element-tracking +[npm-image]: https://img.shields.io/npm/v/@snowplow/browser-plugin-element-tracking +[docs]: https://docs.snowplowanalytics.com/docs/collecting-data/collecting-from-own-applications/javascript-tracker/ +[osi]: https://opensource.org/licenses/BSD-3-Clause +[license-image]: https://img.shields.io/npm/l/@snowplow/browser-plugin-element-tracking diff --git a/plugins/browser-plugin-element-tracking/jest.config.js b/plugins/browser-plugin-element-tracking/jest.config.js new file mode 100644 index 000000000..90f99fb5b --- /dev/null +++ b/plugins/browser-plugin-element-tracking/jest.config.js @@ -0,0 +1,6 @@ +module.exports = { + preset: 'ts-jest', + reporters: ['jest-standard-reporter'], + testEnvironment: 'jest-environment-jsdom-global', + setupFilesAfterEnv: ['../../setupTestGlobals.ts'], +}; diff --git a/plugins/browser-plugin-element-tracking/package.json b/plugins/browser-plugin-element-tracking/package.json new file mode 100644 index 000000000..47bfe0a2c --- /dev/null +++ b/plugins/browser-plugin-element-tracking/package.json @@ -0,0 +1,52 @@ +{ + "name": "@snowplow/browser-plugin-element-tracking", + "version": "4.10.1", + "description": "Snowplow element tracking", + "homepage": "https://github.com/snowplow/snowplow-javascript-tracker", + "bugs": "https://github.com/snowplow/snowplow-javascript-tracker/issues", + "repository": { + "type": "git", + "url": "https://github.com/snowplow/snowplow-javascript-tracker.git" + }, + "license": "BSD-3-Clause", + "author": "Snowplow Analytics Ltd (https://snowplow.io/)", + "sideEffects": false, + "main": "./dist/index.umd.js", + "module": "./dist/index.module.js", + "types": "./dist/index.module.d.ts", + "files": [ + "dist" + ], + "scripts": { + "build": "rollup -c --silent --failAfterWarnings", + "test": "jest" + }, + "dependencies": { + "@snowplow/browser-tracker-core": "workspace:*", + "@snowplow/tracker-core": "workspace:*", + "tslib": "^2.3.1" + }, + "devDependencies": { + "@rollup/plugin-commonjs": "~21.0.2", + "@rollup/plugin-node-resolve": "~13.1.3", + "@types/jest": "~28.1.1", + "@types/jsdom": "~16.2.14", + "@typescript-eslint/eslint-plugin": "~5.15.0", + "@typescript-eslint/parser": "~5.15.0", + "eslint": "~8.11.0", + "jest": "~28.1.3", + "jest-environment-jsdom": "~28.1.3", + "jest-environment-jsdom-global": "~4.0.0", + "jest-standard-reporter": "~2.0.0", + "rollup": "~2.70.1", + "rollup-plugin-cleanup": "~3.2.1", + "rollup-plugin-license": "~2.6.1", + "rollup-plugin-terser": "~7.0.2", + "rollup-plugin-ts": "~2.0.5", + "ts-jest": "~28.0.8", + "typescript": "~4.6.2" + }, + "peerDependencies": { + "@snowplow/browser-tracker": "~4.10.1" + } +} diff --git a/plugins/browser-plugin-element-tracking/rollup.config.js b/plugins/browser-plugin-element-tracking/rollup.config.js new file mode 100644 index 000000000..07574f559 --- /dev/null +++ b/plugins/browser-plugin-element-tracking/rollup.config.js @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2022 Snowplow Analytics Ltd, 2010 Anthon Pang + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +import { nodeResolve } from '@rollup/plugin-node-resolve'; +import commonjs from '@rollup/plugin-commonjs'; +import ts from 'rollup-plugin-ts'; // Preferred over @rollup/plugin-typescript as it bundles .d.ts files +import { banner } from '../../banner'; +import { terser } from 'rollup-plugin-terser'; +import cleanup from 'rollup-plugin-cleanup'; +import pkg from './package.json'; +import { builtinModules } from 'module'; + +const umdPlugins = [nodeResolve({ browser: true }), commonjs(), ts()]; +const umdName = 'snowplowElementTracking'; + +export default [ + // CommonJS (for Node) and ES module (for bundlers) build. + { + input: './src/index.ts', + plugins: [...umdPlugins, banner()], + treeshake: { moduleSideEffects: ['sha1'] }, + output: [{ file: pkg.main, format: 'umd', sourcemap: true, name: umdName }], + }, + { + input: './src/index.ts', + plugins: [...umdPlugins, terser(), cleanup({ comments: 'none' }), banner()], + treeshake: { moduleSideEffects: ['sha1'] }, + output: [{ file: pkg.main.replace('.js', '.min.js'), format: 'umd', sourcemap: true, name: umdName }], + }, + { + input: './src/index.ts', + external: [...builtinModules, ...Object.keys(pkg.dependencies), ...Object.keys(pkg.devDependencies)], + plugins: [ + ts(), // so Rollup can convert TypeScript to JavaScript + banner(), + ], + output: [{ file: pkg.module, format: 'es', sourcemap: true }], + }, +]; diff --git a/plugins/browser-plugin-element-tracking/src/api.ts b/plugins/browser-plugin-element-tracking/src/api.ts new file mode 100644 index 000000000..89e41496d --- /dev/null +++ b/plugins/browser-plugin-element-tracking/src/api.ts @@ -0,0 +1,594 @@ +import { + type BrowserPlugin, + type BrowserTracker, + dispatchToTrackersInCollection, +} from '@snowplow/browser-tracker-core'; +import { type Logger, SelfDescribingJson, buildSelfDescribingEvent } from '@snowplow/tracker-core'; + +import { baseComponentGenerator } from './components'; +import { + ConfigurationState, + checkConfig, + createContextMerger, + type Configuration, + type ContextProvider, + type ElementConfiguration, +} from './configuration'; +import { buildContentTree, evaluateDataSelector, getElementDetails } from './data'; +import { ElementStatus, aggregateStats, getState } from './elementsState'; +import { ComponentsEntity, ElementDetailsEntity, Entity, Events, Event } from './schemata'; +import { Frequency, type OneOrMany } from './types'; +import { getMatchingElements, nodeIsElement, shouldTrackExpose } from './util'; + +/** + * Parameters for startElementTracking. + */ +export type ElementTrackingConfiguration = { + /** + * Optional context generator or static contexts to apply/add to any events generated by this batch of element configurations. + */ + context?: ContextProvider; + /** + * Single or array of element configurations to start tracking events for. + */ + elements: OneOrMany; +}; + +/** + * Parameters for endElementTracking. + */ +export type ElementTrackingDisable = + | { + /** + * A list of configuration names to stop tracking. Configurations can share names so this may match multiple cases. + * Configurations with no explicit name use their selector as their name. + */ + elements: OneOrMany; + } + | { + /** + * A list of configuration IDs to stop tracking. Only a single Configuration is allowed to exist per ID so this can be used to target specific instances. + */ + elementIds: OneOrMany>; + } + | { + /** + * Custom predicate to return if each Configuration should be removed (`true`) or kept (`false`). + * @param configuration The filter function to decide if the Configuration should be removed or not. + * @returns + */ + filter: (configuration: Readonly) => boolean; + }; + +const trackers: Record = {}; +const configurations: Configuration[] = []; + +const WeakestSet = typeof WeakSet === 'undefined' ? Set : WeakSet; + +const trackedThisPage: Record> = { + [Events.ELEMENT_CREATE]: new Set(), + [Events.ELEMENT_DESTROY]: new Set(), + [Events.ELEMENT_EXPOSE]: new Set(), + [Events.ELEMENT_OBSCURE]: new Set(), +}; + +const trackedElements: Record> = { + [Events.ELEMENT_CREATE]: new WeakestSet(), + [Events.ELEMENT_DESTROY]: new WeakestSet(), + [Events.ELEMENT_EXPOSE]: new WeakestSet(), + [Events.ELEMENT_OBSCURE]: new WeakestSet(), +}; + +const trackedConfigs: Record> = { + [Events.ELEMENT_CREATE]: new WeakestSet(), + [Events.ELEMENT_DESTROY]: new WeakestSet(), + [Events.ELEMENT_EXPOSE]: new WeakestSet(), + [Events.ELEMENT_OBSCURE]: new WeakestSet(), +}; + +let LOG: Logger | undefined = undefined; +let mutationObserver: MutationObserver | false = false; +let intersectionObserver: IntersectionObserver | false = false; +let currentPageViewId: string = ''; + +/** + * Plugin for tracking the addition and removal of elements to a page and the visibility of those elements. + * @param param0 Plugin configuration. + * @param param0.ignoreNextPageView Only required when use per-pageview frequency configurations and the ordering vs the pageview event matters. Defaults to `true`, which means the next pageview event will be ignored and not count as resetting the per-pageview state; this is correct if you're calling startElementTracking before calling trackPageView. + * @returns + */ +export function SnowplowElementTrackingPlugin({ ignoreNextPageView = true } = {}): BrowserPlugin { + // book keeping for controlling behavior if activated before/after first pageview + // used when tracking `when: pageview` frequency + if (ignoreNextPageView) { + Object.values(trackedThisPage).forEach((trackedThisPage) => { + trackedThisPage.add('initial'); + }); + } + + return { + activateBrowserPlugin(tracker) { + trackers[tracker.id] = tracker; + currentPageViewId = tracker.getPageViewId(); + setupObservers(); + }, + afterTrack(payload) { + if (payload['e'] === 'pv') { + // update originating pageview id + const trackerName = payload['tna']; + if (typeof trackerName === 'string' && trackerName in trackers) { + currentPageViewId = trackers[trackerName].getPageViewId(); + } + + // re-set state for `when: pageview` frequency caps + Object.values(trackedThisPage).forEach((trackedThisPage) => { + // handle book-keeping from above + if (trackedThisPage.has('initial')) { + trackedThisPage.delete('initial'); + } else { + trackedThisPage.clear(); + } + }); + } + }, + beforeTrack(payload) { + // attach stat/component entities for configured events + const e = payload.getPayload()['e']; + let eventName: string; + + if (e === 'pv') eventName = 'page_view'; + else if (e === 'pp') eventName = 'page_ping'; + else if (e === 'se') eventName = 'event'; + else if (e === 'tr') eventName = 'transaction'; + else if (e === 'ti') eventName = 'transaction_item'; + else if (e === 'ue') { + const sdjData = payload.getJson(); + for (const sdjWithKey of sdjData) { + if (sdjWithKey.keyIfEncoded === 'ue_px') { + const schema = (sdjWithKey.json.data as SelfDescribingJson).schema; + eventName = schema.split('/')[1]; + } + } + } else return; + + configurations.forEach((config) => { + if (!config.includeStats.includes(eventName) && !config.includeStats.includes('*')) return; + const elements = getMatchingElements(config); + elements.forEach((elem, i, a) => { + payload.addContextEntity(aggregateStats(config.name, elem, i + 1, a.length)); + }); + }); + }, + logger(logger) { + LOG = logger; + }, + }; +} + +function setupObservers() { + if (!mutationObserver) { + mutationObserver = typeof MutationObserver === 'function' && new MutationObserver(mutationCallback); + if (mutationObserver) + mutationObserver.observe(document.documentElement, { + attributes: true, + childList: true, + subtree: true, + }); + } + intersectionObserver = + intersectionObserver || + (typeof IntersectionObserver === 'function' && new IntersectionObserver(intersectionCallback)); +} + +/** + * Start Element tracking for elements that match the given configuration(s). + * + * Invalid configurations will be ignored, but valid configurations in the same batch will still apply. + * + * You can call this multiple times with different batches of configurations. E.g. section-specific configs, different custom context, different tracker instance destinations. + * Configurations supplied in multiple calls will not be deduped unless an `id` is provided and it collides with previous `id` values. + * + * @param param0 Element Tracking configuration options containing a batch of element configurations and optionally, custom context. + * @param trackers A list of tracker instance names that should receive events generated by this batch of element configurations. If not provided, events go to all trackers the plugin has activated for. + * @returns + */ +export function startElementTracking( + { elements = [], context }: ElementTrackingConfiguration, + trackers?: Array +): void { + const elementConfigs = Array.isArray(elements) ? elements : [elements]; + + // may have stopped observers via `endElementTracking` + if (elementConfigs.length) setupObservers(); + + elementConfigs.forEach((config) => { + try { + const batchContext = createContextMerger(context, config.context); + const valid = checkConfig(config, batchContext, !!intersectionObserver, !!mutationObserver, LOG, trackers); + + // upsert by id if provided + if (valid.id) { + const existing = configurations.findIndex(({ id }) => id === valid.id); + if (existing > -1) { + configurations[existing] = valid; + } else configurations.push(valid); + } else configurations.push(valid); + } catch (e) { + LOG?.error('Failed to process Element Tracking configuration', e, config); + } + }); + + configurations.forEach((config) => { + const { expose, obscure, state } = config; + if (state === ConfigurationState.INITIAL) { + config.state = ConfigurationState.CONFIGURED; + + const elements = getMatchingElements(config); + + elements.forEach((element, i) => { + const state = getState(element, { originalPageViewId: currentPageViewId }); + + state.lastPosition = i; + state.matches.add(config); + + trackEvent(Events.ELEMENT_CREATE, config, element, { position: i + 1, matches: elements.length }); + + if (intersectionObserver && (expose.when !== Frequency.NEVER || obscure.when !== Frequency.NEVER)) { + intersectionObserver.observe(element); + } + }); + } + }); +} + +/** + * Stop tracking events for the configurations with the given names or IDs, or satisfying a custom predicate. + * If no parameters provided, removes all previous configurations. + * All element configurations have names, if not provided the `name` is the `selector` which is required. + * + * No considerations are made for tracker instance destinations. Use IDs or filters if you need specific routing options. + * @param remove Filter information for which element configurations should be removed. Omit to remove all configurations. + */ +export function endElementTracking(remove?: ElementTrackingDisable): void { + if (!remove) { + configurations.length = 0; + } else { + if ('elementIds' in remove) { + const { elementIds } = remove; + const idsToRemove = Array.isArray(elementIds) ? elementIds : [elementIds]; + + const remaining = configurations.filter(({ id }) => { + const shouldRemove = typeof id === 'string' && idsToRemove.includes(id); + return !shouldRemove; + }); + + configurations.splice(0, configurations.length, ...remaining); + } + + if ('elements' in remove) { + const { elements } = remove; + const elsToRemove = Array.isArray(elements) ? elements : [elements]; + + const remaining = configurations.filter(({ name }) => elsToRemove.includes(name)); + + configurations.splice(0, configurations.length, ...remaining); + } + + if ('filter' in remove && typeof remove.filter === 'function') { + const remaining = configurations.filter((config) => { + try { + return remove.filter(config) !== true; + } catch (e) { + return true; + } + }); + configurations.splice(0, configurations.length, ...remaining); + } + } + + if (!configurations.length) { + if (intersectionObserver) intersectionObserver.disconnect(); + if (mutationObserver) mutationObserver.disconnect(); + mutationObserver = intersectionObserver = false; + } +} + +const componentGenerator = baseComponentGenerator.bind(null, false, configurations) as ( + ...args: any[] +) => ComponentsEntity | null; +const detailedComponentGenerator = baseComponentGenerator.bind(null, true, configurations) as ( + ...args: any[] +) => [ComponentsEntity, ...ElementDetailsEntity[]] | null; + +/** + * Obtain access to functions that can determine details about any configured `component`s and return `component_parents` context for given elements. + * + * It returns two generator functions: + * - one returns a single `component_parents` entity, which lists the names of any defined components that are ancestors of the provided element + * - the second returns multiple entities, including `component_parents` plus any element_details information about each matching component + * + * When called, the generators will examine all parameters in order looking for: + * - an element to look for owning components of + * - a string to use as the element_name in the component_parents entity + * + * The functions are suitable for use in Dynamic Context Generator functions used in other plugins such as Link and Form tracking. + * + * If a `cb` function is provided, it is called with the above generators as parameters that it can use in asynchronous situations (such as the JavaScript tracker). + * + * @param cb Callback function to receive the generator callbacks described above asynchronously. + * @returns Array of callbacks described above. + */ +export function getComponentListGenerator( + cb?: (basic: typeof componentGenerator, detailed: typeof detailedComponentGenerator) => void +): [typeof componentGenerator, typeof detailedComponentGenerator] { + if (cb) cb(componentGenerator, detailedComponentGenerator); + return [componentGenerator, detailedComponentGenerator]; +} + +/** + * Do the thing! + * + * - Build the event payload for `schema` + * - Evaluate whether we have been configured to actually send that event + * - Evaluate frequency caps + * - Build entity payloads + * - Dispatch event to trackers + * + * The actual tracking is scheduled in a new task to yield back to the callers quickly, as they may need to be performant. + * @param schema The type of event to generate/track. + * @param config The configuration that matched and triggered this event to generate. This will include any criteria for the preventing the event to fire, and information for which entities are required. + * @param element The element that is the subject of the event; used to generate entity information. + * @param options Other details about the situation; like the bounding rect of the element, its number of siblings/etc. Some of these may be expensive to recalculate if needed, so you can provide them in advance if already available. + * @returns + */ +function trackEvent( + schema: T, + config: Configuration, + element: Element | HTMLElement, + options?: Partial<{ + boundingRect: DOMRect; + position: number; + matches: number; + }> +): void { + const { boundingRect, position, matches } = options ?? {}; + + // core payload + const payload: Event = { + schema, + data: { + element_name: config.name, + }, + }; + + // check custom conditions + const conditions = { + [Events.ELEMENT_CREATE]: config.create.condition, + [Events.ELEMENT_DESTROY]: config.destroy.condition, + [Events.ELEMENT_EXPOSE]: config.expose.condition, + [Events.ELEMENT_OBSCURE]: config.obscure.condition, + }; + + if (conditions[schema]) { + if (!evaluateDataSelector(element, config.selector, conditions[schema]!).length) return; + } + + // check frequency caps + const frequencies = { + [Events.ELEMENT_CREATE]: config.create.when, + [Events.ELEMENT_DESTROY]: config.destroy.when, + [Events.ELEMENT_EXPOSE]: config.expose.when, + [Events.ELEMENT_OBSCURE]: config.obscure.when, + }; + + switch (frequencies[schema]) { + case Frequency.NEVER: + return; // abort + case Frequency.ALWAYS: + break; // continue + case Frequency.ONCE: + if (trackedConfigs[schema].has(config)) return; // once / once per config + trackedConfigs[schema].add(config); + break; + case Frequency.ELEMENT: + if (trackedElements[schema].has(element)) return; // once per element + trackedElements[schema].add(element); + break; + case Frequency.PAGEVIEW: + if (trackedThisPage[schema].has(element)) return; // once per pageview + trackedThisPage[schema].add(element); + break; + } + + // build entities + const context: (Entity | SelfDescribingJson)[] = []; + + context.push(...(config.context(element, config) as Entity[])); + + if (config.details) { + context.push( + getElementDetails( + config, + element, + boundingRect, + position, + matches, + schema === Events.ELEMENT_DESTROY || schema === Events.ELEMENT_OBSCURE + ) + ); + } + + if (config.contents.length) { + context.push(...buildContentTree(config, element, position)); + } + + const components = detailedComponentGenerator(config.name, element); + if (components) context.push(...components); + + // track the event + setTimeout(dispatchToTrackersInCollection, 0, config.trackers, trackers, (tracker: BrowserTracker) => { + const event = buildSelfDescribingEvent({ event: payload }); + tracker.core.track(event, context); + }); +} + +/** + * Handle some boilerplate/book-keeping to track an element as CREATEd. + * Saves use duplicating this logic many times in `mutationCallback`. + */ +function handleCreate(nowTs: number, config: Configuration, node: Node | Element) { + if (nodeIsElement(node) && node.matches(config.selector)) { + const state = getState(node, { originalPageViewId: currentPageViewId }); + state.state = ElementStatus.CREATED; + state.createdTs = nowTs; + state.matches.add(config); + trackEvent(Events.ELEMENT_CREATE, config, node); + if (config.expose.when !== Frequency.NEVER && intersectionObserver) intersectionObserver.observe(node); + } +} + +/** + * Handler for the mutation observer. + * Checks for two mutation types: + * attributes: for existing nodes in the document that may mutate into matching a config when they didn't previously (or vice-versa) + * childList: for node adds/removals, to find new elements added dynamically to the page that may match configurations + * + * For the former, we need to keep track of if we've matched each element against a config before to determine if it's mutated away or not; not matching now isn't enough enough information to know if it previously matched. + * If we determine a matching element has been DESTROYed, we stop observing it for intersections. + * On the other hand, if a CREATE was determined, start observing intersections if that's requested in the configuration. + */ +function mutationCallback(mutations: MutationRecord[]): void { + const nowTs = performance.now() + performance.timeOrigin; + mutations.forEach((record) => { + configurations.forEach((config) => { + const createFn = handleCreate.bind(null, nowTs, config); + + if (record.type === 'attributes') { + if (nodeIsElement(record.target)) { + const element = record.target; + const prevState = getState(element, { originalPageViewId: currentPageViewId }); + + if (prevState.state !== ElementStatus.INITIAL) { + if (!element.matches(config.selector)) { + if (prevState.matches.has(config)) { + if (prevState.state === ElementStatus.EXPOSED) trackEvent(Events.ELEMENT_OBSCURE, config, element); + trackEvent(Events.ELEMENT_DESTROY, config, element); + prevState.matches.delete(config); + if (intersectionObserver) intersectionObserver.unobserve(element); + prevState.state = ElementStatus.DESTROYED; + } + } else { + if (!prevState.matches.has(config)) { + createFn(element); + } + } + } else { + createFn(element); + } + } + } else if (record.type === 'childList') { + const matches = getMatchingElements(config); + record.addedNodes.forEach((node) => { + matches.filter((m) => node.contains(m)).forEach(createFn); + }); + record.removedNodes.forEach((node) => { + if (nodeIsElement(node)) { + const removals = node.matches(config.selector) ? [node] : []; + removals.push(...getMatchingElements(config, node)); + removals.forEach((node) => { + const state = getState(node, { originalPageViewId: currentPageViewId }); + if (state.state === ElementStatus.EXPOSED) trackEvent(Events.ELEMENT_OBSCURE, config, node); + trackEvent(Events.ELEMENT_DESTROY, config, node); + if (intersectionObserver) intersectionObserver.unobserve(node); + state.state = ElementStatus.DESTROYED; + }); + } + }); + } + }); + }); +} + +/** + * Handler for the intersection observer. + * Called when there are intersection updates, and when an element is first observed (the latter when new configs are added, or the mutation observer tries to evaluate visibility). + * + * Each entry is for a specific element, so we need to find if the element matches a config. + * With a config match we can determine if we need to fire EXPOSE/OBSCURE events for that element. + * For intersections, we first put it in a PENDING state in case we need to account for minimum time conditions. + * If time and other conditions are met, we can track the EXPOSE. + * Otherwise, we schedule an unobserve/reobserve in the next animation frame to update time in view, which will repeat until the time condition is met. This feels expensive, but seems to be OK since the layout should all be pretty freshly calculated at these points so it's actually pretty light. + * If no longer visible, consider tracking OBSCURE (unless it was DESTROYED, which would already have tried OBSCURE). + */ +function intersectionCallback(entries: IntersectionObserverEntry[], observer: IntersectionObserver): void { + entries.forEach((entry) => { + let frameRequest: number | undefined = undefined; + const state = getState(entry.target, { lastObservationTs: entry.time, originalPageViewId: currentPageViewId }); + configurations.forEach((config) => { + if (entry.target.matches(config.selector)) { + const siblings = getMatchingElements(config); + const foundIndex = siblings.findIndex((el) => el.isSameNode(entry.target)); + const position = foundIndex !== -1 ? foundIndex + 1 : Math.max(state.lastPosition + 1, 1); + const matchCount = foundIndex !== -1 ? siblings.length : Math.max(siblings.length + 1, position); + + if (foundIndex !== -1) { + state.lastPosition = foundIndex; + } + + if (entry.isIntersecting) { + if (state.state !== ElementStatus.EXPOSED && state.state !== ElementStatus.PENDING) { + Object.assign(state, { + state: ElementStatus.PENDING, + lastObservationTs: entry.time, + views: state.views + 1, + }); + } + + if (state.state === ElementStatus.PENDING) { + // check configured criteria, if any + if (shouldTrackExpose(config, entry)) { + // check time criteria + if (config.expose.minTimeMillis <= state.elapsedVisibleMs) { + state.state = ElementStatus.EXPOSED; + trackEvent(Events.ELEMENT_EXPOSE, config, entry.target, { + boundingRect: entry.boundingClientRect, + position, + matches: matchCount, + }); + } + } + } + + if (state.state === ElementStatus.PENDING || state.state === ElementStatus.EXPOSED) { + const elapsedVisibleMs = state.elapsedVisibleMs + (entry.time - state.lastObservationTs); + Object.assign(state, { + lastObservationTs: entry.time, + elapsedVisibleMs, + }); + + // check visibility time next frame + if (!frameRequest) { + frameRequest = requestAnimationFrame(() => { + observer.unobserve(entry.target); // observe is no-op for already observed elements + observer.observe(entry.target); // for non-observed elements, it immediately generates an entry of current state + }); + } + } + } else { + if (state.state === ElementStatus.EXPOSED) { + trackEvent(Events.ELEMENT_OBSCURE, config, entry.target, { + boundingRect: entry.boundingClientRect, + position, + matches: matchCount, + }); + } + + Object.assign(state, { + state: state.state === ElementStatus.DESTROYED ? ElementStatus.DESTROYED : ElementStatus.OBSCURED, + lastObservationTs: entry.time, + }); + } + } + }); + }); +} diff --git a/plugins/browser-plugin-element-tracking/src/components.ts b/plugins/browser-plugin-element-tracking/src/components.ts new file mode 100644 index 000000000..9c8e9fdb6 --- /dev/null +++ b/plugins/browser-plugin-element-tracking/src/components.ts @@ -0,0 +1,50 @@ +import type { Configuration } from './configuration'; +import { getElementDetails } from './data'; +import { ComponentsEntity, ElementDetailsEntity, Entities } from './schemata'; +import { nodeIsElement } from './util'; + +/** + * Generic callback for providing `component` entities for given Elements. + * Auto discovers element and name from parameters and returns the list of components that encapsulate that element. + * @param withDetails Whether details for each component should be included. + * @param configurations List of configurations that contain component definitions. + * @param params Arbitrary parameters that should include an element and optionally a logical name for that element. + * @returns `component_parents` entity, or if `withDetails` specified, a list of entities containing `component_parents` and the details for each component as `element` entities. + */ +export const baseComponentGenerator = ( + withDetails: boolean, + configurations: Configuration[], + ...params: any[] +): ComponentsEntity | [ComponentsEntity, ...ElementDetailsEntity[]] | null => { + const elementParams = params.filter((arg) => arg instanceof Node && nodeIsElement(arg)); + const elementName = params.find((arg) => typeof arg === 'string'); + + if (!elementParams.length) return null; + + const components: string[] = []; + const details: ElementDetailsEntity[] = []; + + elementParams.forEach((elem) => { + configurations.forEach((config) => { + if (!config.component) return; + + const ancestor = elem.closest(config.selector); + if (ancestor !== null) { + components.push(config.name); + if (withDetails && config.details) { + details.push(getElementDetails(config, ancestor)); + } + } + }); + }); + + const entity: ComponentsEntity = { + schema: Entities.COMPONENT_PARENTS, + data: { + element_name: elementName, + component_list: components, + }, + }; + + return components.length ? (withDetails ? [entity, ...details] : entity) : null; +}; diff --git a/plugins/browser-plugin-element-tracking/src/configuration.ts b/plugins/browser-plugin-element-tracking/src/configuration.ts new file mode 100644 index 000000000..d15db3f3e --- /dev/null +++ b/plugins/browser-plugin-element-tracking/src/configuration.ts @@ -0,0 +1,310 @@ +import type { Logger, SelfDescribingJson } from '@snowplow/tracker-core'; + +import { isDataSelector } from './data'; +import { type DataSelector, Frequency, type OneOrMany, type RequiredExcept } from './types'; + +export enum ConfigurationState { + INITIAL, + CONFIGURED, +} + +/** + * A dynamic context provider for events generated from the plugin. + * + * Can be a static list of Self Describing JSON entities, or a function that returns the same. + * The function will receive the matching element, and matching element configuration as parameters. + */ +export type ContextProvider = + | SelfDescribingJson[] + | ((element: Element | HTMLElement | undefined, match: Configuration) => SelfDescribingJson[]); + +/** + * Options controlling when this type of event should occur. + */ +type BaseOptions = { + /** + * Frequency cap options for how often this should be tracked over the lifetime of the plugin. + */ + when: `${Frequency}`; + /** + * A custom DataSelector defining if an element should trigger the event or not. If the DataSelector returns no result triplets, the event does not trigger. The `match` operation can be used here to do some logic against the other types of operators. + */ + condition?: DataSelector; +}; + +/** + * Additional options for controlling when an EXPOSE event should occur. + */ +type ExposeOptions = BaseOptions & { + /** + * For larger elements, only trigger if at least this proportion of the element is visible on screen; expects: 0.0 - 1.0; default: 0 + */ + minPercentage?: number; + /** + * Only trigger once the element has been in view for at least this many milliseconds. The time is measured cumulatively. After the threshold is met it will re-fire immediately. + */ + minTimeMillis?: number; + /** + * Don't count this element as visible unless its area (height * width) is at least this many pixels. Useful to prohibit empty container elements being tracked as visible. + */ + minSize?: number; + /** + * Add these dimensions (in pixels) to the element size when calculating minPercentage. Used to increase/decrease the size of the actual element before considering it visible. + */ + boundaryPixels?: [number, number, number, number] | [number, number] | number; +}; + +/** + * Input configuration format for describing a set of elements to be tracked with this plugin. + */ +export type ElementConfiguration = { + /** + * Logical name for elements matched by this configuration. This name will be used to describe any matching elements in event payloads and entities, and to associate the data between them. + * If not provided, the `selector` is used as `name`. + */ + name?: string; + /** + * Required. CSS selector to determine the set of elements that match this configuration. + */ + selector: string; + /** + * If `selector` is intended for matching elements within custom elements or shadow DOM hosts, specify a selector for the shadow hosts here; this will be used to identify shadow-elements that match `selector` that would otherwise not be visible. + */ + shadowSelector?: string; + /** + * If using `shadowSelector` to indicate `selector` matches elements in shadow hosts; use this to specify that only elements within shadow hosts matching `shadowSelector` should match; if `false` (default), elements outside shadow hosts (that are not necessarily children of `shadowSelector` hosts) will match the configuration also. + */ + shadowOnly?: boolean; + /** + * Configure when, if ever, element create events should be triggered when detected for elements matching this configuration. + * Defaults to `false`, which is shorthand for `{ when: 'never' }`. + */ + create?: boolean | BaseOptions; + /** + * Configure when, if ever, element destroy events should be triggered when detected for elements matching this configuration. + * Defaults to `false`, which is shorthand for `{ when: 'never' }`. + */ + destroy?: boolean | BaseOptions; + /** + * Configure when, if ever, element expose events should be triggered when detected for elements matching this configuration. + * Also specify additional criteria on relevant for expose events like minimum size or visibility time. + * Defaults to `true`, which is shorthand for `{ when: 'always' }` and `0` for all other options. + */ + expose?: boolean | ExposeOptions; + /** + * Configure when, if ever, element obscure events should be triggered when detected for elements matching this configuration. + * Defaults to `false`, which is shorthand for `{ when: 'never' }`. + */ + obscure?: boolean | BaseOptions; + /** + * Indicate that elements matching this configuration are "components"; their ancestry of other elements will be identified in the component_parents entity if this is set (using this configuration's `name`). + */ + component?: boolean; + /** + * When events occur to elements matching this configuration, extract data from one or more DataSelectors and include them in `attributes` in the `element` entity that describes that element. + */ + details?: OneOrMany; + /** + * When events occur to elements matching this configuration, evaluate one or more nested configurations using the matching element as a root; the `name`, `selector`, `details`, and `contents` will be processed, with other options ignored. The resulting elements (and optionally their `details` will be included as entities on events for this element.) + */ + contents?: OneOrMany; + /** + * Types of events that statistics for the element should be included on, if any. Should be the `event_name` value for events that should have the entity attached. E.g. `page_view`, `page_ping`, `expose_element`, `my_custom_event`. + */ + includeStats?: OneOrMany; + /** + * Provide custom context entities for events generated from this configuration. + */ + context?: ContextProvider; + /** + * An optional ID for this configuration. + * Calls to track configurations with a specific ID will override previous configurations with the same ID. + * No impact on actual tracking or payloads. + */ + id?: string; +}; + +/** + * Parsed valid version of `ElementConfiguration`. + * Removes some ambiguities allowed in that type that are there for a more pleasant configuration API. + */ +export type Configuration = Omit< + RequiredExcept, + 'create' | 'destroy' | 'expose' | 'obscure' | 'details' | 'includeStats' | 'contents' +> & { + trackers?: string[]; + create: BaseOptions; + destroy: BaseOptions; + expose: RequiredExcept; + obscure: BaseOptions; + state: ConfigurationState; + details: DataSelector[]; + includeStats: string[]; + contents: Configuration[]; + context: Extract; +}; + +const DEFAULT_FREQUENCY_OPTIONS: BaseOptions = { when: 'always' }; + +const emptyProvider: ContextProvider = () => []; + +/** + * Create a new ContextProvider that will merge the given `context` into that generated by the plugin or other configuration itself. + * @param context An existing ContextProvider to merge with future unknown context. + * @returns New ContextProvider function that will produce the results of merging its own context with the provided `context`. + */ +export function createContextMerger(batchContext?: ContextProvider, configContext?: ContextProvider): ContextProvider { + return function contextMerger(element, config) { + const result: SelfDescribingJson[] = []; + + for (const contextSrc of [batchContext, configContext]) { + if (contextSrc) { + if (typeof contextSrc === 'function') { + if (contextSrc !== contextMerger) result.push(...contextSrc(element, config)); + } else { + result.push(...contextSrc); + } + } + } + + return result; + }; +} + +/** + * Parse and validate a given `ElementConfiguration`, returning a more concrete `Configuration` if successful. + * @param config Input configuration to evaluate. + * @param contextProvider The context provider to embed into the configuration; this will handle merging any batch-level context into configuration-level context. + * @param trackers A list of trackers the resulting configuration should send events to, if specified. + * @returns Validated Configuration. + */ +export function checkConfig( + config: ElementConfiguration, + contextProvider: ContextProvider, + intersectionPossible: boolean, + mutationPossible: boolean, + logger?: Logger, + trackers?: string[] +): Configuration { + const { selector, name = selector, shadowSelector, shadowOnly = false, id, component = false } = config; + + // essential configs + if (typeof name !== 'string' || !name) throw new Error(`Invalid element name value: ${name}`); + if (typeof selector !== 'string' || !selector) throw new Error(`Invalid element selector value: ${selector}`); + + // these will throw if selectors invalid + document.querySelector(selector); + if (shadowSelector) document.querySelector(shadowSelector); + + // event type frequencies & options + const { create = false, destroy = false, expose = true, obscure = false } = config; + + // simple event configs + const [validCreate, validDestroy, validObscure] = [create, destroy, obscure].map((input) => { + if (!input) return { when: Frequency.NEVER }; + if (typeof input === 'object') { + const { when = 'always', condition } = input; + + if (condition && !isDataSelector(condition)) throw new Error('Invalid data selector provided for condition'); + + if (when.toUpperCase() in Frequency) { + return { + when: when.toLowerCase() as Frequency, + condition, + }; + } else { + throw new Error(`Unknown tracking frequency: ${when}`); + } + } + return DEFAULT_FREQUENCY_OPTIONS; + }); + + if ((validCreate.when !== Frequency.NEVER || validDestroy.when !== Frequency.NEVER) && !mutationPossible) + logger?.warn('MutationObserver API unavailable but required for events in configuration:', config); + + let validExpose: RequiredExcept | null = null; + + // expose has custom options and is more complex + if (expose && typeof expose === 'object') { + const { + when = 'always', + condition, + boundaryPixels = 0, + minPercentage = 0, + minSize = 0, + minTimeMillis = 0, + } = expose; + + if (condition && !isDataSelector(condition)) throw new Error('Invalid data selector provided for condition'); + if ( + (typeof boundaryPixels !== 'number' && !Array.isArray(boundaryPixels)) || + typeof minPercentage !== 'number' || + typeof minSize !== 'number' || + typeof minTimeMillis !== 'number' + ) + throw new Error('Invalid expose options provided'); + + if (when.toUpperCase() in Frequency) { + validExpose = { + when: when.toLowerCase() as Frequency, + condition, + boundaryPixels, + minPercentage, + minSize, + minTimeMillis, + }; + } else { + throw new Error(`Unknown tracking frequency: ${when}`); + } + } else if (expose) { + validExpose = { + ...DEFAULT_FREQUENCY_OPTIONS, + boundaryPixels: 0, + minPercentage: 0, + minSize: 0, + minTimeMillis: 0, + }; + } else { + validExpose = { + when: Frequency.NEVER, + boundaryPixels: 0, + minPercentage: 0, + minSize: 0, + minTimeMillis: 0, + }; + } + + if ((validExpose.when !== Frequency.NEVER || validObscure.when !== Frequency.NEVER) && !intersectionPossible) + logger?.warn('IntersectionObserver API unavailable but required for events in configuration:', config); + + // normalize to arrays (scalars allowed in input for convenience) + let { details = [], contents = [], includeStats = [] } = config; + + if (!Array.isArray(details)) details = details == null ? [] : [details]; + if (!Array.isArray(contents)) contents = contents == null ? [] : [contents]; + if (!Array.isArray(includeStats)) includeStats = includeStats == null ? [] : [includeStats]; + + if (details.length !== details.filter(isDataSelector).length) + throw new Error('Invalid DataSelector given for details'); + + return { + name, + selector, + id, + shadowSelector, + shadowOnly, + create: validCreate, + destroy: validDestroy, + expose: validExpose, + obscure: validObscure, + component: !!component, + details, + includeStats, + contents: contents.map((inner) => + checkConfig(inner, inner.context ?? emptyProvider, intersectionPossible, mutationPossible, logger, trackers) + ), + context: typeof contextProvider === 'function' ? contextProvider : () => contextProvider, + trackers, + state: ConfigurationState.INITIAL, + }; +} diff --git a/plugins/browser-plugin-element-tracking/src/data.ts b/plugins/browser-plugin-element-tracking/src/data.ts new file mode 100644 index 000000000..05315dccc --- /dev/null +++ b/plugins/browser-plugin-element-tracking/src/data.ts @@ -0,0 +1,258 @@ +import { SelfDescribingJson } from '@snowplow/tracker-core'; +import type { Configuration } from './configuration'; +import { getState } from './elementsState'; +import { ElementContentEntity, ElementDetailsEntity, Entities } from './schemata'; +import { AttributeList, type DataSelector } from './types'; +import { getMatchingElements } from './util'; + +/** + * Type guard to determine if `val` is a valid `DataSelector` function or descriptor + */ +export function isDataSelector(val: unknown): val is DataSelector { + if (val == null) return false; + if (typeof val === 'function') return true; + + type KeysOf = T extends Function ? never : keyof T; + type AllOf = Exclude extends never + ? Exclude extends never + ? T + : Exclude + : Exclude; + + const knownKeys = ['match', 'content', 'selector', 'dataset', 'attributes', 'properties', 'child_text'] as const; + const selectorKeys: AllOf, typeof knownKeys> = knownKeys; // type error if we add a new selector without updating knownKeys + + if (typeof val === 'object') return selectorKeys.some((key) => key in val); + return false; +} + +/** + * Combine the results of an array of DataSelectors + * @param element Element to select data from + * @param path The CSS path used to select `element`, which may be requested by the `selector` + * @param selectors The list of DataSelectors to evaluate + * @returns Flattened list of results found processing the element. + */ +export function extractSelectorDetails(element: Element, path: string, selectors: DataSelector[]): AttributeList { + return selectors.reduce((attributes: AttributeList, selector) => { + const result = evaluateDataSelector(element, path, selector); + + if (result.length) { + return attributes.concat(result); + } else if ('match' in selector) return []; + + return attributes; + }, []); +} + +/** + * Combine the results of an array of DataSelectors + * @param element Element to select data from + * @param path The CSS path used to select `element`, which may be requested by the `selector` DataSelector type + * @param selector The single DataSelector to evaluate + * @returns Selector results; list of key/value/source triplets that were extracted from the element + */ +export function evaluateDataSelector( + element: HTMLElement | Element, + path: string, + selector: DataSelector +): AttributeList { + const result: AttributeList = []; + + type DataSelectorType = (T extends T ? keyof T : never) | 'callback'; + let source: DataSelectorType = 'callback'; + + if (typeof selector === 'function') { + try { + const discovered = selector(element); + for (const attribute in discovered) { + if (typeof attribute === 'string' && discovered.hasOwnProperty(attribute)) { + const value = + typeof discovered[attribute] === 'object' + ? JSON.stringify(discovered[attribute]) + : String(discovered[attribute]); + result.push({ source, attribute, value }); + } + } + } catch (e) { + const value = e instanceof Error ? e.message || e.name : String(e); + result.push({ source: 'error', attribute: 'message', value }); + } + + return result; + } + + source = 'attributes'; + if (source in selector && Array.isArray(selector[source])) { + selector[source].forEach((attribute) => { + const value = element.getAttribute(attribute); + + if (value !== null) { + result.push({ source, attribute, value }); + } + }); + } + + source = 'properties'; + if (source in selector && Array.isArray(selector[source])) { + selector[source].forEach((attribute) => { + const value = (element as any)[attribute]; + + if (typeof value !== 'object' && typeof value !== 'undefined') { + result.push({ source, attribute, value: String(value) }); + } + }); + } + + source = 'dataset'; + if (source in selector && Array.isArray(selector[source])) { + selector[source].forEach((attribute) => { + if ('dataset' in element) { + const value = element.dataset[attribute]; + + if (typeof value !== 'undefined') { + result.push({ source, attribute, value: String(value) }); + } + } + }); + } + + source = 'child_text'; + if (source in selector && typeof selector[source] === 'object' && selector[source]) { + Object.entries(selector[source]).forEach(([attribute, selector]) => { + try { + const child = element.querySelector(selector) || element.shadowRoot?.querySelector(selector); + if (child && child.textContent) result.push({ source, attribute, value: child.textContent }); + } catch (e) {} + }); + } + + source = 'content'; + if (source in selector && typeof selector[source] === 'object' && selector[source]) { + Object.entries(selector[source]).forEach(([attribute, pattern]) => { + if (!(pattern instanceof RegExp)) + try { + pattern = new RegExp(pattern); + } catch (e) { + return; + } + + const innerText = element.textContent || element.shadowRoot?.textContent; + if (innerText) { + try { + const match = pattern.exec(innerText); + if (match) { + result.push({ source, attribute, value: match.length > 1 ? match[1] : match[0] }); + } + } catch (e) { + console.error(e); + } + } + }); + } + + source = 'selector'; + if (source in selector && selector[source]) { + result.push({ source, attribute: source, value: path }); + } + + source = 'match'; + if (source in selector && selector[source]) { + const condition = selector[source]; + + for (const [attribute, value] of Object.entries(condition)) { + if ( + !result.some( + (r) => r.attribute === attribute && (typeof value === 'function' ? value(r.value) : r.value === value) + ) + ) + return []; + } + } + + return result; +} + +/** + * Builds a flat list of `element_content` entities describing the matched element and any child configuration matches. + * @param config A root/branch element configuration with nested `contents` configurations. + * @param element The element that matched `config` that will be (and have its children) described. + * @param parentPosition The position of this element amongst its matching sibling elements. Used to de-flatten the tree at analysis time. + * @returns A list of `element_content` entities describing the elements and its content, and the same of its children. + */ +export function buildContentTree( + config: Configuration, + element: Element, + parentPosition: number = 1 +): (ElementContentEntity | SelfDescribingJson)[] { + const context: (ElementContentEntity | SelfDescribingJson)[] = []; + + if (element && config.contents.length) { + config.contents.forEach((contentConfig) => { + const contents = getMatchingElements(contentConfig, element); + + contents.forEach((contentElement, i) => { + const entity: ElementContentEntity = { + schema: Entities.ELEMENT_CONTENT, + data: { + parent_name: config.name, + parent_index: parentPosition, + element_name: contentConfig.name, + element_index: i + 1, + attributes: extractSelectorDetails(contentElement, contentConfig.selector, contentConfig.details), + }, + }; + + context.push(entity); + context.push(...contentConfig.context(contentElement, contentConfig)); + context.push(...buildContentTree(contentConfig, contentElement, i + 1)); + }); + }); + } + + return context; +} + +/** + * Builds an `element` entity. + * @param config Configuration describing any additional data that should be included in the entity. + * @param element The element this entity will describe. + * @param rect The position/dimension information of the element. + * @param position Which match this element is amongst those that match the Configuration's selector. + * @param matches The total number, including this one, of elements that matched the Configuration selector. + * @param usePreviousForEmpty Whether to use the previously seen size instead of the current one. Useful if the node no longer exists (e.g. destroyed). Will only apply if the new size is 0. + * @returns The Element entity SDJ. + */ +export function getElementDetails( + config: Configuration, + element: Element, + rect: DOMRect = element.getBoundingClientRect(), + position?: number, + matches?: number, + usePreviousForEmpty: boolean = false +): ElementDetailsEntity { + const state = getState(element); + + if (usePreviousForEmpty && state.lastKnownSize && (rect.height === 0 || rect.width === 0)) { + rect = state.lastKnownSize; + } + + state.lastKnownSize = rect; + + return { + schema: Entities.ELEMENT_DETAILS, + data: { + element_name: config.name, + width: rect.width, + height: rect.height, + position_x: rect.x, + position_y: rect.y, + doc_position_x: rect.x + window.scrollX, + doc_position_y: rect.y + window.scrollY, + element_index: position, + element_matches: matches, + originating_page_view: state.originalPageViewId, + attributes: extractSelectorDetails(element, config.selector, config.details), + }, + }; +} diff --git a/plugins/browser-plugin-element-tracking/src/elementsState.ts b/plugins/browser-plugin-element-tracking/src/elementsState.ts new file mode 100644 index 000000000..dd1f0ba07 --- /dev/null +++ b/plugins/browser-plugin-element-tracking/src/elementsState.ts @@ -0,0 +1,163 @@ +import type { Configuration } from './configuration'; +import { Entities, type ElementStatisticsEntity } from './schemata'; + +export enum ElementStatus { + INITIAL, + CREATED, + DESTROYED, + EXPOSED, + PENDING, + OBSCURED, +} + +/** + * Keeps track of per-element stuff we need to keep track of. + */ +type ElementState = { + /** + * Last known state for this element. Used to decide if events should be triggered or not when it's otherwise ambiguous. + */ + state: ElementStatus; + /** + * When the element was first seen/deemed "created"; for use in aggregate stats in future version. + */ + createdTs: number; + /** + * Last time we evaluated this element for a state change. Used for a delta to calculate cumulative visible time. + */ + lastObservationTs: number; + /** + * The above mentioned cumulative visible time. + */ + elapsedVisibleMs: number; + /** + * The pageview ID when we first observed this element. + */ + originalPageViewId: string; + /** + * The last position we saw of this element amongst the other matches we saw for this element. + */ + lastPosition: number; + /** + * The last non-0 size information available for this element. + */ + lastKnownSize?: DOMRect; + /** + * The other matches for this element's selector we last saw, of which the element is/was at `lastPosition`-1 position. + */ + matches: Set; + /** + * Smallest size dimensions seen so far for this element. + */ + minSize?: [number, number]; + /** + * Largest size dimensions seen so far for this element. + */ + maxSize?: [number, number]; + /** + * Largest vertical depth seen so far for this element, and the height the element was at that time. + */ + maxDepth?: [number, number]; + /** + * Number of times this element has entered viewport so far. + */ + views: number; +}; + +/** + * Bank of per-element state that needs to be stored. + */ +const elementsState = + typeof WeakMap !== 'undefined' ? new WeakMap() : new Map(); + +/** + * Obtain element state from `elementState`, creating with sane defaults if element is unknown. + * @param target Element to obtain state for. + * @param initial Initial state to include in the state if created. + * @returns State for the target element. + */ +export function getState(target: Element, initial: Partial = {}): ElementState { + if (elementsState.has(target)) { + return elementsState.get(target)!; + } else { + const nowTs = performance.now(); + const state: ElementState = { + state: ElementStatus.INITIAL, + matches: new Set(), + originalPageViewId: '', + createdTs: nowTs + performance.timeOrigin, + lastPosition: -1, + lastObservationTs: nowTs, + elapsedVisibleMs: 0, + views: 0, + ...initial, + }; + elementsState.set(target, state); + return state; + } +} + +const stateLabels: Record = { + [ElementStatus.CREATED]: 'exists', + [ElementStatus.DESTROYED]: 'destroyed', + [ElementStatus.EXPOSED]: 'on screen', + [ElementStatus.INITIAL]: 'unknown', + [ElementStatus.OBSCURED]: 'off screen', + [ElementStatus.PENDING]: 'awaiting time criteria', +}; + +const compareSize = (a: [number, number], b?: [number, number]) => { + if (b === undefined) return 0; + const asize = a[0] * a[1]; + const bsize = b[0] * b[1]; + return asize - bsize; +}; + +export function aggregateStats( + element_name: string, + target: Element, + index: number, + matches: number +): ElementStatisticsEntity { + const state = getState(target); + const stateLabel = stateLabels[state.state]; + + const rect = target.getBoundingClientRect(); + const curSize: [number, number] = [rect.width, rect.height]; + const minSize = compareSize(curSize, state.minSize) <= 0 ? curSize : state.minSize!; + const maxSize = compareSize(curSize, state.maxSize) < 0 ? state.maxSize! : curSize; + + const vpBottom = window.visualViewport + ? window.visualViewport.height + window.visualViewport.pageTop + : window.innerHeight + window.scrollY; + const curDepth: [number, number] = [Math.min(vpBottom, rect.top + rect.height) - rect.top, rect.height]; + const maxDepth = + state.maxDepth === undefined || state.maxDepth[1] === 0 + ? curDepth + : curDepth[1] === 0 + ? state.maxDepth + : curDepth[0] / curDepth[1] > state.maxDepth[0] / state.maxDepth[1] + ? curDepth + : state.maxDepth; + + Object.assign(state, { minSize, maxSize, maxDepth }); + + return { + schema: Entities.ELEMENT_STATISTICS, + data: { + element_name, + element_index: index, + element_matches: matches, + current_state: stateLabel, + min_size: minSize.join('x'), + current_size: curSize.join('x'), + max_size: maxSize.join('x'), + y_depth_ratio: curDepth[1] === 0 ? null : curDepth[0] / curDepth[1], + max_y_depth_ratio: maxDepth[1] === 0 ? null : maxDepth[0] / maxDepth[1], + max_y_depth: maxDepth.join('/'), + element_age_ms: Math.floor(performance.now() - (state.createdTs - performance.timeOrigin)), + times_in_view: state.views, + total_time_visible_ms: Math.floor(state.elapsedVisibleMs), + }, + }; +} diff --git a/plugins/browser-plugin-element-tracking/src/index.ts b/plugins/browser-plugin-element-tracking/src/index.ts new file mode 100644 index 000000000..b1c13e734 --- /dev/null +++ b/plugins/browser-plugin-element-tracking/src/index.ts @@ -0,0 +1 @@ +export * from './api'; diff --git a/plugins/browser-plugin-element-tracking/src/schemata.ts b/plugins/browser-plugin-element-tracking/src/schemata.ts new file mode 100644 index 000000000..2da3375a5 --- /dev/null +++ b/plugins/browser-plugin-element-tracking/src/schemata.ts @@ -0,0 +1,107 @@ +import { SelfDescribingJson } from '@snowplow/tracker-core'; + +import type { AttributeList } from './types'; + +export enum Events { + ELEMENT_CREATE = 'iglu:com.snowplowanalytics.snowplow/create_element/jsonschema/1-0-0', + ELEMENT_DESTROY = 'iglu:com.snowplowanalytics.snowplow/destroy_element/jsonschema/1-0-0', + ELEMENT_EXPOSE = 'iglu:com.snowplowanalytics.snowplow/expose_element/jsonschema/1-0-0', + ELEMENT_OBSCURE = 'iglu:com.snowplowanalytics.snowplow/obscure_element/jsonschema/1-0-0', +} + +export enum Entities { + ELEMENT_DETAILS = 'iglu:com.snowplowanalytics.snowplow/element/jsonschema/1-0-0', + ELEMENT_CONTENT = 'iglu:com.snowplowanalytics.snowplow/element_content/jsonschema/1-0-0', + ELEMENT_STATISTICS = 'iglu:com.snowplowanalytics.snowplow/element_statistics/jsonschema/1-0-0', + COMPONENT_PARENTS = 'iglu:com.snowplowanalytics.snowplow/component_parents/jsonschema/1-0-0', +} + +export type SDJ> = SelfDescribingJson & { + schema: S; +}; + +export type Event> = SDJ; +export type Entity> = SDJ; + +export type ElementCreateEvent = SDJ< + Events.ELEMENT_CREATE, + { + element_name: string; + } +>; + +export type ElementDestroyEvent = SDJ< + Events.ELEMENT_DESTROY, + { + element_name: string; + } +>; + +export type ElementExposeEvent = SDJ< + Events.ELEMENT_EXPOSE, + { + element_name: string; + } +>; + +export type ElementObscureEvent = SDJ< + Events.ELEMENT_OBSCURE, + { + element_name: string; + } +>; + +export type ElementContentEntity = SDJ< + Entities.ELEMENT_CONTENT, + { + parent_name: string; + parent_index: number; + element_name: string; + element_index: number; + attributes?: AttributeList; + } +>; + +export type ElementDetailsEntity = SDJ< + Entities.ELEMENT_DETAILS, + { + element_name: string; + height: number; + width: number; + position_x: number; + position_y: number; + doc_position_x: number; + doc_position_y: number; + element_index?: number; + element_matches?: number; + originating_page_view: string; + attributes?: AttributeList; + } +>; + +export type ComponentsEntity = SDJ< + Entities.COMPONENT_PARENTS, + { + element_name?: string; + component_list: string[]; + } +>; + +export type ElementStatisticsEntity = SDJ< + Entities.ELEMENT_STATISTICS, + { + element_name: string; + element_index: number; + element_matches: number; + current_state: string; + min_size: string; + current_size: string; + max_size: string; + y_depth_ratio: number | null; + max_y_depth_ratio: number | null; + max_y_depth: string; + element_age_ms: number; + times_in_view: number; + total_time_visible_ms: number; + } +>; diff --git a/plugins/browser-plugin-element-tracking/src/types.ts b/plugins/browser-plugin-element-tracking/src/types.ts new file mode 100644 index 000000000..1f046bfe3 --- /dev/null +++ b/plugins/browser-plugin-element-tracking/src/types.ts @@ -0,0 +1,76 @@ +/** + * Like `Required`, but any keys in `E` are optional instead of required. + */ +export type RequiredExcept = { + [P in Exclude]-?: Exclude; +} & { + [P in E]?: T[P]; +}; + +/** + * A thing, or an array of thing. Just a neater interface for the user writing configuration. + */ +export type OneOrMany = T | T[]; + +/** + * An attribute list details the results of running DataSelectors on an element. + * + * It's a list of key-value pairs along with a label for the source DataSelector to remove ambiguity. + * The list of objects is chosen for BigQuery compat, as it doesn't really support arbitrary "map" types. + */ +export type AttributeList = { + source: string; + attribute: string; + value: string; +}[]; + +/** + * A DataSelector defines information to extract from an element. + * + * It can be a custom function returning arbitrary key/values as an object. Non-string values will be cast to string or cast to JSON strings. If exceptions are thrown, the error information is captured. + * Alternatively there are several declarative options that can be specified as object properties. + * + * The properties allowed are: + * - attributes: Return the values of a list of attributes of the element + * - properties: Return the values of a list of property names of the element's DOM node; this is similar to attributes in some cases but different in others. E.g. `class` as an attribute needs to be `className` as a property; some attributes will reflect their initial value rather than what has been updated via JavaScript + * - dataset: Return the values of a list of data-* attributes; uses the camelCase name rather than the kebab-case name of the attribute + * - selector: Specify `true` to attach the CSS selector used to match the element; can be used to differentiate elements with the same `name` + * - content: Provide an object mapping names to RegExp patterns to run on the element's text content. If it matches it is included. The first group in the pattern will be prioritized if specified. + * - child_text: Provide an object mapping names to CSS selectors; the selectors are evaluated against the element and the first matching element's text content is the value. + * - match: Logical operator for use when used as a condition; always evaluated last. Look at existing matches so far, comparing each key/value to the provided object. Alternatively supply a predicate function that determines if this matches or not. If there are no matches, discard any matches found to this point. + */ +export type DataSelector = + | ((element: Element) => Record) + | { attributes: string[] } + | { properties: string[] } + | { dataset: string[] } + | { selector: boolean } + | { content: Record } + | { child_text: Record } + | { match: Record boolean)> }; + +/** + * When this type of event should actually be tracked after it has been detected. + */ +export enum Frequency { + /** + * Track this event every time it occurs; e.g. EXPOSE every time it scrolls into/out of view. + */ + ALWAYS = 'always', + /** + * Track this event at most once per element that matches the selector for the lifetime of the plugin. + */ + ELEMENT = 'element', + /** + * Only track the event the first time it occurs per configuration. Even if other elements would trigger the event, ignore them after the first time it occurs. + */ + ONCE = 'once', + /** + * Never track this event, effectively disabling a configuration. + */ + NEVER = 'never', + /** + * Track each event only once per element until the next pageview is seen, allowing it to be tracked again. Mostly useful for Single Page Applications. + */ + PAGEVIEW = 'pageview', +} diff --git a/plugins/browser-plugin-element-tracking/src/util.ts b/plugins/browser-plugin-element-tracking/src/util.ts new file mode 100644 index 000000000..030fc3d46 --- /dev/null +++ b/plugins/browser-plugin-element-tracking/src/util.ts @@ -0,0 +1,85 @@ +import { Configuration } from './configuration'; +import { Frequency } from './types'; + +/** + * Parses custom boundaries config. + * @param boundaryPixels Input format boundaries. + * @returns Object describing the input boundary configuration. + */ +export function defineBoundaries(boundaryPixels: number | [number, number] | [number, number, number, number]) { + let boundTop: number, boundRight: number, boundBottom: number, boundLeft: number; + if (typeof boundaryPixels === 'number') { + boundTop = boundRight = boundBottom = boundLeft = boundaryPixels; + } else if (Array.isArray(boundaryPixels)) { + if (boundaryPixels.length === 2) { + boundTop = boundBottom = boundaryPixels[0]; + boundRight = boundLeft = boundaryPixels[1]; + } else if (boundaryPixels.length === 4) { + [boundTop, boundRight, boundBottom, boundLeft] = boundaryPixels; + } else { + boundTop = boundRight = boundBottom = boundLeft = 0; + } + } else { + boundTop = boundRight = boundBottom = boundLeft = 0; + } + + return { boundTop, boundRight, boundBottom, boundLeft }; +} + +/** + * Gets descendent elements of `target` (`document` by default) that match the selector info in `config`. + * This is usually a wrapper around `querySelectorAll`, but accounts for shadow roots that can be specified in `config`. + * @param config The configuration containing the selector and other details that influence how elements will be found. + * @param target The root to start finding descendent elements from; defaults to `document` + * @returns Array of elements within `target` that matched the configuration in `config`. + */ +export function getMatchingElements(config: Configuration, target: ParentNode = document) { + const { selector, shadowOnly, shadowSelector } = config; + const elements: Element[] = shadowOnly ? [] : Array.from(target.querySelectorAll(selector)); + + if (shadowSelector) { + Array.from(target.querySelectorAll(shadowSelector), (host) => { + if (host.shadowRoot) { + // these will have been skipped in the above check but should be included if we're recursing + if (shadowOnly) elements.push(...Array.from(host.shadowRoot.querySelectorAll(selector))); + // look for nested shadow elements + elements.push(...getMatchingElements(config, host.shadowRoot)); + } + }); + } + + return elements; +} + +/** + * Type guard to check that `Node` is an `Element` + * @param node Node to check. + * @returns If `node` is an Element. + */ +export function nodeIsElement(node: Node): node is Element { + return node.nodeType === Node.ELEMENT_NODE; +} + +/** + * Evaluates whether the current intersection is eligible for firing an EXPOSE event against the given configuration. + * Mostly this handles "disabled" config (when: never), minimum size/intersection checks and custom boundaries. + */ +export function shouldTrackExpose(config: Configuration, entry: IntersectionObserverEntry): boolean { + if (config.expose.when === Frequency.NEVER) return false; + if (!entry.isIntersecting) return false; + + const { boundaryPixels, minPercentage, minSize } = config.expose; + + const { boundTop, boundRight, boundBottom, boundLeft } = defineBoundaries(boundaryPixels); + + const { boundingClientRect } = entry; + if (boundingClientRect.height * boundingClientRect.width < minSize) return false; + + const intersectionArea = entry.intersectionRect.height * entry.intersectionRect.width; + const boundingHeight = entry.boundingClientRect.height + boundTop + boundBottom; + const boundingWidth = entry.boundingClientRect.width + boundLeft + boundRight; + const boundingArea = boundingHeight * boundingWidth; + if (minPercentage > intersectionArea / boundingArea) return false; + + return true; +} diff --git a/plugins/browser-plugin-element-tracking/test/api.test.ts b/plugins/browser-plugin-element-tracking/test/api.test.ts new file mode 100644 index 000000000..4fd77b224 --- /dev/null +++ b/plugins/browser-plugin-element-tracking/test/api.test.ts @@ -0,0 +1,624 @@ +import { addTracker, BrowserTracker, SharedState } from '@snowplow/browser-tracker-core'; +import type { Logger } from '@snowplow/tracker-core'; + +import { SnowplowElementTrackingPlugin, endElementTracking, startElementTracking } from '../src'; +import { AttributeList } from '../src/types'; + +/** + * Note: jsdom does not support IntersectionObserver so unit tests can only cover create/destroy events. + * + * https://github.com/jsdom/jsdom/issues/2032 + */ + +/** + * The plugin performs asynchronously when possible for performance. + * To actually see generated events, we need to check for them in a new task. + * This fn handles boilerplate for that. + * @param cb Callback making actual assertions + * @returns Promise resolving after callback succeeds after executing in new task. Rejects if `cb` throws to avoid timeouts. + */ +const inNewTask = (cb: () => void) => + new Promise((resolve, reject) => { + expect.hasAssertions(); + setTimeout(() => { + try { + resolve(cb()); + } catch (e) { + reject(e); + } + }, 50); + }); + +const eventSDJ = ( + field: string, + evt: { evt: Record }, + schema: string +): Record | Record[] | undefined => { + try { + const payloadString = evt.evt[field] as string; + const payload = JSON.parse(payloadString); + + if (/^ue_p[rx]$/.test(field)) { + if (payload.data.schema.split('/').includes(schema)) return payload.data; + } else if (/^c[ox]$/.test(field)) { + return payload.data.filter((e: any) => e.schema.split('/').includes(schema)).map((e: any) => e.data); + } + } catch (e) {} + return; +}; + +const unstructOf = eventSDJ.bind(null, 'ue_pr'); +const entityOf = eventSDJ.bind(null, 'co'); + +const FAKE_CONTEXT_SCHEMA = 'iglu:com.example/custom_entity/jsonschema/1-0-0'; + +describe('Element Tracking Plugin API', () => { + const eventQueue: { evt: Record }[] = []; + const secondEventQueue: { evt: Record }[] = []; + let warnLog: jest.SpyInstance>; + let tracker: BrowserTracker; + + beforeAll(() => { + const state = new SharedState(); + const plugin = SnowplowElementTrackingPlugin({ ignoreNextPageView: false }); + + const activateBrowserPlugin = jest.spyOn(plugin, 'activateBrowserPlugin'); + const logger = jest.spyOn(plugin, 'logger'); + + tracker = addTracker('test', 'test', 'js-test', '', state, { + stateStorageStrategy: 'cookie', + encodeBase64: false, + plugins: [ + plugin, + { + beforeTrack: (pb) => { + eventQueue.push({ evt: pb.build() }); + }, + }, + ], + customFetch: async () => new Response(null, { status: 200 }), + })!; + + expect(activateBrowserPlugin).toHaveBeenCalled(); + expect(logger).toHaveBeenCalledTimes(1); + + addTracker('test2', 'test2', 'js-test', '', state, { + stateStorageStrategy: 'cookie', + encodeBase64: false, + plugins: [ + plugin, + { + beforeTrack: (pb) => { + secondEventQueue.push({ evt: pb.build() }); + }, + }, + ], + customFetch: async () => new Response(null, { status: 200 }), + }); + + warnLog = jest.spyOn(logger.mock.calls[0][0], 'warn'); + }); + + afterEach(() => { + endElementTracking(); + document.body.replaceChildren(); + warnLog.mockReset(); + eventQueue.length = 0; + secondEventQueue.length = 0; + }); + + describe('startElementTracking', () => { + it('warns for unavailable observer', () => { + expect(typeof IntersectionObserver).toBe('undefined'); + + startElementTracking({ elements: { selector: 'div', expose: true } }); + + return inNewTask(() => { + expect(warnLog).toHaveBeenCalled(); + expect(eventQueue).toHaveLength(0); + }); + }); + + it('silent when not requesting unavailable observer', () => { + expect(typeof IntersectionObserver).toBe('undefined'); + expect(typeof MutationObserver).toBe('function'); + + startElementTracking({ elements: { selector: 'div', expose: false, create: true } }); + + return inNewTask(() => { + expect(warnLog).not.toHaveBeenCalled(); + expect(eventQueue).toHaveLength(0); + }); + }); + + it('tracks element creation', () => { + startElementTracking({ elements: { selector: '.newelement', expose: false, create: true } }); + + const div = document.createElement('div'); + div.classList.add('newelement'); + document.body.appendChild(div); + + return inNewTask(() => { + expect(eventQueue).toHaveLength(1); + expect(unstructOf(eventQueue[0], 'create_element')).toBeDefined(); + expect(entityOf(eventQueue[0], 'element')).toHaveLength(1); + }); + }); + + it('tracks element removal', () => { + const div = document.createElement('div'); + div.classList.add('existing'); + document.body.appendChild(div); + + startElementTracking({ elements: [{ selector: '.existing', expose: false, destroy: true }] }); + + document.body.removeChild(div); + + return inNewTask(() => { + expect(eventQueue).toHaveLength(1); + expect(unstructOf(eventQueue[0], 'destroy_element')).toBeDefined(); + expect(entityOf(eventQueue[0], 'element')).toHaveLength(1); + }); + }); + + it('tracks element mutation', () => { + const div = document.createElement('div'); + document.body.appendChild(div); + + startElementTracking({ elements: [{ selector: '.mutated', expose: false, create: true, destroy: true }] }); + + // we split these changes into microtasks or else the double toggle can't actually be observed + return Promise.resolve() + .then(() => { + div.classList.toggle('mutated'); + }) + .then(() => { + div.classList.toggle('mutated'); + }) + .then(() => { + div.classList.toggle('mutated'); + }) + .then(() => + inNewTask(() => { + expect(eventQueue).toHaveLength(3); + expect(unstructOf(eventQueue[0], 'create_element')).toBeDefined(); + expect(unstructOf(eventQueue[1], 'destroy_element')).toBeDefined(); + expect(unstructOf(eventQueue[2], 'create_element')).toBeDefined(); + }) + ); + }); + + it('includes advanced details', () => { + startElementTracking({ + elements: [ + { + selector: 'body', + component: true, + }, + { + selector: '.advanced', + expose: false, + create: { + when: 'always', + }, + details: { properties: ['className'] }, + contents: { selector: 'h1', details: { content: { heading_text: '.+' } } }, + context: () => [{ schema: FAKE_CONTEXT_SCHEMA, data: { from: 'config' } }], + }, + ], + context: [{ schema: FAKE_CONTEXT_SCHEMA, data: { from: 'batch' } }], + }); + + const div = document.createElement('div'); + div.classList.add('advanced'); + const heading = document.createElement('h1'); + heading.replaceChildren('Heading'); + div.replaceChildren(heading); + document.body.appendChild(div); + + return inNewTask(() => { + expect(eventQueue).toHaveLength(1); + expect(unstructOf(eventQueue[0], 'create_element')).toBeDefined(); + + expect(entityOf(eventQueue[0], 'element')).toHaveLength(2); // .advanced and body component + const elementEntities = entityOf(eventQueue[0], 'element'); + const elementEntity = Array.isArray(elementEntities) ? elementEntities[0] : (undefined as never); + const attributeList = elementEntity.attributes as AttributeList; + expect(attributeList).toHaveLength(1); + expect(attributeList).toEqual([ + { + source: 'properties', + attribute: 'className', + value: 'advanced', + }, + ]); + + expect(entityOf(eventQueue[0], 'component_parents')).toEqual([ + { + element_name: '.advanced', + component_list: ['body'], + }, + ]); + expect(entityOf(eventQueue[0], 'element_content')).toEqual([ + { + parent_name: '.advanced', + parent_index: 1, + element_name: 'h1', + element_index: 1, + attributes: [ + { + source: 'content', + attribute: 'heading_text', + value: 'Heading', + }, + ], + }, + ]); + expect(entityOf(eventQueue[0], 'custom_entity')).toEqual([{ from: 'batch' }, { from: 'config' }]); + }); + }); + + it('frequency: once', () => { + const div = document.createElement('div'); + document.body.appendChild(div); + const div2 = document.createElement('div'); + document.body.appendChild(div2); + + startElementTracking({ elements: [{ selector: '.mutated', expose: false, create: { when: 'once' } }] }); + + // we split these changes into microtasks or else the double toggle can't actually be observed + return Promise.resolve() + .then(() => { + div.classList.toggle('mutated'); + }) + .then(() => { + div.classList.toggle('mutated'); + }) + .then(() => { + div.classList.toggle('mutated'); // this create should be skipped + }) + .then(() => { + div2.classList.toggle('mutated'); // second div should skip too + }) + .then(() => + inNewTask(() => { + expect(eventQueue).toHaveLength(1); + expect(unstructOf(eventQueue[0], 'create_element')).toBeDefined(); + }) + ); + }); + + it('frequency: element', () => { + const div = document.createElement('div'); + document.body.appendChild(div); + const div2 = document.createElement('div'); + document.body.appendChild(div2); + + startElementTracking({ + elements: [{ selector: '.mutated', expose: false, create: { when: 'element' }, destroy: true }], + }); + + // we split these changes into microtasks or else the double toggle can't actually be observed + return Promise.resolve() + .then(() => { + div.classList.toggle('mutated'); + }) + .then(() => { + div.classList.toggle('mutated'); + }) + .then(() => { + div.classList.toggle('mutated'); // this create should be skipped + }) + .then(() => { + div.classList.toggle('mutated'); + }) + .then(() => { + div2.classList.toggle('mutated'); // but not for div2 + }) + .then(() => + inNewTask(() => { + expect(eventQueue).toHaveLength(4); + expect(unstructOf(eventQueue[0], 'create_element')).toBeDefined(); + expect(unstructOf(eventQueue[1], 'destroy_element')).toBeDefined(); + expect(unstructOf(eventQueue[2], 'destroy_element')).toBeDefined(); + expect(unstructOf(eventQueue[3], 'create_element')).toBeDefined(); + }) + ); + }); + + it('frequency: pageview', () => { + const div = document.createElement('div'); + document.body.appendChild(div); + + startElementTracking({ + elements: [{ selector: '.mutated', expose: false, create: { when: 'pageview' }, destroy: true }], + }); + + // we split these changes into microtasks or else the double toggle can't actually be observed + return Promise.resolve() + .then(() => { + div.classList.toggle('mutated'); + }) + .then(() => { + div.classList.toggle('mutated'); + }) + .then(() => { + div.classList.toggle('mutated'); // this create should be skipped + }) + .then(() => { + div.classList.toggle('mutated'); + }) + .then(() => + inNewTask(() => { + tracker.trackPageView(); // new task or the order is weird + }) + ) + .then(() => { + div.classList.toggle('mutated'); // new pv, don't skip this one + }) + .then(() => + inNewTask(() => { + expect(eventQueue).toHaveLength(5); + expect(unstructOf(eventQueue[0], 'create_element')).toBeDefined(); + expect(unstructOf(eventQueue[1], 'destroy_element')).toBeDefined(); + expect(unstructOf(eventQueue[2], 'destroy_element')).toBeDefined(); + expect(eventQueue[3].evt.e).toBe('pv'); + expect(unstructOf(eventQueue[4], 'create_element')).toBeDefined(); + }) + ); + }); + + it('evaluates conditions', () => { + startElementTracking({ + elements: { + selector: 'div', + expose: false, + create: { + when: 'always', + condition: { dataset: ['fake'] }, + }, + }, + }); + + const div = document.createElement('div'); + document.body.appendChild(div); + + return inNewTask(() => { + expect(eventQueue).toHaveLength(0); + }); + }); + + it('dedupes by id', () => { + startElementTracking({ + elements: { + id: 'test', + selector: 'span', + expose: false, + create: true, + }, + }); + + startElementTracking({ + elements: { + id: 'test', + selector: 'div', + expose: false, + create: true, + }, + }); + + for (const nodeName of ['div', 'span']) { + const element = document.createElement(nodeName); + document.body.appendChild(element); + } + + return inNewTask(() => { + expect(eventQueue).toHaveLength(1); + }); + }); + + it('adds element stats', () => { + startElementTracking({ + elements: { selector: '.newelement', expose: false, create: false, includeStats: 'page_view' }, + }); + + const div = document.createElement('div'); + div.classList.add('newelement'); + document.body.appendChild(div); + + tracker.trackPageView(); + tracker.trackPageView(); + + return inNewTask(() => { + expect(eventQueue).toHaveLength(2); + expect(entityOf(eventQueue[0], 'element_statistics')).toHaveLength(1); + expect(entityOf(eventQueue[1], 'element_statistics')).toHaveLength(1); + }); + }); + }); + + describe('multiple tracker', () => { + it('works with multiple trackers', () => { + startElementTracking({ elements: { selector: '.newelement', expose: false, create: true } }); + + const div = document.createElement('div'); + div.classList.add('newelement'); + document.body.appendChild(div); + + return inNewTask(() => { + expect(eventQueue).toHaveLength(1); + expect(secondEventQueue).toHaveLength(1); + expect(unstructOf(eventQueue[0], 'create_element')).toBeDefined(); + expect(unstructOf(secondEventQueue[0], 'create_element')).toBeDefined(); + expect(entityOf(eventQueue[0], 'element')).toHaveLength(1); + expect(entityOf(secondEventQueue[0], 'element')).toHaveLength(1); + }); + }); + + it('works with selective trackers', () => { + startElementTracking({ elements: { selector: '.newelement', expose: false, create: true } }, ['test']); + + const div = document.createElement('div'); + div.classList.add('newelement'); + document.body.appendChild(div); + + return inNewTask(() => { + expect(eventQueue).toHaveLength(1); + expect(secondEventQueue).toHaveLength(0); + expect(unstructOf(eventQueue[0], 'create_element')).toBeDefined(); + expect(entityOf(eventQueue[0], 'element')).toHaveLength(1); + }); + }); + }); + + describe('endElementTracking', () => { + it('untracks by id', () => { + startElementTracking({ + elements: { + id: 'test', + selector: 'div', + expose: false, + create: true, + }, + }); + + endElementTracking({ elementIds: ['test'] }); + + const div = document.createElement('div'); + document.body.appendChild(div); + + return inNewTask(() => { + expect(eventQueue).toHaveLength(0); + }); + }); + + it('untracks by name', () => { + startElementTracking({ + elements: [ + { + selector: 'div', + expose: false, + create: true, + }, + { + selector: 'span', + expose: false, + create: true, + }, + ], + }); + + endElementTracking({ elements: ['span'] }); + + for (const nodeName of ['div', 'span']) { + const element = document.createElement(nodeName); + document.body.appendChild(element); + } + + return inNewTask(() => { + expect(eventQueue).toHaveLength(1); + }); + }); + + it('untracks by filter', () => { + startElementTracking({ + elements: [ + { + selector: 'div', + expose: false, + create: true, + }, + { + selector: 'span', + expose: false, + create: true, + }, + ], + }); + + endElementTracking({ filter: (config) => config.create.when === 'always' }); + + for (const nodeName of ['div', 'span']) { + const element = document.createElement(nodeName); + document.body.appendChild(element); + } + + return inNewTask(() => { + expect(eventQueue).toHaveLength(0); + }); + }); + }); + + describe('intersectionCallback position fallback', () => { + let intersectionCallback: IntersectionObserverCallback; + + beforeAll(() => { + // Mock IntersectionObserver to capture the callback + (globalThis as any).IntersectionObserver = class { + constructor(cb: IntersectionObserverCallback) { + intersectionCallback = cb; + } + observe() {} + unobserve() {} + disconnect() {} + }; + }); + + afterAll(() => { + delete (globalThis as any).IntersectionObserver; + }); + + it('uses last-known position when element is no longer in DOM during intersection callback', () => { + // Create two matching elements so position > 1 is testable + const div1 = document.createElement('div'); + div1.classList.add('disappearing'); + document.body.appendChild(div1); + + const div2 = document.createElement('div'); + div2.classList.add('disappearing'); + document.body.appendChild(div2); + + startElementTracking({ + elements: { + selector: '.disappearing', + expose: true, + }, + }); + + // Remove div2 from DOM before firing intersection + document.body.removeChild(div2); + + // Simulate intersection callback for the now-removed div2 + const fakeEntry = { + target: div2, + isIntersecting: true, + intersectionRatio: 1, + intersectionRect: { height: 100, width: 100 } as DOMRect, + boundingClientRect: { x: 0, y: 0, width: 100, height: 100 } as DOMRect, + rootBounds: null, + time: performance.now(), + } as IntersectionObserverEntry; + + intersectionCallback([fakeEntry], { + unobserve() {}, + observe() {}, + disconnect() {}, + } as unknown as IntersectionObserver); + + return inNewTask(() => { + expect(eventQueue.length).toBeGreaterThanOrEqual(1); + + const exposeEvent = eventQueue.find((e) => unstructOf(e, 'expose_element')); + expect(exposeEvent).toBeDefined(); + + const elementEntities = entityOf(exposeEvent!, 'element') as Record[]; + expect(elementEntities).toBeDefined(); + expect(elementEntities.length).toBeGreaterThanOrEqual(1); + + // element_index must be >= 1, never 0 + const elementEntity = elementEntities[0]; + expect(elementEntity.element_index).toBeGreaterThanOrEqual(1); + }); + }); + }); +}); diff --git a/plugins/browser-plugin-element-tracking/test/components.test.ts b/plugins/browser-plugin-element-tracking/test/components.test.ts new file mode 100644 index 000000000..6dabfb996 --- /dev/null +++ b/plugins/browser-plugin-element-tracking/test/components.test.ts @@ -0,0 +1,43 @@ +import { baseComponentGenerator } from '../src/components'; +import { Entities } from '../src/schemata'; +import { Configuration } from '../src/configuration'; + +describe('component detection', () => { + let container: HTMLElement; + const config: Configuration = { + name: 'template', + selector: 'body', + shadowOnly: false, + component: true, + context: () => [], + trackers: [], + create: { when: 'never' }, + destroy: { when: 'never' }, + expose: { when: 'never', minPercentage: 0, boundaryPixels: 0, minSize: 0, minTimeMillis: 0 }, + obscure: { when: 'never' }, + state: 0, + details: [], + contents: [], + includeStats: [], + }; + + beforeAll(() => { + container = document.createElement('div'); + document.body.appendChild(container); + }); + + it('no-ops without target element', () => { + expect(baseComponentGenerator(true, [config])).toBeNull(); + }); + + it('finds components from child target', () => { + expect(baseComponentGenerator(false, [config], container)).toEqual({ + schema: Entities.COMPONENT_PARENTS, + data: { + component_list: [config.name], + }, + }); + + expect(baseComponentGenerator(true, [config], container)).toHaveLength(2); + }); +}); diff --git a/plugins/browser-plugin-element-tracking/test/configuration.test.ts b/plugins/browser-plugin-element-tracking/test/configuration.test.ts new file mode 100644 index 000000000..b1818d1de --- /dev/null +++ b/plugins/browser-plugin-element-tracking/test/configuration.test.ts @@ -0,0 +1,128 @@ +import { + Configuration, + type ContextProvider, + ElementConfiguration, + checkConfig, + createContextMerger, +} from '../src/configuration'; + +describe('configuration parsing', () => { + const emptyMerger = createContextMerger(); + + // Accept valid configs + it.each<{ note: string; input: ElementConfiguration; expected?: Partial }>([ + { + note: 'minimal configuration', + input: { selector: '.oncreate' }, + }, + { + note: 'use selector when no name', + input: { selector: 'unnamed' }, + expected: { selector: 'unnamed', name: 'unnamed' }, + }, + { + note: 'custom name', + input: { selector: '.selector', name: 'named' }, + expected: { selector: '.selector', name: 'named' }, + }, + { + note: 'default event frequencies', + input: { selector: 'unnamed' }, + expected: { + create: { when: 'never' }, + destroy: { when: 'never' }, + expose: { when: 'always', boundaryPixels: 0, minPercentage: 0, minSize: 0, minTimeMillis: 0 }, + obscure: { when: 'never' }, + component: false, + contents: [], + details: [], + }, + }, + { + note: 'custom frequencies', + input: { selector: 'unnamed', expose: false, create: true }, + expected: { + create: { when: 'always' }, + expose: { when: 'never', boundaryPixels: 0, minPercentage: 0, minSize: 0, minTimeMillis: 0 }, + }, + }, + { + note: 'mis-cased frequencies', + input: { selector: 'unnamed', create: { when: 'ALWAYs' as any }, expose: { when: 'Never' as any } }, + expected: { + create: { when: 'always' }, + expose: { when: 'never' } as any, + }, + }, + { + note: 'context provider', + input: { selector: 'unnamed', context: [] }, + expected: { + context: emptyMerger as Extract, + }, + }, + { + note: 'contents recursion', + input: { selector: 'unnamed', contents: { selector: 'inner' } }, + }, + ])('accepts valid config: $note', ({ input, expected }) => { + const result = checkConfig(input, emptyMerger, true, true); + expect(result).toBeDefined(); + if (expected) expect(result).toMatchObject(expected); + }); + + // Reject invalid configs + it.each<{ note: string; input: ElementConfiguration }>([ + { + note: 'invalid name', + input: { selector: 'a', name: '' }, + }, + { + note: 'empty selector', + input: { selector: '' }, + }, + { + note: 'invalid selector', + input: { selector: ':asdf' }, + }, + { + note: 'mistyped selector', + input: { selector: 1 as any }, + }, + { + note: 'good name, bad selector', + input: { selector: '', name: 'named' }, + }, + { + note: 'bad expose condition', + input: { selector: '.good', name: 'named', expose: { condition: {} } as any }, + }, + { + note: 'bad other condition', + input: { selector: '.good', name: 'named', create: { condition: true } as any }, + }, + { + note: 'bad expose frequency', + input: { selector: '.good', name: 'named', expose: { when: 'fail' } }, + }, + { + note: 'bad other frequency', + input: { selector: '.good', name: 'named', create: { when: 'fail' } }, + }, + { + note: 'bad boundaries', + input: { selector: '.good', name: 'named', expose: { when: 'always', boundaryPixels: '1em' } }, + }, + { + note: 'bad details request', + input: { selector: '.good', name: 'named', details: {} as any }, + }, + ])('rejects invalid config: $note', ({ input }) => { + expect.hasAssertions(); + try { + checkConfig(input, emptyMerger, true, true); + } catch (e) { + expect(e).toBeDefined(); + } + }); +}); diff --git a/plugins/browser-plugin-element-tracking/test/data.test.ts b/plugins/browser-plugin-element-tracking/test/data.test.ts new file mode 100644 index 000000000..cb0b2552a --- /dev/null +++ b/plugins/browser-plugin-element-tracking/test/data.test.ts @@ -0,0 +1,139 @@ +import { evaluateDataSelector, extractSelectorDetails, isDataSelector } from '../src/data'; +import type { DataSelector } from '../src/types'; + +describe('DataSelector behavior', () => { + const fake_selector = 'css_path_val'; + let elem: HTMLDivElement; + + beforeAll(() => { + // sample element we'll be selecting from + elem = document.createElement('div'); + + elem.textContent = 'text_content_val\n'; + elem.setAttribute('id', 'id_attr'); + elem.className = 'class_prop'; + elem.dataset.dsAttr = 'ds_val'; + + const child = document.createElement('span'); + child.textContent = 'child_text_val'; + elem.appendChild(child); + }); + + it.each([ + ['attributes', ['id'], 'id_attr'], + ['properties', ['className'], 'class_prop'], + ['dataset', ['dsAttr'], 'ds_val'], + ['child_text', { inner: 'span' }, 'child_text_val'], + ['content', { inner: 'text_content\\S+' }, 'text_content_val'], + ['selector', true, fake_selector], + ])('extracts %p', (source, params, value) => { + const selector = { [source]: params } as DataSelector; + expect(isDataSelector(selector)).toBe(true); + + const result = evaluateDataSelector(elem, fake_selector, selector); + + const expected = Array.isArray(params) ? params : params === true ? [source] : Object.keys(params); + + expect(result).toEqual( + expected.map((attribute) => ({ + source, + attribute, + value, + })) + ); + }); + + it('handles callbacks', () => { + const sel = jest.fn().mockReturnValueOnce({ attribute: 'value', complex: { nested: 'data' } }); + + expect(isDataSelector(sel)).toBe(true); + + const result = evaluateDataSelector(elem, fake_selector, sel); + + expect(sel).toBeCalledWith(elem); + expect(result).toEqual([ + { + source: 'callback', + attribute: 'attribute', + value: 'value', + }, + { + source: 'callback', + attribute: 'complex', + value: '{"nested":"data"}', + }, + ]); + }); + + it('handles callback failures', () => { + const sel = jest.fn, Element[]>(() => { + throw new Error('deliberate failure'); + }); + + expect(isDataSelector(sel)).toBe(true); + + const result = evaluateDataSelector(elem, fake_selector, sel); + + expect(sel).toBeCalledWith(elem); + expect(result).toEqual([ + { + source: 'error', + attribute: 'message', + value: 'deliberate failure', + }, + ]); + }); + + it('flattens correctly', () => { + const result = extractSelectorDetails(elem, fake_selector, [ + { attributes: ['id'] }, + { properties: ['className'] }, + { properties: ['DOES_NOT_EXIST'] }, + ]); + + expect(result).toHaveLength(2); + }); + + it('doesnt mix properties and attributes', () => { + const result = evaluateDataSelector(elem, fake_selector, { + attributes: ['className', 'class'], + properties: ['className', 'class'], + }); + + expect(result).toHaveLength(2); + + expect(result).toContainEqual({ + source: 'properties', + attribute: 'className', + value: 'class_prop', + }); + + expect(result).toContainEqual({ + source: 'attributes', + attribute: 'class', + value: 'class_prop', + }); + }); + + it('produces successful matches', () => { + const result = evaluateDataSelector(elem, fake_selector, { + attributes: ['id'], + match: { id: 'id_attr' }, + }); + + expect(result).toHaveLength(1); + }); + + it('filters unsuccessful matches', () => { + const result = evaluateDataSelector(elem, fake_selector, { + attributes: ['id'], + match: { id: 'NOT_REAL_VALUE' }, + }); + + expect(result).toHaveLength(0); + }); + + it.each([null, {}, { notASelector: [] }])('ignores empty: %j', (invalid) => { + expect(isDataSelector(invalid)).toBe(false); + }); +}); diff --git a/plugins/browser-plugin-element-tracking/test/util.test.ts b/plugins/browser-plugin-element-tracking/test/util.test.ts new file mode 100644 index 000000000..6325ab74e --- /dev/null +++ b/plugins/browser-plugin-element-tracking/test/util.test.ts @@ -0,0 +1,246 @@ +import { defineBoundaries, getMatchingElements, nodeIsElement, shouldTrackExpose } from '../src/util'; +import type { Configuration } from '../src/configuration'; + +const TEMPLATE_CONFIG: Configuration = { + name: 'template', + selector: '', + shadowOnly: false, + component: false, + context: () => [], + trackers: [], + create: { when: 'never' }, + destroy: { when: 'never' }, + expose: { when: 'never', minPercentage: 0, boundaryPixels: 0, minSize: 0, minTimeMillis: 0 }, + obscure: { when: 'never' }, + state: 0, + details: [], + contents: [], + includeStats: [], +}; + +const TEMPLATE_DOMRECT: DOMRectReadOnly = { + bottom: 0, + top: 0, + left: 0, + right: 0, + height: 0, + width: 0, + x: 0, + y: 0, + toJSON() {}, +}; + +const TEMPLATE_INTERSECTION: IntersectionObserverEntry = { + time: 0, + isIntersecting: true, + target: document.body, + rootBounds: null, + boundingClientRect: TEMPLATE_DOMRECT, + intersectionRatio: 0, + intersectionRect: TEMPLATE_DOMRECT, +}; + +describe('utils', () => { + describe('defineBoundaries', () => { + it.each([ + [0, [0, 0, 0, 0]], + [1, [1, 1, 1, 1]], + [[0, 1] as [number, number], [0, 1, 0, 1]], + [[2, 2, 2, 2] as [number, number, number, number], [2, 2, 2, 2]], + [[2, 2, 2] as any as [number, number, number, number], [0, 0, 0, 0]], // silent error + [{} as any as number, [0, 0, 0, 0]], // silent error + ])('interprets: %j', (provided, expected) => { + const [boundTop, boundRight, boundBottom, boundLeft] = expected; + expect(defineBoundaries(provided)).toEqual({ + boundTop, + boundRight, + boundBottom, + boundLeft, + }); + }); + }); + + describe('getMatchingElements', () => { + it('queries for nodes', () => { + const config: Configuration = { ...TEMPLATE_CONFIG, selector: 'body' }; + const results = getMatchingElements(config); + expect(results).toHaveLength(1); + expect(results[0]).toBe(document.body); + expect(nodeIsElement(results[0])).toBe(true); + + const explicitTarget = getMatchingElements(config, document); + expect(results).toEqual(explicitTarget); + }); + + describe('shadow host support', () => { + const elements: Element[] = []; + const config: Configuration = { ...TEMPLATE_CONFIG, selector: 'span' }; + + beforeAll(() => { + const host = document.createElement('div'); + host.id = 'shadowHost'; + const shadow = host.attachShadow({ mode: 'open' }); + document.body.appendChild(host); + + for (let i = 5; i > 0; i--) { + const el = document.createElement('span'); + shadow.appendChild(el); + elements.push(el); + } + }); + + afterAll(() => { + document.body.replaceChildren(); + }); + + it('should not find from shadow roots by default', () => { + expect(getMatchingElements(config)).toHaveLength(0); + }); + + it('should descend shadow hosts matching shadowSelector', () => { + const shadowConfig: Configuration = { + ...config, + shadowSelector: '#shadowHost', + }; + + expect(getMatchingElements(shadowConfig)).toEqual(elements); + }); + + it('should respect shadowOnly setting', () => { + const shadowConfig: Configuration = { + ...config, + shadowSelector: '#shadowHost', + shadowOnly: false, + }; + + let results = getMatchingElements(shadowConfig); + + expect(results).toEqual(elements); + + // with shadowOnly: false, should find a non-shadow span, too + const addition = document.createElement('span'); + document.body.appendChild(addition); + + results = getMatchingElements(shadowConfig); + expect(results).not.toEqual(elements); + expect(results).toHaveLength(elements.length + 1); + expect(results).toEqual(elements.concat([addition])); + + // with shadowOnly: true, should ignore the non-shadow span + results = getMatchingElements({ ...shadowConfig, shadowOnly: true }); + expect(results).toEqual(elements); + }); + + it('should find nested shadow targets', () => { + const shadowConfig: Configuration = { + ...config, + shadowSelector: '#shadowHost', + shadowOnly: true, + }; + + let results = getMatchingElements(shadowConfig); + + expect(results).toEqual(elements); + + const host = document.querySelector('#shadowHost')!.shadowRoot!; + const addition = document.createElement('span'); + host.appendChild(addition); + + results = getMatchingElements(shadowConfig); + expect(results).not.toEqual(elements); + expect(results).toHaveLength(elements.length + 1); + expect(results).toEqual(elements.concat([addition])); + }); + }); + }); + + describe('shouldTrackExpose', () => { + it.each([ + ['frequency: never', { when: 'never' as const }, {}, false], + ['not intersecting', { when: 'always' as const }, { isIntersecting: false }, false], + ['intersecting', { when: 'always' as const }, { isIntersecting: true }, true], + ['zero-size', { when: 'always' as const, minSize: 1 }, { isIntersecting: true }, false], + [ + 'partial view', + { when: 'always' as const, minPercentage: 1 }, + { + intersectionRatio: (100 * 100) / (200 * 200), + intersectionRect: { ...TEMPLATE_DOMRECT, width: 100, height: 100 }, + boundingClientRect: { ...TEMPLATE_DOMRECT, width: 200, height: 200 }, + }, + false, + ], + [ + 'sufficent view', + { when: 'always' as const, minPercentage: (200 * 160) / (200 * 200) }, + { + intersectionRatio: (200 * 160) / (200 * 200), + intersectionRect: { ...TEMPLATE_DOMRECT, width: 200, height: 160 }, + boundingClientRect: { ...TEMPLATE_DOMRECT, width: 200, height: 200 }, + }, + true, + ], + [ + 'insufficent view', + { when: 'always' as const, minPercentage: (200 * 160) / (200 * 200) }, + { + intersectionRatio: (200 * 159) / (200 * 200), + intersectionRect: { ...TEMPLATE_DOMRECT, width: 200, height: 159 }, + boundingClientRect: { ...TEMPLATE_DOMRECT, width: 200, height: 200 }, + }, + false, + ], + [ + 'shrunken element', + { when: 'always' as const, minPercentage: (200 * 160) / (200 * 200), boundaryPixels: -100 }, + { + intersectionRatio: (200 * 159) / (200 * 200), + intersectionRect: { ...TEMPLATE_DOMRECT, width: 200, height: 159 }, + boundingClientRect: { ...TEMPLATE_DOMRECT, width: 200, height: 200 }, + }, + true, + ], + [ + 'enlarged element - possible', + { when: 'always' as const, minPercentage: 0.1, boundaryPixels: 100 }, + { + intersectionRatio: (200 * 200) / (200 * 200), + intersectionRect: { ...TEMPLATE_DOMRECT, width: 200, height: 200 }, + boundingClientRect: { ...TEMPLATE_DOMRECT, width: 200, height: 200 }, + }, + true, + ], + [ + 'enlarged element - impossible', + { when: 'always' as const, minPercentage: 1, boundaryPixels: 100 }, + { + intersectionRatio: (200 * 200) / (200 * 200), + intersectionRect: { ...TEMPLATE_DOMRECT, width: 200, height: 200 }, + boundingClientRect: { ...TEMPLATE_DOMRECT, width: 200, height: 200 }, + }, + false, + ], + ])( + '%s', + ( + _: string, + expose: Partial, + entry: Partial, + shouldPass: boolean + ) => { + expect( + shouldTrackExpose( + { + ...TEMPLATE_CONFIG, + expose: { ...TEMPLATE_CONFIG.expose, ...expose }, + }, + { + ...TEMPLATE_INTERSECTION, + ...entry, + } + ) + ).toBe(shouldPass); + } + ); + }); +}); diff --git a/plugins/browser-plugin-element-tracking/tsconfig.json b/plugins/browser-plugin-element-tracking/tsconfig.json new file mode 100644 index 000000000..4082f16a5 --- /dev/null +++ b/plugins/browser-plugin-element-tracking/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "../../tsconfig.json" +} diff --git a/plugins/browser-plugin-enhanced-consent/CHANGELOG.json b/plugins/browser-plugin-enhanced-consent/CHANGELOG.json index 2de12becc..80876d9a6 100644 --- a/plugins/browser-plugin-enhanced-consent/CHANGELOG.json +++ b/plugins/browser-plugin-enhanced-consent/CHANGELOG.json @@ -1,6 +1,174 @@ { "name": "@snowplow/browser-plugin-enhanced-consent", "entries": [ + { + "version": "4.10.1", + "tag": "@snowplow/browser-plugin-enhanced-consent_v4.10.1", + "date": "Wed, 19 Aug 2026 14:26:05 GMT", + "comments": {} + }, + { + "version": "4.10.0", + "tag": "@snowplow/browser-plugin-enhanced-consent_v4.10.0", + "date": "Mon, 27 Jul 2026 13:52:14 GMT", + "comments": {} + }, + { + "version": "4.9.0", + "tag": "@snowplow/browser-plugin-enhanced-consent_v4.9.0", + "date": "Tue, 21 Jul 2026 14:53:08 GMT", + "comments": {} + }, + { + "version": "4.8.4", + "tag": "@snowplow/browser-plugin-enhanced-consent_v4.8.4", + "date": "Thu, 02 Jul 2026 10:07:52 GMT", + "comments": {} + }, + { + "version": "4.8.3", + "tag": "@snowplow/browser-plugin-enhanced-consent_v4.8.3", + "date": "Tue, 30 Jun 2026 14:22:03 GMT", + "comments": { + "none": [ + { + "comment": "Update uuid to v11 and remove closure-compiler from the build pipeline" + } + ] + } + }, + { + "version": "4.8.2", + "tag": "@snowplow/browser-plugin-enhanced-consent_v4.8.2", + "date": "Wed, 17 Jun 2026 12:30:12 GMT", + "comments": {} + }, + { + "version": "4.8.1", + "tag": "@snowplow/browser-plugin-enhanced-consent_v4.8.1", + "date": "Wed, 13 May 2026 09:26:05 GMT", + "comments": {} + }, + { + "version": "4.8.0", + "tag": "@snowplow/browser-plugin-enhanced-consent_v4.8.0", + "date": "Tue, 28 Apr 2026 07:56:22 GMT", + "comments": {} + }, + { + "version": "4.7.0", + "tag": "@snowplow/browser-plugin-enhanced-consent_v4.7.0", + "date": "Wed, 01 Apr 2026 12:59:29 GMT", + "comments": {} + }, + { + "version": "4.6.9", + "tag": "@snowplow/browser-plugin-enhanced-consent_v4.6.9", + "date": "Mon, 16 Mar 2026 15:43:06 GMT", + "comments": {} + }, + { + "version": "4.6.8", + "tag": "@snowplow/browser-plugin-enhanced-consent_v4.6.8", + "date": "Tue, 28 Oct 2025 09:46:42 GMT", + "comments": {} + }, + { + "version": "4.6.7", + "tag": "@snowplow/browser-plugin-enhanced-consent_v4.6.7", + "date": "Tue, 07 Oct 2025 14:53:36 GMT", + "comments": {} + }, + { + "version": "4.6.6", + "tag": "@snowplow/browser-plugin-enhanced-consent_v4.6.6", + "date": "Tue, 26 Aug 2025 08:42:27 GMT", + "comments": {} + }, + { + "version": "4.6.5", + "tag": "@snowplow/browser-plugin-enhanced-consent_v4.6.5", + "date": "Wed, 25 Jun 2025 21:16:46 GMT", + "comments": {} + }, + { + "version": "4.6.4", + "tag": "@snowplow/browser-plugin-enhanced-consent_v4.6.4", + "date": "Wed, 25 Jun 2025 12:08:50 GMT", + "comments": {} + }, + { + "version": "4.6.3", + "tag": "@snowplow/browser-plugin-enhanced-consent_v4.6.3", + "date": "Thu, 29 May 2025 19:52:07 GMT", + "comments": {} + }, + { + "version": "4.6.2", + "tag": "@snowplow/browser-plugin-enhanced-consent_v4.6.2", + "date": "Tue, 20 May 2025 07:39:05 GMT", + "comments": {} + }, + { + "version": "4.6.1", + "tag": "@snowplow/browser-plugin-enhanced-consent_v4.6.1", + "date": "Tue, 06 May 2025 13:10:51 GMT", + "comments": {} + }, + { + "version": "4.6.0", + "tag": "@snowplow/browser-plugin-enhanced-consent_v4.6.0", + "date": "Thu, 01 May 2025 09:58:59 GMT", + "comments": {} + }, + { + "version": "4.5.0", + "tag": "@snowplow/browser-plugin-enhanced-consent_v4.5.0", + "date": "Fri, 04 Apr 2025 09:21:23 GMT", + "comments": {} + }, + { + "version": "4.4.0", + "tag": "@snowplow/browser-plugin-enhanced-consent_v4.4.0", + "date": "Thu, 20 Mar 2025 12:14:34 GMT", + "comments": {} + }, + { + "version": "4.3.1", + "tag": "@snowplow/browser-plugin-enhanced-consent_v4.3.1", + "date": "Tue, 21 Jan 2025 11:09:42 GMT", + "comments": {} + }, + { + "version": "4.3.0", + "tag": "@snowplow/browser-plugin-enhanced-consent_v4.3.0", + "date": "Mon, 20 Jan 2025 11:45:13 GMT", + "comments": {} + }, + { + "version": "4.2.0", + "tag": "@snowplow/browser-plugin-enhanced-consent_v4.2.0", + "date": "Mon, 13 Jan 2025 08:30:05 GMT", + "comments": {} + }, + { + "version": "4.1.0", + "tag": "@snowplow/browser-plugin-enhanced-consent_v4.1.0", + "date": "Thu, 28 Nov 2024 10:57:30 GMT", + "comments": {} + }, + { + "version": "4.0.4", + "tag": "@snowplow/browser-plugin-enhanced-consent_v4.0.4", + "date": "Thu, 21 Nov 2024 09:06:36 GMT", + "comments": {} + }, + { + "version": "4.0.3", + "tag": "@snowplow/browser-plugin-enhanced-consent_v4.0.3", + "date": "Wed, 20 Nov 2024 09:30:31 GMT", + "comments": {} + }, { "version": "4.0.2", "tag": "@snowplow/browser-plugin-enhanced-consent_v4.0.2", diff --git a/plugins/browser-plugin-enhanced-consent/CHANGELOG.md b/plugins/browser-plugin-enhanced-consent/CHANGELOG.md index 9dc31520f..a73a05f81 100644 --- a/plugins/browser-plugin-enhanced-consent/CHANGELOG.md +++ b/plugins/browser-plugin-enhanced-consent/CHANGELOG.md @@ -1,6 +1,143 @@ # Change Log - @snowplow/browser-plugin-enhanced-consent -This log was last generated on Mon, 11 Nov 2024 15:46:33 GMT and should not be manually modified. +This log was last generated on Wed, 19 Aug 2026 14:26:05 GMT and should not be manually modified. + +## 4.10.1 +Wed, 19 Aug 2026 14:26:05 GMT + +_Version update only_ + +## 4.10.0 +Mon, 27 Jul 2026 13:52:14 GMT + +_Version update only_ + +## 4.9.0 +Tue, 21 Jul 2026 14:53:08 GMT + +_Version update only_ + +## 4.8.4 +Thu, 02 Jul 2026 10:07:52 GMT + +_Version update only_ + +## 4.8.3 +Tue, 30 Jun 2026 14:22:03 GMT + +### Updates + +- Update uuid to v11 and remove closure-compiler from the build pipeline + +## 4.8.2 +Wed, 17 Jun 2026 12:30:12 GMT + +_Version update only_ + +## 4.8.1 +Wed, 13 May 2026 09:26:05 GMT + +_Version update only_ + +## 4.8.0 +Tue, 28 Apr 2026 07:56:22 GMT + +_Version update only_ + +## 4.7.0 +Wed, 01 Apr 2026 12:59:29 GMT + +_Version update only_ + +## 4.6.9 +Mon, 16 Mar 2026 15:43:06 GMT + +_Version update only_ + +## 4.6.8 +Tue, 28 Oct 2025 09:46:42 GMT + +_Version update only_ + +## 4.6.7 +Tue, 07 Oct 2025 14:53:36 GMT + +_Version update only_ + +## 4.6.6 +Tue, 26 Aug 2025 08:42:27 GMT + +_Version update only_ + +## 4.6.5 +Wed, 25 Jun 2025 21:16:46 GMT + +_Version update only_ + +## 4.6.4 +Wed, 25 Jun 2025 12:08:50 GMT + +_Version update only_ + +## 4.6.3 +Thu, 29 May 2025 19:52:07 GMT + +_Version update only_ + +## 4.6.2 +Tue, 20 May 2025 07:39:05 GMT + +_Version update only_ + +## 4.6.1 +Tue, 06 May 2025 13:10:51 GMT + +_Version update only_ + +## 4.6.0 +Thu, 01 May 2025 09:58:59 GMT + +_Version update only_ + +## 4.5.0 +Fri, 04 Apr 2025 09:21:23 GMT + +_Version update only_ + +## 4.4.0 +Thu, 20 Mar 2025 12:14:34 GMT + +_Version update only_ + +## 4.3.1 +Tue, 21 Jan 2025 11:09:42 GMT + +_Version update only_ + +## 4.3.0 +Mon, 20 Jan 2025 11:45:13 GMT + +_Version update only_ + +## 4.2.0 +Mon, 13 Jan 2025 08:30:05 GMT + +_Version update only_ + +## 4.1.0 +Thu, 28 Nov 2024 10:57:30 GMT + +_Version update only_ + +## 4.0.4 +Thu, 21 Nov 2024 09:06:36 GMT + +_Version update only_ + +## 4.0.3 +Wed, 20 Nov 2024 09:30:31 GMT + +_Version update only_ ## 4.0.2 Mon, 11 Nov 2024 15:46:33 GMT diff --git a/plugins/browser-plugin-enhanced-consent/package.json b/plugins/browser-plugin-enhanced-consent/package.json index 70a847905..e3d6adda1 100644 --- a/plugins/browser-plugin-enhanced-consent/package.json +++ b/plugins/browser-plugin-enhanced-consent/package.json @@ -1,6 +1,6 @@ { "name": "@snowplow/browser-plugin-enhanced-consent", - "version": "4.0.2", + "version": "4.10.1", "description": "Consent tracking for Snowplow", "bugs": "https://github.com/snowplow/snowplow-javascript-tracker/issues", "repository": { @@ -26,18 +26,17 @@ "tslib": "^2.3.1" }, "devDependencies": { - "@ampproject/rollup-plugin-closure-compiler": "~0.27.0", "@rollup/plugin-commonjs": "~21.0.2", "@rollup/plugin-node-resolve": "~13.1.3", - "@types/jest": "~27.4.1", + "@types/jest": "~28.1.1", "@types/jsdom": "~16.2.14", "@types/lodash": "~4.14.180", "@typescript-eslint/eslint-plugin": "~5.15.0", "@typescript-eslint/parser": "~5.15.0", "eslint": "~8.11.0", - "jest": "~27.5.1", - "jest-environment-jsdom": "~27.5.1", - "jest-environment-jsdom-global": "~3.0.0", + "jest": "~28.1.3", + "jest-environment-jsdom": "~28.1.3", + "jest-environment-jsdom-global": "~4.0.0", "jest-standard-reporter": "~2.0.0", "lodash": "~4.17.21", "rollup": "~2.70.1", @@ -45,10 +44,10 @@ "rollup-plugin-license": "~2.6.1", "rollup-plugin-terser": "~7.0.2", "rollup-plugin-ts": "~2.0.5", - "ts-jest": "~27.1.3", + "ts-jest": "~28.0.8", "typescript": "~4.6.2" }, "peerDependencies": { - "@snowplow/browser-tracker": "~4.0.2" + "@snowplow/browser-tracker": "~4.10.1" } } diff --git a/plugins/browser-plugin-enhanced-consent/rollup.config.js b/plugins/browser-plugin-enhanced-consent/rollup.config.js index 93b14595b..fc20df5fe 100644 --- a/plugins/browser-plugin-enhanced-consent/rollup.config.js +++ b/plugins/browser-plugin-enhanced-consent/rollup.config.js @@ -32,7 +32,6 @@ import { nodeResolve } from '@rollup/plugin-node-resolve'; import commonjs from '@rollup/plugin-commonjs'; import ts from 'rollup-plugin-ts'; // Prefered over @rollup/plugin-typescript as it bundles .d.ts files import { banner } from '../../banner'; -import compiler from '@ampproject/rollup-plugin-closure-compiler'; import { terser } from 'rollup-plugin-terser'; import cleanup from 'rollup-plugin-cleanup'; import pkg from './package.json'; @@ -51,7 +50,7 @@ export default [ }, { input: './src/index.ts', - plugins: [...umdPlugins, compiler(), terser(), cleanup({ comments: 'none' }), banner()], + plugins: [...umdPlugins, terser(), cleanup({ comments: 'none' }), banner()], treeshake: { moduleSideEffects: ['sha1'] }, output: [{ file: pkg.main.replace('.js', '.min.js'), format: 'umd', sourcemap: true, name: umdName }], }, diff --git a/plugins/browser-plugin-enhanced-ecommerce/CHANGELOG.json b/plugins/browser-plugin-enhanced-ecommerce/CHANGELOG.json index 45bb3e6c9..637623c37 100644 --- a/plugins/browser-plugin-enhanced-ecommerce/CHANGELOG.json +++ b/plugins/browser-plugin-enhanced-ecommerce/CHANGELOG.json @@ -1,6 +1,174 @@ { "name": "@snowplow/browser-plugin-enhanced-ecommerce", "entries": [ + { + "version": "4.10.1", + "tag": "@snowplow/browser-plugin-enhanced-ecommerce_v4.10.1", + "date": "Wed, 19 Aug 2026 14:26:05 GMT", + "comments": {} + }, + { + "version": "4.10.0", + "tag": "@snowplow/browser-plugin-enhanced-ecommerce_v4.10.0", + "date": "Mon, 27 Jul 2026 13:52:14 GMT", + "comments": {} + }, + { + "version": "4.9.0", + "tag": "@snowplow/browser-plugin-enhanced-ecommerce_v4.9.0", + "date": "Tue, 21 Jul 2026 14:53:08 GMT", + "comments": {} + }, + { + "version": "4.8.4", + "tag": "@snowplow/browser-plugin-enhanced-ecommerce_v4.8.4", + "date": "Thu, 02 Jul 2026 10:07:52 GMT", + "comments": {} + }, + { + "version": "4.8.3", + "tag": "@snowplow/browser-plugin-enhanced-ecommerce_v4.8.3", + "date": "Tue, 30 Jun 2026 14:22:03 GMT", + "comments": { + "none": [ + { + "comment": "Update uuid to v11 and remove closure-compiler from the build pipeline" + } + ] + } + }, + { + "version": "4.8.2", + "tag": "@snowplow/browser-plugin-enhanced-ecommerce_v4.8.2", + "date": "Wed, 17 Jun 2026 12:30:12 GMT", + "comments": {} + }, + { + "version": "4.8.1", + "tag": "@snowplow/browser-plugin-enhanced-ecommerce_v4.8.1", + "date": "Wed, 13 May 2026 09:26:05 GMT", + "comments": {} + }, + { + "version": "4.8.0", + "tag": "@snowplow/browser-plugin-enhanced-ecommerce_v4.8.0", + "date": "Tue, 28 Apr 2026 07:56:22 GMT", + "comments": {} + }, + { + "version": "4.7.0", + "tag": "@snowplow/browser-plugin-enhanced-ecommerce_v4.7.0", + "date": "Wed, 01 Apr 2026 12:59:29 GMT", + "comments": {} + }, + { + "version": "4.6.9", + "tag": "@snowplow/browser-plugin-enhanced-ecommerce_v4.6.9", + "date": "Mon, 16 Mar 2026 15:43:06 GMT", + "comments": {} + }, + { + "version": "4.6.8", + "tag": "@snowplow/browser-plugin-enhanced-ecommerce_v4.6.8", + "date": "Tue, 28 Oct 2025 09:46:42 GMT", + "comments": {} + }, + { + "version": "4.6.7", + "tag": "@snowplow/browser-plugin-enhanced-ecommerce_v4.6.7", + "date": "Tue, 07 Oct 2025 14:53:36 GMT", + "comments": {} + }, + { + "version": "4.6.6", + "tag": "@snowplow/browser-plugin-enhanced-ecommerce_v4.6.6", + "date": "Tue, 26 Aug 2025 08:42:27 GMT", + "comments": {} + }, + { + "version": "4.6.5", + "tag": "@snowplow/browser-plugin-enhanced-ecommerce_v4.6.5", + "date": "Wed, 25 Jun 2025 21:16:46 GMT", + "comments": {} + }, + { + "version": "4.6.4", + "tag": "@snowplow/browser-plugin-enhanced-ecommerce_v4.6.4", + "date": "Wed, 25 Jun 2025 12:08:50 GMT", + "comments": {} + }, + { + "version": "4.6.3", + "tag": "@snowplow/browser-plugin-enhanced-ecommerce_v4.6.3", + "date": "Thu, 29 May 2025 19:52:07 GMT", + "comments": {} + }, + { + "version": "4.6.2", + "tag": "@snowplow/browser-plugin-enhanced-ecommerce_v4.6.2", + "date": "Tue, 20 May 2025 07:39:05 GMT", + "comments": {} + }, + { + "version": "4.6.1", + "tag": "@snowplow/browser-plugin-enhanced-ecommerce_v4.6.1", + "date": "Tue, 06 May 2025 13:10:51 GMT", + "comments": {} + }, + { + "version": "4.6.0", + "tag": "@snowplow/browser-plugin-enhanced-ecommerce_v4.6.0", + "date": "Thu, 01 May 2025 09:58:59 GMT", + "comments": {} + }, + { + "version": "4.5.0", + "tag": "@snowplow/browser-plugin-enhanced-ecommerce_v4.5.0", + "date": "Fri, 04 Apr 2025 09:21:23 GMT", + "comments": {} + }, + { + "version": "4.4.0", + "tag": "@snowplow/browser-plugin-enhanced-ecommerce_v4.4.0", + "date": "Thu, 20 Mar 2025 12:14:34 GMT", + "comments": {} + }, + { + "version": "4.3.1", + "tag": "@snowplow/browser-plugin-enhanced-ecommerce_v4.3.1", + "date": "Tue, 21 Jan 2025 11:09:42 GMT", + "comments": {} + }, + { + "version": "4.3.0", + "tag": "@snowplow/browser-plugin-enhanced-ecommerce_v4.3.0", + "date": "Mon, 20 Jan 2025 11:45:13 GMT", + "comments": {} + }, + { + "version": "4.2.0", + "tag": "@snowplow/browser-plugin-enhanced-ecommerce_v4.2.0", + "date": "Mon, 13 Jan 2025 08:30:05 GMT", + "comments": {} + }, + { + "version": "4.1.0", + "tag": "@snowplow/browser-plugin-enhanced-ecommerce_v4.1.0", + "date": "Thu, 28 Nov 2024 10:57:30 GMT", + "comments": {} + }, + { + "version": "4.0.4", + "tag": "@snowplow/browser-plugin-enhanced-ecommerce_v4.0.4", + "date": "Thu, 21 Nov 2024 09:06:36 GMT", + "comments": {} + }, + { + "version": "4.0.3", + "tag": "@snowplow/browser-plugin-enhanced-ecommerce_v4.0.3", + "date": "Wed, 20 Nov 2024 09:30:31 GMT", + "comments": {} + }, { "version": "4.0.2", "tag": "@snowplow/browser-plugin-enhanced-ecommerce_v4.0.2", diff --git a/plugins/browser-plugin-enhanced-ecommerce/CHANGELOG.md b/plugins/browser-plugin-enhanced-ecommerce/CHANGELOG.md index 459e66dd1..025e5cf85 100644 --- a/plugins/browser-plugin-enhanced-ecommerce/CHANGELOG.md +++ b/plugins/browser-plugin-enhanced-ecommerce/CHANGELOG.md @@ -1,6 +1,143 @@ # Change Log - @snowplow/browser-plugin-enhanced-ecommerce -This log was last generated on Mon, 11 Nov 2024 15:46:33 GMT and should not be manually modified. +This log was last generated on Wed, 19 Aug 2026 14:26:05 GMT and should not be manually modified. + +## 4.10.1 +Wed, 19 Aug 2026 14:26:05 GMT + +_Version update only_ + +## 4.10.0 +Mon, 27 Jul 2026 13:52:14 GMT + +_Version update only_ + +## 4.9.0 +Tue, 21 Jul 2026 14:53:08 GMT + +_Version update only_ + +## 4.8.4 +Thu, 02 Jul 2026 10:07:52 GMT + +_Version update only_ + +## 4.8.3 +Tue, 30 Jun 2026 14:22:03 GMT + +### Updates + +- Update uuid to v11 and remove closure-compiler from the build pipeline + +## 4.8.2 +Wed, 17 Jun 2026 12:30:12 GMT + +_Version update only_ + +## 4.8.1 +Wed, 13 May 2026 09:26:05 GMT + +_Version update only_ + +## 4.8.0 +Tue, 28 Apr 2026 07:56:22 GMT + +_Version update only_ + +## 4.7.0 +Wed, 01 Apr 2026 12:59:29 GMT + +_Version update only_ + +## 4.6.9 +Mon, 16 Mar 2026 15:43:06 GMT + +_Version update only_ + +## 4.6.8 +Tue, 28 Oct 2025 09:46:42 GMT + +_Version update only_ + +## 4.6.7 +Tue, 07 Oct 2025 14:53:36 GMT + +_Version update only_ + +## 4.6.6 +Tue, 26 Aug 2025 08:42:27 GMT + +_Version update only_ + +## 4.6.5 +Wed, 25 Jun 2025 21:16:46 GMT + +_Version update only_ + +## 4.6.4 +Wed, 25 Jun 2025 12:08:50 GMT + +_Version update only_ + +## 4.6.3 +Thu, 29 May 2025 19:52:07 GMT + +_Version update only_ + +## 4.6.2 +Tue, 20 May 2025 07:39:05 GMT + +_Version update only_ + +## 4.6.1 +Tue, 06 May 2025 13:10:51 GMT + +_Version update only_ + +## 4.6.0 +Thu, 01 May 2025 09:58:59 GMT + +_Version update only_ + +## 4.5.0 +Fri, 04 Apr 2025 09:21:23 GMT + +_Version update only_ + +## 4.4.0 +Thu, 20 Mar 2025 12:14:34 GMT + +_Version update only_ + +## 4.3.1 +Tue, 21 Jan 2025 11:09:42 GMT + +_Version update only_ + +## 4.3.0 +Mon, 20 Jan 2025 11:45:13 GMT + +_Version update only_ + +## 4.2.0 +Mon, 13 Jan 2025 08:30:05 GMT + +_Version update only_ + +## 4.1.0 +Thu, 28 Nov 2024 10:57:30 GMT + +_Version update only_ + +## 4.0.4 +Thu, 21 Nov 2024 09:06:36 GMT + +_Version update only_ + +## 4.0.3 +Wed, 20 Nov 2024 09:30:31 GMT + +_Version update only_ ## 4.0.2 Mon, 11 Nov 2024 15:46:33 GMT diff --git a/plugins/browser-plugin-enhanced-ecommerce/package.json b/plugins/browser-plugin-enhanced-ecommerce/package.json index df6df9d14..05eeefada 100644 --- a/plugins/browser-plugin-enhanced-ecommerce/package.json +++ b/plugins/browser-plugin-enhanced-ecommerce/package.json @@ -1,6 +1,6 @@ { "name": "@snowplow/browser-plugin-enhanced-ecommerce", - "version": "4.0.2", + "version": "4.10.1", "description": "Enhanced Ecommerce tracking for Snowplow", "homepage": "http://bit.ly/sp-js", "bugs": "https://github.com/snowplow/snowplow-javascript-tracker/issues", @@ -27,18 +27,17 @@ "tslib": "^2.3.1" }, "devDependencies": { - "@ampproject/rollup-plugin-closure-compiler": "~0.27.0", "@rollup/plugin-commonjs": "~21.0.2", "@rollup/plugin-node-resolve": "~13.1.3", - "@types/jest": "~27.4.1", + "@types/jest": "~28.1.1", "@types/jsdom": "~16.2.14", "@types/lodash": "~4.14.180", "@typescript-eslint/eslint-plugin": "~5.15.0", "@typescript-eslint/parser": "~5.15.0", "eslint": "~8.11.0", - "jest": "~27.5.1", - "jest-environment-jsdom": "~27.5.1", - "jest-environment-jsdom-global": "~3.0.0", + "jest": "~28.1.3", + "jest-environment-jsdom": "~28.1.3", + "jest-environment-jsdom-global": "~4.0.0", "jest-standard-reporter": "~2.0.0", "lodash": "~4.17.21", "rollup": "~2.70.1", @@ -46,10 +45,10 @@ "rollup-plugin-license": "~2.6.1", "rollup-plugin-terser": "~7.0.2", "rollup-plugin-ts": "~2.0.5", - "ts-jest": "~27.1.3", + "ts-jest": "~28.0.8", "typescript": "~4.6.2" }, "peerDependencies": { - "@snowplow/browser-tracker": "~4.0.2" + "@snowplow/browser-tracker": "~4.10.1" } } diff --git a/plugins/browser-plugin-enhanced-ecommerce/rollup.config.js b/plugins/browser-plugin-enhanced-ecommerce/rollup.config.js index f6bc4733e..fe36add47 100644 --- a/plugins/browser-plugin-enhanced-ecommerce/rollup.config.js +++ b/plugins/browser-plugin-enhanced-ecommerce/rollup.config.js @@ -32,7 +32,6 @@ import { nodeResolve } from '@rollup/plugin-node-resolve'; import commonjs from '@rollup/plugin-commonjs'; import ts from 'rollup-plugin-ts'; // Prefered over @rollup/plugin-typescript as it bundles .d.ts files import { banner } from '../../banner'; -import compiler from '@ampproject/rollup-plugin-closure-compiler'; import { terser } from 'rollup-plugin-terser'; import cleanup from 'rollup-plugin-cleanup'; import pkg from './package.json'; @@ -51,7 +50,7 @@ export default [ }, { input: './src/index.ts', - plugins: [...umdPlugins, compiler(), terser(), cleanup({ comments: 'none' }), banner()], + plugins: [...umdPlugins, terser(), cleanup({ comments: 'none' }), banner()], treeshake: { moduleSideEffects: ['sha1'] }, output: [{ file: pkg.main.replace('.js', '.min.js'), format: 'umd', sourcemap: true, name: umdName }], }, diff --git a/plugins/browser-plugin-error-tracking/CHANGELOG.json b/plugins/browser-plugin-error-tracking/CHANGELOG.json index 1fa1bd4db..48761ff36 100644 --- a/plugins/browser-plugin-error-tracking/CHANGELOG.json +++ b/plugins/browser-plugin-error-tracking/CHANGELOG.json @@ -1,6 +1,180 @@ { "name": "@snowplow/browser-plugin-error-tracking", "entries": [ + { + "version": "4.10.1", + "tag": "@snowplow/browser-plugin-error-tracking_v4.10.1", + "date": "Wed, 19 Aug 2026 14:26:05 GMT", + "comments": {} + }, + { + "version": "4.10.0", + "tag": "@snowplow/browser-plugin-error-tracking_v4.10.0", + "date": "Mon, 27 Jul 2026 13:52:14 GMT", + "comments": {} + }, + { + "version": "4.9.0", + "tag": "@snowplow/browser-plugin-error-tracking_v4.9.0", + "date": "Tue, 21 Jul 2026 14:53:08 GMT", + "comments": {} + }, + { + "version": "4.8.4", + "tag": "@snowplow/browser-plugin-error-tracking_v4.8.4", + "date": "Thu, 02 Jul 2026 10:07:52 GMT", + "comments": {} + }, + { + "version": "4.8.3", + "tag": "@snowplow/browser-plugin-error-tracking_v4.8.3", + "date": "Tue, 30 Jun 2026 14:22:03 GMT", + "comments": { + "none": [ + { + "comment": "Update uuid to v11 and remove closure-compiler from the build pipeline" + } + ] + } + }, + { + "version": "4.8.2", + "tag": "@snowplow/browser-plugin-error-tracking_v4.8.2", + "date": "Wed, 17 Jun 2026 12:30:12 GMT", + "comments": {} + }, + { + "version": "4.8.1", + "tag": "@snowplow/browser-plugin-error-tracking_v4.8.1", + "date": "Wed, 13 May 2026 09:26:05 GMT", + "comments": {} + }, + { + "version": "4.8.0", + "tag": "@snowplow/browser-plugin-error-tracking_v4.8.0", + "date": "Tue, 28 Apr 2026 07:56:22 GMT", + "comments": {} + }, + { + "version": "4.7.0", + "tag": "@snowplow/browser-plugin-error-tracking_v4.7.0", + "date": "Wed, 01 Apr 2026 12:59:29 GMT", + "comments": {} + }, + { + "version": "4.6.9", + "tag": "@snowplow/browser-plugin-error-tracking_v4.6.9", + "date": "Mon, 16 Mar 2026 15:43:06 GMT", + "comments": { + "none": [ + { + "comment": "Truncate fileName property in application_error events to max 1024 characters to avoid validation errors" + } + ] + } + }, + { + "version": "4.6.8", + "tag": "@snowplow/browser-plugin-error-tracking_v4.6.8", + "date": "Tue, 28 Oct 2025 09:46:42 GMT", + "comments": {} + }, + { + "version": "4.6.7", + "tag": "@snowplow/browser-plugin-error-tracking_v4.6.7", + "date": "Tue, 07 Oct 2025 14:53:36 GMT", + "comments": {} + }, + { + "version": "4.6.6", + "tag": "@snowplow/browser-plugin-error-tracking_v4.6.6", + "date": "Tue, 26 Aug 2025 08:42:27 GMT", + "comments": {} + }, + { + "version": "4.6.5", + "tag": "@snowplow/browser-plugin-error-tracking_v4.6.5", + "date": "Wed, 25 Jun 2025 21:16:46 GMT", + "comments": {} + }, + { + "version": "4.6.4", + "tag": "@snowplow/browser-plugin-error-tracking_v4.6.4", + "date": "Wed, 25 Jun 2025 12:08:50 GMT", + "comments": {} + }, + { + "version": "4.6.3", + "tag": "@snowplow/browser-plugin-error-tracking_v4.6.3", + "date": "Thu, 29 May 2025 19:52:07 GMT", + "comments": {} + }, + { + "version": "4.6.2", + "tag": "@snowplow/browser-plugin-error-tracking_v4.6.2", + "date": "Tue, 20 May 2025 07:39:05 GMT", + "comments": {} + }, + { + "version": "4.6.1", + "tag": "@snowplow/browser-plugin-error-tracking_v4.6.1", + "date": "Tue, 06 May 2025 13:10:51 GMT", + "comments": {} + }, + { + "version": "4.6.0", + "tag": "@snowplow/browser-plugin-error-tracking_v4.6.0", + "date": "Thu, 01 May 2025 09:58:59 GMT", + "comments": {} + }, + { + "version": "4.5.0", + "tag": "@snowplow/browser-plugin-error-tracking_v4.5.0", + "date": "Fri, 04 Apr 2025 09:21:23 GMT", + "comments": {} + }, + { + "version": "4.4.0", + "tag": "@snowplow/browser-plugin-error-tracking_v4.4.0", + "date": "Thu, 20 Mar 2025 12:14:34 GMT", + "comments": {} + }, + { + "version": "4.3.1", + "tag": "@snowplow/browser-plugin-error-tracking_v4.3.1", + "date": "Tue, 21 Jan 2025 11:09:42 GMT", + "comments": {} + }, + { + "version": "4.3.0", + "tag": "@snowplow/browser-plugin-error-tracking_v4.3.0", + "date": "Mon, 20 Jan 2025 11:45:13 GMT", + "comments": {} + }, + { + "version": "4.2.0", + "tag": "@snowplow/browser-plugin-error-tracking_v4.2.0", + "date": "Mon, 13 Jan 2025 08:30:05 GMT", + "comments": {} + }, + { + "version": "4.1.0", + "tag": "@snowplow/browser-plugin-error-tracking_v4.1.0", + "date": "Thu, 28 Nov 2024 10:57:30 GMT", + "comments": {} + }, + { + "version": "4.0.4", + "tag": "@snowplow/browser-plugin-error-tracking_v4.0.4", + "date": "Thu, 21 Nov 2024 09:06:36 GMT", + "comments": {} + }, + { + "version": "4.0.3", + "tag": "@snowplow/browser-plugin-error-tracking_v4.0.3", + "date": "Wed, 20 Nov 2024 09:30:31 GMT", + "comments": {} + }, { "version": "4.0.2", "tag": "@snowplow/browser-plugin-error-tracking_v4.0.2", diff --git a/plugins/browser-plugin-error-tracking/CHANGELOG.md b/plugins/browser-plugin-error-tracking/CHANGELOG.md index ca32e9273..2e9c81b69 100644 --- a/plugins/browser-plugin-error-tracking/CHANGELOG.md +++ b/plugins/browser-plugin-error-tracking/CHANGELOG.md @@ -1,6 +1,145 @@ # Change Log - @snowplow/browser-plugin-error-tracking -This log was last generated on Mon, 11 Nov 2024 15:46:34 GMT and should not be manually modified. +This log was last generated on Wed, 19 Aug 2026 14:26:05 GMT and should not be manually modified. + +## 4.10.1 +Wed, 19 Aug 2026 14:26:05 GMT + +_Version update only_ + +## 4.10.0 +Mon, 27 Jul 2026 13:52:14 GMT + +_Version update only_ + +## 4.9.0 +Tue, 21 Jul 2026 14:53:08 GMT + +_Version update only_ + +## 4.8.4 +Thu, 02 Jul 2026 10:07:52 GMT + +_Version update only_ + +## 4.8.3 +Tue, 30 Jun 2026 14:22:03 GMT + +### Updates + +- Update uuid to v11 and remove closure-compiler from the build pipeline + +## 4.8.2 +Wed, 17 Jun 2026 12:30:12 GMT + +_Version update only_ + +## 4.8.1 +Wed, 13 May 2026 09:26:05 GMT + +_Version update only_ + +## 4.8.0 +Tue, 28 Apr 2026 07:56:22 GMT + +_Version update only_ + +## 4.7.0 +Wed, 01 Apr 2026 12:59:29 GMT + +_Version update only_ + +## 4.6.9 +Mon, 16 Mar 2026 15:43:06 GMT + +### Updates + +- Truncate fileName property in application_error events to max 1024 characters to avoid validation errors + +## 4.6.8 +Tue, 28 Oct 2025 09:46:42 GMT + +_Version update only_ + +## 4.6.7 +Tue, 07 Oct 2025 14:53:36 GMT + +_Version update only_ + +## 4.6.6 +Tue, 26 Aug 2025 08:42:27 GMT + +_Version update only_ + +## 4.6.5 +Wed, 25 Jun 2025 21:16:46 GMT + +_Version update only_ + +## 4.6.4 +Wed, 25 Jun 2025 12:08:50 GMT + +_Version update only_ + +## 4.6.3 +Thu, 29 May 2025 19:52:07 GMT + +_Version update only_ + +## 4.6.2 +Tue, 20 May 2025 07:39:05 GMT + +_Version update only_ + +## 4.6.1 +Tue, 06 May 2025 13:10:51 GMT + +_Version update only_ + +## 4.6.0 +Thu, 01 May 2025 09:58:59 GMT + +_Version update only_ + +## 4.5.0 +Fri, 04 Apr 2025 09:21:23 GMT + +_Version update only_ + +## 4.4.0 +Thu, 20 Mar 2025 12:14:34 GMT + +_Version update only_ + +## 4.3.1 +Tue, 21 Jan 2025 11:09:42 GMT + +_Version update only_ + +## 4.3.0 +Mon, 20 Jan 2025 11:45:13 GMT + +_Version update only_ + +## 4.2.0 +Mon, 13 Jan 2025 08:30:05 GMT + +_Version update only_ + +## 4.1.0 +Thu, 28 Nov 2024 10:57:30 GMT + +_Version update only_ + +## 4.0.4 +Thu, 21 Nov 2024 09:06:36 GMT + +_Version update only_ + +## 4.0.3 +Wed, 20 Nov 2024 09:30:31 GMT + +_Version update only_ ## 4.0.2 Mon, 11 Nov 2024 15:46:34 GMT diff --git a/plugins/browser-plugin-error-tracking/package.json b/plugins/browser-plugin-error-tracking/package.json index e5fcac6f4..000bc620d 100644 --- a/plugins/browser-plugin-error-tracking/package.json +++ b/plugins/browser-plugin-error-tracking/package.json @@ -1,6 +1,6 @@ { "name": "@snowplow/browser-plugin-error-tracking", - "version": "4.0.2", + "version": "4.10.1", "description": "Error tracking for Snowplow", "homepage": "http://bit.ly/sp-js", "bugs": "https://github.com/snowplow/snowplow-javascript-tracker/issues", @@ -27,18 +27,17 @@ "tslib": "^2.3.1" }, "devDependencies": { - "@ampproject/rollup-plugin-closure-compiler": "~0.27.0", "@rollup/plugin-commonjs": "~21.0.2", "@rollup/plugin-node-resolve": "~13.1.3", - "@types/jest": "~27.4.1", + "@types/jest": "~28.1.1", "@types/jsdom": "~16.2.14", "@types/lodash": "~4.14.180", "@typescript-eslint/eslint-plugin": "~5.15.0", "@typescript-eslint/parser": "~5.15.0", "eslint": "~8.11.0", - "jest": "~27.5.1", - "jest-environment-jsdom": "~27.5.1", - "jest-environment-jsdom-global": "~3.0.0", + "jest": "~28.1.3", + "jest-environment-jsdom": "~28.1.3", + "jest-environment-jsdom-global": "~4.0.0", "jest-standard-reporter": "~2.0.0", "lodash": "~4.17.21", "rollup": "~2.70.1", @@ -46,10 +45,10 @@ "rollup-plugin-license": "~2.6.1", "rollup-plugin-terser": "~7.0.2", "rollup-plugin-ts": "~2.0.5", - "ts-jest": "~27.1.3", + "ts-jest": "~28.0.8", "typescript": "~4.6.2" }, "peerDependencies": { - "@snowplow/browser-tracker": "~4.0.2" + "@snowplow/browser-tracker": "~4.10.1" } } diff --git a/plugins/browser-plugin-error-tracking/rollup.config.js b/plugins/browser-plugin-error-tracking/rollup.config.js index 500087175..9d4e4080e 100644 --- a/plugins/browser-plugin-error-tracking/rollup.config.js +++ b/plugins/browser-plugin-error-tracking/rollup.config.js @@ -32,7 +32,6 @@ import { nodeResolve } from '@rollup/plugin-node-resolve'; import commonjs from '@rollup/plugin-commonjs'; import ts from 'rollup-plugin-ts'; // Prefered over @rollup/plugin-typescript as it bundles .d.ts files import { banner } from '../../banner'; -import compiler from '@ampproject/rollup-plugin-closure-compiler'; import { terser } from 'rollup-plugin-terser'; import cleanup from 'rollup-plugin-cleanup'; import pkg from './package.json'; @@ -51,7 +50,7 @@ export default [ }, { input: './src/index.ts', - plugins: [...umdPlugins, compiler(), terser(), cleanup({ comments: 'none' }), banner()], + plugins: [...umdPlugins, terser(), cleanup({ comments: 'none' }), banner()], treeshake: { moduleSideEffects: ['sha1'] }, output: [{ file: pkg.main.replace('.js', '.min.js'), format: 'umd', sourcemap: true, name: umdName }], }, diff --git a/plugins/browser-plugin-error-tracking/src/index.ts b/plugins/browser-plugin-error-tracking/src/index.ts index e0d239412..eb4238587 100644 --- a/plugins/browser-plugin-error-tracking/src/index.ts +++ b/plugins/browser-plugin-error-tracking/src/index.ts @@ -76,7 +76,8 @@ export function trackError( ) { const { message, filename, lineno, colno, error, context, timestamp } = event, stack = error && truncateString(error.stack, 8192), - truncatedMessage = message && truncateString(message, 2048); + truncatedMessage = message && truncateString(message, 2048), + truncatedFilename = truncateString(filename, 1024); dispatchToTrackersInCollection(trackers, _trackers, (t) => { t.core.track( @@ -89,7 +90,7 @@ export function trackError( stackTrace: stack, lineNumber: lineno, lineColumn: colno, - fileName: filename, + fileName: truncatedFilename, }, }, }), diff --git a/plugins/browser-plugin-error-tracking/test/events.test.ts b/plugins/browser-plugin-error-tracking/test/events.test.ts index 857e761df..2d2b0d0f4 100644 --- a/plugins/browser-plugin-error-tracking/test/events.test.ts +++ b/plugins/browser-plugin-error-tracking/test/events.test.ts @@ -53,6 +53,7 @@ describe('ErrorTrackingPlugin', () => { const eventStore3 = newInMemoryEventStore({}); const eventStore4 = newInMemoryEventStore({}); const eventStore5 = newInMemoryEventStore({}); + const eventStore6 = newInMemoryEventStore({}); const state = new SharedState(); addTracker('sp1', 'sp1', 'js-3.0.0', '', state, { @@ -85,6 +86,12 @@ describe('ErrorTrackingPlugin', () => { eventStore: eventStore5, customFetch: async () => new Response(null, { status: 500 }), }); + addTracker('sp6', 'sp6', 'js-3.0.0', '', state, { + encodeBase64: false, + plugins: [ErrorTrackingPlugin()], + eventStore: eventStore6, + customFetch: async () => new Response(null, { status: 500 }), + }); const error = new Error('this is an error'); error.stack = 'stacktrace-1'; @@ -92,6 +99,7 @@ describe('ErrorTrackingPlugin', () => { const oversizedError = new Error('this is a longer error'); oversizedError.stack = 'x'.repeat(10000); const oversizedMessage = 'y'.repeat(10000); + const oversizedFilename = 'z'.repeat(2000); trackError( { @@ -126,6 +134,14 @@ describe('ErrorTrackingPlugin', () => { ['sp4'] ); + trackError( + { + message: 'message-6', + filename: oversizedFilename, + }, + ['sp6'] + ); + enableErrorTracking({}, ['sp5']); it('trackError adds the expected application error event to the queue', async () => { @@ -186,6 +202,19 @@ describe('ErrorTrackingPlugin', () => { }); }); + it('trackError truncates long fileName to 1024 characters', async () => { + expect( + extractUeEvent('iglu:com.snowplowanalytics.snowplow/application_error/jsonschema/1-0-1').from( + await eventStore6.getAllPayloads() + ) + ).toMatchObject({ + schema: 'iglu:com.snowplowanalytics.snowplow/application_error/jsonschema/1-0-1', + data: { + fileName: 'z'.repeat(1024), + }, + }); + }); + it('trackError should be called by listener for resource errors', async () => { const resourceUrl = '/fake-should-404.js'; diff --git a/plugins/browser-plugin-event-specifications/CHANGELOG.json b/plugins/browser-plugin-event-specifications/CHANGELOG.json index 2056eb70d..448984309 100644 --- a/plugins/browser-plugin-event-specifications/CHANGELOG.json +++ b/plugins/browser-plugin-event-specifications/CHANGELOG.json @@ -1,6 +1,174 @@ { "name": "@snowplow/browser-plugin-event-specifications", "entries": [ + { + "version": "4.10.1", + "tag": "@snowplow/browser-plugin-event-specifications_v4.10.1", + "date": "Wed, 19 Aug 2026 14:26:05 GMT", + "comments": {} + }, + { + "version": "4.10.0", + "tag": "@snowplow/browser-plugin-event-specifications_v4.10.0", + "date": "Mon, 27 Jul 2026 13:52:14 GMT", + "comments": {} + }, + { + "version": "4.9.0", + "tag": "@snowplow/browser-plugin-event-specifications_v4.9.0", + "date": "Tue, 21 Jul 2026 14:53:08 GMT", + "comments": {} + }, + { + "version": "4.8.4", + "tag": "@snowplow/browser-plugin-event-specifications_v4.8.4", + "date": "Thu, 02 Jul 2026 10:07:52 GMT", + "comments": {} + }, + { + "version": "4.8.3", + "tag": "@snowplow/browser-plugin-event-specifications_v4.8.3", + "date": "Tue, 30 Jun 2026 14:22:03 GMT", + "comments": { + "none": [ + { + "comment": "Update uuid to v11 and remove closure-compiler from the build pipeline" + } + ] + } + }, + { + "version": "4.8.2", + "tag": "@snowplow/browser-plugin-event-specifications_v4.8.2", + "date": "Wed, 17 Jun 2026 12:30:12 GMT", + "comments": {} + }, + { + "version": "4.8.1", + "tag": "@snowplow/browser-plugin-event-specifications_v4.8.1", + "date": "Wed, 13 May 2026 09:26:05 GMT", + "comments": {} + }, + { + "version": "4.8.0", + "tag": "@snowplow/browser-plugin-event-specifications_v4.8.0", + "date": "Tue, 28 Apr 2026 07:56:22 GMT", + "comments": {} + }, + { + "version": "4.7.0", + "tag": "@snowplow/browser-plugin-event-specifications_v4.7.0", + "date": "Wed, 01 Apr 2026 12:59:29 GMT", + "comments": {} + }, + { + "version": "4.6.9", + "tag": "@snowplow/browser-plugin-event-specifications_v4.6.9", + "date": "Mon, 16 Mar 2026 15:43:06 GMT", + "comments": {} + }, + { + "version": "4.6.8", + "tag": "@snowplow/browser-plugin-event-specifications_v4.6.8", + "date": "Tue, 28 Oct 2025 09:46:42 GMT", + "comments": {} + }, + { + "version": "4.6.7", + "tag": "@snowplow/browser-plugin-event-specifications_v4.6.7", + "date": "Tue, 07 Oct 2025 14:53:36 GMT", + "comments": {} + }, + { + "version": "4.6.6", + "tag": "@snowplow/browser-plugin-event-specifications_v4.6.6", + "date": "Tue, 26 Aug 2025 08:42:27 GMT", + "comments": {} + }, + { + "version": "4.6.5", + "tag": "@snowplow/browser-plugin-event-specifications_v4.6.5", + "date": "Wed, 25 Jun 2025 21:16:46 GMT", + "comments": {} + }, + { + "version": "4.6.4", + "tag": "@snowplow/browser-plugin-event-specifications_v4.6.4", + "date": "Wed, 25 Jun 2025 12:08:50 GMT", + "comments": {} + }, + { + "version": "4.6.3", + "tag": "@snowplow/browser-plugin-event-specifications_v4.6.3", + "date": "Thu, 29 May 2025 19:52:07 GMT", + "comments": {} + }, + { + "version": "4.6.2", + "tag": "@snowplow/browser-plugin-event-specifications_v4.6.2", + "date": "Tue, 20 May 2025 07:39:05 GMT", + "comments": {} + }, + { + "version": "4.6.1", + "tag": "@snowplow/browser-plugin-event-specifications_v4.6.1", + "date": "Tue, 06 May 2025 13:10:51 GMT", + "comments": {} + }, + { + "version": "4.6.0", + "tag": "@snowplow/browser-plugin-event-specifications_v4.6.0", + "date": "Thu, 01 May 2025 09:58:59 GMT", + "comments": {} + }, + { + "version": "4.5.0", + "tag": "@snowplow/browser-plugin-event-specifications_v4.5.0", + "date": "Fri, 04 Apr 2025 09:21:23 GMT", + "comments": {} + }, + { + "version": "4.4.0", + "tag": "@snowplow/browser-plugin-event-specifications_v4.4.0", + "date": "Thu, 20 Mar 2025 12:14:34 GMT", + "comments": {} + }, + { + "version": "4.3.1", + "tag": "@snowplow/browser-plugin-event-specifications_v4.3.1", + "date": "Tue, 21 Jan 2025 11:09:42 GMT", + "comments": {} + }, + { + "version": "4.3.0", + "tag": "@snowplow/browser-plugin-event-specifications_v4.3.0", + "date": "Mon, 20 Jan 2025 11:45:13 GMT", + "comments": {} + }, + { + "version": "4.2.0", + "tag": "@snowplow/browser-plugin-event-specifications_v4.2.0", + "date": "Mon, 13 Jan 2025 08:30:05 GMT", + "comments": {} + }, + { + "version": "4.1.0", + "tag": "@snowplow/browser-plugin-event-specifications_v4.1.0", + "date": "Thu, 28 Nov 2024 10:57:30 GMT", + "comments": {} + }, + { + "version": "4.0.4", + "tag": "@snowplow/browser-plugin-event-specifications_v4.0.4", + "date": "Thu, 21 Nov 2024 09:06:36 GMT", + "comments": {} + }, + { + "version": "4.0.3", + "tag": "@snowplow/browser-plugin-event-specifications_v4.0.3", + "date": "Wed, 20 Nov 2024 09:30:31 GMT", + "comments": {} + }, { "version": "4.0.2", "tag": "@snowplow/browser-plugin-event-specifications_v4.0.2", diff --git a/plugins/browser-plugin-event-specifications/CHANGELOG.md b/plugins/browser-plugin-event-specifications/CHANGELOG.md index a4b1770fb..d627fcf16 100644 --- a/plugins/browser-plugin-event-specifications/CHANGELOG.md +++ b/plugins/browser-plugin-event-specifications/CHANGELOG.md @@ -1,6 +1,143 @@ # Change Log - @snowplow/browser-plugin-event-specifications -This log was last generated on Mon, 11 Nov 2024 15:46:34 GMT and should not be manually modified. +This log was last generated on Wed, 19 Aug 2026 14:26:05 GMT and should not be manually modified. + +## 4.10.1 +Wed, 19 Aug 2026 14:26:05 GMT + +_Version update only_ + +## 4.10.0 +Mon, 27 Jul 2026 13:52:14 GMT + +_Version update only_ + +## 4.9.0 +Tue, 21 Jul 2026 14:53:08 GMT + +_Version update only_ + +## 4.8.4 +Thu, 02 Jul 2026 10:07:52 GMT + +_Version update only_ + +## 4.8.3 +Tue, 30 Jun 2026 14:22:03 GMT + +### Updates + +- Update uuid to v11 and remove closure-compiler from the build pipeline + +## 4.8.2 +Wed, 17 Jun 2026 12:30:12 GMT + +_Version update only_ + +## 4.8.1 +Wed, 13 May 2026 09:26:05 GMT + +_Version update only_ + +## 4.8.0 +Tue, 28 Apr 2026 07:56:22 GMT + +_Version update only_ + +## 4.7.0 +Wed, 01 Apr 2026 12:59:29 GMT + +_Version update only_ + +## 4.6.9 +Mon, 16 Mar 2026 15:43:06 GMT + +_Version update only_ + +## 4.6.8 +Tue, 28 Oct 2025 09:46:42 GMT + +_Version update only_ + +## 4.6.7 +Tue, 07 Oct 2025 14:53:36 GMT + +_Version update only_ + +## 4.6.6 +Tue, 26 Aug 2025 08:42:27 GMT + +_Version update only_ + +## 4.6.5 +Wed, 25 Jun 2025 21:16:46 GMT + +_Version update only_ + +## 4.6.4 +Wed, 25 Jun 2025 12:08:50 GMT + +_Version update only_ + +## 4.6.3 +Thu, 29 May 2025 19:52:07 GMT + +_Version update only_ + +## 4.6.2 +Tue, 20 May 2025 07:39:05 GMT + +_Version update only_ + +## 4.6.1 +Tue, 06 May 2025 13:10:51 GMT + +_Version update only_ + +## 4.6.0 +Thu, 01 May 2025 09:58:59 GMT + +_Version update only_ + +## 4.5.0 +Fri, 04 Apr 2025 09:21:23 GMT + +_Version update only_ + +## 4.4.0 +Thu, 20 Mar 2025 12:14:34 GMT + +_Version update only_ + +## 4.3.1 +Tue, 21 Jan 2025 11:09:42 GMT + +_Version update only_ + +## 4.3.0 +Mon, 20 Jan 2025 11:45:13 GMT + +_Version update only_ + +## 4.2.0 +Mon, 13 Jan 2025 08:30:05 GMT + +_Version update only_ + +## 4.1.0 +Thu, 28 Nov 2024 10:57:30 GMT + +_Version update only_ + +## 4.0.4 +Thu, 21 Nov 2024 09:06:36 GMT + +_Version update only_ + +## 4.0.3 +Wed, 20 Nov 2024 09:30:31 GMT + +_Version update only_ ## 4.0.2 Mon, 11 Nov 2024 15:46:34 GMT diff --git a/plugins/browser-plugin-event-specifications/jest.config.js b/plugins/browser-plugin-event-specifications/jest.config.js index bd3ea4e2a..87d15da9b 100644 --- a/plugins/browser-plugin-event-specifications/jest.config.js +++ b/plugins/browser-plugin-event-specifications/jest.config.js @@ -1,5 +1,6 @@ module.exports = { preset: 'ts-jest', reporters: ['jest-standard-reporter'], + setupFilesAfterEnv: ['../../setupTestGlobals.ts'], testEnvironment: 'jest-environment-jsdom-global', }; diff --git a/plugins/browser-plugin-event-specifications/package.json b/plugins/browser-plugin-event-specifications/package.json index 71f8af15d..051277826 100644 --- a/plugins/browser-plugin-event-specifications/package.json +++ b/plugins/browser-plugin-event-specifications/package.json @@ -1,6 +1,6 @@ { "name": "@snowplow/browser-plugin-event-specifications", - "version": "4.0.2", + "version": "4.10.1", "description": "Automatically adds Event Specifications context to event specifications of a Data Product template.", "homepage": "https://github.com/snowplow/snowplow-javascript-tracker", "bugs": "https://github.com/snowplow/snowplow-javascript-tracker/issues", @@ -27,27 +27,26 @@ "tslib": "^2.3.1" }, "devDependencies": { - "@ampproject/rollup-plugin-closure-compiler": "~0.27.0", "@rollup/plugin-commonjs": "~21.0.2", "@rollup/plugin-node-resolve": "~13.1.3", - "@types/jest": "~27.4.1", + "@types/jest": "~28.1.1", "@types/jsdom": "~16.2.14", "@typescript-eslint/eslint-plugin": "~5.15.0", "@typescript-eslint/parser": "~5.15.0", "eslint": "~8.11.0", - "jest": "~27.5.1", - "jest-environment-jsdom": "~27.5.1", - "jest-environment-jsdom-global": "~3.0.0", + "jest": "~28.1.3", + "jest-environment-jsdom": "~28.1.3", + "jest-environment-jsdom-global": "~4.0.0", "jest-standard-reporter": "~2.0.0", "rollup": "~2.70.1", "rollup-plugin-cleanup": "~3.2.1", "rollup-plugin-license": "~2.6.1", "rollup-plugin-terser": "~7.0.2", "rollup-plugin-ts": "~2.0.5", - "ts-jest": "~27.1.3", + "ts-jest": "~28.0.8", "typescript": "~4.6.2" }, "peerDependencies": { - "@snowplow/browser-tracker": "~4.0.2" + "@snowplow/browser-tracker": "~4.10.1" } } diff --git a/plugins/browser-plugin-event-specifications/rollup.config.js b/plugins/browser-plugin-event-specifications/rollup.config.js index 5b5b37e67..2fdaec972 100644 --- a/plugins/browser-plugin-event-specifications/rollup.config.js +++ b/plugins/browser-plugin-event-specifications/rollup.config.js @@ -2,7 +2,6 @@ import { nodeResolve } from '@rollup/plugin-node-resolve'; import commonjs from '@rollup/plugin-commonjs'; import ts from 'rollup-plugin-ts'; // Preferred over @rollup/plugin-typescript as it bundles .d.ts files import { banner } from '../../banner'; -import compiler from '@ampproject/rollup-plugin-closure-compiler'; import { terser } from 'rollup-plugin-terser'; import cleanup from 'rollup-plugin-cleanup'; import pkg from './package.json'; @@ -21,7 +20,7 @@ export default [ }, { input: './src/index.ts', - plugins: [...umdPlugins, compiler(), terser(), cleanup({ comments: 'none' }), banner()], + plugins: [...umdPlugins, terser(), cleanup({ comments: 'none' }), banner()], treeshake: { moduleSideEffects: ['sha1'] }, output: [{ file: pkg.main.replace('.js', '.min.js'), format: 'umd', sourcemap: true, name: umdName }], }, diff --git a/plugins/browser-plugin-focalmeter/CHANGELOG.json b/plugins/browser-plugin-focalmeter/CHANGELOG.json index 513cc7354..cdd230120 100644 --- a/plugins/browser-plugin-focalmeter/CHANGELOG.json +++ b/plugins/browser-plugin-focalmeter/CHANGELOG.json @@ -1,6 +1,174 @@ { "name": "@snowplow/browser-plugin-focalmeter", "entries": [ + { + "version": "4.10.1", + "tag": "@snowplow/browser-plugin-focalmeter_v4.10.1", + "date": "Wed, 19 Aug 2026 14:26:05 GMT", + "comments": {} + }, + { + "version": "4.10.0", + "tag": "@snowplow/browser-plugin-focalmeter_v4.10.0", + "date": "Mon, 27 Jul 2026 13:52:14 GMT", + "comments": {} + }, + { + "version": "4.9.0", + "tag": "@snowplow/browser-plugin-focalmeter_v4.9.0", + "date": "Tue, 21 Jul 2026 14:53:08 GMT", + "comments": {} + }, + { + "version": "4.8.4", + "tag": "@snowplow/browser-plugin-focalmeter_v4.8.4", + "date": "Thu, 02 Jul 2026 10:07:52 GMT", + "comments": {} + }, + { + "version": "4.8.3", + "tag": "@snowplow/browser-plugin-focalmeter_v4.8.3", + "date": "Tue, 30 Jun 2026 14:22:03 GMT", + "comments": { + "none": [ + { + "comment": "Update uuid to v11 and remove closure-compiler from the build pipeline" + } + ] + } + }, + { + "version": "4.8.2", + "tag": "@snowplow/browser-plugin-focalmeter_v4.8.2", + "date": "Wed, 17 Jun 2026 12:30:12 GMT", + "comments": {} + }, + { + "version": "4.8.1", + "tag": "@snowplow/browser-plugin-focalmeter_v4.8.1", + "date": "Wed, 13 May 2026 09:26:05 GMT", + "comments": {} + }, + { + "version": "4.8.0", + "tag": "@snowplow/browser-plugin-focalmeter_v4.8.0", + "date": "Tue, 28 Apr 2026 07:56:22 GMT", + "comments": {} + }, + { + "version": "4.7.0", + "tag": "@snowplow/browser-plugin-focalmeter_v4.7.0", + "date": "Wed, 01 Apr 2026 12:59:29 GMT", + "comments": {} + }, + { + "version": "4.6.9", + "tag": "@snowplow/browser-plugin-focalmeter_v4.6.9", + "date": "Mon, 16 Mar 2026 15:43:06 GMT", + "comments": {} + }, + { + "version": "4.6.8", + "tag": "@snowplow/browser-plugin-focalmeter_v4.6.8", + "date": "Tue, 28 Oct 2025 09:46:42 GMT", + "comments": {} + }, + { + "version": "4.6.7", + "tag": "@snowplow/browser-plugin-focalmeter_v4.6.7", + "date": "Tue, 07 Oct 2025 14:53:36 GMT", + "comments": {} + }, + { + "version": "4.6.6", + "tag": "@snowplow/browser-plugin-focalmeter_v4.6.6", + "date": "Tue, 26 Aug 2025 08:42:27 GMT", + "comments": {} + }, + { + "version": "4.6.5", + "tag": "@snowplow/browser-plugin-focalmeter_v4.6.5", + "date": "Wed, 25 Jun 2025 21:16:46 GMT", + "comments": {} + }, + { + "version": "4.6.4", + "tag": "@snowplow/browser-plugin-focalmeter_v4.6.4", + "date": "Wed, 25 Jun 2025 12:08:50 GMT", + "comments": {} + }, + { + "version": "4.6.3", + "tag": "@snowplow/browser-plugin-focalmeter_v4.6.3", + "date": "Thu, 29 May 2025 19:52:07 GMT", + "comments": {} + }, + { + "version": "4.6.2", + "tag": "@snowplow/browser-plugin-focalmeter_v4.6.2", + "date": "Tue, 20 May 2025 07:39:05 GMT", + "comments": {} + }, + { + "version": "4.6.1", + "tag": "@snowplow/browser-plugin-focalmeter_v4.6.1", + "date": "Tue, 06 May 2025 13:10:51 GMT", + "comments": {} + }, + { + "version": "4.6.0", + "tag": "@snowplow/browser-plugin-focalmeter_v4.6.0", + "date": "Thu, 01 May 2025 09:58:59 GMT", + "comments": {} + }, + { + "version": "4.5.0", + "tag": "@snowplow/browser-plugin-focalmeter_v4.5.0", + "date": "Fri, 04 Apr 2025 09:21:23 GMT", + "comments": {} + }, + { + "version": "4.4.0", + "tag": "@snowplow/browser-plugin-focalmeter_v4.4.0", + "date": "Thu, 20 Mar 2025 12:14:34 GMT", + "comments": {} + }, + { + "version": "4.3.1", + "tag": "@snowplow/browser-plugin-focalmeter_v4.3.1", + "date": "Tue, 21 Jan 2025 11:09:42 GMT", + "comments": {} + }, + { + "version": "4.3.0", + "tag": "@snowplow/browser-plugin-focalmeter_v4.3.0", + "date": "Mon, 20 Jan 2025 11:45:13 GMT", + "comments": {} + }, + { + "version": "4.2.0", + "tag": "@snowplow/browser-plugin-focalmeter_v4.2.0", + "date": "Mon, 13 Jan 2025 08:30:05 GMT", + "comments": {} + }, + { + "version": "4.1.0", + "tag": "@snowplow/browser-plugin-focalmeter_v4.1.0", + "date": "Thu, 28 Nov 2024 10:57:30 GMT", + "comments": {} + }, + { + "version": "4.0.4", + "tag": "@snowplow/browser-plugin-focalmeter_v4.0.4", + "date": "Thu, 21 Nov 2024 09:06:36 GMT", + "comments": {} + }, + { + "version": "4.0.3", + "tag": "@snowplow/browser-plugin-focalmeter_v4.0.3", + "date": "Wed, 20 Nov 2024 09:30:31 GMT", + "comments": {} + }, { "version": "4.0.2", "tag": "@snowplow/browser-plugin-focalmeter_v4.0.2", diff --git a/plugins/browser-plugin-focalmeter/CHANGELOG.md b/plugins/browser-plugin-focalmeter/CHANGELOG.md index 4d64d566f..b3eb98edd 100644 --- a/plugins/browser-plugin-focalmeter/CHANGELOG.md +++ b/plugins/browser-plugin-focalmeter/CHANGELOG.md @@ -1,6 +1,143 @@ # Change Log - @snowplow/browser-plugin-focalmeter -This log was last generated on Mon, 11 Nov 2024 15:46:34 GMT and should not be manually modified. +This log was last generated on Wed, 19 Aug 2026 14:26:05 GMT and should not be manually modified. + +## 4.10.1 +Wed, 19 Aug 2026 14:26:05 GMT + +_Version update only_ + +## 4.10.0 +Mon, 27 Jul 2026 13:52:14 GMT + +_Version update only_ + +## 4.9.0 +Tue, 21 Jul 2026 14:53:08 GMT + +_Version update only_ + +## 4.8.4 +Thu, 02 Jul 2026 10:07:52 GMT + +_Version update only_ + +## 4.8.3 +Tue, 30 Jun 2026 14:22:03 GMT + +### Updates + +- Update uuid to v11 and remove closure-compiler from the build pipeline + +## 4.8.2 +Wed, 17 Jun 2026 12:30:12 GMT + +_Version update only_ + +## 4.8.1 +Wed, 13 May 2026 09:26:05 GMT + +_Version update only_ + +## 4.8.0 +Tue, 28 Apr 2026 07:56:22 GMT + +_Version update only_ + +## 4.7.0 +Wed, 01 Apr 2026 12:59:29 GMT + +_Version update only_ + +## 4.6.9 +Mon, 16 Mar 2026 15:43:06 GMT + +_Version update only_ + +## 4.6.8 +Tue, 28 Oct 2025 09:46:42 GMT + +_Version update only_ + +## 4.6.7 +Tue, 07 Oct 2025 14:53:36 GMT + +_Version update only_ + +## 4.6.6 +Tue, 26 Aug 2025 08:42:27 GMT + +_Version update only_ + +## 4.6.5 +Wed, 25 Jun 2025 21:16:46 GMT + +_Version update only_ + +## 4.6.4 +Wed, 25 Jun 2025 12:08:50 GMT + +_Version update only_ + +## 4.6.3 +Thu, 29 May 2025 19:52:07 GMT + +_Version update only_ + +## 4.6.2 +Tue, 20 May 2025 07:39:05 GMT + +_Version update only_ + +## 4.6.1 +Tue, 06 May 2025 13:10:51 GMT + +_Version update only_ + +## 4.6.0 +Thu, 01 May 2025 09:58:59 GMT + +_Version update only_ + +## 4.5.0 +Fri, 04 Apr 2025 09:21:23 GMT + +_Version update only_ + +## 4.4.0 +Thu, 20 Mar 2025 12:14:34 GMT + +_Version update only_ + +## 4.3.1 +Tue, 21 Jan 2025 11:09:42 GMT + +_Version update only_ + +## 4.3.0 +Mon, 20 Jan 2025 11:45:13 GMT + +_Version update only_ + +## 4.2.0 +Mon, 13 Jan 2025 08:30:05 GMT + +_Version update only_ + +## 4.1.0 +Thu, 28 Nov 2024 10:57:30 GMT + +_Version update only_ + +## 4.0.4 +Thu, 21 Nov 2024 09:06:36 GMT + +_Version update only_ + +## 4.0.3 +Wed, 20 Nov 2024 09:30:31 GMT + +_Version update only_ ## 4.0.2 Mon, 11 Nov 2024 15:46:34 GMT diff --git a/plugins/browser-plugin-focalmeter/package.json b/plugins/browser-plugin-focalmeter/package.json index a0900807d..c284917fb 100644 --- a/plugins/browser-plugin-focalmeter/package.json +++ b/plugins/browser-plugin-focalmeter/package.json @@ -1,6 +1,6 @@ { "name": "@snowplow/browser-plugin-focalmeter", - "version": "4.0.2", + "version": "4.10.1", "description": "Kantar FocalMeter integration for Snowplow", "homepage": "http://bit.ly/sp-js", "bugs": "https://github.com/snowplow/snowplow-javascript-tracker/issues", @@ -27,27 +27,26 @@ "tslib": "^2.3.1" }, "devDependencies": { - "@ampproject/rollup-plugin-closure-compiler": "~0.27.0", "@rollup/plugin-commonjs": "~21.0.2", "@rollup/plugin-node-resolve": "~13.1.3", - "@types/jest": "~27.4.1", + "@types/jest": "~28.1.1", "@types/jsdom": "~16.2.14", "@typescript-eslint/eslint-plugin": "~5.15.0", "@typescript-eslint/parser": "~5.15.0", "eslint": "~8.11.0", - "jest": "~27.5.1", - "jest-environment-jsdom": "~27.5.1", - "jest-environment-jsdom-global": "~3.0.0", + "jest": "~28.1.3", + "jest-environment-jsdom": "~28.1.3", + "jest-environment-jsdom-global": "~4.0.0", "jest-standard-reporter": "~2.0.0", "rollup": "~2.70.1", "rollup-plugin-cleanup": "~3.2.1", "rollup-plugin-license": "~2.6.1", "rollup-plugin-terser": "~7.0.2", "rollup-plugin-ts": "~2.0.5", - "ts-jest": "~27.1.3", + "ts-jest": "~28.0.8", "typescript": "~4.6.2" }, "peerDependencies": { - "@snowplow/browser-tracker": "~4.0.2" + "@snowplow/browser-tracker": "~4.10.1" } } diff --git a/plugins/browser-plugin-focalmeter/rollup.config.js b/plugins/browser-plugin-focalmeter/rollup.config.js index dfef86c7b..659f9438b 100644 --- a/plugins/browser-plugin-focalmeter/rollup.config.js +++ b/plugins/browser-plugin-focalmeter/rollup.config.js @@ -32,7 +32,6 @@ import { nodeResolve } from '@rollup/plugin-node-resolve'; import commonjs from '@rollup/plugin-commonjs'; import ts from 'rollup-plugin-ts'; // Prefered over @rollup/plugin-typescript as it bundles .d.ts files import { banner } from '../../banner'; -import compiler from '@ampproject/rollup-plugin-closure-compiler'; import { terser } from 'rollup-plugin-terser'; import cleanup from 'rollup-plugin-cleanup'; import pkg from './package.json'; @@ -51,7 +50,7 @@ export default [ }, { input: './src/index.ts', - plugins: [...umdPlugins, compiler(), terser(), cleanup({ comments: 'none' }), banner()], + plugins: [...umdPlugins, terser(), cleanup({ comments: 'none' }), banner()], treeshake: { moduleSideEffects: ['sha1'] }, output: [{ file: pkg.main.replace('.js', '.min.js'), format: 'umd', sourcemap: true, name: umdName }], }, diff --git a/plugins/browser-plugin-form-tracking/CHANGELOG.json b/plugins/browser-plugin-form-tracking/CHANGELOG.json index 16ce0f2ca..26531fe40 100644 --- a/plugins/browser-plugin-form-tracking/CHANGELOG.json +++ b/plugins/browser-plugin-form-tracking/CHANGELOG.json @@ -1,6 +1,180 @@ { "name": "@snowplow/browser-plugin-form-tracking", "entries": [ + { + "version": "4.10.1", + "tag": "@snowplow/browser-plugin-form-tracking_v4.10.1", + "date": "Wed, 19 Aug 2026 14:26:05 GMT", + "comments": {} + }, + { + "version": "4.10.0", + "tag": "@snowplow/browser-plugin-form-tracking_v4.10.0", + "date": "Mon, 27 Jul 2026 13:52:14 GMT", + "comments": {} + }, + { + "version": "4.9.0", + "tag": "@snowplow/browser-plugin-form-tracking_v4.9.0", + "date": "Tue, 21 Jul 2026 14:53:08 GMT", + "comments": {} + }, + { + "version": "4.8.4", + "tag": "@snowplow/browser-plugin-form-tracking_v4.8.4", + "date": "Thu, 02 Jul 2026 10:07:52 GMT", + "comments": {} + }, + { + "version": "4.8.3", + "tag": "@snowplow/browser-plugin-form-tracking_v4.8.3", + "date": "Tue, 30 Jun 2026 14:22:03 GMT", + "comments": { + "none": [ + { + "comment": "Update uuid to v11 and remove closure-compiler from the build pipeline" + } + ] + } + }, + { + "version": "4.8.2", + "tag": "@snowplow/browser-plugin-form-tracking_v4.8.2", + "date": "Wed, 17 Jun 2026 12:30:12 GMT", + "comments": {} + }, + { + "version": "4.8.1", + "tag": "@snowplow/browser-plugin-form-tracking_v4.8.1", + "date": "Wed, 13 May 2026 09:26:05 GMT", + "comments": {} + }, + { + "version": "4.8.0", + "tag": "@snowplow/browser-plugin-form-tracking_v4.8.0", + "date": "Tue, 28 Apr 2026 07:56:22 GMT", + "comments": {} + }, + { + "version": "4.7.0", + "tag": "@snowplow/browser-plugin-form-tracking_v4.7.0", + "date": "Wed, 01 Apr 2026 12:59:29 GMT", + "comments": {} + }, + { + "version": "4.6.9", + "tag": "@snowplow/browser-plugin-form-tracking_v4.6.9", + "date": "Mon, 16 Mar 2026 15:43:06 GMT", + "comments": {} + }, + { + "version": "4.6.8", + "tag": "@snowplow/browser-plugin-form-tracking_v4.6.8", + "date": "Tue, 28 Oct 2025 09:46:42 GMT", + "comments": { + "none": [ + { + "comment": "Allow opt-in bubble-phase listeners for change/submit" + } + ] + } + }, + { + "version": "4.6.7", + "tag": "@snowplow/browser-plugin-form-tracking_v4.6.7", + "date": "Tue, 07 Oct 2025 14:53:36 GMT", + "comments": {} + }, + { + "version": "4.6.6", + "tag": "@snowplow/browser-plugin-form-tracking_v4.6.6", + "date": "Tue, 26 Aug 2025 08:42:27 GMT", + "comments": {} + }, + { + "version": "4.6.5", + "tag": "@snowplow/browser-plugin-form-tracking_v4.6.5", + "date": "Wed, 25 Jun 2025 21:16:46 GMT", + "comments": {} + }, + { + "version": "4.6.4", + "tag": "@snowplow/browser-plugin-form-tracking_v4.6.4", + "date": "Wed, 25 Jun 2025 12:08:50 GMT", + "comments": {} + }, + { + "version": "4.6.3", + "tag": "@snowplow/browser-plugin-form-tracking_v4.6.3", + "date": "Thu, 29 May 2025 19:52:07 GMT", + "comments": {} + }, + { + "version": "4.6.2", + "tag": "@snowplow/browser-plugin-form-tracking_v4.6.2", + "date": "Tue, 20 May 2025 07:39:05 GMT", + "comments": {} + }, + { + "version": "4.6.1", + "tag": "@snowplow/browser-plugin-form-tracking_v4.6.1", + "date": "Tue, 06 May 2025 13:10:51 GMT", + "comments": {} + }, + { + "version": "4.6.0", + "tag": "@snowplow/browser-plugin-form-tracking_v4.6.0", + "date": "Thu, 01 May 2025 09:58:59 GMT", + "comments": {} + }, + { + "version": "4.5.0", + "tag": "@snowplow/browser-plugin-form-tracking_v4.5.0", + "date": "Fri, 04 Apr 2025 09:21:23 GMT", + "comments": {} + }, + { + "version": "4.4.0", + "tag": "@snowplow/browser-plugin-form-tracking_v4.4.0", + "date": "Thu, 20 Mar 2025 12:14:34 GMT", + "comments": {} + }, + { + "version": "4.3.1", + "tag": "@snowplow/browser-plugin-form-tracking_v4.3.1", + "date": "Tue, 21 Jan 2025 11:09:42 GMT", + "comments": {} + }, + { + "version": "4.3.0", + "tag": "@snowplow/browser-plugin-form-tracking_v4.3.0", + "date": "Mon, 20 Jan 2025 11:45:13 GMT", + "comments": {} + }, + { + "version": "4.2.0", + "tag": "@snowplow/browser-plugin-form-tracking_v4.2.0", + "date": "Mon, 13 Jan 2025 08:30:05 GMT", + "comments": {} + }, + { + "version": "4.1.0", + "tag": "@snowplow/browser-plugin-form-tracking_v4.1.0", + "date": "Thu, 28 Nov 2024 10:57:30 GMT", + "comments": {} + }, + { + "version": "4.0.4", + "tag": "@snowplow/browser-plugin-form-tracking_v4.0.4", + "date": "Thu, 21 Nov 2024 09:06:36 GMT", + "comments": {} + }, + { + "version": "4.0.3", + "tag": "@snowplow/browser-plugin-form-tracking_v4.0.3", + "date": "Wed, 20 Nov 2024 09:30:31 GMT", + "comments": {} + }, { "version": "4.0.2", "tag": "@snowplow/browser-plugin-form-tracking_v4.0.2", diff --git a/plugins/browser-plugin-form-tracking/CHANGELOG.md b/plugins/browser-plugin-form-tracking/CHANGELOG.md index 59d783311..53f1327e1 100644 --- a/plugins/browser-plugin-form-tracking/CHANGELOG.md +++ b/plugins/browser-plugin-form-tracking/CHANGELOG.md @@ -1,6 +1,145 @@ # Change Log - @snowplow/browser-plugin-form-tracking -This log was last generated on Mon, 11 Nov 2024 15:46:34 GMT and should not be manually modified. +This log was last generated on Wed, 19 Aug 2026 14:26:05 GMT and should not be manually modified. + +## 4.10.1 +Wed, 19 Aug 2026 14:26:05 GMT + +_Version update only_ + +## 4.10.0 +Mon, 27 Jul 2026 13:52:14 GMT + +_Version update only_ + +## 4.9.0 +Tue, 21 Jul 2026 14:53:08 GMT + +_Version update only_ + +## 4.8.4 +Thu, 02 Jul 2026 10:07:52 GMT + +_Version update only_ + +## 4.8.3 +Tue, 30 Jun 2026 14:22:03 GMT + +### Updates + +- Update uuid to v11 and remove closure-compiler from the build pipeline + +## 4.8.2 +Wed, 17 Jun 2026 12:30:12 GMT + +_Version update only_ + +## 4.8.1 +Wed, 13 May 2026 09:26:05 GMT + +_Version update only_ + +## 4.8.0 +Tue, 28 Apr 2026 07:56:22 GMT + +_Version update only_ + +## 4.7.0 +Wed, 01 Apr 2026 12:59:29 GMT + +_Version update only_ + +## 4.6.9 +Mon, 16 Mar 2026 15:43:06 GMT + +_Version update only_ + +## 4.6.8 +Tue, 28 Oct 2025 09:46:42 GMT + +### Updates + +- Allow opt-in bubble-phase listeners for change/submit + +## 4.6.7 +Tue, 07 Oct 2025 14:53:36 GMT + +_Version update only_ + +## 4.6.6 +Tue, 26 Aug 2025 08:42:27 GMT + +_Version update only_ + +## 4.6.5 +Wed, 25 Jun 2025 21:16:46 GMT + +_Version update only_ + +## 4.6.4 +Wed, 25 Jun 2025 12:08:50 GMT + +_Version update only_ + +## 4.6.3 +Thu, 29 May 2025 19:52:07 GMT + +_Version update only_ + +## 4.6.2 +Tue, 20 May 2025 07:39:05 GMT + +_Version update only_ + +## 4.6.1 +Tue, 06 May 2025 13:10:51 GMT + +_Version update only_ + +## 4.6.0 +Thu, 01 May 2025 09:58:59 GMT + +_Version update only_ + +## 4.5.0 +Fri, 04 Apr 2025 09:21:23 GMT + +_Version update only_ + +## 4.4.0 +Thu, 20 Mar 2025 12:14:34 GMT + +_Version update only_ + +## 4.3.1 +Tue, 21 Jan 2025 11:09:42 GMT + +_Version update only_ + +## 4.3.0 +Mon, 20 Jan 2025 11:45:13 GMT + +_Version update only_ + +## 4.2.0 +Mon, 13 Jan 2025 08:30:05 GMT + +_Version update only_ + +## 4.1.0 +Thu, 28 Nov 2024 10:57:30 GMT + +_Version update only_ + +## 4.0.4 +Thu, 21 Nov 2024 09:06:36 GMT + +_Version update only_ + +## 4.0.3 +Wed, 20 Nov 2024 09:30:31 GMT + +_Version update only_ ## 4.0.2 Mon, 11 Nov 2024 15:46:34 GMT diff --git a/plugins/browser-plugin-form-tracking/package.json b/plugins/browser-plugin-form-tracking/package.json index 332a0ca01..ffb935097 100644 --- a/plugins/browser-plugin-form-tracking/package.json +++ b/plugins/browser-plugin-form-tracking/package.json @@ -1,6 +1,6 @@ { "name": "@snowplow/browser-plugin-form-tracking", - "version": "4.0.2", + "version": "4.10.1", "description": "Form tracking for Snowplow", "homepage": "http://bit.ly/sp-js", "bugs": "https://github.com/snowplow/snowplow-javascript-tracker/issues", @@ -27,27 +27,26 @@ "tslib": "^2.3.1" }, "devDependencies": { - "@ampproject/rollup-plugin-closure-compiler": "~0.27.0", "@rollup/plugin-commonjs": "~21.0.2", "@rollup/plugin-node-resolve": "~13.1.3", - "@types/jest": "~27.4.1", + "@types/jest": "~28.1.1", "@types/jsdom": "~16.2.14", "@typescript-eslint/eslint-plugin": "~5.15.0", "@typescript-eslint/parser": "~5.15.0", "eslint": "~8.11.0", - "jest": "~27.5.1", - "jest-environment-jsdom": "~27.5.1", - "jest-environment-jsdom-global": "~3.0.0", + "jest": "~28.1.3", + "jest-environment-jsdom": "~28.1.3", + "jest-environment-jsdom-global": "~4.0.0", "jest-standard-reporter": "~2.0.0", "rollup": "~2.70.1", "rollup-plugin-cleanup": "~3.2.1", "rollup-plugin-license": "~2.6.1", "rollup-plugin-terser": "~7.0.2", "rollup-plugin-ts": "~2.0.5", - "ts-jest": "~27.1.3", + "ts-jest": "~28.0.8", "typescript": "~4.6.2" }, "peerDependencies": { - "@snowplow/browser-tracker": "~4.0.2" + "@snowplow/browser-tracker": "~4.10.1" } } diff --git a/plugins/browser-plugin-form-tracking/rollup.config.js b/plugins/browser-plugin-form-tracking/rollup.config.js index 2396a31d0..48aa953de 100644 --- a/plugins/browser-plugin-form-tracking/rollup.config.js +++ b/plugins/browser-plugin-form-tracking/rollup.config.js @@ -32,7 +32,6 @@ import { nodeResolve } from '@rollup/plugin-node-resolve'; import commonjs from '@rollup/plugin-commonjs'; import ts from 'rollup-plugin-ts'; // Prefered over @rollup/plugin-typescript as it bundles .d.ts files import { banner } from '../../banner'; -import compiler from '@ampproject/rollup-plugin-closure-compiler'; import { terser } from 'rollup-plugin-terser'; import cleanup from 'rollup-plugin-cleanup'; import pkg from './package.json'; @@ -51,7 +50,7 @@ export default [ }, { input: './src/index.ts', - plugins: [...umdPlugins, compiler(), terser(), cleanup({ comments: 'none' }), banner()], + plugins: [...umdPlugins, terser(), cleanup({ comments: 'none' }), banner()], treeshake: { moduleSideEffects: ['sha1'] }, output: [{ file: pkg.main.replace('.js', '.min.js'), format: 'umd', sourcemap: true, name: umdName }], }, diff --git a/plugins/browser-plugin-form-tracking/src/helpers.ts b/plugins/browser-plugin-form-tracking/src/helpers.ts index d7d0e7309..6153fee67 100644 --- a/plugins/browser-plugin-form-tracking/src/helpers.ts +++ b/plugins/browser-plugin-form-tracking/src/helpers.ts @@ -40,6 +40,8 @@ const defaultFormTrackingEvents = [ /** Form tracking plugin options to determine which events to fire and the elements to listen for */ interface FormTrackingOptions { + /** Whether to handle events in the capture phase or the bubbling phase. Capture is usually more reliable, but may trigger early if you need changes from other submit handlers in your transforms, filters, or context generators. Defaults to true. */ + useCapture?: boolean; /** List of `form` elements that are allowed to generate events, or criteria for deciding that when the event listener handles the event */ forms?: | FilterCriterion @@ -86,6 +88,7 @@ const _focusListeners: Record = {}; const _changeListeners: Record = {}; const _submitListeners: Record = {}; const _targets: Record = {}; +const _captures: Record = {}; /** * Add submission/focus/change event listeners to page for forms and elements according to `configuration` @@ -99,19 +102,21 @@ export function addFormListeners(tracker: BrowserTracker, configuration: FormTra const events = options?.events ?? defaultFormTrackingEvents; + const useCapture = (_captures[tracker.id] = options?.useCapture ?? true); + const targets = (_targets[tracker.id] = getTargetList(options?.targets, config.forms)); if (events.indexOf(FormTrackingEvent.FOCUS_FORM) !== -1) { _focusListeners[tracker.id] = getFormChangeListener(tracker, config, FormTrackingEvent.FOCUS_FORM, context); - targets.forEach((target) => addEventListener(target, 'focus', _focusListeners[tracker.id], true)); + targets.forEach((target) => addEventListener(target, 'focus', _focusListeners[tracker.id], true)); // focus does not bubble } if (events.indexOf(FormTrackingEvent.CHANGE_FORM) !== -1) { _changeListeners[tracker.id] = getFormChangeListener(tracker, config, FormTrackingEvent.CHANGE_FORM, context); - targets.forEach((target) => addEventListener(target, 'change', _changeListeners[tracker.id], true)); + targets.forEach((target) => addEventListener(target, 'change', _changeListeners[tracker.id], useCapture)); } if (events.indexOf(FormTrackingEvent.SUBMIT_FORM) !== -1) { _submitListeners[tracker.id] = getFormSubmissionListener(tracker, config, context); - targets.forEach((target) => addEventListener(target, 'submit', _submitListeners[tracker.id], true)); + targets.forEach((target) => addEventListener(target, 'submit', _submitListeners[tracker.id], useCapture)); } } @@ -145,10 +150,11 @@ function getTargetList(configTargets: EventTarget[] | undefined, forms: FormConf */ export function removeFormListeners(tracker: BrowserTracker) { const targets = _targets[tracker.id] ?? [document]; + const useCapture = _captures[tracker.id] ?? true; targets.forEach((target) => { - if (_focusListeners[tracker.id]) target.removeEventListener('focus', _focusListeners[tracker.id], true); - if (_changeListeners[tracker.id]) target.removeEventListener('change', _changeListeners[tracker.id], true); - if (_submitListeners[tracker.id]) target.removeEventListener('submit', _submitListeners[tracker.id], true); + if (_focusListeners[tracker.id]) target.removeEventListener('focus', _focusListeners[tracker.id], true); // focus does not bubble + if (_changeListeners[tracker.id]) target.removeEventListener('change', _changeListeners[tracker.id], useCapture); + if (_submitListeners[tracker.id]) target.removeEventListener('submit', _submitListeners[tracker.id], useCapture); }); } @@ -363,10 +369,13 @@ function getFormChangeListener( // bind late to the forms/field directly on field focus in this case if (target !== e.target && e.composed && isTrackableElement(target)) { if (target.form) { - if (_changeListeners[tracker.id]) addEventListener(target.form, 'change', _changeListeners[tracker.id], true); - if (_submitListeners[tracker.id]) addEventListener(target.form, 'submit', _submitListeners[tracker.id], true); + if (_changeListeners[tracker.id]) + addEventListener(target.form, 'change', _changeListeners[tracker.id], _captures[tracker.id]); + if (_submitListeners[tracker.id]) + addEventListener(target.form, 'submit', _submitListeners[tracker.id], _captures[tracker.id]); } else { - if (_changeListeners[tracker.id]) addEventListener(target, 'change', _changeListeners[tracker.id], true); + if (_changeListeners[tracker.id]) + addEventListener(target, 'change', _changeListeners[tracker.id], _captures[tracker.id]); } } diff --git a/plugins/browser-plugin-ga-cookies/CHANGELOG.json b/plugins/browser-plugin-ga-cookies/CHANGELOG.json index f8a328875..9a866ac6d 100644 --- a/plugins/browser-plugin-ga-cookies/CHANGELOG.json +++ b/plugins/browser-plugin-ga-cookies/CHANGELOG.json @@ -1,6 +1,174 @@ { "name": "@snowplow/browser-plugin-ga-cookies", "entries": [ + { + "version": "4.10.1", + "tag": "@snowplow/browser-plugin-ga-cookies_v4.10.1", + "date": "Wed, 19 Aug 2026 14:26:05 GMT", + "comments": {} + }, + { + "version": "4.10.0", + "tag": "@snowplow/browser-plugin-ga-cookies_v4.10.0", + "date": "Mon, 27 Jul 2026 13:52:14 GMT", + "comments": {} + }, + { + "version": "4.9.0", + "tag": "@snowplow/browser-plugin-ga-cookies_v4.9.0", + "date": "Tue, 21 Jul 2026 14:53:08 GMT", + "comments": {} + }, + { + "version": "4.8.4", + "tag": "@snowplow/browser-plugin-ga-cookies_v4.8.4", + "date": "Thu, 02 Jul 2026 10:07:52 GMT", + "comments": {} + }, + { + "version": "4.8.3", + "tag": "@snowplow/browser-plugin-ga-cookies_v4.8.3", + "date": "Tue, 30 Jun 2026 14:22:03 GMT", + "comments": { + "none": [ + { + "comment": "Update uuid to v11 and remove closure-compiler from the build pipeline" + } + ] + } + }, + { + "version": "4.8.2", + "tag": "@snowplow/browser-plugin-ga-cookies_v4.8.2", + "date": "Wed, 17 Jun 2026 12:30:12 GMT", + "comments": {} + }, + { + "version": "4.8.1", + "tag": "@snowplow/browser-plugin-ga-cookies_v4.8.1", + "date": "Wed, 13 May 2026 09:26:05 GMT", + "comments": {} + }, + { + "version": "4.8.0", + "tag": "@snowplow/browser-plugin-ga-cookies_v4.8.0", + "date": "Tue, 28 Apr 2026 07:56:22 GMT", + "comments": {} + }, + { + "version": "4.7.0", + "tag": "@snowplow/browser-plugin-ga-cookies_v4.7.0", + "date": "Wed, 01 Apr 2026 12:59:29 GMT", + "comments": {} + }, + { + "version": "4.6.9", + "tag": "@snowplow/browser-plugin-ga-cookies_v4.6.9", + "date": "Mon, 16 Mar 2026 15:43:06 GMT", + "comments": {} + }, + { + "version": "4.6.8", + "tag": "@snowplow/browser-plugin-ga-cookies_v4.6.8", + "date": "Tue, 28 Oct 2025 09:46:42 GMT", + "comments": {} + }, + { + "version": "4.6.7", + "tag": "@snowplow/browser-plugin-ga-cookies_v4.6.7", + "date": "Tue, 07 Oct 2025 14:53:36 GMT", + "comments": {} + }, + { + "version": "4.6.6", + "tag": "@snowplow/browser-plugin-ga-cookies_v4.6.6", + "date": "Tue, 26 Aug 2025 08:42:27 GMT", + "comments": {} + }, + { + "version": "4.6.5", + "tag": "@snowplow/browser-plugin-ga-cookies_v4.6.5", + "date": "Wed, 25 Jun 2025 21:16:46 GMT", + "comments": {} + }, + { + "version": "4.6.4", + "tag": "@snowplow/browser-plugin-ga-cookies_v4.6.4", + "date": "Wed, 25 Jun 2025 12:08:50 GMT", + "comments": {} + }, + { + "version": "4.6.3", + "tag": "@snowplow/browser-plugin-ga-cookies_v4.6.3", + "date": "Thu, 29 May 2025 19:52:07 GMT", + "comments": {} + }, + { + "version": "4.6.2", + "tag": "@snowplow/browser-plugin-ga-cookies_v4.6.2", + "date": "Tue, 20 May 2025 07:39:05 GMT", + "comments": {} + }, + { + "version": "4.6.1", + "tag": "@snowplow/browser-plugin-ga-cookies_v4.6.1", + "date": "Tue, 06 May 2025 13:10:51 GMT", + "comments": {} + }, + { + "version": "4.6.0", + "tag": "@snowplow/browser-plugin-ga-cookies_v4.6.0", + "date": "Thu, 01 May 2025 09:58:59 GMT", + "comments": {} + }, + { + "version": "4.5.0", + "tag": "@snowplow/browser-plugin-ga-cookies_v4.5.0", + "date": "Fri, 04 Apr 2025 09:21:23 GMT", + "comments": {} + }, + { + "version": "4.4.0", + "tag": "@snowplow/browser-plugin-ga-cookies_v4.4.0", + "date": "Thu, 20 Mar 2025 12:14:34 GMT", + "comments": {} + }, + { + "version": "4.3.1", + "tag": "@snowplow/browser-plugin-ga-cookies_v4.3.1", + "date": "Tue, 21 Jan 2025 11:09:42 GMT", + "comments": {} + }, + { + "version": "4.3.0", + "tag": "@snowplow/browser-plugin-ga-cookies_v4.3.0", + "date": "Mon, 20 Jan 2025 11:45:13 GMT", + "comments": {} + }, + { + "version": "4.2.0", + "tag": "@snowplow/browser-plugin-ga-cookies_v4.2.0", + "date": "Mon, 13 Jan 2025 08:30:05 GMT", + "comments": {} + }, + { + "version": "4.1.0", + "tag": "@snowplow/browser-plugin-ga-cookies_v4.1.0", + "date": "Thu, 28 Nov 2024 10:57:30 GMT", + "comments": {} + }, + { + "version": "4.0.4", + "tag": "@snowplow/browser-plugin-ga-cookies_v4.0.4", + "date": "Thu, 21 Nov 2024 09:06:36 GMT", + "comments": {} + }, + { + "version": "4.0.3", + "tag": "@snowplow/browser-plugin-ga-cookies_v4.0.3", + "date": "Wed, 20 Nov 2024 09:30:31 GMT", + "comments": {} + }, { "version": "4.0.2", "tag": "@snowplow/browser-plugin-ga-cookies_v4.0.2", diff --git a/plugins/browser-plugin-ga-cookies/CHANGELOG.md b/plugins/browser-plugin-ga-cookies/CHANGELOG.md index d67597d38..8c50e01a3 100644 --- a/plugins/browser-plugin-ga-cookies/CHANGELOG.md +++ b/plugins/browser-plugin-ga-cookies/CHANGELOG.md @@ -1,6 +1,143 @@ # Change Log - @snowplow/browser-plugin-ga-cookies -This log was last generated on Mon, 11 Nov 2024 15:46:34 GMT and should not be manually modified. +This log was last generated on Wed, 19 Aug 2026 14:26:05 GMT and should not be manually modified. + +## 4.10.1 +Wed, 19 Aug 2026 14:26:05 GMT + +_Version update only_ + +## 4.10.0 +Mon, 27 Jul 2026 13:52:14 GMT + +_Version update only_ + +## 4.9.0 +Tue, 21 Jul 2026 14:53:08 GMT + +_Version update only_ + +## 4.8.4 +Thu, 02 Jul 2026 10:07:52 GMT + +_Version update only_ + +## 4.8.3 +Tue, 30 Jun 2026 14:22:03 GMT + +### Updates + +- Update uuid to v11 and remove closure-compiler from the build pipeline + +## 4.8.2 +Wed, 17 Jun 2026 12:30:12 GMT + +_Version update only_ + +## 4.8.1 +Wed, 13 May 2026 09:26:05 GMT + +_Version update only_ + +## 4.8.0 +Tue, 28 Apr 2026 07:56:22 GMT + +_Version update only_ + +## 4.7.0 +Wed, 01 Apr 2026 12:59:29 GMT + +_Version update only_ + +## 4.6.9 +Mon, 16 Mar 2026 15:43:06 GMT + +_Version update only_ + +## 4.6.8 +Tue, 28 Oct 2025 09:46:42 GMT + +_Version update only_ + +## 4.6.7 +Tue, 07 Oct 2025 14:53:36 GMT + +_Version update only_ + +## 4.6.6 +Tue, 26 Aug 2025 08:42:27 GMT + +_Version update only_ + +## 4.6.5 +Wed, 25 Jun 2025 21:16:46 GMT + +_Version update only_ + +## 4.6.4 +Wed, 25 Jun 2025 12:08:50 GMT + +_Version update only_ + +## 4.6.3 +Thu, 29 May 2025 19:52:07 GMT + +_Version update only_ + +## 4.6.2 +Tue, 20 May 2025 07:39:05 GMT + +_Version update only_ + +## 4.6.1 +Tue, 06 May 2025 13:10:51 GMT + +_Version update only_ + +## 4.6.0 +Thu, 01 May 2025 09:58:59 GMT + +_Version update only_ + +## 4.5.0 +Fri, 04 Apr 2025 09:21:23 GMT + +_Version update only_ + +## 4.4.0 +Thu, 20 Mar 2025 12:14:34 GMT + +_Version update only_ + +## 4.3.1 +Tue, 21 Jan 2025 11:09:42 GMT + +_Version update only_ + +## 4.3.0 +Mon, 20 Jan 2025 11:45:13 GMT + +_Version update only_ + +## 4.2.0 +Mon, 13 Jan 2025 08:30:05 GMT + +_Version update only_ + +## 4.1.0 +Thu, 28 Nov 2024 10:57:30 GMT + +_Version update only_ + +## 4.0.4 +Thu, 21 Nov 2024 09:06:36 GMT + +_Version update only_ + +## 4.0.3 +Wed, 20 Nov 2024 09:30:31 GMT + +_Version update only_ ## 4.0.2 Mon, 11 Nov 2024 15:46:34 GMT diff --git a/plugins/browser-plugin-ga-cookies/jest.config.js b/plugins/browser-plugin-ga-cookies/jest.config.js index bd3ea4e2a..87d15da9b 100644 --- a/plugins/browser-plugin-ga-cookies/jest.config.js +++ b/plugins/browser-plugin-ga-cookies/jest.config.js @@ -1,5 +1,6 @@ module.exports = { preset: 'ts-jest', reporters: ['jest-standard-reporter'], + setupFilesAfterEnv: ['../../setupTestGlobals.ts'], testEnvironment: 'jest-environment-jsdom-global', }; diff --git a/plugins/browser-plugin-ga-cookies/package.json b/plugins/browser-plugin-ga-cookies/package.json index 25f2c161a..c3777f515 100644 --- a/plugins/browser-plugin-ga-cookies/package.json +++ b/plugins/browser-plugin-ga-cookies/package.json @@ -1,6 +1,6 @@ { "name": "@snowplow/browser-plugin-ga-cookies", - "version": "4.0.2", + "version": "4.10.1", "description": "Attaches GA cookie data to Snowplow events", "homepage": "http://bit.ly/sp-js", "bugs": "https://github.com/snowplow/snowplow-javascript-tracker/issues", @@ -27,27 +27,26 @@ "tslib": "^2.3.1" }, "devDependencies": { - "@ampproject/rollup-plugin-closure-compiler": "~0.27.0", "@rollup/plugin-commonjs": "~21.0.2", "@rollup/plugin-node-resolve": "~13.1.3", - "@types/jest": "~27.4.1", + "@types/jest": "~28.1.1", "@types/jsdom": "~16.2.14", "@typescript-eslint/eslint-plugin": "~5.15.0", "@typescript-eslint/parser": "~5.15.0", "eslint": "~8.11.0", - "jest": "~27.5.1", - "jest-environment-jsdom": "~27.5.1", - "jest-environment-jsdom-global": "~3.0.0", + "jest": "~28.1.3", + "jest-environment-jsdom": "~28.1.3", + "jest-environment-jsdom-global": "~4.0.0", "jest-standard-reporter": "~2.0.0", "rollup": "~2.70.1", "rollup-plugin-cleanup": "~3.2.1", "rollup-plugin-license": "~2.6.1", "rollup-plugin-terser": "~7.0.2", "rollup-plugin-ts": "~2.0.5", - "ts-jest": "~27.1.3", + "ts-jest": "~28.0.8", "typescript": "~4.6.2" }, "peerDependencies": { - "@snowplow/browser-tracker": "~4.0.2" + "@snowplow/browser-tracker": "~4.10.1" } } diff --git a/plugins/browser-plugin-ga-cookies/rollup.config.js b/plugins/browser-plugin-ga-cookies/rollup.config.js index 837ac7417..4748aabab 100644 --- a/plugins/browser-plugin-ga-cookies/rollup.config.js +++ b/plugins/browser-plugin-ga-cookies/rollup.config.js @@ -32,7 +32,6 @@ import { nodeResolve } from '@rollup/plugin-node-resolve'; import commonjs from '@rollup/plugin-commonjs'; import ts from 'rollup-plugin-ts'; // Prefered over @rollup/plugin-typescript as it bundles .d.ts files import { banner } from '../../banner'; -import compiler from '@ampproject/rollup-plugin-closure-compiler'; import { terser } from 'rollup-plugin-terser'; import cleanup from 'rollup-plugin-cleanup'; import pkg from './package.json'; @@ -51,7 +50,7 @@ export default [ }, { input: './src/index.ts', - plugins: [...umdPlugins, compiler(), terser(), cleanup({ comments: 'none' }), banner()], + plugins: [...umdPlugins, terser(), cleanup({ comments: 'none' }), banner()], treeshake: { moduleSideEffects: ['sha1'] }, output: [{ file: pkg.main.replace('.js', '.min.js'), format: 'umd', sourcemap: true, name: umdName }], }, diff --git a/plugins/browser-plugin-geolocation/CHANGELOG.json b/plugins/browser-plugin-geolocation/CHANGELOG.json index 6cc846f7e..3136772b8 100644 --- a/plugins/browser-plugin-geolocation/CHANGELOG.json +++ b/plugins/browser-plugin-geolocation/CHANGELOG.json @@ -1,6 +1,174 @@ { "name": "@snowplow/browser-plugin-geolocation", "entries": [ + { + "version": "4.10.1", + "tag": "@snowplow/browser-plugin-geolocation_v4.10.1", + "date": "Wed, 19 Aug 2026 14:26:05 GMT", + "comments": {} + }, + { + "version": "4.10.0", + "tag": "@snowplow/browser-plugin-geolocation_v4.10.0", + "date": "Mon, 27 Jul 2026 13:52:14 GMT", + "comments": {} + }, + { + "version": "4.9.0", + "tag": "@snowplow/browser-plugin-geolocation_v4.9.0", + "date": "Tue, 21 Jul 2026 14:53:08 GMT", + "comments": {} + }, + { + "version": "4.8.4", + "tag": "@snowplow/browser-plugin-geolocation_v4.8.4", + "date": "Thu, 02 Jul 2026 10:07:52 GMT", + "comments": {} + }, + { + "version": "4.8.3", + "tag": "@snowplow/browser-plugin-geolocation_v4.8.3", + "date": "Tue, 30 Jun 2026 14:22:03 GMT", + "comments": { + "none": [ + { + "comment": "Update uuid to v11 and remove closure-compiler from the build pipeline" + } + ] + } + }, + { + "version": "4.8.2", + "tag": "@snowplow/browser-plugin-geolocation_v4.8.2", + "date": "Wed, 17 Jun 2026 12:30:12 GMT", + "comments": {} + }, + { + "version": "4.8.1", + "tag": "@snowplow/browser-plugin-geolocation_v4.8.1", + "date": "Wed, 13 May 2026 09:26:05 GMT", + "comments": {} + }, + { + "version": "4.8.0", + "tag": "@snowplow/browser-plugin-geolocation_v4.8.0", + "date": "Tue, 28 Apr 2026 07:56:22 GMT", + "comments": {} + }, + { + "version": "4.7.0", + "tag": "@snowplow/browser-plugin-geolocation_v4.7.0", + "date": "Wed, 01 Apr 2026 12:59:29 GMT", + "comments": {} + }, + { + "version": "4.6.9", + "tag": "@snowplow/browser-plugin-geolocation_v4.6.9", + "date": "Mon, 16 Mar 2026 15:43:06 GMT", + "comments": {} + }, + { + "version": "4.6.8", + "tag": "@snowplow/browser-plugin-geolocation_v4.6.8", + "date": "Tue, 28 Oct 2025 09:46:42 GMT", + "comments": {} + }, + { + "version": "4.6.7", + "tag": "@snowplow/browser-plugin-geolocation_v4.6.7", + "date": "Tue, 07 Oct 2025 14:53:36 GMT", + "comments": {} + }, + { + "version": "4.6.6", + "tag": "@snowplow/browser-plugin-geolocation_v4.6.6", + "date": "Tue, 26 Aug 2025 08:42:27 GMT", + "comments": {} + }, + { + "version": "4.6.5", + "tag": "@snowplow/browser-plugin-geolocation_v4.6.5", + "date": "Wed, 25 Jun 2025 21:16:46 GMT", + "comments": {} + }, + { + "version": "4.6.4", + "tag": "@snowplow/browser-plugin-geolocation_v4.6.4", + "date": "Wed, 25 Jun 2025 12:08:50 GMT", + "comments": {} + }, + { + "version": "4.6.3", + "tag": "@snowplow/browser-plugin-geolocation_v4.6.3", + "date": "Thu, 29 May 2025 19:52:07 GMT", + "comments": {} + }, + { + "version": "4.6.2", + "tag": "@snowplow/browser-plugin-geolocation_v4.6.2", + "date": "Tue, 20 May 2025 07:39:05 GMT", + "comments": {} + }, + { + "version": "4.6.1", + "tag": "@snowplow/browser-plugin-geolocation_v4.6.1", + "date": "Tue, 06 May 2025 13:10:51 GMT", + "comments": {} + }, + { + "version": "4.6.0", + "tag": "@snowplow/browser-plugin-geolocation_v4.6.0", + "date": "Thu, 01 May 2025 09:58:59 GMT", + "comments": {} + }, + { + "version": "4.5.0", + "tag": "@snowplow/browser-plugin-geolocation_v4.5.0", + "date": "Fri, 04 Apr 2025 09:21:23 GMT", + "comments": {} + }, + { + "version": "4.4.0", + "tag": "@snowplow/browser-plugin-geolocation_v4.4.0", + "date": "Thu, 20 Mar 2025 12:14:34 GMT", + "comments": {} + }, + { + "version": "4.3.1", + "tag": "@snowplow/browser-plugin-geolocation_v4.3.1", + "date": "Tue, 21 Jan 2025 11:09:42 GMT", + "comments": {} + }, + { + "version": "4.3.0", + "tag": "@snowplow/browser-plugin-geolocation_v4.3.0", + "date": "Mon, 20 Jan 2025 11:45:13 GMT", + "comments": {} + }, + { + "version": "4.2.0", + "tag": "@snowplow/browser-plugin-geolocation_v4.2.0", + "date": "Mon, 13 Jan 2025 08:30:05 GMT", + "comments": {} + }, + { + "version": "4.1.0", + "tag": "@snowplow/browser-plugin-geolocation_v4.1.0", + "date": "Thu, 28 Nov 2024 10:57:30 GMT", + "comments": {} + }, + { + "version": "4.0.4", + "tag": "@snowplow/browser-plugin-geolocation_v4.0.4", + "date": "Thu, 21 Nov 2024 09:06:36 GMT", + "comments": {} + }, + { + "version": "4.0.3", + "tag": "@snowplow/browser-plugin-geolocation_v4.0.3", + "date": "Wed, 20 Nov 2024 09:30:31 GMT", + "comments": {} + }, { "version": "4.0.2", "tag": "@snowplow/browser-plugin-geolocation_v4.0.2", diff --git a/plugins/browser-plugin-geolocation/CHANGELOG.md b/plugins/browser-plugin-geolocation/CHANGELOG.md index 68cade81c..5c74074e8 100644 --- a/plugins/browser-plugin-geolocation/CHANGELOG.md +++ b/plugins/browser-plugin-geolocation/CHANGELOG.md @@ -1,6 +1,143 @@ # Change Log - @snowplow/browser-plugin-geolocation -This log was last generated on Mon, 11 Nov 2024 15:46:34 GMT and should not be manually modified. +This log was last generated on Wed, 19 Aug 2026 14:26:05 GMT and should not be manually modified. + +## 4.10.1 +Wed, 19 Aug 2026 14:26:05 GMT + +_Version update only_ + +## 4.10.0 +Mon, 27 Jul 2026 13:52:14 GMT + +_Version update only_ + +## 4.9.0 +Tue, 21 Jul 2026 14:53:08 GMT + +_Version update only_ + +## 4.8.4 +Thu, 02 Jul 2026 10:07:52 GMT + +_Version update only_ + +## 4.8.3 +Tue, 30 Jun 2026 14:22:03 GMT + +### Updates + +- Update uuid to v11 and remove closure-compiler from the build pipeline + +## 4.8.2 +Wed, 17 Jun 2026 12:30:12 GMT + +_Version update only_ + +## 4.8.1 +Wed, 13 May 2026 09:26:05 GMT + +_Version update only_ + +## 4.8.0 +Tue, 28 Apr 2026 07:56:22 GMT + +_Version update only_ + +## 4.7.0 +Wed, 01 Apr 2026 12:59:29 GMT + +_Version update only_ + +## 4.6.9 +Mon, 16 Mar 2026 15:43:06 GMT + +_Version update only_ + +## 4.6.8 +Tue, 28 Oct 2025 09:46:42 GMT + +_Version update only_ + +## 4.6.7 +Tue, 07 Oct 2025 14:53:36 GMT + +_Version update only_ + +## 4.6.6 +Tue, 26 Aug 2025 08:42:27 GMT + +_Version update only_ + +## 4.6.5 +Wed, 25 Jun 2025 21:16:46 GMT + +_Version update only_ + +## 4.6.4 +Wed, 25 Jun 2025 12:08:50 GMT + +_Version update only_ + +## 4.6.3 +Thu, 29 May 2025 19:52:07 GMT + +_Version update only_ + +## 4.6.2 +Tue, 20 May 2025 07:39:05 GMT + +_Version update only_ + +## 4.6.1 +Tue, 06 May 2025 13:10:51 GMT + +_Version update only_ + +## 4.6.0 +Thu, 01 May 2025 09:58:59 GMT + +_Version update only_ + +## 4.5.0 +Fri, 04 Apr 2025 09:21:23 GMT + +_Version update only_ + +## 4.4.0 +Thu, 20 Mar 2025 12:14:34 GMT + +_Version update only_ + +## 4.3.1 +Tue, 21 Jan 2025 11:09:42 GMT + +_Version update only_ + +## 4.3.0 +Mon, 20 Jan 2025 11:45:13 GMT + +_Version update only_ + +## 4.2.0 +Mon, 13 Jan 2025 08:30:05 GMT + +_Version update only_ + +## 4.1.0 +Thu, 28 Nov 2024 10:57:30 GMT + +_Version update only_ + +## 4.0.4 +Thu, 21 Nov 2024 09:06:36 GMT + +_Version update only_ + +## 4.0.3 +Wed, 20 Nov 2024 09:30:31 GMT + +_Version update only_ ## 4.0.2 Mon, 11 Nov 2024 15:46:34 GMT diff --git a/plugins/browser-plugin-geolocation/package.json b/plugins/browser-plugin-geolocation/package.json index 50f3432e8..f2186bced 100644 --- a/plugins/browser-plugin-geolocation/package.json +++ b/plugins/browser-plugin-geolocation/package.json @@ -1,6 +1,6 @@ { "name": "@snowplow/browser-plugin-geolocation", - "version": "4.0.2", + "version": "4.10.1", "description": "Attaches Geolocation data to Snowplow events", "homepage": "http://bit.ly/sp-js", "bugs": "https://github.com/snowplow/snowplow-javascript-tracker/issues", @@ -27,27 +27,26 @@ "tslib": "^2.3.1" }, "devDependencies": { - "@ampproject/rollup-plugin-closure-compiler": "~0.27.0", "@rollup/plugin-commonjs": "~21.0.2", "@rollup/plugin-node-resolve": "~13.1.3", - "@types/jest": "~27.4.1", + "@types/jest": "~28.1.1", "@types/jsdom": "~16.2.14", "@typescript-eslint/eslint-plugin": "~5.15.0", "@typescript-eslint/parser": "~5.15.0", "eslint": "~8.11.0", - "jest": "~27.5.1", - "jest-environment-jsdom": "~27.5.1", - "jest-environment-jsdom-global": "~3.0.0", + "jest": "~28.1.3", + "jest-environment-jsdom": "~28.1.3", + "jest-environment-jsdom-global": "~4.0.0", "jest-standard-reporter": "~2.0.0", "rollup": "~2.70.1", "rollup-plugin-cleanup": "~3.2.1", "rollup-plugin-license": "~2.6.1", "rollup-plugin-terser": "~7.0.2", "rollup-plugin-ts": "~2.0.5", - "ts-jest": "~27.1.3", + "ts-jest": "~28.0.8", "typescript": "~4.6.2" }, "peerDependencies": { - "@snowplow/browser-tracker": "~4.0.2" + "@snowplow/browser-tracker": "~4.10.1" } } diff --git a/plugins/browser-plugin-geolocation/rollup.config.js b/plugins/browser-plugin-geolocation/rollup.config.js index 762f93b25..ae1d93d44 100644 --- a/plugins/browser-plugin-geolocation/rollup.config.js +++ b/plugins/browser-plugin-geolocation/rollup.config.js @@ -32,7 +32,6 @@ import { nodeResolve } from '@rollup/plugin-node-resolve'; import commonjs from '@rollup/plugin-commonjs'; import ts from 'rollup-plugin-ts'; // Prefered over @rollup/plugin-typescript as it bundles .d.ts files import { banner } from '../../banner'; -import compiler from '@ampproject/rollup-plugin-closure-compiler'; import { terser } from 'rollup-plugin-terser'; import cleanup from 'rollup-plugin-cleanup'; import pkg from './package.json'; @@ -51,7 +50,7 @@ export default [ }, { input: './src/index.ts', - plugins: [...umdPlugins, compiler(), terser(), cleanup({ comments: 'none' }), banner()], + plugins: [...umdPlugins, terser(), cleanup({ comments: 'none' }), banner()], treeshake: { moduleSideEffects: ['sha1'] }, output: [{ file: pkg.main.replace('.js', '.min.js'), format: 'umd', sourcemap: true, name: umdName }], }, diff --git a/plugins/browser-plugin-link-click-tracking/CHANGELOG.json b/plugins/browser-plugin-link-click-tracking/CHANGELOG.json index b88a2a423..e071fa53c 100644 --- a/plugins/browser-plugin-link-click-tracking/CHANGELOG.json +++ b/plugins/browser-plugin-link-click-tracking/CHANGELOG.json @@ -1,6 +1,180 @@ { "name": "@snowplow/browser-plugin-link-click-tracking", "entries": [ + { + "version": "4.10.1", + "tag": "@snowplow/browser-plugin-link-click-tracking_v4.10.1", + "date": "Wed, 19 Aug 2026 14:26:05 GMT", + "comments": {} + }, + { + "version": "4.10.0", + "tag": "@snowplow/browser-plugin-link-click-tracking_v4.10.0", + "date": "Mon, 27 Jul 2026 13:52:14 GMT", + "comments": {} + }, + { + "version": "4.9.0", + "tag": "@snowplow/browser-plugin-link-click-tracking_v4.9.0", + "date": "Tue, 21 Jul 2026 14:53:08 GMT", + "comments": {} + }, + { + "version": "4.8.4", + "tag": "@snowplow/browser-plugin-link-click-tracking_v4.8.4", + "date": "Thu, 02 Jul 2026 10:07:52 GMT", + "comments": {} + }, + { + "version": "4.8.3", + "tag": "@snowplow/browser-plugin-link-click-tracking_v4.8.3", + "date": "Tue, 30 Jun 2026 14:22:03 GMT", + "comments": { + "none": [ + { + "comment": "Update uuid to v11 and remove closure-compiler from the build pipeline" + } + ] + } + }, + { + "version": "4.8.2", + "tag": "@snowplow/browser-plugin-link-click-tracking_v4.8.2", + "date": "Wed, 17 Jun 2026 12:30:12 GMT", + "comments": {} + }, + { + "version": "4.8.1", + "tag": "@snowplow/browser-plugin-link-click-tracking_v4.8.1", + "date": "Wed, 13 May 2026 09:26:05 GMT", + "comments": {} + }, + { + "version": "4.8.0", + "tag": "@snowplow/browser-plugin-link-click-tracking_v4.8.0", + "date": "Tue, 28 Apr 2026 07:56:22 GMT", + "comments": {} + }, + { + "version": "4.7.0", + "tag": "@snowplow/browser-plugin-link-click-tracking_v4.7.0", + "date": "Wed, 01 Apr 2026 12:59:29 GMT", + "comments": {} + }, + { + "version": "4.6.9", + "tag": "@snowplow/browser-plugin-link-click-tracking_v4.6.9", + "date": "Mon, 16 Mar 2026 15:43:06 GMT", + "comments": {} + }, + { + "version": "4.6.8", + "tag": "@snowplow/browser-plugin-link-click-tracking_v4.6.8", + "date": "Tue, 28 Oct 2025 09:46:42 GMT", + "comments": {} + }, + { + "version": "4.6.7", + "tag": "@snowplow/browser-plugin-link-click-tracking_v4.6.7", + "date": "Tue, 07 Oct 2025 14:53:36 GMT", + "comments": {} + }, + { + "version": "4.6.6", + "tag": "@snowplow/browser-plugin-link-click-tracking_v4.6.6", + "date": "Tue, 26 Aug 2025 08:42:27 GMT", + "comments": {} + }, + { + "version": "4.6.5", + "tag": "@snowplow/browser-plugin-link-click-tracking_v4.6.5", + "date": "Wed, 25 Jun 2025 21:16:46 GMT", + "comments": {} + }, + { + "version": "4.6.4", + "tag": "@snowplow/browser-plugin-link-click-tracking_v4.6.4", + "date": "Wed, 25 Jun 2025 12:08:50 GMT", + "comments": {} + }, + { + "version": "4.6.3", + "tag": "@snowplow/browser-plugin-link-click-tracking_v4.6.3", + "date": "Thu, 29 May 2025 19:52:07 GMT", + "comments": {} + }, + { + "version": "4.6.2", + "tag": "@snowplow/browser-plugin-link-click-tracking_v4.6.2", + "date": "Tue, 20 May 2025 07:39:05 GMT", + "comments": {} + }, + { + "version": "4.6.1", + "tag": "@snowplow/browser-plugin-link-click-tracking_v4.6.1", + "date": "Tue, 06 May 2025 13:10:51 GMT", + "comments": {} + }, + { + "version": "4.6.0", + "tag": "@snowplow/browser-plugin-link-click-tracking_v4.6.0", + "date": "Thu, 01 May 2025 09:58:59 GMT", + "comments": {} + }, + { + "version": "4.5.0", + "tag": "@snowplow/browser-plugin-link-click-tracking_v4.5.0", + "date": "Fri, 04 Apr 2025 09:21:23 GMT", + "comments": {} + }, + { + "version": "4.4.0", + "tag": "@snowplow/browser-plugin-link-click-tracking_v4.4.0", + "date": "Thu, 20 Mar 2025 12:14:34 GMT", + "comments": {} + }, + { + "version": "4.3.1", + "tag": "@snowplow/browser-plugin-link-click-tracking_v4.3.1", + "date": "Tue, 21 Jan 2025 11:09:42 GMT", + "comments": {} + }, + { + "version": "4.3.0", + "tag": "@snowplow/browser-plugin-link-click-tracking_v4.3.0", + "date": "Mon, 20 Jan 2025 11:45:13 GMT", + "comments": {} + }, + { + "version": "4.2.0", + "tag": "@snowplow/browser-plugin-link-click-tracking_v4.2.0", + "date": "Mon, 13 Jan 2025 08:30:05 GMT", + "comments": {} + }, + { + "version": "4.1.0", + "tag": "@snowplow/browser-plugin-link-click-tracking_v4.1.0", + "date": "Thu, 28 Nov 2024 10:57:30 GMT", + "comments": {} + }, + { + "version": "4.0.4", + "tag": "@snowplow/browser-plugin-link-click-tracking_v4.0.4", + "date": "Thu, 21 Nov 2024 09:06:36 GMT", + "comments": { + "none": [ + { + "comment": "Fix multiple link click events tracked for a single tracker in case multiple trackers are initialized on the page (#1384)" + } + ] + } + }, + { + "version": "4.0.3", + "tag": "@snowplow/browser-plugin-link-click-tracking_v4.0.3", + "date": "Wed, 20 Nov 2024 09:30:31 GMT", + "comments": {} + }, { "version": "4.0.2", "tag": "@snowplow/browser-plugin-link-click-tracking_v4.0.2", diff --git a/plugins/browser-plugin-link-click-tracking/CHANGELOG.md b/plugins/browser-plugin-link-click-tracking/CHANGELOG.md index 3bd4e60e1..1329d8caa 100644 --- a/plugins/browser-plugin-link-click-tracking/CHANGELOG.md +++ b/plugins/browser-plugin-link-click-tracking/CHANGELOG.md @@ -1,6 +1,145 @@ # Change Log - @snowplow/browser-plugin-link-click-tracking -This log was last generated on Mon, 11 Nov 2024 15:46:34 GMT and should not be manually modified. +This log was last generated on Wed, 19 Aug 2026 14:26:05 GMT and should not be manually modified. + +## 4.10.1 +Wed, 19 Aug 2026 14:26:05 GMT + +_Version update only_ + +## 4.10.0 +Mon, 27 Jul 2026 13:52:14 GMT + +_Version update only_ + +## 4.9.0 +Tue, 21 Jul 2026 14:53:08 GMT + +_Version update only_ + +## 4.8.4 +Thu, 02 Jul 2026 10:07:52 GMT + +_Version update only_ + +## 4.8.3 +Tue, 30 Jun 2026 14:22:03 GMT + +### Updates + +- Update uuid to v11 and remove closure-compiler from the build pipeline + +## 4.8.2 +Wed, 17 Jun 2026 12:30:12 GMT + +_Version update only_ + +## 4.8.1 +Wed, 13 May 2026 09:26:05 GMT + +_Version update only_ + +## 4.8.0 +Tue, 28 Apr 2026 07:56:22 GMT + +_Version update only_ + +## 4.7.0 +Wed, 01 Apr 2026 12:59:29 GMT + +_Version update only_ + +## 4.6.9 +Mon, 16 Mar 2026 15:43:06 GMT + +_Version update only_ + +## 4.6.8 +Tue, 28 Oct 2025 09:46:42 GMT + +_Version update only_ + +## 4.6.7 +Tue, 07 Oct 2025 14:53:36 GMT + +_Version update only_ + +## 4.6.6 +Tue, 26 Aug 2025 08:42:27 GMT + +_Version update only_ + +## 4.6.5 +Wed, 25 Jun 2025 21:16:46 GMT + +_Version update only_ + +## 4.6.4 +Wed, 25 Jun 2025 12:08:50 GMT + +_Version update only_ + +## 4.6.3 +Thu, 29 May 2025 19:52:07 GMT + +_Version update only_ + +## 4.6.2 +Tue, 20 May 2025 07:39:05 GMT + +_Version update only_ + +## 4.6.1 +Tue, 06 May 2025 13:10:51 GMT + +_Version update only_ + +## 4.6.0 +Thu, 01 May 2025 09:58:59 GMT + +_Version update only_ + +## 4.5.0 +Fri, 04 Apr 2025 09:21:23 GMT + +_Version update only_ + +## 4.4.0 +Thu, 20 Mar 2025 12:14:34 GMT + +_Version update only_ + +## 4.3.1 +Tue, 21 Jan 2025 11:09:42 GMT + +_Version update only_ + +## 4.3.0 +Mon, 20 Jan 2025 11:45:13 GMT + +_Version update only_ + +## 4.2.0 +Mon, 13 Jan 2025 08:30:05 GMT + +_Version update only_ + +## 4.1.0 +Thu, 28 Nov 2024 10:57:30 GMT + +_Version update only_ + +## 4.0.4 +Thu, 21 Nov 2024 09:06:36 GMT + +### Updates + +- Fix multiple link click events tracked for a single tracker in case multiple trackers are initialized on the page (#1384) + +## 4.0.3 +Wed, 20 Nov 2024 09:30:31 GMT + +_Version update only_ ## 4.0.2 Mon, 11 Nov 2024 15:46:34 GMT diff --git a/plugins/browser-plugin-link-click-tracking/package.json b/plugins/browser-plugin-link-click-tracking/package.json index dd8928619..d4a26a559 100644 --- a/plugins/browser-plugin-link-click-tracking/package.json +++ b/plugins/browser-plugin-link-click-tracking/package.json @@ -1,6 +1,6 @@ { "name": "@snowplow/browser-plugin-link-click-tracking", - "version": "4.0.2", + "version": "4.10.1", "description": "Link Click tracking for Snowplow", "homepage": "http://bit.ly/sp-js", "bugs": "https://github.com/snowplow/snowplow-javascript-tracker/issues", @@ -27,18 +27,17 @@ "tslib": "^2.3.1" }, "devDependencies": { - "@ampproject/rollup-plugin-closure-compiler": "~0.27.0", "@rollup/plugin-commonjs": "~21.0.2", "@rollup/plugin-node-resolve": "~13.1.3", - "@types/jest": "~27.4.1", + "@types/jest": "~28.1.1", "@types/jsdom": "~16.2.14", "@types/lodash": "~4.14.180", "@typescript-eslint/eslint-plugin": "~5.15.0", "@typescript-eslint/parser": "~5.15.0", "eslint": "~8.11.0", - "jest": "~27.5.1", - "jest-environment-jsdom": "~27.5.1", - "jest-environment-jsdom-global": "~3.0.0", + "jest": "~28.1.3", + "jest-environment-jsdom": "~28.1.3", + "jest-environment-jsdom-global": "~4.0.0", "jest-standard-reporter": "~2.0.0", "lodash": "~4.17.21", "rollup": "~2.70.1", @@ -46,10 +45,10 @@ "rollup-plugin-license": "~2.6.1", "rollup-plugin-terser": "~7.0.2", "rollup-plugin-ts": "~2.0.5", - "ts-jest": "~27.1.3", + "ts-jest": "~28.0.8", "typescript": "~4.6.2" }, "peerDependencies": { - "@snowplow/browser-tracker": "~4.0.2" + "@snowplow/browser-tracker": "~4.10.1" } } diff --git a/plugins/browser-plugin-link-click-tracking/rollup.config.js b/plugins/browser-plugin-link-click-tracking/rollup.config.js index afc39459d..132b51fdb 100644 --- a/plugins/browser-plugin-link-click-tracking/rollup.config.js +++ b/plugins/browser-plugin-link-click-tracking/rollup.config.js @@ -32,7 +32,6 @@ import { nodeResolve } from '@rollup/plugin-node-resolve'; import commonjs from '@rollup/plugin-commonjs'; import ts from 'rollup-plugin-ts'; // Prefered over @rollup/plugin-typescript as it bundles .d.ts files import { banner } from '../../banner'; -import compiler from '@ampproject/rollup-plugin-closure-compiler'; import { terser } from 'rollup-plugin-terser'; import cleanup from 'rollup-plugin-cleanup'; import pkg from './package.json'; @@ -51,7 +50,7 @@ export default [ }, { input: './src/index.ts', - plugins: [...umdPlugins, compiler(), terser(), cleanup({ comments: 'none' }), banner()], + plugins: [...umdPlugins, terser(), cleanup({ comments: 'none' }), banner()], treeshake: { moduleSideEffects: ['sha1'] }, output: [{ file: pkg.main.replace('.js', '.min.js'), format: 'umd', sourcemap: true, name: umdName }], }, diff --git a/plugins/browser-plugin-link-click-tracking/src/index.ts b/plugins/browser-plugin-link-click-tracking/src/index.ts index 428752749..b7c060993 100644 --- a/plugins/browser-plugin-link-click-tracking/src/index.ts +++ b/plugins/browser-plugin-link-click-tracking/src/index.ts @@ -274,10 +274,13 @@ function clickHandler(tracker: string, evt: MouseEvent | undefined): void { // Using evt.type (added in IE4), we avoid defining separate handlers for mouseup and mousedown. if (event.type === 'click') { - trackLinkClick({ - element: target, - context: resolveDynamicContext(context, target), - }); + trackLinkClick( + { + element: target, + context: resolveDynamicContext(context, target), + }, + [tracker] + ); } else if (event.type === 'mousedown') { if (button === 1 || button === 2) { _configuration[tracker].lastButton = button; @@ -287,10 +290,13 @@ function clickHandler(tracker: string, evt: MouseEvent | undefined): void { } } else if (event.type === 'mouseup') { if (button === _configuration[tracker].lastButton && target === _configuration[tracker].lastTarget) { - trackLinkClick({ - element: target, - context: resolveDynamicContext(context, target), - }); + trackLinkClick( + { + element: target, + context: resolveDynamicContext(context, target), + }, + [tracker] + ); } delete _configuration[tracker].lastButton; delete _configuration[tracker].lastTarget; diff --git a/plugins/browser-plugin-link-click-tracking/test/events.test.ts b/plugins/browser-plugin-link-click-tracking/test/events.test.ts index 9e3b30e07..0436c5183 100644 --- a/plugins/browser-plugin-link-click-tracking/test/events.test.ts +++ b/plugins/browser-plugin-link-click-tracking/test/events.test.ts @@ -342,6 +342,26 @@ describe('LinkClickTrackingPlugin', () => { expect(await eventStore.getAllPayloads()).toHaveLength(1); }); + + it('tracks a single link click with each tracker', async () => { + addTracker('sp2', 'sp2', 'js-3.0.0', '', new SharedState(), { + stateStorageStrategy: 'cookie', + encodeBase64: false, + plugins: [LinkClickTrackingPlugin()], + eventStore, + customFetch: async () => new Response(null, { status: 500 }), + }); + + enableLinkClickTracking(); + + const target = document.createElement('a'); + target.href = 'https://www.example.com/exists'; + document.body.appendChild(target); + + target.click(); + + expect(await eventStore.getAllPayloads()).toHaveLength(2); + }); }); describe('disableLinkClickTracking', () => { @@ -351,7 +371,7 @@ describe('LinkClickTrackingPlugin', () => { const addCalls = $addEventListener.mock.calls; - expect(addCalls).toHaveLength(1); + expect(addCalls).toHaveLength(2); expect($removeEventListener.mock.calls).toContainEqual(addCalls[0]); }); }); diff --git a/plugins/browser-plugin-media-tracking/CHANGELOG.json b/plugins/browser-plugin-media-tracking/CHANGELOG.json index f96174027..8f8c53877 100644 --- a/plugins/browser-plugin-media-tracking/CHANGELOG.json +++ b/plugins/browser-plugin-media-tracking/CHANGELOG.json @@ -1,6 +1,186 @@ { "name": "@snowplow/browser-plugin-media-tracking", "entries": [ + { + "version": "4.10.1", + "tag": "@snowplow/browser-plugin-media-tracking_v4.10.1", + "date": "Wed, 19 Aug 2026 14:26:05 GMT", + "comments": {} + }, + { + "version": "4.10.0", + "tag": "@snowplow/browser-plugin-media-tracking_v4.10.0", + "date": "Mon, 27 Jul 2026 13:52:14 GMT", + "comments": {} + }, + { + "version": "4.9.0", + "tag": "@snowplow/browser-plugin-media-tracking_v4.9.0", + "date": "Tue, 21 Jul 2026 14:53:08 GMT", + "comments": {} + }, + { + "version": "4.8.4", + "tag": "@snowplow/browser-plugin-media-tracking_v4.8.4", + "date": "Thu, 02 Jul 2026 10:07:52 GMT", + "comments": {} + }, + { + "version": "4.8.3", + "tag": "@snowplow/browser-plugin-media-tracking_v4.8.3", + "date": "Tue, 30 Jun 2026 14:22:03 GMT", + "comments": { + "none": [ + { + "comment": "Update uuid to v11 and remove closure-compiler from the build pipeline" + } + ] + } + }, + { + "version": "4.8.2", + "tag": "@snowplow/browser-plugin-media-tracking_v4.8.2", + "date": "Wed, 17 Jun 2026 12:30:12 GMT", + "comments": {} + }, + { + "version": "4.8.1", + "tag": "@snowplow/browser-plugin-media-tracking_v4.8.1", + "date": "Wed, 13 May 2026 09:26:05 GMT", + "comments": {} + }, + { + "version": "4.8.0", + "tag": "@snowplow/browser-plugin-media-tracking_v4.8.0", + "date": "Tue, 28 Apr 2026 07:56:22 GMT", + "comments": {} + }, + { + "version": "4.7.0", + "tag": "@snowplow/browser-plugin-media-tracking_v4.7.0", + "date": "Wed, 01 Apr 2026 12:59:29 GMT", + "comments": {} + }, + { + "version": "4.6.9", + "tag": "@snowplow/browser-plugin-media-tracking_v4.6.9", + "date": "Mon, 16 Mar 2026 15:43:06 GMT", + "comments": {} + }, + { + "version": "4.6.8", + "tag": "@snowplow/browser-plugin-media-tracking_v4.6.8", + "date": "Tue, 28 Oct 2025 09:46:42 GMT", + "comments": {} + }, + { + "version": "4.6.7", + "tag": "@snowplow/browser-plugin-media-tracking_v4.6.7", + "date": "Tue, 07 Oct 2025 14:53:36 GMT", + "comments": {} + }, + { + "version": "4.6.6", + "tag": "@snowplow/browser-plugin-media-tracking_v4.6.6", + "date": "Tue, 26 Aug 2025 08:42:27 GMT", + "comments": { + "none": [ + { + "comment": "Allow using a CSS selector to find media elements" + } + ] + } + }, + { + "version": "4.6.5", + "tag": "@snowplow/browser-plugin-media-tracking_v4.6.5", + "date": "Wed, 25 Jun 2025 21:16:46 GMT", + "comments": {} + }, + { + "version": "4.6.4", + "tag": "@snowplow/browser-plugin-media-tracking_v4.6.4", + "date": "Wed, 25 Jun 2025 12:08:50 GMT", + "comments": {} + }, + { + "version": "4.6.3", + "tag": "@snowplow/browser-plugin-media-tracking_v4.6.3", + "date": "Thu, 29 May 2025 19:52:07 GMT", + "comments": {} + }, + { + "version": "4.6.2", + "tag": "@snowplow/browser-plugin-media-tracking_v4.6.2", + "date": "Tue, 20 May 2025 07:39:05 GMT", + "comments": {} + }, + { + "version": "4.6.1", + "tag": "@snowplow/browser-plugin-media-tracking_v4.6.1", + "date": "Tue, 06 May 2025 13:10:51 GMT", + "comments": { + "none": [ + { + "comment": "Add a default 0 value for start and end in the media_element entity time ranges" + } + ] + } + }, + { + "version": "4.6.0", + "tag": "@snowplow/browser-plugin-media-tracking_v4.6.0", + "date": "Thu, 01 May 2025 09:58:59 GMT", + "comments": {} + }, + { + "version": "4.5.0", + "tag": "@snowplow/browser-plugin-media-tracking_v4.5.0", + "date": "Fri, 04 Apr 2025 09:21:23 GMT", + "comments": {} + }, + { + "version": "4.4.0", + "tag": "@snowplow/browser-plugin-media-tracking_v4.4.0", + "date": "Thu, 20 Mar 2025 12:14:34 GMT", + "comments": {} + }, + { + "version": "4.3.1", + "tag": "@snowplow/browser-plugin-media-tracking_v4.3.1", + "date": "Tue, 21 Jan 2025 11:09:42 GMT", + "comments": {} + }, + { + "version": "4.3.0", + "tag": "@snowplow/browser-plugin-media-tracking_v4.3.0", + "date": "Mon, 20 Jan 2025 11:45:13 GMT", + "comments": {} + }, + { + "version": "4.2.0", + "tag": "@snowplow/browser-plugin-media-tracking_v4.2.0", + "date": "Mon, 13 Jan 2025 08:30:05 GMT", + "comments": {} + }, + { + "version": "4.1.0", + "tag": "@snowplow/browser-plugin-media-tracking_v4.1.0", + "date": "Thu, 28 Nov 2024 10:57:30 GMT", + "comments": {} + }, + { + "version": "4.0.4", + "tag": "@snowplow/browser-plugin-media-tracking_v4.0.4", + "date": "Thu, 21 Nov 2024 09:06:36 GMT", + "comments": {} + }, + { + "version": "4.0.3", + "tag": "@snowplow/browser-plugin-media-tracking_v4.0.3", + "date": "Wed, 20 Nov 2024 09:30:31 GMT", + "comments": {} + }, { "version": "4.0.2", "tag": "@snowplow/browser-plugin-media-tracking_v4.0.2", diff --git a/plugins/browser-plugin-media-tracking/CHANGELOG.md b/plugins/browser-plugin-media-tracking/CHANGELOG.md index cd259db71..c60f1bd31 100644 --- a/plugins/browser-plugin-media-tracking/CHANGELOG.md +++ b/plugins/browser-plugin-media-tracking/CHANGELOG.md @@ -1,6 +1,147 @@ # Change Log - @snowplow/browser-plugin-media-tracking -This log was last generated on Mon, 11 Nov 2024 15:46:34 GMT and should not be manually modified. +This log was last generated on Wed, 19 Aug 2026 14:26:05 GMT and should not be manually modified. + +## 4.10.1 +Wed, 19 Aug 2026 14:26:05 GMT + +_Version update only_ + +## 4.10.0 +Mon, 27 Jul 2026 13:52:14 GMT + +_Version update only_ + +## 4.9.0 +Tue, 21 Jul 2026 14:53:08 GMT + +_Version update only_ + +## 4.8.4 +Thu, 02 Jul 2026 10:07:52 GMT + +_Version update only_ + +## 4.8.3 +Tue, 30 Jun 2026 14:22:03 GMT + +### Updates + +- Update uuid to v11 and remove closure-compiler from the build pipeline + +## 4.8.2 +Wed, 17 Jun 2026 12:30:12 GMT + +_Version update only_ + +## 4.8.1 +Wed, 13 May 2026 09:26:05 GMT + +_Version update only_ + +## 4.8.0 +Tue, 28 Apr 2026 07:56:22 GMT + +_Version update only_ + +## 4.7.0 +Wed, 01 Apr 2026 12:59:29 GMT + +_Version update only_ + +## 4.6.9 +Mon, 16 Mar 2026 15:43:06 GMT + +_Version update only_ + +## 4.6.8 +Tue, 28 Oct 2025 09:46:42 GMT + +_Version update only_ + +## 4.6.7 +Tue, 07 Oct 2025 14:53:36 GMT + +_Version update only_ + +## 4.6.6 +Tue, 26 Aug 2025 08:42:27 GMT + +### Updates + +- Allow using a CSS selector to find media elements + +## 4.6.5 +Wed, 25 Jun 2025 21:16:46 GMT + +_Version update only_ + +## 4.6.4 +Wed, 25 Jun 2025 12:08:50 GMT + +_Version update only_ + +## 4.6.3 +Thu, 29 May 2025 19:52:07 GMT + +_Version update only_ + +## 4.6.2 +Tue, 20 May 2025 07:39:05 GMT + +_Version update only_ + +## 4.6.1 +Tue, 06 May 2025 13:10:51 GMT + +### Updates + +- Add a default 0 value for start and end in the media_element entity time ranges + +## 4.6.0 +Thu, 01 May 2025 09:58:59 GMT + +_Version update only_ + +## 4.5.0 +Fri, 04 Apr 2025 09:21:23 GMT + +_Version update only_ + +## 4.4.0 +Thu, 20 Mar 2025 12:14:34 GMT + +_Version update only_ + +## 4.3.1 +Tue, 21 Jan 2025 11:09:42 GMT + +_Version update only_ + +## 4.3.0 +Mon, 20 Jan 2025 11:45:13 GMT + +_Version update only_ + +## 4.2.0 +Mon, 13 Jan 2025 08:30:05 GMT + +_Version update only_ + +## 4.1.0 +Thu, 28 Nov 2024 10:57:30 GMT + +_Version update only_ + +## 4.0.4 +Thu, 21 Nov 2024 09:06:36 GMT + +_Version update only_ + +## 4.0.3 +Wed, 20 Nov 2024 09:30:31 GMT + +_Version update only_ ## 4.0.2 Mon, 11 Nov 2024 15:46:34 GMT diff --git a/plugins/browser-plugin-media-tracking/README.md b/plugins/browser-plugin-media-tracking/README.md index 3aeaa63b2..7b32eba4f 100644 --- a/plugins/browser-plugin-media-tracking/README.md +++ b/plugins/browser-plugin-media-tracking/README.md @@ -9,13 +9,13 @@ Adds HTML5 Video and Audio tracking events to your Snowplow tracking. ## Maintainer quick start -Part of the Snowplow JavaScript Tracker monorepo. +Part of the Snowplow JavaScript Tracker monorepo. Build with [Node.js](https://nodejs.org/en/) (18 - 20) and [Rush](https://rushjs.io/). ### Setup repository ```bash -npm install -g @microsoft/rush +npm install -g @microsoft/rush git clone https://github.com/snowplow/snowplow-javascript-tracker.git rush update ``` @@ -34,24 +34,23 @@ Initialize your tracker with the MediaTrackingPlugin: ```js import { newTracker } from '@snowplow/browser-tracker'; -import { MediaTrackingPlugin } from 'snowplow-browser-media-tracker'; +import { MediaTrackingPlugin, startHtml5MediaTracking, endHtml5MediaTracking } from '@snowplow/browser-plugin-media-tracking'; newTracker('sp2', '{{collector}}', { plugins: [ MediaTrackingPlugin() ] }); // Also stores reference at module level ``` -Then, use the `enableMediaTracking` function described below to produce events from your HTML5 Video/Audio element(s). +Then, use the `startHtml5MediaTracking` function described below to produce events from your HTML5 Video/Audio element(s). ```js -enableMediaTracking({ id, options?: { label?, captureEvents?, boundaries?, volumeChangeTrackingInterval? } }) +startHtml5MediaTracking({ video, id }) ``` -| Parameter | Type | Default | Description | Required | -| -------------------------------------- | ---------- | ------------------- | --------------------------------------------------------- | -------- | -| `id` | `string` | - | The HTML id attribute of the media element | Yes | -| `options.label` | `string` | - | An identifiable custom label sent with the event | No | -| `options.captureEvents` | `string[]` | `['DefaultEvents']` | The name(s) of the events to capture | No | -| `options.boundaries` | `number[]` | `[10, 25, 50, 75]` | The progress percentages to fire an event at (if enabled) | No | -| `options.volumeChangeTrackingInterval` | `number` | `250` | The rate at which volume events can be sent | No | +| Parameter | Type | Description | Required | +| ----------| ------------------------ | -------------------------------------------------------------------------------------- | -------- | +| `id` | `string` | A UUID identifier to use as the media session ID | Yes | +| `video` | `string` / `HTMLElement` | The HTML id attribute, CSS selector, or actual media element to track media events for | Yes | + +See the [full documentation](https://docs.snowplow.io/docs/sources/trackers/web-trackers/tracking-events/media/html5/#starthtml5mediatracking) for optional parameters. ## Example Usage @@ -62,20 +61,23 @@ enableMediaTracking({ id, options?: { label?, captureEvents?, boundaries?, volum ``` ```js -import { enableMediaTracking } from '@snowplow/browser-plugin-media-tracking' - -enableMediaTracking({ - id: 'my-video', - options: { - label: "My Custom Video Label", - captureEvents: ["DefaultEvents"], - boundaries: [10, 25, 50, 75], - volumeChangeTrackingInterval: 250, - } -}) +import { startHtml5MediaTracking, endHtml5MediaTracking } from '@snowplow/browser-plugin-media-tracking'; + +const sessionId = crypto.randomUUID(); + +startHtml5MediaTracking({ + id: sessionId, + video: 'my-video', + label: "My Custom Video Label", + boundaries: [10, 25, 50, 75], +}); + +/* ... */ + +endHtml5MediaTracking(sessionId); ``` - For a full list of trackable events, head over to the [docs page](https://docs.snowplowanalytics.com/docs/collecting-data/collecting-from-own-applications/javascript-trackers/browser-tracker/browser-tracker-v3-reference/media-tracking/) + For a full list of parameters and trackable events, head over to the [docs page](https://docs.snowplow.io/docs/sources/trackers/web-trackers/tracking-events/media/html5/#events). ## Copyright and license diff --git a/plugins/browser-plugin-media-tracking/package.json b/plugins/browser-plugin-media-tracking/package.json index 08b8f4a94..a2e35a772 100644 --- a/plugins/browser-plugin-media-tracking/package.json +++ b/plugins/browser-plugin-media-tracking/package.json @@ -1,6 +1,6 @@ { "name": "@snowplow/browser-plugin-media-tracking", - "version": "4.0.2", + "version": "4.10.1", "description": "Audio/Video tracking for Snowplow", "homepage": "http://bit.ly/sp-js", "bugs": "https://github.com/snowplow/snowplow-javascript-tracker/issues", @@ -25,31 +25,29 @@ "@snowplow/browser-tracker-core": "workspace:*", "@snowplow/tracker-core": "workspace:*", "tslib": "^2.3.1", - "uuid": "^10.0.0" + "uuid": "^11.1.1" }, "devDependencies": { - "@ampproject/rollup-plugin-closure-compiler": "~0.27.0", "@rollup/plugin-commonjs": "~21.0.2", "@rollup/plugin-node-resolve": "~13.1.3", - "@types/jest": "~27.4.1", + "@types/jest": "~28.1.1", "@types/jsdom": "~16.2.14", - "@types/uuid": "^10.0.0", "@typescript-eslint/eslint-plugin": "~5.15.0", "@typescript-eslint/parser": "~5.15.0", "eslint": "~8.11.0", - "jest": "~27.5.1", - "jest-environment-jsdom": "~27.5.1", - "jest-environment-jsdom-global": "~3.0.0", + "jest": "~28.1.3", + "jest-environment-jsdom": "~28.1.3", + "jest-environment-jsdom-global": "~4.0.0", "jest-standard-reporter": "~2.0.0", "rollup": "~2.70.1", "rollup-plugin-cleanup": "~3.2.1", "rollup-plugin-license": "~2.6.1", "rollup-plugin-terser": "~7.0.2", "rollup-plugin-ts": "~2.0.5", - "ts-jest": "~27.1.3", + "ts-jest": "~28.0.8", "typescript": "~4.6.2" }, "peerDependencies": { - "@snowplow/browser-tracker": "~4.0.2" + "@snowplow/browser-tracker": "~4.10.1" } } diff --git a/plugins/browser-plugin-media-tracking/rollup.config.js b/plugins/browser-plugin-media-tracking/rollup.config.js index 576bbf899..1003a0d5b 100644 --- a/plugins/browser-plugin-media-tracking/rollup.config.js +++ b/plugins/browser-plugin-media-tracking/rollup.config.js @@ -32,7 +32,6 @@ import { nodeResolve } from '@rollup/plugin-node-resolve'; import commonjs from '@rollup/plugin-commonjs'; import ts from 'rollup-plugin-ts'; import { banner } from '../../banner'; -import compiler from '@ampproject/rollup-plugin-closure-compiler'; import { terser } from 'rollup-plugin-terser'; import cleanup from 'rollup-plugin-cleanup'; import pkg from './package.json'; @@ -51,7 +50,7 @@ export default [ }, { input: './src/index.ts', - plugins: [...umdPlugins, compiler(), terser(), cleanup({ comments: 'none' }), banner(true)], + plugins: [...umdPlugins, terser(), cleanup({ comments: 'none' }), banner(true)], treeshake: { moduleSideEffects: ['sha1'] }, output: [{ file: pkg.main.replace('.js', '.min.js'), format: 'umd', sourcemap: true, name: umdName }], }, diff --git a/plugins/browser-plugin-media-tracking/src/entities.ts b/plugins/browser-plugin-media-tracking/src/entities.ts index dcb88ad36..76e1dac9b 100644 --- a/plugins/browser-plugin-media-tracking/src/entities.ts +++ b/plugins/browser-plugin-media-tracking/src/entities.ts @@ -18,7 +18,7 @@ export function buildHTMLMediaElementEntity(el: HTMLAudioElement | HTMLVideoElem autoPlay: el.autoplay, buffered: timeRangesToObjectArray(el.buffered), controls: el.controls, - currentSrc: el.currentSrc, + currentSrc: el.currentSrc || el.src, defaultMuted: el.defaultMuted || false, defaultPlaybackRate: el.defaultPlaybackRate, error: el.error ? { code: el.error?.code, message: el.error?.message } : null, diff --git a/plugins/browser-plugin-media-tracking/src/findElem.ts b/plugins/browser-plugin-media-tracking/src/findElem.ts index 6fffe2e00..542bf0525 100644 --- a/plugins/browser-plugin-media-tracking/src/findElem.ts +++ b/plugins/browser-plugin-media-tracking/src/findElem.ts @@ -43,9 +43,15 @@ export function waitForElement(config: StringConfig, callback: (element: Element } export function findMediaElement(id: string): SearchResult { - let el: HTMLElement | null = document.getElementById(id); + let el: HTMLElement | null = null; - if (!el) return { err: SEARCH_ERROR.NOT_FOUND }; + try { + el = document.getElementById(id) ?? document.querySelector(id); + } catch (e) {} + + if (!el) { + return { err: SEARCH_ERROR.NOT_FOUND }; + } if (isHtmlAudioElement(el)) return { el }; if (isHtmlVideoElement(el)) { diff --git a/plugins/browser-plugin-media-tracking/src/helperFunctions.ts b/plugins/browser-plugin-media-tracking/src/helperFunctions.ts index d5d025a2e..4fa7ebfb3 100644 --- a/plugins/browser-plugin-media-tracking/src/helperFunctions.ts +++ b/plugins/browser-plugin-media-tracking/src/helperFunctions.ts @@ -53,7 +53,11 @@ type TimeRange = { start: number; end: number }; export function timeRangesToObjectArray(t: TimeRanges): TimeRange[] { const out: TimeRange[] = []; for (let i = 0; i < t.length; i++) { - out.push({ start: t.start(i), end: t.end(i) }); + const start = t.start(i); + const end = t.end(i); + if (isFinite(start) && isFinite(end)) { + out.push({ start: start || 0, end: end || 0 }); + } } return out; } diff --git a/plugins/browser-plugin-media-tracking/tests/media.test.ts b/plugins/browser-plugin-media-tracking/tests/media.test.ts index 8d1f2fe9e..3266fc8e3 100644 --- a/plugins/browser-plugin-media-tracking/tests/media.test.ts +++ b/plugins/browser-plugin-media-tracking/tests/media.test.ts @@ -41,6 +41,12 @@ describe('element searcher', () => { const output = findMediaElement('parentElem'); expect(output).toStrictEqual({ err: 'More than one media element in the provided node' }); }); + + it('falls back to css selector if can not find by id', () => { + document.body.innerHTML = '
'; + const output = findMediaElement('#parentElem > video'); + expect(output.el?.tagName).toBe('VIDEO'); + }); }); describe('dataUrlHandler', () => { diff --git a/plugins/browser-plugin-media/CHANGELOG.json b/plugins/browser-plugin-media/CHANGELOG.json index adc17c8e8..eecdf428f 100644 --- a/plugins/browser-plugin-media/CHANGELOG.json +++ b/plugins/browser-plugin-media/CHANGELOG.json @@ -1,6 +1,186 @@ { "name": "@snowplow/browser-plugin-media", "entries": [ + { + "version": "4.10.1", + "tag": "@snowplow/browser-plugin-media_v4.10.1", + "date": "Wed, 19 Aug 2026 14:26:05 GMT", + "comments": {} + }, + { + "version": "4.10.0", + "tag": "@snowplow/browser-plugin-media_v4.10.0", + "date": "Mon, 27 Jul 2026 13:52:14 GMT", + "comments": {} + }, + { + "version": "4.9.0", + "tag": "@snowplow/browser-plugin-media_v4.9.0", + "date": "Tue, 21 Jul 2026 14:53:08 GMT", + "comments": {} + }, + { + "version": "4.8.4", + "tag": "@snowplow/browser-plugin-media_v4.8.4", + "date": "Thu, 02 Jul 2026 10:07:52 GMT", + "comments": {} + }, + { + "version": "4.8.3", + "tag": "@snowplow/browser-plugin-media_v4.8.3", + "date": "Tue, 30 Jun 2026 14:22:03 GMT", + "comments": { + "none": [ + { + "comment": "Update uuid to v11 and remove closure-compiler from the build pipeline" + } + ] + } + }, + { + "version": "4.8.2", + "tag": "@snowplow/browser-plugin-media_v4.8.2", + "date": "Wed, 17 Jun 2026 12:30:12 GMT", + "comments": { + "none": [ + { + "comment": "Prevent empty values in media entity" + } + ] + } + }, + { + "version": "4.8.1", + "tag": "@snowplow/browser-plugin-media_v4.8.1", + "date": "Wed, 13 May 2026 09:26:05 GMT", + "comments": {} + }, + { + "version": "4.8.0", + "tag": "@snowplow/browser-plugin-media_v4.8.0", + "date": "Tue, 28 Apr 2026 07:56:22 GMT", + "comments": {} + }, + { + "version": "4.7.0", + "tag": "@snowplow/browser-plugin-media_v4.7.0", + "date": "Wed, 01 Apr 2026 12:59:29 GMT", + "comments": {} + }, + { + "version": "4.6.9", + "tag": "@snowplow/browser-plugin-media_v4.6.9", + "date": "Mon, 16 Mar 2026 15:43:06 GMT", + "comments": { + "none": [ + { + "comment": "Fix crashes due to large content time jumps in updateDurationStats in media tracking" + } + ] + } + }, + { + "version": "4.6.8", + "tag": "@snowplow/browser-plugin-media_v4.6.8", + "date": "Tue, 28 Oct 2025 09:46:42 GMT", + "comments": {} + }, + { + "version": "4.6.7", + "tag": "@snowplow/browser-plugin-media_v4.6.7", + "date": "Tue, 07 Oct 2025 14:53:36 GMT", + "comments": {} + }, + { + "version": "4.6.6", + "tag": "@snowplow/browser-plugin-media_v4.6.6", + "date": "Tue, 26 Aug 2025 08:42:27 GMT", + "comments": {} + }, + { + "version": "4.6.5", + "tag": "@snowplow/browser-plugin-media_v4.6.5", + "date": "Wed, 25 Jun 2025 21:16:46 GMT", + "comments": {} + }, + { + "version": "4.6.4", + "tag": "@snowplow/browser-plugin-media_v4.6.4", + "date": "Wed, 25 Jun 2025 12:08:50 GMT", + "comments": {} + }, + { + "version": "4.6.3", + "tag": "@snowplow/browser-plugin-media_v4.6.3", + "date": "Thu, 29 May 2025 19:52:07 GMT", + "comments": {} + }, + { + "version": "4.6.2", + "tag": "@snowplow/browser-plugin-media_v4.6.2", + "date": "Tue, 20 May 2025 07:39:05 GMT", + "comments": {} + }, + { + "version": "4.6.1", + "tag": "@snowplow/browser-plugin-media_v4.6.1", + "date": "Tue, 06 May 2025 13:10:51 GMT", + "comments": {} + }, + { + "version": "4.6.0", + "tag": "@snowplow/browser-plugin-media_v4.6.0", + "date": "Thu, 01 May 2025 09:58:59 GMT", + "comments": {} + }, + { + "version": "4.5.0", + "tag": "@snowplow/browser-plugin-media_v4.5.0", + "date": "Fri, 04 Apr 2025 09:21:23 GMT", + "comments": {} + }, + { + "version": "4.4.0", + "tag": "@snowplow/browser-plugin-media_v4.4.0", + "date": "Thu, 20 Mar 2025 12:14:34 GMT", + "comments": {} + }, + { + "version": "4.3.1", + "tag": "@snowplow/browser-plugin-media_v4.3.1", + "date": "Tue, 21 Jan 2025 11:09:42 GMT", + "comments": {} + }, + { + "version": "4.3.0", + "tag": "@snowplow/browser-plugin-media_v4.3.0", + "date": "Mon, 20 Jan 2025 11:45:13 GMT", + "comments": {} + }, + { + "version": "4.2.0", + "tag": "@snowplow/browser-plugin-media_v4.2.0", + "date": "Mon, 13 Jan 2025 08:30:05 GMT", + "comments": {} + }, + { + "version": "4.1.0", + "tag": "@snowplow/browser-plugin-media_v4.1.0", + "date": "Thu, 28 Nov 2024 10:57:30 GMT", + "comments": {} + }, + { + "version": "4.0.4", + "tag": "@snowplow/browser-plugin-media_v4.0.4", + "date": "Thu, 21 Nov 2024 09:06:36 GMT", + "comments": {} + }, + { + "version": "4.0.3", + "tag": "@snowplow/browser-plugin-media_v4.0.3", + "date": "Wed, 20 Nov 2024 09:30:31 GMT", + "comments": {} + }, { "version": "4.0.2", "tag": "@snowplow/browser-plugin-media_v4.0.2", diff --git a/plugins/browser-plugin-media/CHANGELOG.md b/plugins/browser-plugin-media/CHANGELOG.md index cc91dd3f5..6cc6987a4 100644 --- a/plugins/browser-plugin-media/CHANGELOG.md +++ b/plugins/browser-plugin-media/CHANGELOG.md @@ -1,6 +1,147 @@ # Change Log - @snowplow/browser-plugin-media -This log was last generated on Mon, 11 Nov 2024 15:46:34 GMT and should not be manually modified. +This log was last generated on Wed, 19 Aug 2026 14:26:05 GMT and should not be manually modified. + +## 4.10.1 +Wed, 19 Aug 2026 14:26:05 GMT + +_Version update only_ + +## 4.10.0 +Mon, 27 Jul 2026 13:52:14 GMT + +_Version update only_ + +## 4.9.0 +Tue, 21 Jul 2026 14:53:08 GMT + +_Version update only_ + +## 4.8.4 +Thu, 02 Jul 2026 10:07:52 GMT + +_Version update only_ + +## 4.8.3 +Tue, 30 Jun 2026 14:22:03 GMT + +### Updates + +- Update uuid to v11 and remove closure-compiler from the build pipeline + +## 4.8.2 +Wed, 17 Jun 2026 12:30:12 GMT + +### Updates + +- Prevent empty values in media entity + +## 4.8.1 +Wed, 13 May 2026 09:26:05 GMT + +_Version update only_ + +## 4.8.0 +Tue, 28 Apr 2026 07:56:22 GMT + +_Version update only_ + +## 4.7.0 +Wed, 01 Apr 2026 12:59:29 GMT + +_Version update only_ + +## 4.6.9 +Mon, 16 Mar 2026 15:43:06 GMT + +### Updates + +- Fix crashes due to large content time jumps in updateDurationStats in media tracking + +## 4.6.8 +Tue, 28 Oct 2025 09:46:42 GMT + +_Version update only_ + +## 4.6.7 +Tue, 07 Oct 2025 14:53:36 GMT + +_Version update only_ + +## 4.6.6 +Tue, 26 Aug 2025 08:42:27 GMT + +_Version update only_ + +## 4.6.5 +Wed, 25 Jun 2025 21:16:46 GMT + +_Version update only_ + +## 4.6.4 +Wed, 25 Jun 2025 12:08:50 GMT + +_Version update only_ + +## 4.6.3 +Thu, 29 May 2025 19:52:07 GMT + +_Version update only_ + +## 4.6.2 +Tue, 20 May 2025 07:39:05 GMT + +_Version update only_ + +## 4.6.1 +Tue, 06 May 2025 13:10:51 GMT + +_Version update only_ + +## 4.6.0 +Thu, 01 May 2025 09:58:59 GMT + +_Version update only_ + +## 4.5.0 +Fri, 04 Apr 2025 09:21:23 GMT + +_Version update only_ + +## 4.4.0 +Thu, 20 Mar 2025 12:14:34 GMT + +_Version update only_ + +## 4.3.1 +Tue, 21 Jan 2025 11:09:42 GMT + +_Version update only_ + +## 4.3.0 +Mon, 20 Jan 2025 11:45:13 GMT + +_Version update only_ + +## 4.2.0 +Mon, 13 Jan 2025 08:30:05 GMT + +_Version update only_ + +## 4.1.0 +Thu, 28 Nov 2024 10:57:30 GMT + +_Version update only_ + +## 4.0.4 +Thu, 21 Nov 2024 09:06:36 GMT + +_Version update only_ + +## 4.0.3 +Wed, 20 Nov 2024 09:30:31 GMT + +_Version update only_ ## 4.0.2 Mon, 11 Nov 2024 15:46:34 GMT diff --git a/plugins/browser-plugin-media/package.json b/plugins/browser-plugin-media/package.json index 5e445326a..8eb776dc1 100644 --- a/plugins/browser-plugin-media/package.json +++ b/plugins/browser-plugin-media/package.json @@ -1,6 +1,6 @@ { "name": "@snowplow/browser-plugin-media", - "version": "4.0.2", + "version": "4.10.1", "description": "Snowplow media tracking", "homepage": "https://github.com/snowplow/snowplow-javascript-tracker", "bugs": "https://github.com/snowplow/snowplow-javascript-tracker/issues", @@ -25,31 +25,29 @@ "@snowplow/browser-tracker-core": "workspace:*", "@snowplow/tracker-core": "workspace:*", "tslib": "^2.3.1", - "uuid": "^10.0.0" + "uuid": "^11.1.1" }, "devDependencies": { - "@ampproject/rollup-plugin-closure-compiler": "~0.27.0", "@rollup/plugin-commonjs": "~21.0.2", "@rollup/plugin-node-resolve": "~13.1.3", - "@types/jest": "~27.4.1", + "@types/jest": "~28.1.1", "@types/jsdom": "~16.2.14", - "@types/uuid": "^10.0.0", "@typescript-eslint/eslint-plugin": "~5.15.0", "@typescript-eslint/parser": "~5.15.0", "eslint": "~8.11.0", - "jest": "~27.5.1", - "jest-environment-jsdom": "~27.5.1", - "jest-environment-jsdom-global": "~3.0.0", + "jest": "~28.1.3", + "jest-environment-jsdom": "~28.1.3", + "jest-environment-jsdom-global": "~4.0.0", "jest-standard-reporter": "~2.0.0", "rollup": "~2.70.1", "rollup-plugin-cleanup": "~3.2.1", "rollup-plugin-license": "~2.6.1", "rollup-plugin-terser": "~7.0.2", "rollup-plugin-ts": "~2.0.5", - "ts-jest": "~27.1.3", + "ts-jest": "~28.0.8", "typescript": "~4.6.2" }, "peerDependencies": { - "@snowplow/browser-tracker": "~4.0.2" + "@snowplow/browser-tracker": "~4.10.1" } } diff --git a/plugins/browser-plugin-media/rollup.config.js b/plugins/browser-plugin-media/rollup.config.js index 67bc856d7..dd69f312d 100644 --- a/plugins/browser-plugin-media/rollup.config.js +++ b/plugins/browser-plugin-media/rollup.config.js @@ -32,7 +32,6 @@ import { nodeResolve } from '@rollup/plugin-node-resolve'; import commonjs from '@rollup/plugin-commonjs'; import ts from 'rollup-plugin-ts'; // Prefered over @rollup/plugin-typescript as it bundles .d.ts files import { banner } from '../../banner'; -import compiler from '@ampproject/rollup-plugin-closure-compiler'; import { terser } from 'rollup-plugin-terser'; import cleanup from 'rollup-plugin-cleanup'; import pkg from './package.json'; @@ -51,7 +50,7 @@ export default [ }, { input: './src/index.ts', - plugins: [...umdPlugins, compiler(), terser(), cleanup({ comments: 'none' }), banner()], + plugins: [...umdPlugins, terser(), cleanup({ comments: 'none' }), banner()], treeshake: { moduleSideEffects: ['sha1'] }, output: [{ file: pkg.main.replace('.js', '.min.js'), format: 'umd', sourcemap: true, name: umdName }], }, diff --git a/plugins/browser-plugin-media/src/core.ts b/plugins/browser-plugin-media/src/core.ts index 54f9da276..d1b67ea7e 100644 --- a/plugins/browser-plugin-media/src/core.ts +++ b/plugins/browser-plugin-media/src/core.ts @@ -16,9 +16,14 @@ export function buildMediaPlayerEvent(event: MediaEvent): SelfDescribingJson { } export function buildMediaPlayerEntity(mediaPlayer: MediaPlayer): SelfDescribingJson { + const player = { ...mediaPlayer }; + if (player.label === '') delete player.label; + if (player.playerType === '') delete player.playerType; + if (player.quality === '') delete player.quality; + return { schema: MEDIA_PLAYER_SCHEMA, - data: removeEmptyProperties(mediaPlayer), + data: removeEmptyProperties(player), }; } diff --git a/plugins/browser-plugin-media/src/sessionStats.ts b/plugins/browser-plugin-media/src/sessionStats.ts index edbf32b20..172b13efd 100644 --- a/plugins/browser-plugin-media/src/sessionStats.ts +++ b/plugins/browser-plugin-media/src/sessionStats.ts @@ -17,6 +17,12 @@ type Log = { linearAd: boolean; }; +/** Maximum content-time gap (seconds) for which intermediate seconds are filled into playedSeconds. + * Beyond this threshold only the current second is recorded, preventing unbounded iteration + * for live streams or large VOD seeks where currentTime can be a huge offset. + */ +const MAX_CONTENT_TIME_STEP = 3600; + const adStartTypes = [MediaEventType.AdStart, MediaEventType.AdResume]; const adProgressTypes = [ MediaEventType.AdClick, @@ -134,9 +140,13 @@ export class MediaSessionTrackingStats { } if (!log.paused) { - for (let i = Math.floor(this.lastLog.contentTime); i < log.contentTime; i++) { - this.playedSeconds.add(i); + const gap = log.contentTime - this.lastLog.contentTime; + if (gap <= MAX_CONTENT_TIME_STEP) { + for (let i = Math.floor(this.lastLog.contentTime); i < log.contentTime; i++) { + this.playedSeconds.add(i); + } } + // gap > MAX_CONTENT_TIME_STEP: skip loop, only current second is recorded below } } } diff --git a/plugins/browser-plugin-media/test/api.test.ts b/plugins/browser-plugin-media/test/api.test.ts index 2229243b9..47ab34441 100644 --- a/plugins/browser-plugin-media/test/api.test.ts +++ b/plugins/browser-plugin-media/test/api.test.ts @@ -316,6 +316,38 @@ describe('Media Tracking API', () => { ]); }); + it('strips empty string values from optional media player fields', () => { + startMediaTracking({ + id, + session: false, + player: { label: '', playerType: '', quality: '' }, + }); + + trackMediaPlay({ id }); + + const playerContext = eventQueue[0].context[0].data; + expect(playerContext).not.toHaveProperty('label'); + expect(playerContext).not.toHaveProperty('playerType'); + expect(playerContext).not.toHaveProperty('quality'); + }); + + it('preserves non-empty string values for optional media player fields', () => { + startMediaTracking({ + id, + session: false, + player: { label: 'My Video', playerType: 'html5', quality: '1080p' }, + }); + + trackMediaPlay({ id }); + + const playerContext = eventQueue[0].context[0].data; + expect(playerContext).toMatchObject({ + label: 'My Video', + playerType: 'html5', + quality: '1080p', + }); + }); + it('tracks error event', () => { startMediaTracking({ id, session: false }); diff --git a/plugins/browser-plugin-media/test/sessionStats.test.ts b/plugins/browser-plugin-media/test/sessionStats.test.ts index 1987b46ef..4af9d2ae8 100644 --- a/plugins/browser-plugin-media/test/sessionStats.test.ts +++ b/plugins/browser-plugin-media/test/sessionStats.test.ts @@ -188,6 +188,46 @@ describe('MediaSessionTrackingStats', () => { expect(entity.timePlayedMuted).toBe(30); }); + it('does not crash when content time jump exceeds MAX_CONTENT_TIME_STEP', () => { + let session = new MediaSessionTrackingStats(); + + session.update(MediaEventType.Play, { ...mediaPlayerDefaults, currentTime: 0 }); + + jest.advanceTimersByTime(1000); + session.update(MediaEventType.SeekEnd, { ...mediaPlayerDefaults, currentTime: 7200 }); + + expect(() => session.toSessionContextEntity()).not.toThrow(); + let entity = session.toSessionContextEntity(); + // Loop is skipped; only the start second (0) and the landed second (7200) are recorded + expect(entity.contentWatched).toBeLessThanOrEqual(3); + }); + + it('does not crash when livestream currentTime is a large Unix-epoch offset', () => { + let session = new MediaSessionTrackingStats(); + + const epochBase = 1_700_000_000; + + session.update(MediaEventType.Play, { ...mediaPlayerDefaults, livestream: true, currentTime: epochBase }); + + jest.advanceTimersByTime(1000); + // Jump larger than MAX_CONTENT_TIME_STEP — simulates stream discontinuity + session.update(MediaEventType.Ping, { ...mediaPlayerDefaults, livestream: true, currentTime: epochBase + 7200 }); + + expect(() => session.toSessionContextEntity()).not.toThrow(); + }); + + it('still fills intermediate seconds for gaps within MAX_CONTENT_TIME_STEP', () => { + let session = new MediaSessionTrackingStats(); + + session.update(MediaEventType.Play, { ...mediaPlayerDefaults, currentTime: 0 }); + + jest.advanceTimersByTime(30 * 1000); + session.update(MediaEventType.End, { ...mediaPlayerDefaults, currentTime: 30 }); + + let entity = session.toSessionContextEntity(); + expect(entity.contentWatched).toBe(31); + }); + it('calculates buffering time', () => { let session = new MediaSessionTrackingStats(); diff --git a/plugins/browser-plugin-optimizely-x/CHANGELOG.json b/plugins/browser-plugin-optimizely-x/CHANGELOG.json index 4529754cc..d1172726e 100644 --- a/plugins/browser-plugin-optimizely-x/CHANGELOG.json +++ b/plugins/browser-plugin-optimizely-x/CHANGELOG.json @@ -1,6 +1,180 @@ { "name": "@snowplow/browser-plugin-optimizely-x", "entries": [ + { + "version": "4.10.1", + "tag": "@snowplow/browser-plugin-optimizely-x_v4.10.1", + "date": "Wed, 19 Aug 2026 14:26:05 GMT", + "comments": {} + }, + { + "version": "4.10.0", + "tag": "@snowplow/browser-plugin-optimizely-x_v4.10.0", + "date": "Mon, 27 Jul 2026 13:52:14 GMT", + "comments": {} + }, + { + "version": "4.9.0", + "tag": "@snowplow/browser-plugin-optimizely-x_v4.9.0", + "date": "Tue, 21 Jul 2026 14:53:08 GMT", + "comments": {} + }, + { + "version": "4.8.4", + "tag": "@snowplow/browser-plugin-optimizely-x_v4.8.4", + "date": "Thu, 02 Jul 2026 10:07:52 GMT", + "comments": {} + }, + { + "version": "4.8.3", + "tag": "@snowplow/browser-plugin-optimizely-x_v4.8.3", + "date": "Tue, 30 Jun 2026 14:22:03 GMT", + "comments": { + "none": [ + { + "comment": "Update uuid to v11 and remove closure-compiler from the build pipeline" + } + ] + } + }, + { + "version": "4.8.2", + "tag": "@snowplow/browser-plugin-optimizely-x_v4.8.2", + "date": "Wed, 17 Jun 2026 12:30:12 GMT", + "comments": {} + }, + { + "version": "4.8.1", + "tag": "@snowplow/browser-plugin-optimizely-x_v4.8.1", + "date": "Wed, 13 May 2026 09:26:05 GMT", + "comments": {} + }, + { + "version": "4.8.0", + "tag": "@snowplow/browser-plugin-optimizely-x_v4.8.0", + "date": "Tue, 28 Apr 2026 07:56:22 GMT", + "comments": { + "none": [ + { + "comment": "Fix optimizely personalization campaign attribution" + } + ] + } + }, + { + "version": "4.7.0", + "tag": "@snowplow/browser-plugin-optimizely-x_v4.7.0", + "date": "Wed, 01 Apr 2026 12:59:29 GMT", + "comments": {} + }, + { + "version": "4.6.9", + "tag": "@snowplow/browser-plugin-optimizely-x_v4.6.9", + "date": "Mon, 16 Mar 2026 15:43:06 GMT", + "comments": {} + }, + { + "version": "4.6.8", + "tag": "@snowplow/browser-plugin-optimizely-x_v4.6.8", + "date": "Tue, 28 Oct 2025 09:46:42 GMT", + "comments": {} + }, + { + "version": "4.6.7", + "tag": "@snowplow/browser-plugin-optimizely-x_v4.6.7", + "date": "Tue, 07 Oct 2025 14:53:36 GMT", + "comments": {} + }, + { + "version": "4.6.6", + "tag": "@snowplow/browser-plugin-optimizely-x_v4.6.6", + "date": "Tue, 26 Aug 2025 08:42:27 GMT", + "comments": {} + }, + { + "version": "4.6.5", + "tag": "@snowplow/browser-plugin-optimizely-x_v4.6.5", + "date": "Wed, 25 Jun 2025 21:16:46 GMT", + "comments": {} + }, + { + "version": "4.6.4", + "tag": "@snowplow/browser-plugin-optimizely-x_v4.6.4", + "date": "Wed, 25 Jun 2025 12:08:50 GMT", + "comments": {} + }, + { + "version": "4.6.3", + "tag": "@snowplow/browser-plugin-optimizely-x_v4.6.3", + "date": "Thu, 29 May 2025 19:52:07 GMT", + "comments": {} + }, + { + "version": "4.6.2", + "tag": "@snowplow/browser-plugin-optimizely-x_v4.6.2", + "date": "Tue, 20 May 2025 07:39:05 GMT", + "comments": {} + }, + { + "version": "4.6.1", + "tag": "@snowplow/browser-plugin-optimizely-x_v4.6.1", + "date": "Tue, 06 May 2025 13:10:51 GMT", + "comments": {} + }, + { + "version": "4.6.0", + "tag": "@snowplow/browser-plugin-optimizely-x_v4.6.0", + "date": "Thu, 01 May 2025 09:58:59 GMT", + "comments": {} + }, + { + "version": "4.5.0", + "tag": "@snowplow/browser-plugin-optimizely-x_v4.5.0", + "date": "Fri, 04 Apr 2025 09:21:23 GMT", + "comments": {} + }, + { + "version": "4.4.0", + "tag": "@snowplow/browser-plugin-optimizely-x_v4.4.0", + "date": "Thu, 20 Mar 2025 12:14:34 GMT", + "comments": {} + }, + { + "version": "4.3.1", + "tag": "@snowplow/browser-plugin-optimizely-x_v4.3.1", + "date": "Tue, 21 Jan 2025 11:09:42 GMT", + "comments": {} + }, + { + "version": "4.3.0", + "tag": "@snowplow/browser-plugin-optimizely-x_v4.3.0", + "date": "Mon, 20 Jan 2025 11:45:13 GMT", + "comments": {} + }, + { + "version": "4.2.0", + "tag": "@snowplow/browser-plugin-optimizely-x_v4.2.0", + "date": "Mon, 13 Jan 2025 08:30:05 GMT", + "comments": {} + }, + { + "version": "4.1.0", + "tag": "@snowplow/browser-plugin-optimizely-x_v4.1.0", + "date": "Thu, 28 Nov 2024 10:57:30 GMT", + "comments": {} + }, + { + "version": "4.0.4", + "tag": "@snowplow/browser-plugin-optimizely-x_v4.0.4", + "date": "Thu, 21 Nov 2024 09:06:36 GMT", + "comments": {} + }, + { + "version": "4.0.3", + "tag": "@snowplow/browser-plugin-optimizely-x_v4.0.3", + "date": "Wed, 20 Nov 2024 09:30:31 GMT", + "comments": {} + }, { "version": "4.0.2", "tag": "@snowplow/browser-plugin-optimizely-x_v4.0.2", diff --git a/plugins/browser-plugin-optimizely-x/CHANGELOG.md b/plugins/browser-plugin-optimizely-x/CHANGELOG.md index c11aca289..17693a511 100644 --- a/plugins/browser-plugin-optimizely-x/CHANGELOG.md +++ b/plugins/browser-plugin-optimizely-x/CHANGELOG.md @@ -1,6 +1,145 @@ # Change Log - @snowplow/browser-plugin-optimizely-x -This log was last generated on Mon, 11 Nov 2024 15:46:34 GMT and should not be manually modified. +This log was last generated on Wed, 19 Aug 2026 14:26:05 GMT and should not be manually modified. + +## 4.10.1 +Wed, 19 Aug 2026 14:26:05 GMT + +_Version update only_ + +## 4.10.0 +Mon, 27 Jul 2026 13:52:14 GMT + +_Version update only_ + +## 4.9.0 +Tue, 21 Jul 2026 14:53:08 GMT + +_Version update only_ + +## 4.8.4 +Thu, 02 Jul 2026 10:07:52 GMT + +_Version update only_ + +## 4.8.3 +Tue, 30 Jun 2026 14:22:03 GMT + +### Updates + +- Update uuid to v11 and remove closure-compiler from the build pipeline + +## 4.8.2 +Wed, 17 Jun 2026 12:30:12 GMT + +_Version update only_ + +## 4.8.1 +Wed, 13 May 2026 09:26:05 GMT + +_Version update only_ + +## 4.8.0 +Tue, 28 Apr 2026 07:56:22 GMT + +### Updates + +- Fix optimizely personalization campaign attribution + +## 4.7.0 +Wed, 01 Apr 2026 12:59:29 GMT + +_Version update only_ + +## 4.6.9 +Mon, 16 Mar 2026 15:43:06 GMT + +_Version update only_ + +## 4.6.8 +Tue, 28 Oct 2025 09:46:42 GMT + +_Version update only_ + +## 4.6.7 +Tue, 07 Oct 2025 14:53:36 GMT + +_Version update only_ + +## 4.6.6 +Tue, 26 Aug 2025 08:42:27 GMT + +_Version update only_ + +## 4.6.5 +Wed, 25 Jun 2025 21:16:46 GMT + +_Version update only_ + +## 4.6.4 +Wed, 25 Jun 2025 12:08:50 GMT + +_Version update only_ + +## 4.6.3 +Thu, 29 May 2025 19:52:07 GMT + +_Version update only_ + +## 4.6.2 +Tue, 20 May 2025 07:39:05 GMT + +_Version update only_ + +## 4.6.1 +Tue, 06 May 2025 13:10:51 GMT + +_Version update only_ + +## 4.6.0 +Thu, 01 May 2025 09:58:59 GMT + +_Version update only_ + +## 4.5.0 +Fri, 04 Apr 2025 09:21:23 GMT + +_Version update only_ + +## 4.4.0 +Thu, 20 Mar 2025 12:14:34 GMT + +_Version update only_ + +## 4.3.1 +Tue, 21 Jan 2025 11:09:42 GMT + +_Version update only_ + +## 4.3.0 +Mon, 20 Jan 2025 11:45:13 GMT + +_Version update only_ + +## 4.2.0 +Mon, 13 Jan 2025 08:30:05 GMT + +_Version update only_ + +## 4.1.0 +Thu, 28 Nov 2024 10:57:30 GMT + +_Version update only_ + +## 4.0.4 +Thu, 21 Nov 2024 09:06:36 GMT + +_Version update only_ + +## 4.0.3 +Wed, 20 Nov 2024 09:30:31 GMT + +_Version update only_ ## 4.0.2 Mon, 11 Nov 2024 15:46:34 GMT diff --git a/plugins/browser-plugin-optimizely-x/package.json b/plugins/browser-plugin-optimizely-x/package.json index f43beaf35..6b6ec6d0c 100644 --- a/plugins/browser-plugin-optimizely-x/package.json +++ b/plugins/browser-plugin-optimizely-x/package.json @@ -1,6 +1,6 @@ { "name": "@snowplow/browser-plugin-optimizely-x", - "version": "4.0.2", + "version": "4.10.1", "description": "Attaches OptimizelyX data to Snowplow events", "homepage": "http://bit.ly/sp-js", "bugs": "https://github.com/snowplow/snowplow-javascript-tracker/issues", @@ -27,27 +27,26 @@ "tslib": "^2.3.1" }, "devDependencies": { - "@ampproject/rollup-plugin-closure-compiler": "~0.27.0", "@rollup/plugin-commonjs": "~21.0.2", "@rollup/plugin-node-resolve": "~13.1.3", - "@types/jest": "~27.4.1", + "@types/jest": "~28.1.1", "@types/jsdom": "~16.2.14", "@typescript-eslint/eslint-plugin": "~5.15.0", "@typescript-eslint/parser": "~5.15.0", "eslint": "~8.11.0", - "jest": "~27.5.1", - "jest-environment-jsdom": "~27.5.1", - "jest-environment-jsdom-global": "~3.0.0", + "jest": "~28.1.3", + "jest-environment-jsdom": "~28.1.3", + "jest-environment-jsdom-global": "~4.0.0", "jest-standard-reporter": "~2.0.0", "rollup": "~2.70.1", "rollup-plugin-cleanup": "~3.2.1", "rollup-plugin-license": "~2.6.1", "rollup-plugin-terser": "~7.0.2", "rollup-plugin-ts": "~2.0.5", - "ts-jest": "~27.1.3", + "ts-jest": "~28.0.8", "typescript": "~4.6.2" }, "peerDependencies": { - "@snowplow/browser-tracker": "~4.0.2" + "@snowplow/browser-tracker": "~4.10.1" } } diff --git a/plugins/browser-plugin-optimizely-x/rollup.config.js b/plugins/browser-plugin-optimizely-x/rollup.config.js index f2f698d48..5fc40253c 100644 --- a/plugins/browser-plugin-optimizely-x/rollup.config.js +++ b/plugins/browser-plugin-optimizely-x/rollup.config.js @@ -32,7 +32,6 @@ import { nodeResolve } from '@rollup/plugin-node-resolve'; import commonjs from '@rollup/plugin-commonjs'; import ts from 'rollup-plugin-ts'; // Prefered over @rollup/plugin-typescript as it bundles .d.ts files import { banner } from '../../banner'; -import compiler from '@ampproject/rollup-plugin-closure-compiler'; import { terser } from 'rollup-plugin-terser'; import cleanup from 'rollup-plugin-cleanup'; import pkg from './package.json'; @@ -51,7 +50,7 @@ export default [ }, { input: './src/index.ts', - plugins: [...umdPlugins, compiler(), terser(), cleanup({ comments: 'none' }), banner()], + plugins: [...umdPlugins, terser(), cleanup({ comments: 'none' }), banner()], treeshake: { moduleSideEffects: ['sha1'] }, output: [{ file: pkg.main.replace('.js', '.min.js'), format: 'umd', sourcemap: true, name: umdName }], }, diff --git a/plugins/browser-plugin-optimizely-x/src/contexts.ts b/plugins/browser-plugin-optimizely-x/src/contexts.ts index 6b37a46e2..cf195a974 100644 --- a/plugins/browser-plugin-optimizely-x/src/contexts.ts +++ b/plugins/browser-plugin-optimizely-x/src/contexts.ts @@ -32,6 +32,7 @@ * Schema for an Optimizely X summary context */ export interface OptimizelyxSummary { + campaignId?: number | null; experimentId?: number | null; variationName?: string | null; variation?: number | null; diff --git a/plugins/browser-plugin-optimizely-x/src/index.ts b/plugins/browser-plugin-optimizely-x/src/index.ts index b2233bf8d..a57c1257f 100644 --- a/plugins/browser-plugin-optimizely-x/src/index.ts +++ b/plugins/browser-plugin-optimizely-x/src/index.ts @@ -48,7 +48,7 @@ declare global { } /** - * Adds Opimizely X context to events + * Adds Optimizely X context to events */ export function OptimizelyXPlugin(): BrowserPlugin { /** @@ -66,24 +66,32 @@ export function OptimizelyXPlugin(): BrowserPlugin { } /** - * Get data for OptimizelyX contexts - active experiments on current page + * Get data for OptimizelyX contexts - active campaigns on current page. + * Uses getCampaignStates() instead of getActiveExperimentIds() to correctly + * capture campaignId (layerId) for both Web Experimentation and Personalization + * campaigns. For Personalization campaigns, experimentId will reflect the + * experience ID (the sub-unit within the campaign). * - * @returns Array content of lite optimizely lite context + * @returns Array content of optimizely summary context */ function getOptimizelyXSummary(): OptimizelyxSummary[] { const state = getOptimizelyXData('state'); - if (state == null) return []; - var experiment_ids = state.getActiveExperimentIds() || []; - var variationMap = state.getVariationMap(); - var visitor = getOptimizelyXData('visitor'); + if (state == null || typeof state.getCampaignStates !== 'function') return []; + + const campaignStates = state.getCampaignStates({ isActive: true }) || {}; + const visitor = getOptimizelyXData('visitor'); + const visitorId = (visitor && visitor.visitorId && visitor.visitorId.toString()) || null; + + return Object.keys(campaignStates).map((campaignId: string) => { + const campaign = campaignStates[campaignId]; + const experimentId = campaign.experiment && campaign.experiment.id; + const variationId = campaign.variation && campaign.variation.id; + const variationName = + (campaign.variation && campaign.variation.name && campaign.variation.name.toString()) || null; - return experiment_ids.map((activeExperiment: string) => { - var variation = variationMap[activeExperiment]; - var variationName = (variation && variation.name && variation.name.toString()) || null; - var variationId = variation && variation.id; - var visitorId = (visitor && visitor.visitorId && visitor.visitorId.toString()) || null; return { - experimentId: parseAndValidateInt(activeExperiment) || null, + campaignId: parseAndValidateInt(campaignId) || null, + experimentId: parseAndValidateInt(experimentId) || null, variationName: variationName, variation: parseAndValidateInt(variationId) || null, visitorId: visitorId, @@ -100,7 +108,7 @@ export function OptimizelyXPlugin(): BrowserPlugin { function getOptimizelyXSummaryContexts() { return getOptimizelyXSummary().map(function (experiment) { return { - schema: 'iglu:com.optimizely.optimizelyx/summary/jsonschema/1-0-0', + schema: 'iglu:com.optimizely.optimizelyx/summary/jsonschema/1-1-0', data: experiment, }; }); diff --git a/plugins/browser-plugin-performance-navigation-timing/CHANGELOG.json b/plugins/browser-plugin-performance-navigation-timing/CHANGELOG.json index 625f61c2d..3b0279d13 100644 --- a/plugins/browser-plugin-performance-navigation-timing/CHANGELOG.json +++ b/plugins/browser-plugin-performance-navigation-timing/CHANGELOG.json @@ -1,6 +1,174 @@ { "name": "@snowplow/browser-plugin-performance-navigation-timing", "entries": [ + { + "version": "4.10.1", + "tag": "@snowplow/browser-plugin-performance-navigation-timing_v4.10.1", + "date": "Wed, 19 Aug 2026 14:26:05 GMT", + "comments": {} + }, + { + "version": "4.10.0", + "tag": "@snowplow/browser-plugin-performance-navigation-timing_v4.10.0", + "date": "Mon, 27 Jul 2026 13:52:14 GMT", + "comments": {} + }, + { + "version": "4.9.0", + "tag": "@snowplow/browser-plugin-performance-navigation-timing_v4.9.0", + "date": "Tue, 21 Jul 2026 14:53:08 GMT", + "comments": {} + }, + { + "version": "4.8.4", + "tag": "@snowplow/browser-plugin-performance-navigation-timing_v4.8.4", + "date": "Thu, 02 Jul 2026 10:07:52 GMT", + "comments": {} + }, + { + "version": "4.8.3", + "tag": "@snowplow/browser-plugin-performance-navigation-timing_v4.8.3", + "date": "Tue, 30 Jun 2026 14:22:03 GMT", + "comments": { + "none": [ + { + "comment": "Update uuid to v11 and remove closure-compiler from the build pipeline" + } + ] + } + }, + { + "version": "4.8.2", + "tag": "@snowplow/browser-plugin-performance-navigation-timing_v4.8.2", + "date": "Wed, 17 Jun 2026 12:30:12 GMT", + "comments": {} + }, + { + "version": "4.8.1", + "tag": "@snowplow/browser-plugin-performance-navigation-timing_v4.8.1", + "date": "Wed, 13 May 2026 09:26:05 GMT", + "comments": {} + }, + { + "version": "4.8.0", + "tag": "@snowplow/browser-plugin-performance-navigation-timing_v4.8.0", + "date": "Tue, 28 Apr 2026 07:56:22 GMT", + "comments": {} + }, + { + "version": "4.7.0", + "tag": "@snowplow/browser-plugin-performance-navigation-timing_v4.7.0", + "date": "Wed, 01 Apr 2026 12:59:29 GMT", + "comments": {} + }, + { + "version": "4.6.9", + "tag": "@snowplow/browser-plugin-performance-navigation-timing_v4.6.9", + "date": "Mon, 16 Mar 2026 15:43:06 GMT", + "comments": {} + }, + { + "version": "4.6.8", + "tag": "@snowplow/browser-plugin-performance-navigation-timing_v4.6.8", + "date": "Tue, 28 Oct 2025 09:46:42 GMT", + "comments": {} + }, + { + "version": "4.6.7", + "tag": "@snowplow/browser-plugin-performance-navigation-timing_v4.6.7", + "date": "Tue, 07 Oct 2025 14:53:36 GMT", + "comments": {} + }, + { + "version": "4.6.6", + "tag": "@snowplow/browser-plugin-performance-navigation-timing_v4.6.6", + "date": "Tue, 26 Aug 2025 08:42:27 GMT", + "comments": {} + }, + { + "version": "4.6.5", + "tag": "@snowplow/browser-plugin-performance-navigation-timing_v4.6.5", + "date": "Wed, 25 Jun 2025 21:16:46 GMT", + "comments": {} + }, + { + "version": "4.6.4", + "tag": "@snowplow/browser-plugin-performance-navigation-timing_v4.6.4", + "date": "Wed, 25 Jun 2025 12:08:50 GMT", + "comments": {} + }, + { + "version": "4.6.3", + "tag": "@snowplow/browser-plugin-performance-navigation-timing_v4.6.3", + "date": "Thu, 29 May 2025 19:52:07 GMT", + "comments": {} + }, + { + "version": "4.6.2", + "tag": "@snowplow/browser-plugin-performance-navigation-timing_v4.6.2", + "date": "Tue, 20 May 2025 07:39:05 GMT", + "comments": {} + }, + { + "version": "4.6.1", + "tag": "@snowplow/browser-plugin-performance-navigation-timing_v4.6.1", + "date": "Tue, 06 May 2025 13:10:51 GMT", + "comments": {} + }, + { + "version": "4.6.0", + "tag": "@snowplow/browser-plugin-performance-navigation-timing_v4.6.0", + "date": "Thu, 01 May 2025 09:58:59 GMT", + "comments": {} + }, + { + "version": "4.5.0", + "tag": "@snowplow/browser-plugin-performance-navigation-timing_v4.5.0", + "date": "Fri, 04 Apr 2025 09:21:23 GMT", + "comments": {} + }, + { + "version": "4.4.0", + "tag": "@snowplow/browser-plugin-performance-navigation-timing_v4.4.0", + "date": "Thu, 20 Mar 2025 12:14:34 GMT", + "comments": {} + }, + { + "version": "4.3.1", + "tag": "@snowplow/browser-plugin-performance-navigation-timing_v4.3.1", + "date": "Tue, 21 Jan 2025 11:09:42 GMT", + "comments": {} + }, + { + "version": "4.3.0", + "tag": "@snowplow/browser-plugin-performance-navigation-timing_v4.3.0", + "date": "Mon, 20 Jan 2025 11:45:13 GMT", + "comments": {} + }, + { + "version": "4.2.0", + "tag": "@snowplow/browser-plugin-performance-navigation-timing_v4.2.0", + "date": "Mon, 13 Jan 2025 08:30:05 GMT", + "comments": {} + }, + { + "version": "4.1.0", + "tag": "@snowplow/browser-plugin-performance-navigation-timing_v4.1.0", + "date": "Thu, 28 Nov 2024 10:57:30 GMT", + "comments": {} + }, + { + "version": "4.0.4", + "tag": "@snowplow/browser-plugin-performance-navigation-timing_v4.0.4", + "date": "Thu, 21 Nov 2024 09:06:36 GMT", + "comments": {} + }, + { + "version": "4.0.3", + "tag": "@snowplow/browser-plugin-performance-navigation-timing_v4.0.3", + "date": "Wed, 20 Nov 2024 09:30:31 GMT", + "comments": {} + }, { "version": "4.0.2", "tag": "@snowplow/browser-plugin-performance-navigation-timing_v4.0.2", diff --git a/plugins/browser-plugin-performance-navigation-timing/CHANGELOG.md b/plugins/browser-plugin-performance-navigation-timing/CHANGELOG.md index bed062f2e..bb56f146b 100644 --- a/plugins/browser-plugin-performance-navigation-timing/CHANGELOG.md +++ b/plugins/browser-plugin-performance-navigation-timing/CHANGELOG.md @@ -1,6 +1,143 @@ # Change Log - @snowplow/browser-plugin-performance-navigation-timing -This log was last generated on Mon, 11 Nov 2024 15:46:34 GMT and should not be manually modified. +This log was last generated on Wed, 19 Aug 2026 14:26:05 GMT and should not be manually modified. + +## 4.10.1 +Wed, 19 Aug 2026 14:26:05 GMT + +_Version update only_ + +## 4.10.0 +Mon, 27 Jul 2026 13:52:14 GMT + +_Version update only_ + +## 4.9.0 +Tue, 21 Jul 2026 14:53:08 GMT + +_Version update only_ + +## 4.8.4 +Thu, 02 Jul 2026 10:07:52 GMT + +_Version update only_ + +## 4.8.3 +Tue, 30 Jun 2026 14:22:03 GMT + +### Updates + +- Update uuid to v11 and remove closure-compiler from the build pipeline + +## 4.8.2 +Wed, 17 Jun 2026 12:30:12 GMT + +_Version update only_ + +## 4.8.1 +Wed, 13 May 2026 09:26:05 GMT + +_Version update only_ + +## 4.8.0 +Tue, 28 Apr 2026 07:56:22 GMT + +_Version update only_ + +## 4.7.0 +Wed, 01 Apr 2026 12:59:29 GMT + +_Version update only_ + +## 4.6.9 +Mon, 16 Mar 2026 15:43:06 GMT + +_Version update only_ + +## 4.6.8 +Tue, 28 Oct 2025 09:46:42 GMT + +_Version update only_ + +## 4.6.7 +Tue, 07 Oct 2025 14:53:36 GMT + +_Version update only_ + +## 4.6.6 +Tue, 26 Aug 2025 08:42:27 GMT + +_Version update only_ + +## 4.6.5 +Wed, 25 Jun 2025 21:16:46 GMT + +_Version update only_ + +## 4.6.4 +Wed, 25 Jun 2025 12:08:50 GMT + +_Version update only_ + +## 4.6.3 +Thu, 29 May 2025 19:52:07 GMT + +_Version update only_ + +## 4.6.2 +Tue, 20 May 2025 07:39:05 GMT + +_Version update only_ + +## 4.6.1 +Tue, 06 May 2025 13:10:51 GMT + +_Version update only_ + +## 4.6.0 +Thu, 01 May 2025 09:58:59 GMT + +_Version update only_ + +## 4.5.0 +Fri, 04 Apr 2025 09:21:23 GMT + +_Version update only_ + +## 4.4.0 +Thu, 20 Mar 2025 12:14:34 GMT + +_Version update only_ + +## 4.3.1 +Tue, 21 Jan 2025 11:09:42 GMT + +_Version update only_ + +## 4.3.0 +Mon, 20 Jan 2025 11:45:13 GMT + +_Version update only_ + +## 4.2.0 +Mon, 13 Jan 2025 08:30:05 GMT + +_Version update only_ + +## 4.1.0 +Thu, 28 Nov 2024 10:57:30 GMT + +_Version update only_ + +## 4.0.4 +Thu, 21 Nov 2024 09:06:36 GMT + +_Version update only_ + +## 4.0.3 +Wed, 20 Nov 2024 09:30:31 GMT + +_Version update only_ ## 4.0.2 Mon, 11 Nov 2024 15:46:34 GMT diff --git a/plugins/browser-plugin-performance-navigation-timing/package.json b/plugins/browser-plugin-performance-navigation-timing/package.json index 6d9e11f88..f8d8acb0e 100644 --- a/plugins/browser-plugin-performance-navigation-timing/package.json +++ b/plugins/browser-plugin-performance-navigation-timing/package.json @@ -1,6 +1,6 @@ { "name": "@snowplow/browser-plugin-performance-navigation-timing", - "version": "4.0.2", + "version": "4.10.1", "description": "Attaches Performance Navigation Timing data to Snowplow events", "homepage": "https://docs.snowplow.io/", "bugs": "https://github.com/snowplow/snowplow-javascript-tracker/issues", @@ -27,27 +27,26 @@ "tslib": "^2.3.1" }, "devDependencies": { - "@ampproject/rollup-plugin-closure-compiler": "~0.27.0", "@rollup/plugin-commonjs": "~21.0.2", "@rollup/plugin-node-resolve": "~13.1.3", - "@types/jest": "~27.4.1", + "@types/jest": "~28.1.1", "@types/jsdom": "~16.2.14", "@typescript-eslint/eslint-plugin": "~5.15.0", "@typescript-eslint/parser": "~5.15.0", "eslint": "~8.11.0", - "jest": "~27.5.1", - "jest-environment-jsdom": "~27.5.1", - "jest-environment-jsdom-global": "~3.0.0", + "jest": "~28.1.3", + "jest-environment-jsdom": "~28.1.3", + "jest-environment-jsdom-global": "~4.0.0", "jest-standard-reporter": "~2.0.0", "rollup": "~2.70.1", "rollup-plugin-cleanup": "~3.2.1", "rollup-plugin-license": "~2.6.1", "rollup-plugin-terser": "~7.0.2", "rollup-plugin-ts": "~2.0.5", - "ts-jest": "~27.1.3", + "ts-jest": "~28.0.8", "typescript": "~4.6.2" }, "peerDependencies": { - "@snowplow/browser-tracker": "~4.0.2" + "@snowplow/browser-tracker": "~4.10.1" } } diff --git a/plugins/browser-plugin-performance-navigation-timing/rollup.config.js b/plugins/browser-plugin-performance-navigation-timing/rollup.config.js index b20e36f3b..661f032a4 100644 --- a/plugins/browser-plugin-performance-navigation-timing/rollup.config.js +++ b/plugins/browser-plugin-performance-navigation-timing/rollup.config.js @@ -2,7 +2,6 @@ import { nodeResolve } from '@rollup/plugin-node-resolve'; import commonjs from '@rollup/plugin-commonjs'; import ts from 'rollup-plugin-ts'; // Preferred over @rollup/plugin-typescript as it bundles .d.ts files import { banner } from '../../banner'; -import compiler from '@ampproject/rollup-plugin-closure-compiler'; import { terser } from 'rollup-plugin-terser'; import cleanup from 'rollup-plugin-cleanup'; import pkg from './package.json'; @@ -21,7 +20,7 @@ export default [ }, { input: './src/index.ts', - plugins: [...umdPlugins, compiler(), terser(), cleanup({ comments: 'none' }), banner()], + plugins: [...umdPlugins, terser(), cleanup({ comments: 'none' }), banner()], treeshake: { moduleSideEffects: ['sha1'] }, output: [{ file: pkg.main.replace('.js', '.min.js'), format: 'umd', sourcemap: true, name: umdName }], }, diff --git a/plugins/browser-plugin-performance-timing/CHANGELOG.json b/plugins/browser-plugin-performance-timing/CHANGELOG.json index 06eeb5213..a5eb1bf64 100644 --- a/plugins/browser-plugin-performance-timing/CHANGELOG.json +++ b/plugins/browser-plugin-performance-timing/CHANGELOG.json @@ -1,6 +1,174 @@ { "name": "@snowplow/browser-plugin-performance-timing", "entries": [ + { + "version": "4.10.1", + "tag": "@snowplow/browser-plugin-performance-timing_v4.10.1", + "date": "Wed, 19 Aug 2026 14:26:05 GMT", + "comments": {} + }, + { + "version": "4.10.0", + "tag": "@snowplow/browser-plugin-performance-timing_v4.10.0", + "date": "Mon, 27 Jul 2026 13:52:14 GMT", + "comments": {} + }, + { + "version": "4.9.0", + "tag": "@snowplow/browser-plugin-performance-timing_v4.9.0", + "date": "Tue, 21 Jul 2026 14:53:08 GMT", + "comments": {} + }, + { + "version": "4.8.4", + "tag": "@snowplow/browser-plugin-performance-timing_v4.8.4", + "date": "Thu, 02 Jul 2026 10:07:52 GMT", + "comments": {} + }, + { + "version": "4.8.3", + "tag": "@snowplow/browser-plugin-performance-timing_v4.8.3", + "date": "Tue, 30 Jun 2026 14:22:03 GMT", + "comments": { + "none": [ + { + "comment": "Update uuid to v11 and remove closure-compiler from the build pipeline" + } + ] + } + }, + { + "version": "4.8.2", + "tag": "@snowplow/browser-plugin-performance-timing_v4.8.2", + "date": "Wed, 17 Jun 2026 12:30:12 GMT", + "comments": {} + }, + { + "version": "4.8.1", + "tag": "@snowplow/browser-plugin-performance-timing_v4.8.1", + "date": "Wed, 13 May 2026 09:26:05 GMT", + "comments": {} + }, + { + "version": "4.8.0", + "tag": "@snowplow/browser-plugin-performance-timing_v4.8.0", + "date": "Tue, 28 Apr 2026 07:56:22 GMT", + "comments": {} + }, + { + "version": "4.7.0", + "tag": "@snowplow/browser-plugin-performance-timing_v4.7.0", + "date": "Wed, 01 Apr 2026 12:59:29 GMT", + "comments": {} + }, + { + "version": "4.6.9", + "tag": "@snowplow/browser-plugin-performance-timing_v4.6.9", + "date": "Mon, 16 Mar 2026 15:43:06 GMT", + "comments": {} + }, + { + "version": "4.6.8", + "tag": "@snowplow/browser-plugin-performance-timing_v4.6.8", + "date": "Tue, 28 Oct 2025 09:46:42 GMT", + "comments": {} + }, + { + "version": "4.6.7", + "tag": "@snowplow/browser-plugin-performance-timing_v4.6.7", + "date": "Tue, 07 Oct 2025 14:53:36 GMT", + "comments": {} + }, + { + "version": "4.6.6", + "tag": "@snowplow/browser-plugin-performance-timing_v4.6.6", + "date": "Tue, 26 Aug 2025 08:42:27 GMT", + "comments": {} + }, + { + "version": "4.6.5", + "tag": "@snowplow/browser-plugin-performance-timing_v4.6.5", + "date": "Wed, 25 Jun 2025 21:16:46 GMT", + "comments": {} + }, + { + "version": "4.6.4", + "tag": "@snowplow/browser-plugin-performance-timing_v4.6.4", + "date": "Wed, 25 Jun 2025 12:08:50 GMT", + "comments": {} + }, + { + "version": "4.6.3", + "tag": "@snowplow/browser-plugin-performance-timing_v4.6.3", + "date": "Thu, 29 May 2025 19:52:07 GMT", + "comments": {} + }, + { + "version": "4.6.2", + "tag": "@snowplow/browser-plugin-performance-timing_v4.6.2", + "date": "Tue, 20 May 2025 07:39:05 GMT", + "comments": {} + }, + { + "version": "4.6.1", + "tag": "@snowplow/browser-plugin-performance-timing_v4.6.1", + "date": "Tue, 06 May 2025 13:10:51 GMT", + "comments": {} + }, + { + "version": "4.6.0", + "tag": "@snowplow/browser-plugin-performance-timing_v4.6.0", + "date": "Thu, 01 May 2025 09:58:59 GMT", + "comments": {} + }, + { + "version": "4.5.0", + "tag": "@snowplow/browser-plugin-performance-timing_v4.5.0", + "date": "Fri, 04 Apr 2025 09:21:23 GMT", + "comments": {} + }, + { + "version": "4.4.0", + "tag": "@snowplow/browser-plugin-performance-timing_v4.4.0", + "date": "Thu, 20 Mar 2025 12:14:34 GMT", + "comments": {} + }, + { + "version": "4.3.1", + "tag": "@snowplow/browser-plugin-performance-timing_v4.3.1", + "date": "Tue, 21 Jan 2025 11:09:42 GMT", + "comments": {} + }, + { + "version": "4.3.0", + "tag": "@snowplow/browser-plugin-performance-timing_v4.3.0", + "date": "Mon, 20 Jan 2025 11:45:13 GMT", + "comments": {} + }, + { + "version": "4.2.0", + "tag": "@snowplow/browser-plugin-performance-timing_v4.2.0", + "date": "Mon, 13 Jan 2025 08:30:05 GMT", + "comments": {} + }, + { + "version": "4.1.0", + "tag": "@snowplow/browser-plugin-performance-timing_v4.1.0", + "date": "Thu, 28 Nov 2024 10:57:30 GMT", + "comments": {} + }, + { + "version": "4.0.4", + "tag": "@snowplow/browser-plugin-performance-timing_v4.0.4", + "date": "Thu, 21 Nov 2024 09:06:36 GMT", + "comments": {} + }, + { + "version": "4.0.3", + "tag": "@snowplow/browser-plugin-performance-timing_v4.0.3", + "date": "Wed, 20 Nov 2024 09:30:31 GMT", + "comments": {} + }, { "version": "4.0.2", "tag": "@snowplow/browser-plugin-performance-timing_v4.0.2", diff --git a/plugins/browser-plugin-performance-timing/CHANGELOG.md b/plugins/browser-plugin-performance-timing/CHANGELOG.md index d3664566d..a2c31138d 100644 --- a/plugins/browser-plugin-performance-timing/CHANGELOG.md +++ b/plugins/browser-plugin-performance-timing/CHANGELOG.md @@ -1,6 +1,143 @@ # Change Log - @snowplow/browser-plugin-performance-timing -This log was last generated on Mon, 11 Nov 2024 15:46:34 GMT and should not be manually modified. +This log was last generated on Wed, 19 Aug 2026 14:26:05 GMT and should not be manually modified. + +## 4.10.1 +Wed, 19 Aug 2026 14:26:05 GMT + +_Version update only_ + +## 4.10.0 +Mon, 27 Jul 2026 13:52:14 GMT + +_Version update only_ + +## 4.9.0 +Tue, 21 Jul 2026 14:53:08 GMT + +_Version update only_ + +## 4.8.4 +Thu, 02 Jul 2026 10:07:52 GMT + +_Version update only_ + +## 4.8.3 +Tue, 30 Jun 2026 14:22:03 GMT + +### Updates + +- Update uuid to v11 and remove closure-compiler from the build pipeline + +## 4.8.2 +Wed, 17 Jun 2026 12:30:12 GMT + +_Version update only_ + +## 4.8.1 +Wed, 13 May 2026 09:26:05 GMT + +_Version update only_ + +## 4.8.0 +Tue, 28 Apr 2026 07:56:22 GMT + +_Version update only_ + +## 4.7.0 +Wed, 01 Apr 2026 12:59:29 GMT + +_Version update only_ + +## 4.6.9 +Mon, 16 Mar 2026 15:43:06 GMT + +_Version update only_ + +## 4.6.8 +Tue, 28 Oct 2025 09:46:42 GMT + +_Version update only_ + +## 4.6.7 +Tue, 07 Oct 2025 14:53:36 GMT + +_Version update only_ + +## 4.6.6 +Tue, 26 Aug 2025 08:42:27 GMT + +_Version update only_ + +## 4.6.5 +Wed, 25 Jun 2025 21:16:46 GMT + +_Version update only_ + +## 4.6.4 +Wed, 25 Jun 2025 12:08:50 GMT + +_Version update only_ + +## 4.6.3 +Thu, 29 May 2025 19:52:07 GMT + +_Version update only_ + +## 4.6.2 +Tue, 20 May 2025 07:39:05 GMT + +_Version update only_ + +## 4.6.1 +Tue, 06 May 2025 13:10:51 GMT + +_Version update only_ + +## 4.6.0 +Thu, 01 May 2025 09:58:59 GMT + +_Version update only_ + +## 4.5.0 +Fri, 04 Apr 2025 09:21:23 GMT + +_Version update only_ + +## 4.4.0 +Thu, 20 Mar 2025 12:14:34 GMT + +_Version update only_ + +## 4.3.1 +Tue, 21 Jan 2025 11:09:42 GMT + +_Version update only_ + +## 4.3.0 +Mon, 20 Jan 2025 11:45:13 GMT + +_Version update only_ + +## 4.2.0 +Mon, 13 Jan 2025 08:30:05 GMT + +_Version update only_ + +## 4.1.0 +Thu, 28 Nov 2024 10:57:30 GMT + +_Version update only_ + +## 4.0.4 +Thu, 21 Nov 2024 09:06:36 GMT + +_Version update only_ + +## 4.0.3 +Wed, 20 Nov 2024 09:30:31 GMT + +_Version update only_ ## 4.0.2 Mon, 11 Nov 2024 15:46:34 GMT diff --git a/plugins/browser-plugin-performance-timing/jest.config.js b/plugins/browser-plugin-performance-timing/jest.config.js index bd3ea4e2a..87d15da9b 100644 --- a/plugins/browser-plugin-performance-timing/jest.config.js +++ b/plugins/browser-plugin-performance-timing/jest.config.js @@ -1,5 +1,6 @@ module.exports = { preset: 'ts-jest', reporters: ['jest-standard-reporter'], + setupFilesAfterEnv: ['../../setupTestGlobals.ts'], testEnvironment: 'jest-environment-jsdom-global', }; diff --git a/plugins/browser-plugin-performance-timing/package.json b/plugins/browser-plugin-performance-timing/package.json index 575967660..bf731be98 100644 --- a/plugins/browser-plugin-performance-timing/package.json +++ b/plugins/browser-plugin-performance-timing/package.json @@ -1,6 +1,6 @@ { "name": "@snowplow/browser-plugin-performance-timing", - "version": "4.0.2", + "version": "4.10.1", "description": "Attaches Performance Timing data to Snowplow events", "homepage": "http://bit.ly/sp-js", "bugs": "https://github.com/snowplow/snowplow-javascript-tracker/issues", @@ -27,27 +27,26 @@ "tslib": "^2.3.1" }, "devDependencies": { - "@ampproject/rollup-plugin-closure-compiler": "~0.27.0", "@rollup/plugin-commonjs": "~21.0.2", "@rollup/plugin-node-resolve": "~13.1.3", - "@types/jest": "~27.4.1", + "@types/jest": "~28.1.1", "@types/jsdom": "~16.2.14", "@typescript-eslint/eslint-plugin": "~5.15.0", "@typescript-eslint/parser": "~5.15.0", "eslint": "~8.11.0", - "jest": "~27.5.1", - "jest-environment-jsdom": "~27.5.1", - "jest-environment-jsdom-global": "~3.0.0", + "jest": "~28.1.3", + "jest-environment-jsdom": "~28.1.3", + "jest-environment-jsdom-global": "~4.0.0", "jest-standard-reporter": "~2.0.0", "rollup": "~2.70.1", "rollup-plugin-cleanup": "~3.2.1", "rollup-plugin-license": "~2.6.1", "rollup-plugin-terser": "~7.0.2", "rollup-plugin-ts": "~2.0.5", - "ts-jest": "~27.1.3", + "ts-jest": "~28.0.8", "typescript": "~4.6.2" }, "peerDependencies": { - "@snowplow/browser-tracker": "~4.0.2" + "@snowplow/browser-tracker": "~4.10.1" } } diff --git a/plugins/browser-plugin-performance-timing/rollup.config.js b/plugins/browser-plugin-performance-timing/rollup.config.js index d521628e7..a4f9a4981 100644 --- a/plugins/browser-plugin-performance-timing/rollup.config.js +++ b/plugins/browser-plugin-performance-timing/rollup.config.js @@ -32,7 +32,6 @@ import { nodeResolve } from '@rollup/plugin-node-resolve'; import commonjs from '@rollup/plugin-commonjs'; import ts from 'rollup-plugin-ts'; // Prefered over @rollup/plugin-typescript as it bundles .d.ts files import { banner } from '../../banner'; -import compiler from '@ampproject/rollup-plugin-closure-compiler'; import { terser } from 'rollup-plugin-terser'; import cleanup from 'rollup-plugin-cleanup'; import pkg from './package.json'; @@ -51,7 +50,7 @@ export default [ }, { input: './src/index.ts', - plugins: [...umdPlugins, compiler(), terser(), cleanup({ comments: 'none' }), banner()], + plugins: [...umdPlugins, terser(), cleanup({ comments: 'none' }), banner()], treeshake: { moduleSideEffects: ['sha1'] }, output: [{ file: pkg.main.replace('.js', '.min.js'), format: 'umd', sourcemap: true, name: umdName }], }, diff --git a/plugins/browser-plugin-privacy-sandbox/CHANGELOG.json b/plugins/browser-plugin-privacy-sandbox/CHANGELOG.json index a34952192..d86f20602 100644 --- a/plugins/browser-plugin-privacy-sandbox/CHANGELOG.json +++ b/plugins/browser-plugin-privacy-sandbox/CHANGELOG.json @@ -1,6 +1,174 @@ { "name": "@snowplow/browser-plugin-privacy-sandbox", "entries": [ + { + "version": "4.10.1", + "tag": "@snowplow/browser-plugin-privacy-sandbox_v4.10.1", + "date": "Wed, 19 Aug 2026 14:26:05 GMT", + "comments": {} + }, + { + "version": "4.10.0", + "tag": "@snowplow/browser-plugin-privacy-sandbox_v4.10.0", + "date": "Mon, 27 Jul 2026 13:52:14 GMT", + "comments": {} + }, + { + "version": "4.9.0", + "tag": "@snowplow/browser-plugin-privacy-sandbox_v4.9.0", + "date": "Tue, 21 Jul 2026 14:53:08 GMT", + "comments": {} + }, + { + "version": "4.8.4", + "tag": "@snowplow/browser-plugin-privacy-sandbox_v4.8.4", + "date": "Thu, 02 Jul 2026 10:07:52 GMT", + "comments": {} + }, + { + "version": "4.8.3", + "tag": "@snowplow/browser-plugin-privacy-sandbox_v4.8.3", + "date": "Tue, 30 Jun 2026 14:22:03 GMT", + "comments": { + "none": [ + { + "comment": "Update uuid to v11 and remove closure-compiler from the build pipeline" + } + ] + } + }, + { + "version": "4.8.2", + "tag": "@snowplow/browser-plugin-privacy-sandbox_v4.8.2", + "date": "Wed, 17 Jun 2026 12:30:12 GMT", + "comments": {} + }, + { + "version": "4.8.1", + "tag": "@snowplow/browser-plugin-privacy-sandbox_v4.8.1", + "date": "Wed, 13 May 2026 09:26:05 GMT", + "comments": {} + }, + { + "version": "4.8.0", + "tag": "@snowplow/browser-plugin-privacy-sandbox_v4.8.0", + "date": "Tue, 28 Apr 2026 07:56:22 GMT", + "comments": {} + }, + { + "version": "4.7.0", + "tag": "@snowplow/browser-plugin-privacy-sandbox_v4.7.0", + "date": "Wed, 01 Apr 2026 12:59:29 GMT", + "comments": {} + }, + { + "version": "4.6.9", + "tag": "@snowplow/browser-plugin-privacy-sandbox_v4.6.9", + "date": "Mon, 16 Mar 2026 15:43:06 GMT", + "comments": {} + }, + { + "version": "4.6.8", + "tag": "@snowplow/browser-plugin-privacy-sandbox_v4.6.8", + "date": "Tue, 28 Oct 2025 09:46:42 GMT", + "comments": {} + }, + { + "version": "4.6.7", + "tag": "@snowplow/browser-plugin-privacy-sandbox_v4.6.7", + "date": "Tue, 07 Oct 2025 14:53:36 GMT", + "comments": {} + }, + { + "version": "4.6.6", + "tag": "@snowplow/browser-plugin-privacy-sandbox_v4.6.6", + "date": "Tue, 26 Aug 2025 08:42:27 GMT", + "comments": {} + }, + { + "version": "4.6.5", + "tag": "@snowplow/browser-plugin-privacy-sandbox_v4.6.5", + "date": "Wed, 25 Jun 2025 21:16:46 GMT", + "comments": {} + }, + { + "version": "4.6.4", + "tag": "@snowplow/browser-plugin-privacy-sandbox_v4.6.4", + "date": "Wed, 25 Jun 2025 12:08:50 GMT", + "comments": {} + }, + { + "version": "4.6.3", + "tag": "@snowplow/browser-plugin-privacy-sandbox_v4.6.3", + "date": "Thu, 29 May 2025 19:52:07 GMT", + "comments": {} + }, + { + "version": "4.6.2", + "tag": "@snowplow/browser-plugin-privacy-sandbox_v4.6.2", + "date": "Tue, 20 May 2025 07:39:05 GMT", + "comments": {} + }, + { + "version": "4.6.1", + "tag": "@snowplow/browser-plugin-privacy-sandbox_v4.6.1", + "date": "Tue, 06 May 2025 13:10:51 GMT", + "comments": {} + }, + { + "version": "4.6.0", + "tag": "@snowplow/browser-plugin-privacy-sandbox_v4.6.0", + "date": "Thu, 01 May 2025 09:58:59 GMT", + "comments": {} + }, + { + "version": "4.5.0", + "tag": "@snowplow/browser-plugin-privacy-sandbox_v4.5.0", + "date": "Fri, 04 Apr 2025 09:21:23 GMT", + "comments": {} + }, + { + "version": "4.4.0", + "tag": "@snowplow/browser-plugin-privacy-sandbox_v4.4.0", + "date": "Thu, 20 Mar 2025 12:14:34 GMT", + "comments": {} + }, + { + "version": "4.3.1", + "tag": "@snowplow/browser-plugin-privacy-sandbox_v4.3.1", + "date": "Tue, 21 Jan 2025 11:09:42 GMT", + "comments": {} + }, + { + "version": "4.3.0", + "tag": "@snowplow/browser-plugin-privacy-sandbox_v4.3.0", + "date": "Mon, 20 Jan 2025 11:45:13 GMT", + "comments": {} + }, + { + "version": "4.2.0", + "tag": "@snowplow/browser-plugin-privacy-sandbox_v4.2.0", + "date": "Mon, 13 Jan 2025 08:30:05 GMT", + "comments": {} + }, + { + "version": "4.1.0", + "tag": "@snowplow/browser-plugin-privacy-sandbox_v4.1.0", + "date": "Thu, 28 Nov 2024 10:57:30 GMT", + "comments": {} + }, + { + "version": "4.0.4", + "tag": "@snowplow/browser-plugin-privacy-sandbox_v4.0.4", + "date": "Thu, 21 Nov 2024 09:06:36 GMT", + "comments": {} + }, + { + "version": "4.0.3", + "tag": "@snowplow/browser-plugin-privacy-sandbox_v4.0.3", + "date": "Wed, 20 Nov 2024 09:30:31 GMT", + "comments": {} + }, { "version": "4.0.2", "tag": "@snowplow/browser-plugin-privacy-sandbox_v4.0.2", diff --git a/plugins/browser-plugin-privacy-sandbox/CHANGELOG.md b/plugins/browser-plugin-privacy-sandbox/CHANGELOG.md index 24838410a..f82f59905 100644 --- a/plugins/browser-plugin-privacy-sandbox/CHANGELOG.md +++ b/plugins/browser-plugin-privacy-sandbox/CHANGELOG.md @@ -1,6 +1,143 @@ # Change Log - @snowplow/browser-plugin-privacy-sandbox -This log was last generated on Mon, 11 Nov 2024 15:46:34 GMT and should not be manually modified. +This log was last generated on Wed, 19 Aug 2026 14:26:05 GMT and should not be manually modified. + +## 4.10.1 +Wed, 19 Aug 2026 14:26:05 GMT + +_Version update only_ + +## 4.10.0 +Mon, 27 Jul 2026 13:52:14 GMT + +_Version update only_ + +## 4.9.0 +Tue, 21 Jul 2026 14:53:08 GMT + +_Version update only_ + +## 4.8.4 +Thu, 02 Jul 2026 10:07:52 GMT + +_Version update only_ + +## 4.8.3 +Tue, 30 Jun 2026 14:22:03 GMT + +### Updates + +- Update uuid to v11 and remove closure-compiler from the build pipeline + +## 4.8.2 +Wed, 17 Jun 2026 12:30:12 GMT + +_Version update only_ + +## 4.8.1 +Wed, 13 May 2026 09:26:05 GMT + +_Version update only_ + +## 4.8.0 +Tue, 28 Apr 2026 07:56:22 GMT + +_Version update only_ + +## 4.7.0 +Wed, 01 Apr 2026 12:59:29 GMT + +_Version update only_ + +## 4.6.9 +Mon, 16 Mar 2026 15:43:06 GMT + +_Version update only_ + +## 4.6.8 +Tue, 28 Oct 2025 09:46:42 GMT + +_Version update only_ + +## 4.6.7 +Tue, 07 Oct 2025 14:53:36 GMT + +_Version update only_ + +## 4.6.6 +Tue, 26 Aug 2025 08:42:27 GMT + +_Version update only_ + +## 4.6.5 +Wed, 25 Jun 2025 21:16:46 GMT + +_Version update only_ + +## 4.6.4 +Wed, 25 Jun 2025 12:08:50 GMT + +_Version update only_ + +## 4.6.3 +Thu, 29 May 2025 19:52:07 GMT + +_Version update only_ + +## 4.6.2 +Tue, 20 May 2025 07:39:05 GMT + +_Version update only_ + +## 4.6.1 +Tue, 06 May 2025 13:10:51 GMT + +_Version update only_ + +## 4.6.0 +Thu, 01 May 2025 09:58:59 GMT + +_Version update only_ + +## 4.5.0 +Fri, 04 Apr 2025 09:21:23 GMT + +_Version update only_ + +## 4.4.0 +Thu, 20 Mar 2025 12:14:34 GMT + +_Version update only_ + +## 4.3.1 +Tue, 21 Jan 2025 11:09:42 GMT + +_Version update only_ + +## 4.3.0 +Mon, 20 Jan 2025 11:45:13 GMT + +_Version update only_ + +## 4.2.0 +Mon, 13 Jan 2025 08:30:05 GMT + +_Version update only_ + +## 4.1.0 +Thu, 28 Nov 2024 10:57:30 GMT + +_Version update only_ + +## 4.0.4 +Thu, 21 Nov 2024 09:06:36 GMT + +_Version update only_ + +## 4.0.3 +Wed, 20 Nov 2024 09:30:31 GMT + +_Version update only_ ## 4.0.2 Mon, 11 Nov 2024 15:46:34 GMT diff --git a/plugins/browser-plugin-privacy-sandbox/jest.config.js b/plugins/browser-plugin-privacy-sandbox/jest.config.js index bd3ea4e2a..87d15da9b 100644 --- a/plugins/browser-plugin-privacy-sandbox/jest.config.js +++ b/plugins/browser-plugin-privacy-sandbox/jest.config.js @@ -1,5 +1,6 @@ module.exports = { preset: 'ts-jest', reporters: ['jest-standard-reporter'], + setupFilesAfterEnv: ['../../setupTestGlobals.ts'], testEnvironment: 'jest-environment-jsdom-global', }; diff --git a/plugins/browser-plugin-privacy-sandbox/package.json b/plugins/browser-plugin-privacy-sandbox/package.json index 0e4a1ffee..50e1fe14e 100644 --- a/plugins/browser-plugin-privacy-sandbox/package.json +++ b/plugins/browser-plugin-privacy-sandbox/package.json @@ -1,6 +1,6 @@ { "name": "@snowplow/browser-plugin-privacy-sandbox", - "version": "4.0.2", + "version": "4.10.1", "description": "Allows for the collection of Privacy Sandbox specific data.", "homepage": "https://docs.snowplow.io/", "bugs": "https://github.com/snowplow/snowplow-javascript-tracker/issues", @@ -27,27 +27,26 @@ "tslib": "^2.3.1" }, "devDependencies": { - "@ampproject/rollup-plugin-closure-compiler": "~0.27.0", "@rollup/plugin-commonjs": "~21.0.2", "@rollup/plugin-node-resolve": "~13.1.3", - "@types/jest": "~27.4.1", + "@types/jest": "~28.1.1", "@types/jsdom": "~16.2.14", "@typescript-eslint/eslint-plugin": "~5.15.0", "@typescript-eslint/parser": "~5.15.0", "eslint": "~8.11.0", - "jest": "~27.5.1", - "jest-environment-jsdom": "~27.5.1", - "jest-environment-jsdom-global": "~3.0.0", + "jest": "~28.1.3", + "jest-environment-jsdom": "~28.1.3", + "jest-environment-jsdom-global": "~4.0.0", "jest-standard-reporter": "~2.0.0", "rollup": "~2.70.1", "rollup-plugin-cleanup": "~3.2.1", "rollup-plugin-license": "~2.6.1", "rollup-plugin-terser": "~7.0.2", "rollup-plugin-ts": "~2.0.5", - "ts-jest": "~27.1.3", + "ts-jest": "~28.0.8", "typescript": "~4.6.2" }, "peerDependencies": { - "@snowplow/browser-tracker": "~4.0.2" + "@snowplow/browser-tracker": "~4.10.1" } } diff --git a/plugins/browser-plugin-privacy-sandbox/rollup.config.js b/plugins/browser-plugin-privacy-sandbox/rollup.config.js index 6c968d34c..a6bb93344 100644 --- a/plugins/browser-plugin-privacy-sandbox/rollup.config.js +++ b/plugins/browser-plugin-privacy-sandbox/rollup.config.js @@ -2,7 +2,6 @@ import { nodeResolve } from '@rollup/plugin-node-resolve'; import commonjs from '@rollup/plugin-commonjs'; import ts from 'rollup-plugin-ts'; // Preferred over @rollup/plugin-typescript as it bundles .d.ts files import { banner } from '../../banner'; -import compiler from '@ampproject/rollup-plugin-closure-compiler'; import { terser } from 'rollup-plugin-terser'; import cleanup from 'rollup-plugin-cleanup'; import pkg from './package.json'; @@ -21,7 +20,7 @@ export default [ }, { input: './src/index.ts', - plugins: [...umdPlugins, compiler(), terser(), cleanup({ comments: 'none' }), banner()], + plugins: [...umdPlugins, terser(), cleanup({ comments: 'none' }), banner()], treeshake: { moduleSideEffects: ['sha1'] }, output: [{ file: pkg.main.replace('.js', '.min.js'), format: 'umd', sourcemap: true, name: umdName }], }, diff --git a/plugins/browser-plugin-screen-tracking/CHANGELOG.json b/plugins/browser-plugin-screen-tracking/CHANGELOG.json new file mode 100644 index 000000000..05baaba47 --- /dev/null +++ b/plugins/browser-plugin-screen-tracking/CHANGELOG.json @@ -0,0 +1,161 @@ +{ + "name": "@snowplow/browser-plugin-screen-tracking", + "entries": [ + { + "version": "4.10.1", + "tag": "@snowplow/browser-plugin-screen-tracking_v4.10.1", + "date": "Wed, 19 Aug 2026 14:26:05 GMT", + "comments": {} + }, + { + "version": "4.10.0", + "tag": "@snowplow/browser-plugin-screen-tracking_v4.10.0", + "date": "Mon, 27 Jul 2026 13:52:14 GMT", + "comments": {} + }, + { + "version": "4.9.0", + "tag": "@snowplow/browser-plugin-screen-tracking_v4.9.0", + "date": "Tue, 21 Jul 2026 14:53:08 GMT", + "comments": {} + }, + { + "version": "4.8.4", + "tag": "@snowplow/browser-plugin-screen-tracking_v4.8.4", + "date": "Thu, 02 Jul 2026 10:07:52 GMT", + "comments": {} + }, + { + "version": "4.8.3", + "tag": "@snowplow/browser-plugin-screen-tracking_v4.8.3", + "date": "Tue, 30 Jun 2026 14:22:03 GMT", + "comments": { + "none": [ + { + "comment": "Update uuid to v11 and remove closure-compiler from the build pipeline" + } + ] + } + }, + { + "version": "4.8.2", + "tag": "@snowplow/browser-plugin-screen-tracking_v4.8.2", + "date": "Wed, 17 Jun 2026 12:30:12 GMT", + "comments": {} + }, + { + "version": "4.8.1", + "tag": "@snowplow/browser-plugin-screen-tracking_v4.8.1", + "date": "Wed, 13 May 2026 09:26:05 GMT", + "comments": {} + }, + { + "version": "4.8.0", + "tag": "@snowplow/browser-plugin-screen-tracking_v4.8.0", + "date": "Tue, 28 Apr 2026 07:56:22 GMT", + "comments": {} + }, + { + "version": "4.7.0", + "tag": "@snowplow/browser-plugin-screen-tracking_v4.7.0", + "date": "Wed, 01 Apr 2026 12:59:29 GMT", + "comments": {} + }, + { + "version": "4.6.9", + "tag": "@snowplow/browser-plugin-screen-tracking_v4.6.9", + "date": "Mon, 16 Mar 2026 15:43:06 GMT", + "comments": {} + }, + { + "version": "4.6.8", + "tag": "@snowplow/browser-plugin-screen-tracking_v4.6.8", + "date": "Tue, 28 Oct 2025 09:46:42 GMT", + "comments": {} + }, + { + "version": "4.6.7", + "tag": "@snowplow/browser-plugin-screen-tracking_v4.6.7", + "date": "Tue, 07 Oct 2025 14:53:36 GMT", + "comments": {} + }, + { + "version": "4.6.6", + "tag": "@snowplow/browser-plugin-screen-tracking_v4.6.6", + "date": "Tue, 26 Aug 2025 08:42:27 GMT", + "comments": {} + }, + { + "version": "4.6.5", + "tag": "@snowplow/browser-plugin-screen-tracking_v4.6.5", + "date": "Wed, 25 Jun 2025 21:16:46 GMT", + "comments": {} + }, + { + "version": "4.6.4", + "tag": "@snowplow/browser-plugin-screen-tracking_v4.6.4", + "date": "Wed, 25 Jun 2025 12:08:50 GMT", + "comments": {} + }, + { + "version": "4.6.3", + "tag": "@snowplow/browser-plugin-screen-tracking_v4.6.3", + "date": "Thu, 29 May 2025 19:52:07 GMT", + "comments": {} + }, + { + "version": "4.6.2", + "tag": "@snowplow/browser-plugin-screen-tracking_v4.6.2", + "date": "Tue, 20 May 2025 07:39:05 GMT", + "comments": {} + }, + { + "version": "4.6.1", + "tag": "@snowplow/browser-plugin-screen-tracking_v4.6.1", + "date": "Tue, 06 May 2025 13:10:51 GMT", + "comments": {} + }, + { + "version": "4.6.0", + "tag": "@snowplow/browser-plugin-screen-tracking_v4.6.0", + "date": "Thu, 01 May 2025 09:58:59 GMT", + "comments": {} + }, + { + "version": "4.5.0", + "tag": "@snowplow/browser-plugin-screen-tracking_v4.5.0", + "date": "Fri, 04 Apr 2025 09:21:23 GMT", + "comments": {} + }, + { + "version": "4.4.0", + "tag": "@snowplow/browser-plugin-screen-tracking_v4.4.0", + "date": "Thu, 20 Mar 2025 12:14:34 GMT", + "comments": {} + }, + { + "version": "4.3.1", + "tag": "@snowplow/browser-plugin-screen-tracking_v4.3.1", + "date": "Tue, 21 Jan 2025 11:09:42 GMT", + "comments": {} + }, + { + "version": "4.3.0", + "tag": "@snowplow/browser-plugin-screen-tracking_v4.3.0", + "date": "Mon, 20 Jan 2025 11:45:13 GMT", + "comments": {} + }, + { + "version": "4.2.0", + "tag": "@snowplow/browser-plugin-screen-tracking_v4.2.0", + "date": "Mon, 13 Jan 2025 08:30:05 GMT", + "comments": { + "none": [ + { + "comment": "Add screen tracking plugin and add support for browser plugins (#1394)" + } + ] + } + } + ] +} diff --git a/plugins/browser-plugin-screen-tracking/CHANGELOG.md b/plugins/browser-plugin-screen-tracking/CHANGELOG.md new file mode 100644 index 000000000..718fe92cb --- /dev/null +++ b/plugins/browser-plugin-screen-tracking/CHANGELOG.md @@ -0,0 +1,128 @@ +# Change Log - @snowplow/browser-plugin-screen-tracking + +This log was last generated on Wed, 19 Aug 2026 14:26:05 GMT and should not be manually modified. + +## 4.10.1 +Wed, 19 Aug 2026 14:26:05 GMT + +_Version update only_ + +## 4.10.0 +Mon, 27 Jul 2026 13:52:14 GMT + +_Version update only_ + +## 4.9.0 +Tue, 21 Jul 2026 14:53:08 GMT + +_Version update only_ + +## 4.8.4 +Thu, 02 Jul 2026 10:07:52 GMT + +_Version update only_ + +## 4.8.3 +Tue, 30 Jun 2026 14:22:03 GMT + +### Updates + +- Update uuid to v11 and remove closure-compiler from the build pipeline + +## 4.8.2 +Wed, 17 Jun 2026 12:30:12 GMT + +_Version update only_ + +## 4.8.1 +Wed, 13 May 2026 09:26:05 GMT + +_Version update only_ + +## 4.8.0 +Tue, 28 Apr 2026 07:56:22 GMT + +_Version update only_ + +## 4.7.0 +Wed, 01 Apr 2026 12:59:29 GMT + +_Version update only_ + +## 4.6.9 +Mon, 16 Mar 2026 15:43:06 GMT + +_Version update only_ + +## 4.6.8 +Tue, 28 Oct 2025 09:46:42 GMT + +_Version update only_ + +## 4.6.7 +Tue, 07 Oct 2025 14:53:36 GMT + +_Version update only_ + +## 4.6.6 +Tue, 26 Aug 2025 08:42:27 GMT + +_Version update only_ + +## 4.6.5 +Wed, 25 Jun 2025 21:16:46 GMT + +_Version update only_ + +## 4.6.4 +Wed, 25 Jun 2025 12:08:50 GMT + +_Version update only_ + +## 4.6.3 +Thu, 29 May 2025 19:52:07 GMT + +_Version update only_ + +## 4.6.2 +Tue, 20 May 2025 07:39:05 GMT + +_Version update only_ + +## 4.6.1 +Tue, 06 May 2025 13:10:51 GMT + +_Version update only_ + +## 4.6.0 +Thu, 01 May 2025 09:58:59 GMT + +_Version update only_ + +## 4.5.0 +Fri, 04 Apr 2025 09:21:23 GMT + +_Version update only_ + +## 4.4.0 +Thu, 20 Mar 2025 12:14:34 GMT + +_Version update only_ + +## 4.3.1 +Tue, 21 Jan 2025 11:09:42 GMT + +_Version update only_ + +## 4.3.0 +Mon, 20 Jan 2025 11:45:13 GMT + +_Version update only_ + +## 4.2.0 +Mon, 13 Jan 2025 08:30:05 GMT + +### Updates + +- Add screen tracking plugin and add support for browser plugins (#1394) + diff --git a/plugins/browser-plugin-screen-tracking/LICENSE b/plugins/browser-plugin-screen-tracking/LICENSE new file mode 100644 index 000000000..76f1946ea --- /dev/null +++ b/plugins/browser-plugin-screen-tracking/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2022 Snowplow Analytics Ltd, 2010 Anthon Pang +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/plugins/browser-plugin-screen-tracking/README.md b/plugins/browser-plugin-screen-tracking/README.md new file mode 100644 index 000000000..f89baa099 --- /dev/null +++ b/plugins/browser-plugin-screen-tracking/README.md @@ -0,0 +1,59 @@ +# Snowplow Screen Tracking Plugin + +[![npm version][npm-image]][npm-url] +[![License][license-image]](LICENSE) + +Browser Plugin to be used with `@snowplow/browser-tracker`. The plugin is already included in `@snowplow/react-native-tracker`. + +This plugin is the recommended way to track screen view events. + +## Maintainer quick start + +Part of the Snowplow JavaScript Tracker monorepo. +Build with [Node.js](https://nodejs.org/en/) (18 - 20) and [Rush](https://rushjs.io/). + +### Setup repository + +```bash +npm install -g @microsoft/rush +git clone https://github.com/snowplow/snowplow-javascript-tracker.git +rush update +``` + +## Package Installation + +With npm: + +```bash +npm install @snowplow/browser-plugin-snowplow-screen-tracking +``` + +## Usage + +Initialize your tracker with the ScreenTrackingPlugin: + +```js +import { newTracker } from '@snowplow/browser-tracker'; +import { ScreenTrackingPlugin } from '@snowplow/browser-plugin-screen-tracking'; + +newTracker('sp1', '{{collector_url}}', { + appId: 'my-app-id', + plugins: [ ScreenTrackingPlugin() ], +}); +``` + +For a full API reference, you can read the plugin [documentation page](https://docs.snowplow.io/docs/collecting-data/collecting-from-own-applications/javascript-trackers/browser-tracker/browser-tracker-v3-reference/plugins/screen-tracking/). + +## Copyright and license + +Licensed and distributed under the [BSD 3-Clause License](LICENSE) ([An OSI Approved License][osi]). + +Copyright (c) 2022 Snowplow Analytics Ltd. + +All rights reserved. + +[npm-url]: https://www.npmjs.com/package/@snowplow/browser-plugin-screen-tracking +[npm-image]: https://img.shields.io/npm/v/@snowplow/browser-plugin-screen-tracking +[docs]: https://docs.snowplowanalytics.com/docs/collecting-data/collecting-from-own-applications/javascript-tracker/ +[osi]: https://opensource.org/licenses/BSD-3-Clause +[license-image]: https://img.shields.io/npm/l/@snowplow/browser-plugin-screen-tracking diff --git a/plugins/browser-plugin-screen-tracking/jest.config.js b/plugins/browser-plugin-screen-tracking/jest.config.js new file mode 100644 index 000000000..87d15da9b --- /dev/null +++ b/plugins/browser-plugin-screen-tracking/jest.config.js @@ -0,0 +1,6 @@ +module.exports = { + preset: 'ts-jest', + reporters: ['jest-standard-reporter'], + setupFilesAfterEnv: ['../../setupTestGlobals.ts'], + testEnvironment: 'jest-environment-jsdom-global', +}; diff --git a/plugins/browser-plugin-screen-tracking/package.json b/plugins/browser-plugin-screen-tracking/package.json new file mode 100644 index 000000000..938c199e7 --- /dev/null +++ b/plugins/browser-plugin-screen-tracking/package.json @@ -0,0 +1,55 @@ +{ + "name": "@snowplow/browser-plugin-screen-tracking", + "version": "4.10.1", + "description": "Snowplow screen tracking", + "homepage": "http://bit.ly/sp-js", + "bugs": "https://github.com/snowplow/snowplow-javascript-tracker/issues", + "repository": { + "type": "git", + "url": "https://github.com/snowplow/snowplow-javascript-tracker.git" + }, + "license": "BSD-3-Clause", + "author": "Peter Perlepes", + "sideEffects": false, + "main": "./dist/index.umd.js", + "module": "./dist/index.module.js", + "types": "./dist/index.module.d.ts", + "files": [ + "dist" + ], + "scripts": { + "build": "rollup -c --silent --failAfterWarnings", + "test": "jest" + }, + "dependencies": { + "@snowplow/browser-tracker-core": "workspace:*", + "@snowplow/tracker-core": "workspace:*", + "tslib": "^2.3.1", + "uuid": "^11.1.1" + }, + "devDependencies": { + "@rollup/plugin-commonjs": "~21.0.2", + "@rollup/plugin-node-resolve": "~13.1.3", + "@types/jest": "~28.1.1", + "@types/jsdom": "~16.2.14", + "@types/lodash": "~4.14.180", + "@typescript-eslint/eslint-plugin": "~5.15.0", + "@typescript-eslint/parser": "~5.15.0", + "eslint": "~8.11.0", + "jest": "~28.1.3", + "jest-environment-jsdom": "~28.1.3", + "jest-environment-jsdom-global": "~4.0.0", + "jest-standard-reporter": "~2.0.0", + "lodash": "~4.17.21", + "rollup": "~2.70.1", + "rollup-plugin-cleanup": "~3.2.1", + "rollup-plugin-license": "~2.6.1", + "rollup-plugin-terser": "~7.0.2", + "rollup-plugin-ts": "~2.0.5", + "ts-jest": "~28.0.8", + "typescript": "~4.6.2" + }, + "peerDependencies": { + "@snowplow/browser-tracker": "~4.10.1" + } +} diff --git a/plugins/browser-plugin-screen-tracking/rollup.config.js b/plugins/browser-plugin-screen-tracking/rollup.config.js new file mode 100644 index 000000000..078114499 --- /dev/null +++ b/plugins/browser-plugin-screen-tracking/rollup.config.js @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2022 Snowplow Analytics Ltd, 2010 Anthon Pang + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +import { nodeResolve } from '@rollup/plugin-node-resolve'; +import commonjs from '@rollup/plugin-commonjs'; +import ts from 'rollup-plugin-ts'; // Prefered over @rollup/plugin-typescript as it bundles .d.ts files +import { banner } from '../../banner'; +import { terser } from 'rollup-plugin-terser'; +import cleanup from 'rollup-plugin-cleanup'; +import pkg from './package.json'; +import { builtinModules } from 'module'; + +const umdPlugins = [nodeResolve({ browser: true }), commonjs(), ts()]; +const umdName = 'snowplowScreenTracking'; + +export default [ + // CommonJS (for Node) and ES module (for bundlers) build. + { + input: './src/index.ts', + plugins: [...umdPlugins, banner()], + treeshake: { moduleSideEffects: ['sha1'] }, + output: [{ file: pkg.main, format: 'umd', sourcemap: true, name: umdName }], + }, + { + input: './src/index.ts', + plugins: [...umdPlugins, terser(), cleanup({ comments: 'none' }), banner()], + treeshake: { moduleSideEffects: ['sha1'] }, + output: [{ file: pkg.main.replace('.js', '.min.js'), format: 'umd', sourcemap: true, name: umdName }], + }, + { + input: './src/index.ts', + external: [...builtinModules, ...Object.keys(pkg.dependencies), ...Object.keys(pkg.devDependencies)], + plugins: [ + ts(), // so Rollup can convert TypeScript to JavaScript + banner(), + ], + output: [{ file: pkg.module, format: 'es', sourcemap: true }], + }, +]; diff --git a/plugins/browser-plugin-screen-tracking/src/api.ts b/plugins/browser-plugin-screen-tracking/src/api.ts new file mode 100644 index 000000000..de006c8a9 --- /dev/null +++ b/plugins/browser-plugin-screen-tracking/src/api.ts @@ -0,0 +1,272 @@ +import { BrowserPlugin, BrowserTracker, dispatchToTrackersInCollection } from '@snowplow/browser-tracker-core'; +import { CommonEventProperties, Payload } from '@snowplow/tracker-core'; +import { + buildListItemViewEvent, + buildScreenEndEvent, + buildScreenEntity, + buildScreenSummaryEntity, + buildScreenViewEvent, + buildScrollChangedEvent, +} from './core'; +import { + ListItemViewProps, + ScreenProps, + ScreenSummaryProps, + ScreenTrackingConfiguration, + ScreenViewProps, + ScrollChangedProps, +} from './types'; +import { + BACKGROUND_EVENT_SCHEMA, + FOREGROUND_EVENT_SCHEMA, + LIST_ITEM_VIEW_EVENT_SCHEMA, + SCREEN_END_EVENT_SCHEMA, + SCREEN_VIEW_EVENT_SCHEMA, + SCROLL_CHANGED_EVENT_SCHEMA, +} from './schemata'; +import { getUsefulSchemaAndData } from './utils'; +import { v4 as uuidv4 } from 'uuid'; + +const _trackers: Record = {}; + +/** + * Adds screen tracking + */ +export function ScreenTrackingPlugin({ + screenEngagementAutotracking = true, + screenContext = true, +}: ScreenTrackingConfiguration = {}): BrowserPlugin { + let trackerId: string; + let screenEntity: ScreenProps | undefined; + let screenSummary: ScreenSummaryProps | undefined; + let lastUpdate: Date | undefined; + let inForeground = true; + + // Update the screen summary foreground and background durations based on the time since the last update + const updateScreenSummaryDurations = () => { + if (screenSummary !== undefined && lastUpdate !== undefined) { + const timeDiffSec = (new Date().getTime() - lastUpdate.getTime()) / 1000; + if (inForeground) { + screenSummary.foreground_sec += timeDiffSec; + } else { + screenSummary.background_sec = (screenSummary.background_sec ?? 0) + timeDiffSec; + } + lastUpdate = new Date(); + } + }; + + // Update the screen summary scroll values based on the current event + const updateScreenSummaryScroll = (scrollChanged: ScrollChangedProps) => { + if (screenSummary) { + if (scrollChanged.yOffset !== undefined) { + const maxYOffset = scrollChanged.yOffset + (scrollChanged.viewHeight ?? 0); + screenSummary.max_y_offset = Math.max(maxYOffset, screenSummary.max_y_offset ?? maxYOffset); + + screenSummary.min_y_offset = Math.min( + scrollChanged.yOffset, + screenSummary.min_y_offset ?? scrollChanged.yOffset + ); + } + + if (scrollChanged.xOffset !== undefined) { + const maxXOffset = scrollChanged.xOffset + (scrollChanged.viewWidth ?? 0); + screenSummary.max_x_offset = Math.max(maxXOffset, screenSummary.max_x_offset ?? maxXOffset); + + screenSummary.min_x_offset = Math.min( + scrollChanged.xOffset, + screenSummary.min_x_offset ?? scrollChanged.xOffset + ); + } + + if (scrollChanged.contentHeight !== undefined) { + screenSummary.content_height = Math.max(scrollChanged.contentHeight, screenSummary.content_height ?? 0); + } + + if (scrollChanged.contentWidth !== undefined) { + screenSummary.content_width = Math.max(scrollChanged.contentWidth, screenSummary.content_width ?? 0); + } + } + }; + + // Update the screen summary list items based on the current event + const updateScreenSummaryListItems = (listItemView: ListItemViewProps) => { + if (screenSummary) { + screenSummary.last_item_index = Math.max( + listItemView.index, + screenSummary?.last_item_index ?? listItemView.index + ); + if (listItemView.itemsCount !== undefined) { + screenSummary.items_count = Math.max( + listItemView.itemsCount, + screenSummary.items_count ?? listItemView.itemsCount + ); + } + } + }; + + // Update the current screen view state + const updateScreenView = (screenView: ScreenViewProps) => { + if (screenEntity && !screenView.previousId && !screenView.previousName) { + screenView.previousId = screenEntity.id; + screenView.previousName = screenEntity.name; + screenView.previousType = screenEntity.type; + } + + const { name, id, type } = screenView; + if (name && id) { + screenEntity = { name, id, type }; + screenSummary = { foreground_sec: 0 }; + lastUpdate = new Date(); + } else { + screenEntity = undefined; + screenSummary = undefined; + lastUpdate = undefined; + } + }; + + return { + activateBrowserPlugin: (tracker) => { + trackerId = tracker.id; + _trackers[trackerId] = tracker; + }, + + beforeTrack: (payload) => { + const schemaAndData = getUsefulSchemaAndData(payload); + if (schemaAndData) { + const { schema, data, eventPayload } = schemaAndData; + + // For screen view events, we need to update the current state, + // and fill in missing previous references + if (schema === SCREEN_VIEW_EVENT_SCHEMA) { + const screenView = data as ScreenViewProps; + updateScreenView(screenView); + + // Replace the event payload with the updated screen view + payload.addJson('ue_px', 'ue_pr', { + ...eventPayload, + data: { schema, data: screenView }, + }); + } + + // For screen end events, we need to attach the screen summary entity + // These events are skipped if there is no screen summary to attach. + else if (schema === SCREEN_END_EVENT_SCHEMA) { + if (screenSummary && screenEngagementAutotracking) { + updateScreenSummaryDurations(); + payload.addContextEntity(buildScreenSummaryEntity(screenSummary)); + } else { + payload.add('__filter__', true); + } + } + + // For foreground events, we need to attach the screen summary entity + else if (schema == FOREGROUND_EVENT_SCHEMA && screenEngagementAutotracking) { + updateScreenSummaryDurations(); + inForeground = true; + if (screenSummary) { + payload.addContextEntity(buildScreenSummaryEntity(screenSummary)); + } + } + + // For background events, we need to attach the screen summary entity + else if (schema == BACKGROUND_EVENT_SCHEMA && screenEngagementAutotracking) { + updateScreenSummaryDurations(); + inForeground = false; + if (screenSummary) { + payload.addContextEntity(buildScreenSummaryEntity(screenSummary)); + } + } + + // For list item view events, we need to update the current state for screen summary + // These events are skipped if screenEngagementAutotracking is enabled. + else if (schema == LIST_ITEM_VIEW_EVENT_SCHEMA && screenEngagementAutotracking) { + const listItemView = data as ListItemViewProps; + updateScreenSummaryListItems(listItemView); + payload.add('__filter__', true); + } + + // For scroll changed events, we need to update the current state for screen summary + // These events are skipped if screenEngagementAutotracking is enabled. + else if (schema == SCROLL_CHANGED_EVENT_SCHEMA && screenEngagementAutotracking) { + const scrollChanged = data as ScrollChangedProps; + updateScreenSummaryScroll(scrollChanged); + payload.add('__filter__', true); + } + } + + // For all events, we need to attach the screen entity if screenContext is enabled + if (screenEntity && screenContext) { + payload.addContextEntity(buildScreenEntity(screenEntity)); + } + }, + + filter: (payload: Payload) => { + // Skip events that have been filtered out in the beforeTrack hook + return payload['__filter__'] === undefined; + }, + }; +} + +/** + * Track a screen view event. + * If screen engagement tracking is enabled, will also track a `screen_end` event with the screen summary information of the previous screen view. + * + * Schema: `iglu:com.snowplowanalytics.mobile/screen_view/jsonschema/1-0-0` + * + * @param props - The properties of the screen view event + * @param trackers - The tracker identifiers which the event will be sent to + */ +export function trackScreenView( + props: ScreenViewProps & CommonEventProperties, + trackers: Array = Object.keys(_trackers) +) { + const { context = [], timestamp, ...screenViewAttributes } = props; + if (!screenViewAttributes.id) { + screenViewAttributes.id = uuidv4(); + } + + dispatchToTrackersInCollection(trackers, _trackers, (t) => { + t.core.track(buildScreenEndEvent(), context, timestamp); + t.core.track(buildScreenViewEvent(screenViewAttributes), context, timestamp); + }); +} + +/** + * Event tracking the view of an item in a list. + * If screen engagement tracking is enabled, the list item view events will be aggregated into a `screen_summary` entity. + * + * Schema: `iglu:com.snowplowanalytics.mobile/list_item_view/jsonschema/1-0-0` + * + * @param props - The properties of the event + * @param trackers - The tracker identifiers which the event will be sent to + */ +export function trackListItemView( + props: ListItemViewProps & CommonEventProperties, + trackers: Array = Object.keys(_trackers) +) { + const { context = [], timestamp, ...listItemViewAttributes } = props; + + dispatchToTrackersInCollection(trackers, _trackers, (t) => { + t.core.track(buildListItemViewEvent(listItemViewAttributes), context, timestamp); + }); +} + +/** + * Event tracked when a scroll view's scroll position changes. + * If screen engagement tracking is enabled, the scroll changed events will be aggregated into a `screen_summary` entity. + * + * Schema: `iglu:com.snowplowanalytics.mobile/scroll_changed/jsonschema/1-0-0` + * + * @param props - The properties of the event + * @param trackers - The tracker identifiers which the event will be sent to + */ +export function trackScrollChanged( + props: ScrollChangedProps & CommonEventProperties, + trackers: Array = Object.keys(_trackers) +) { + const { context = [], timestamp, ...scrollChangedAttributes } = props; + + dispatchToTrackersInCollection(trackers, _trackers, (t) => { + t.core.track(buildScrollChangedEvent(scrollChangedAttributes), context, timestamp); + }); +} diff --git a/plugins/browser-plugin-screen-tracking/src/core.ts b/plugins/browser-plugin-screen-tracking/src/core.ts new file mode 100644 index 000000000..3cbba124d --- /dev/null +++ b/plugins/browser-plugin-screen-tracking/src/core.ts @@ -0,0 +1,70 @@ +import { buildSelfDescribingEvent } from '@snowplow/tracker-core'; +import { LIST_ITEM_VIEW_EVENT_SCHEMA, SCREEN_END_EVENT_SCHEMA, SCREEN_ENTITY_SCHEMA, SCREEN_SUMMARY_ENTITY_SCHEMA, SCREEN_VIEW_EVENT_SCHEMA, SCROLL_CHANGED_EVENT_SCHEMA } from './schemata'; +import { ListItemViewProps, ScreenProps, ScreenSummaryProps, ScreenViewProps, ScrollChangedProps } from './types'; + +export function buildScreenViewEvent(event: ScreenViewProps) { + return buildSelfDescribingEvent({ + event: { + schema: SCREEN_VIEW_EVENT_SCHEMA, + data: removeEmptyProperties({ ...event }), + }, + }); +} + +export function buildScreenEndEvent() { + return buildSelfDescribingEvent({ + event: { + schema: SCREEN_END_EVENT_SCHEMA, + data: {}, + }, + }); +} + +export function buildListItemViewEvent(event: ListItemViewProps) { + return buildSelfDescribingEvent({ + event: { + schema: LIST_ITEM_VIEW_EVENT_SCHEMA, + data: removeEmptyProperties({ ...event }), + }, + }); +} + +export function buildScrollChangedEvent(event: ScrollChangedProps) { + return buildSelfDescribingEvent({ + event: { + schema: SCROLL_CHANGED_EVENT_SCHEMA, + data: removeEmptyProperties({ ...event }), + }, + }); +} + +export function buildScreenEntity(entity: ScreenProps) { + return { + schema: SCREEN_ENTITY_SCHEMA, + data: removeEmptyProperties({ ...entity }), + }; +} + +export function buildScreenSummaryEntity(entity: ScreenSummaryProps) { + return { + schema: SCREEN_SUMMARY_ENTITY_SCHEMA, + data: removeEmptyProperties({ ...entity }), + }; +} + +/** + * Returns a copy of a JSON with undefined and null properties removed + * + * @param event - Object to clean + * @param exemptFields - Set of fields which should not be removed even if empty + * @returns A cleaned copy of eventJson + */ +function removeEmptyProperties(event: Record): Record { + const ret: Record = {}; + for (const k in event) { + if (event[k] !== null && typeof event[k] !== 'undefined') { + ret[k] = event[k]; + } + } + return ret; +} diff --git a/plugins/browser-plugin-screen-tracking/src/index.ts b/plugins/browser-plugin-screen-tracking/src/index.ts new file mode 100644 index 000000000..4d4b4e299 --- /dev/null +++ b/plugins/browser-plugin-screen-tracking/src/index.ts @@ -0,0 +1,2 @@ +export * from './api'; +export * from './types'; diff --git a/plugins/browser-plugin-screen-tracking/src/schemata.ts b/plugins/browser-plugin-screen-tracking/src/schemata.ts new file mode 100644 index 000000000..d5710591e --- /dev/null +++ b/plugins/browser-plugin-screen-tracking/src/schemata.ts @@ -0,0 +1,9 @@ +export const SCREEN_VIEW_EVENT_SCHEMA = 'iglu:com.snowplowanalytics.mobile/screen_view/jsonschema/1-0-0'; +export const SCREEN_END_EVENT_SCHEMA = 'iglu:com.snowplowanalytics.mobile/screen_end/jsonschema/1-0-0'; +export const FOREGROUND_EVENT_SCHEMA = 'iglu:com.snowplowanalytics.snowplow/application_foreground/jsonschema/1-0-0'; +export const BACKGROUND_EVENT_SCHEMA = 'iglu:com.snowplowanalytics.snowplow/application_background/jsonschema/1-0-0'; +export const LIST_ITEM_VIEW_EVENT_SCHEMA = 'iglu:com.snowplowanalytics.mobile/list_item_view/jsonschema/1-0-0'; +export const SCROLL_CHANGED_EVENT_SCHEMA = 'iglu:com.snowplowanalytics.mobile/scroll_changed/jsonschema/1-0-0'; + +export const SCREEN_ENTITY_SCHEMA = 'iglu:com.snowplowanalytics.mobile/screen/jsonschema/1-0-0'; +export const SCREEN_SUMMARY_ENTITY_SCHEMA = 'iglu:com.snowplowanalytics.mobile/screen_summary/jsonschema/1-0-0'; diff --git a/plugins/browser-plugin-screen-tracking/src/types.ts b/plugins/browser-plugin-screen-tracking/src/types.ts new file mode 100644 index 000000000..22e3da4e1 --- /dev/null +++ b/plugins/browser-plugin-screen-tracking/src/types.ts @@ -0,0 +1,141 @@ +export interface ScreenTrackingConfiguration { + /** + * Whether to enable tracking of the screen end event and the screen summary context entity. + * Make sure that you have lifecycle autotracking enabled for screen summary to have complete information. + * @default true + */ + screenEngagementAutotracking?: boolean; + + /** + * Whether to enable tracking of the screen context entity. + * @default true + */ + screenContext?: boolean; +} +/** + * ScreenView event properties + * schema: iglu:com.snowplowanalytics.mobile/screen_view/jsonschema/1-0-0 + */ +export type ScreenViewProps = { + /** + * The name of the screen viewed + */ + name: string; + /** + * The id(UUID) of screen that was viewed + * Will be automatically generated if not provided + */ + id?: string; + /** + * The type of screen that was viewed + */ + type?: string; + /** + * The name of the previous screen that was viewed + */ + previousName?: string; + /** + * The id(UUID) of the previous screen that was viewed + */ + previousId?: string; + /** + * The type of the previous screen that was viewed + */ + previousType?: string; + /** + * The type of transition that led to the screen being viewed + */ + transitionType?: string; +}; + +/** Screen context entity properties. */ +export type ScreenProps = { + /** The name of the screen viewed. */ + name: string; + /** The type of screen that was viewed e.g feed / carousel. */ + type?: string; + /** An ID from the associated screenview event. */ + id: string; + /** iOS specific: class name of the view controller. */ + viewController?: string; + /** iOS specific: class name of the top level view controller. */ + topViewController?: string; + /** Android specific: name of activity. */ + activity?: string; + /** Android specific: name of fragment. */ + fragment?: string; +}; + +/** + * Event tracked when a scroll view's scroll position changes. + * If screen engagement tracking is enabled, the scroll changed events will be aggregated into a `screen_summary` entity. + * + * Schema: `iglu:com.snowplowanalytics.mobile/scroll_changed/jsonschema/1-0-0` + */ +export type ScrollChangedProps = { + /** + * Vertical scroll offset in pixels + */ + yOffset?: number; + /** + * Horizontal scroll offset in pixels. + */ + xOffset?: number; + /** + * The height of the scroll view in pixels + */ + viewHeight?: number; + /** + * The width of the scroll view in pixels + */ + viewWidth?: number; + /** + * The height of the content in the scroll view in pixels + */ + contentHeight?: number; + /** + * The width of the content in the scroll view in pixels + */ + contentWidth?: number; +}; + +/** + * Event tracking the view of an item in a list. + * If screen engagement tracking is enabled, the list item view events will be aggregated into a `screen_summary` entity. + * + * Schema: `iglu:com.snowplowanalytics.mobile/list_item_view/jsonschema/1-0-0` + */ +export type ListItemViewProps = { + /** + * Index of the item in the list + */ + index: number; + /** + * Total number of items in the list + */ + itemsCount?: number; +}; + +/** Schema for an entity tracked with foreground/background/screen_end events with summary statistics about the screen view */ +export type ScreenSummaryProps = { + /** Time in seconds spent on the current screen while the app was in foreground */ + foreground_sec: number; + /** Time in seconds spent on the current screen while the app was in background */ + background_sec?: number; + /** Index of the last viewed item in the list on the screen */ + last_item_index?: number; + /** Total number of items in the list on the screen */ + items_count?: number; + /** Minimum horizontal scroll offset on the scroll view in pixels */ + min_x_offset?: number; + /** Maximum horizontal scroll offset on the scroll view in pixels */ + max_x_offset?: number; + /** Minimum vertical scroll offset on the scroll view in pixels */ + min_y_offset?: number; + /** Maximum vertical scroll offset on the scroll view in pixels */ + max_y_offset?: number; + /** Width of the scroll view in pixels */ + content_width?: number; + /** Height of the scroll view in pixels */ + content_height?: number; +}; diff --git a/plugins/browser-plugin-screen-tracking/src/utils.ts b/plugins/browser-plugin-screen-tracking/src/utils.ts new file mode 100644 index 000000000..4df344186 --- /dev/null +++ b/plugins/browser-plugin-screen-tracking/src/utils.ts @@ -0,0 +1,18 @@ +import { PayloadBuilder } from '@snowplow/tracker-core'; + +// Returns the "useful" schema, i.e. what would someone want to use to identify events. +// For some events this is the 'e' property but for self-describing events, this is the +// 'schema' from the 'ue_px' field. +export function getUsefulSchemaAndData(sb: PayloadBuilder) { + let eventJson = sb.getJson(); + for (const json of eventJson) { + if (json.keyIfEncoded === 'ue_px' && typeof json.json['data'] === 'object') { + const schema = (json.json['data'] as Record)['schema']; + if (typeof schema == 'string') { + const data = json.json['data'] as Record; + return { schema, data: data.data as Record, eventPayload: json.json }; + } + } + } + return undefined; +} diff --git a/plugins/browser-plugin-screen-tracking/test/screen.test.ts b/plugins/browser-plugin-screen-tracking/test/screen.test.ts new file mode 100644 index 000000000..bb440fd4e --- /dev/null +++ b/plugins/browser-plugin-screen-tracking/test/screen.test.ts @@ -0,0 +1,110 @@ +import { addTracker, SharedState, EventStore, BrowserTracker } from '@snowplow/browser-tracker-core'; +import { ScreenTrackingPlugin, trackScreenView } from '../src'; +import { newInMemoryEventStore } from '@snowplow/tracker-core'; +import { SCREEN_ENTITY_SCHEMA, SCREEN_VIEW_EVENT_SCHEMA } from '../src/schemata'; + +describe('ScreenTrackingPlugin', () => { + let idx = 1; + let eventStore: EventStore; + let tracker: BrowserTracker | null; + + describe('Enabled screen context tracking', () => { + beforeEach(() => { + eventStore = newInMemoryEventStore({}); + const customFetch = async () => new Response(null, { status: 500 }); + tracker = addTracker(`sp${idx++}`, `sp${idx++}`, 'js-3.0.0', '', new SharedState(), { + plugins: [ScreenTrackingPlugin()], + eventStore, + customFetch, + contexts: { webPage: false }, + }); + }); + + it('adds id and previous screen view references', async () => { + trackScreenView({ + id: '1', + name: 'Home', + }); + + let [{ ue_pr }] = await eventStore.getAllPayloads(); + let event = JSON.parse(ue_pr as string).data; + expect(event.schema).toBe(SCREEN_VIEW_EVENT_SCHEMA); + expect(event.data).toMatchObject({ + name: 'Home', + id: '1', + }); + + trackScreenView({ + name: 'About', + }); + + [, , { ue_pr }] = await eventStore.getAllPayloads(); + event = JSON.parse(ue_pr as string).data; + expect(event.schema).toBe(SCREEN_VIEW_EVENT_SCHEMA); + expect(event.data).toMatchObject({ + name: 'About', + id: expect.any(String), + previousName: 'Home', + previousId: '1', + }); + }); + + it('adds screen context entity to all events', async () => { + trackScreenView({ + id: '1', + name: 'Home', + }); + + let [{ co }] = await eventStore.getAllPayloads(); + let context = JSON.parse(co as string).data; + expect(context).toEqual([ + { + schema: SCREEN_ENTITY_SCHEMA, + data: { + name: 'Home', + id: '1', + }, + }, + ]); + + tracker?.trackPageView(); + + [, { co }] = await eventStore.getAllPayloads(); + context = JSON.parse(co as string).data; + expect(context).toEqual([ + { + schema: SCREEN_ENTITY_SCHEMA, + data: { + name: 'Home', + id: '1', + }, + }, + ]); + }); + }); + + describe('Disabled screen context tracking', () => { + beforeEach(() => { + eventStore = newInMemoryEventStore({}); + const customFetch = async () => new Response(null, { status: 500 }); + tracker = addTracker(`sp${idx++}`, `sp${idx++}`, 'js-3.0.0', '', new SharedState(), { + plugins: [ScreenTrackingPlugin({ screenContext: false })], + eventStore, + customFetch, + contexts: { webPage: false }, + }); + }); + + it('does not add screen context entity to events', async () => { + trackScreenView({ name: 'Home' }); + + let [{ co }] = await eventStore.getAllPayloads(); + expect(co).toBeUndefined(); + + tracker?.trackPageView(); + + [, { co }] = await eventStore.getAllPayloads(); + expect(co).toBeUndefined(); + }); + }); +}); diff --git a/plugins/browser-plugin-screen-tracking/test/screen_summary.test.ts b/plugins/browser-plugin-screen-tracking/test/screen_summary.test.ts new file mode 100644 index 000000000..f86454980 --- /dev/null +++ b/plugins/browser-plugin-screen-tracking/test/screen_summary.test.ts @@ -0,0 +1,215 @@ +import { addTracker, SharedState, EventStore, BrowserTracker } from '@snowplow/browser-tracker-core'; +import { ScreenTrackingPlugin, trackListItemView, trackScreenView, trackScrollChanged } from '../src'; +import { buildSelfDescribingEvent, newInMemoryEventStore } from '@snowplow/tracker-core'; +import { BACKGROUND_EVENT_SCHEMA, SCREEN_END_EVENT_SCHEMA, SCREEN_SUMMARY_ENTITY_SCHEMA, SCREEN_VIEW_EVENT_SCHEMA } from '../src/schemata'; + +describe('Screen summary tracking', () => { + let idx = 1; + let eventStore: EventStore; + let tracker: BrowserTracker | null; + + beforeAll(() => { + jest.useFakeTimers(); + }); + + afterAll(() => { + jest.clearAllTimers(); + }); + + describe('Enabled screen engagement tracking', () => { + beforeEach(() => { + eventStore = newInMemoryEventStore({}); + const customFetch = async () => new Response(null, { status: 500 }); + tracker = addTracker(`sp${idx++}`, `sp${idx++}`, 'js-3.0.0', '', new SharedState(), { + plugins: [ScreenTrackingPlugin()], + eventStore, + customFetch, + contexts: { webPage: false }, + }); + }); + + it('adds a screen summary entity to screen end event', async () => { + jest.setSystemTime(new Date('2022-04-17T00:00:00.000Z')); + trackScreenView({ name: 'Home' }); + + jest.setSystemTime(new Date('2022-04-17T00:00:15.000Z')); + trackScreenView({ name: 'About' }); + + const [, { ue_pr, co }] = await eventStore.getAllPayloads(); + const event = JSON.parse(ue_pr as string).data; + expect(event.schema).toBe(SCREEN_END_EVENT_SCHEMA); + + const context = JSON.parse(co as string).data; + const screenSummary = context.find((c: any) => c.schema === SCREEN_SUMMARY_ENTITY_SCHEMA); + expect(screenSummary.data).toMatchObject({ + foreground_sec: 15, + }); + + jest.setSystemTime(new Date('2022-04-17T00:00:45.000Z')); + trackScreenView({ name: 'Contact' }); + + const [, , , { ue_pr: ue_pr2, co: co2 }] = await eventStore.getAllPayloads(); + const event2 = JSON.parse(ue_pr2 as string).data; + expect(event2.schema).toBe(SCREEN_END_EVENT_SCHEMA); + + const context2 = JSON.parse(co2 as string).data; + const screenSummary2 = context2.find((c: any) => c.schema === SCREEN_SUMMARY_ENTITY_SCHEMA); + expect(screenSummary2.data).toMatchObject({ + foreground_sec: 30, + }); + }); + + it('tracks both background and foreground time', async () => { + jest.setSystemTime(new Date('2022-04-17T00:00:00.000Z')); + trackScreenView({ name: 'Home' }); + + jest.setSystemTime(new Date('2022-04-17T00:00:15.000Z')); + tracker?.core.track( + buildSelfDescribingEvent({ + event: { + schema: BACKGROUND_EVENT_SCHEMA, + data: {}, + }, + }) + ); + + jest.setSystemTime(new Date('2022-04-17T00:00:25.000Z')); + trackScreenView({ name: 'About' }); + + const [, { ue_pr, co }, { ue_pr: ue_pr2, co: co2 }] = await eventStore.getAllPayloads(); + + const event = JSON.parse(ue_pr as string).data; + expect(event.schema).toBe(BACKGROUND_EVENT_SCHEMA); + + const context = JSON.parse(co as string).data; + const screenSummary = context.find((c: any) => c.schema === SCREEN_SUMMARY_ENTITY_SCHEMA); + expect(screenSummary.data).toMatchObject({ + foreground_sec: 15, + }); + + const event2 = JSON.parse(ue_pr2 as string).data; + expect(event2.schema).toBe(SCREEN_END_EVENT_SCHEMA); + + const context2 = JSON.parse(co2 as string).data; + const screenSummary2 = context2.find((c: any) => c.schema === SCREEN_SUMMARY_ENTITY_SCHEMA); + expect(screenSummary2.data).toMatchObject({ + foreground_sec: 15, + background_sec: 10, + }); + }); + + it('adds scroll information to screen summary entity', async () => { + trackScreenView({ name: 'Home' }); + + trackScrollChanged({ + yOffset: 10, + xOffset: 0, + viewHeight: 1000, + viewWidth: 100, + contentHeight: 2000, + contentWidth: 1000, + }); + + trackScrollChanged({ + yOffset: 500, + xOffset: 10, + viewHeight: 1000, + viewWidth: 100, + contentHeight: 2000, + contentWidth: 1000, + }); + + trackScreenView({ name: 'About' }); + + const payloads = await eventStore.getAllPayloads(); + expect(payloads.length).toBe(3); + const [, { co }] = payloads; + const context = JSON.parse(co as string).data; + const screenSummary = context.find((c: any) => c.schema === SCREEN_SUMMARY_ENTITY_SCHEMA); + expect(screenSummary.data).toMatchObject({ + min_x_offset: 0, + max_x_offset: 10 + 100, + min_y_offset: 10, + max_y_offset: 500 + 1000, + content_height: 2000, + content_width: 1000, + }); + }); + + it('adds list item view information to screen summary entity', async () => { + trackScreenView({ name: 'Home' }); + + trackListItemView({ + index: 0, + itemsCount: 10, + }); + + trackListItemView({ + index: 5, + itemsCount: 10, + }); + + trackScreenView({ name: 'About' }); + + const payloads = await eventStore.getAllPayloads(); + expect(payloads.length).toBe(3); + const [, { co }] = payloads; + const context = JSON.parse(co as string).data; + const screenSummary = context.find((c: any) => c.schema === SCREEN_SUMMARY_ENTITY_SCHEMA); + expect(screenSummary.data).toMatchObject({ + last_item_index: 5, + items_count: 10, + }); + }); + }); + + describe('Disabled screen engagement tracking', () => { + beforeEach(() => { + eventStore = newInMemoryEventStore({}); + const customFetch = async () => new Response(null, { status: 500 }); + tracker = addTracker(`sp${idx++}`, `sp${idx++}`, 'js-3.0.0', '', new SharedState(), { + plugins: [ScreenTrackingPlugin({ screenEngagementAutotracking: false })], + eventStore, + customFetch, + contexts: { webPage: false }, + }); + }); + + it('does not add a screen end event', async () => { + jest.setSystemTime(new Date('2022-04-17T00:00:00.000Z')); + trackScreenView({ name: 'Home' }); + + jest.setSystemTime(new Date('2022-04-17T00:00:15.000Z')); + trackScreenView({ name: 'About' }); + + const payloads = await eventStore.getAllPayloads(); + expect(payloads.length).toBe(2); + const [, { ue_pr }] = payloads; + const event = JSON.parse(ue_pr as string).data; + expect(event.schema).toBe(SCREEN_VIEW_EVENT_SCHEMA); + }); + + it('tracks scroll and list item view events', async () => { + trackScreenView({ name: 'Home' }); + + trackScrollChanged({ + yOffset: 10, + xOffset: 0, + viewHeight: 1000, + viewWidth: 100, + contentHeight: 2000, + contentWidth: 1000, + }); + + trackListItemView({ + index: 0, + itemsCount: 10, + }); + + trackScreenView({ name: 'About' }); + + const payloads = await eventStore.getAllPayloads(); + expect(payloads.length).toBe(4); + }); + }); +}); diff --git a/plugins/browser-plugin-screen-tracking/tsconfig.json b/plugins/browser-plugin-screen-tracking/tsconfig.json new file mode 100644 index 000000000..4082f16a5 --- /dev/null +++ b/plugins/browser-plugin-screen-tracking/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "../../tsconfig.json" +} diff --git a/plugins/browser-plugin-site-tracking/CHANGELOG.json b/plugins/browser-plugin-site-tracking/CHANGELOG.json index af724ca43..b25ff1d6e 100644 --- a/plugins/browser-plugin-site-tracking/CHANGELOG.json +++ b/plugins/browser-plugin-site-tracking/CHANGELOG.json @@ -1,6 +1,174 @@ { "name": "@snowplow/browser-plugin-site-tracking", "entries": [ + { + "version": "4.10.1", + "tag": "@snowplow/browser-plugin-site-tracking_v4.10.1", + "date": "Wed, 19 Aug 2026 14:26:05 GMT", + "comments": {} + }, + { + "version": "4.10.0", + "tag": "@snowplow/browser-plugin-site-tracking_v4.10.0", + "date": "Mon, 27 Jul 2026 13:52:14 GMT", + "comments": {} + }, + { + "version": "4.9.0", + "tag": "@snowplow/browser-plugin-site-tracking_v4.9.0", + "date": "Tue, 21 Jul 2026 14:53:08 GMT", + "comments": {} + }, + { + "version": "4.8.4", + "tag": "@snowplow/browser-plugin-site-tracking_v4.8.4", + "date": "Thu, 02 Jul 2026 10:07:52 GMT", + "comments": {} + }, + { + "version": "4.8.3", + "tag": "@snowplow/browser-plugin-site-tracking_v4.8.3", + "date": "Tue, 30 Jun 2026 14:22:03 GMT", + "comments": { + "none": [ + { + "comment": "Update uuid to v11 and remove closure-compiler from the build pipeline" + } + ] + } + }, + { + "version": "4.8.2", + "tag": "@snowplow/browser-plugin-site-tracking_v4.8.2", + "date": "Wed, 17 Jun 2026 12:30:12 GMT", + "comments": {} + }, + { + "version": "4.8.1", + "tag": "@snowplow/browser-plugin-site-tracking_v4.8.1", + "date": "Wed, 13 May 2026 09:26:05 GMT", + "comments": {} + }, + { + "version": "4.8.0", + "tag": "@snowplow/browser-plugin-site-tracking_v4.8.0", + "date": "Tue, 28 Apr 2026 07:56:22 GMT", + "comments": {} + }, + { + "version": "4.7.0", + "tag": "@snowplow/browser-plugin-site-tracking_v4.7.0", + "date": "Wed, 01 Apr 2026 12:59:29 GMT", + "comments": {} + }, + { + "version": "4.6.9", + "tag": "@snowplow/browser-plugin-site-tracking_v4.6.9", + "date": "Mon, 16 Mar 2026 15:43:06 GMT", + "comments": {} + }, + { + "version": "4.6.8", + "tag": "@snowplow/browser-plugin-site-tracking_v4.6.8", + "date": "Tue, 28 Oct 2025 09:46:42 GMT", + "comments": {} + }, + { + "version": "4.6.7", + "tag": "@snowplow/browser-plugin-site-tracking_v4.6.7", + "date": "Tue, 07 Oct 2025 14:53:36 GMT", + "comments": {} + }, + { + "version": "4.6.6", + "tag": "@snowplow/browser-plugin-site-tracking_v4.6.6", + "date": "Tue, 26 Aug 2025 08:42:27 GMT", + "comments": {} + }, + { + "version": "4.6.5", + "tag": "@snowplow/browser-plugin-site-tracking_v4.6.5", + "date": "Wed, 25 Jun 2025 21:16:46 GMT", + "comments": {} + }, + { + "version": "4.6.4", + "tag": "@snowplow/browser-plugin-site-tracking_v4.6.4", + "date": "Wed, 25 Jun 2025 12:08:50 GMT", + "comments": {} + }, + { + "version": "4.6.3", + "tag": "@snowplow/browser-plugin-site-tracking_v4.6.3", + "date": "Thu, 29 May 2025 19:52:07 GMT", + "comments": {} + }, + { + "version": "4.6.2", + "tag": "@snowplow/browser-plugin-site-tracking_v4.6.2", + "date": "Tue, 20 May 2025 07:39:05 GMT", + "comments": {} + }, + { + "version": "4.6.1", + "tag": "@snowplow/browser-plugin-site-tracking_v4.6.1", + "date": "Tue, 06 May 2025 13:10:51 GMT", + "comments": {} + }, + { + "version": "4.6.0", + "tag": "@snowplow/browser-plugin-site-tracking_v4.6.0", + "date": "Thu, 01 May 2025 09:58:59 GMT", + "comments": {} + }, + { + "version": "4.5.0", + "tag": "@snowplow/browser-plugin-site-tracking_v4.5.0", + "date": "Fri, 04 Apr 2025 09:21:23 GMT", + "comments": {} + }, + { + "version": "4.4.0", + "tag": "@snowplow/browser-plugin-site-tracking_v4.4.0", + "date": "Thu, 20 Mar 2025 12:14:34 GMT", + "comments": {} + }, + { + "version": "4.3.1", + "tag": "@snowplow/browser-plugin-site-tracking_v4.3.1", + "date": "Tue, 21 Jan 2025 11:09:42 GMT", + "comments": {} + }, + { + "version": "4.3.0", + "tag": "@snowplow/browser-plugin-site-tracking_v4.3.0", + "date": "Mon, 20 Jan 2025 11:45:13 GMT", + "comments": {} + }, + { + "version": "4.2.0", + "tag": "@snowplow/browser-plugin-site-tracking_v4.2.0", + "date": "Mon, 13 Jan 2025 08:30:05 GMT", + "comments": {} + }, + { + "version": "4.1.0", + "tag": "@snowplow/browser-plugin-site-tracking_v4.1.0", + "date": "Thu, 28 Nov 2024 10:57:30 GMT", + "comments": {} + }, + { + "version": "4.0.4", + "tag": "@snowplow/browser-plugin-site-tracking_v4.0.4", + "date": "Thu, 21 Nov 2024 09:06:36 GMT", + "comments": {} + }, + { + "version": "4.0.3", + "tag": "@snowplow/browser-plugin-site-tracking_v4.0.3", + "date": "Wed, 20 Nov 2024 09:30:31 GMT", + "comments": {} + }, { "version": "4.0.2", "tag": "@snowplow/browser-plugin-site-tracking_v4.0.2", diff --git a/plugins/browser-plugin-site-tracking/CHANGELOG.md b/plugins/browser-plugin-site-tracking/CHANGELOG.md index 4c8b7d052..0e4a6da68 100644 --- a/plugins/browser-plugin-site-tracking/CHANGELOG.md +++ b/plugins/browser-plugin-site-tracking/CHANGELOG.md @@ -1,6 +1,143 @@ # Change Log - @snowplow/browser-plugin-site-tracking -This log was last generated on Mon, 11 Nov 2024 15:46:34 GMT and should not be manually modified. +This log was last generated on Wed, 19 Aug 2026 14:26:05 GMT and should not be manually modified. + +## 4.10.1 +Wed, 19 Aug 2026 14:26:05 GMT + +_Version update only_ + +## 4.10.0 +Mon, 27 Jul 2026 13:52:14 GMT + +_Version update only_ + +## 4.9.0 +Tue, 21 Jul 2026 14:53:08 GMT + +_Version update only_ + +## 4.8.4 +Thu, 02 Jul 2026 10:07:52 GMT + +_Version update only_ + +## 4.8.3 +Tue, 30 Jun 2026 14:22:03 GMT + +### Updates + +- Update uuid to v11 and remove closure-compiler from the build pipeline + +## 4.8.2 +Wed, 17 Jun 2026 12:30:12 GMT + +_Version update only_ + +## 4.8.1 +Wed, 13 May 2026 09:26:05 GMT + +_Version update only_ + +## 4.8.0 +Tue, 28 Apr 2026 07:56:22 GMT + +_Version update only_ + +## 4.7.0 +Wed, 01 Apr 2026 12:59:29 GMT + +_Version update only_ + +## 4.6.9 +Mon, 16 Mar 2026 15:43:06 GMT + +_Version update only_ + +## 4.6.8 +Tue, 28 Oct 2025 09:46:42 GMT + +_Version update only_ + +## 4.6.7 +Tue, 07 Oct 2025 14:53:36 GMT + +_Version update only_ + +## 4.6.6 +Tue, 26 Aug 2025 08:42:27 GMT + +_Version update only_ + +## 4.6.5 +Wed, 25 Jun 2025 21:16:46 GMT + +_Version update only_ + +## 4.6.4 +Wed, 25 Jun 2025 12:08:50 GMT + +_Version update only_ + +## 4.6.3 +Thu, 29 May 2025 19:52:07 GMT + +_Version update only_ + +## 4.6.2 +Tue, 20 May 2025 07:39:05 GMT + +_Version update only_ + +## 4.6.1 +Tue, 06 May 2025 13:10:51 GMT + +_Version update only_ + +## 4.6.0 +Thu, 01 May 2025 09:58:59 GMT + +_Version update only_ + +## 4.5.0 +Fri, 04 Apr 2025 09:21:23 GMT + +_Version update only_ + +## 4.4.0 +Thu, 20 Mar 2025 12:14:34 GMT + +_Version update only_ + +## 4.3.1 +Tue, 21 Jan 2025 11:09:42 GMT + +_Version update only_ + +## 4.3.0 +Mon, 20 Jan 2025 11:45:13 GMT + +_Version update only_ + +## 4.2.0 +Mon, 13 Jan 2025 08:30:05 GMT + +_Version update only_ + +## 4.1.0 +Thu, 28 Nov 2024 10:57:30 GMT + +_Version update only_ + +## 4.0.4 +Thu, 21 Nov 2024 09:06:36 GMT + +_Version update only_ + +## 4.0.3 +Wed, 20 Nov 2024 09:30:31 GMT + +_Version update only_ ## 4.0.2 Mon, 11 Nov 2024 15:46:34 GMT diff --git a/plugins/browser-plugin-site-tracking/package.json b/plugins/browser-plugin-site-tracking/package.json index af403f556..85104e7fb 100644 --- a/plugins/browser-plugin-site-tracking/package.json +++ b/plugins/browser-plugin-site-tracking/package.json @@ -1,6 +1,6 @@ { "name": "@snowplow/browser-plugin-site-tracking", - "version": "4.0.2", + "version": "4.10.1", "description": "Site tracking for Snowplow", "homepage": "http://bit.ly/sp-js", "bugs": "https://github.com/snowplow/snowplow-javascript-tracker/issues", @@ -27,18 +27,17 @@ "tslib": "^2.3.1" }, "devDependencies": { - "@ampproject/rollup-plugin-closure-compiler": "~0.27.0", "@rollup/plugin-commonjs": "~21.0.2", "@rollup/plugin-node-resolve": "~13.1.3", - "@types/jest": "~27.4.1", + "@types/jest": "~28.1.1", "@types/jsdom": "~16.2.14", "@types/lodash": "~4.14.180", "@typescript-eslint/eslint-plugin": "~5.15.0", "@typescript-eslint/parser": "~5.15.0", "eslint": "~8.11.0", - "jest": "~27.5.1", - "jest-environment-jsdom": "~27.5.1", - "jest-environment-jsdom-global": "~3.0.0", + "jest": "~28.1.3", + "jest-environment-jsdom": "~28.1.3", + "jest-environment-jsdom-global": "~4.0.0", "jest-standard-reporter": "~2.0.0", "lodash": "~4.17.21", "rollup": "~2.70.1", @@ -46,10 +45,10 @@ "rollup-plugin-license": "~2.6.1", "rollup-plugin-terser": "~7.0.2", "rollup-plugin-ts": "~2.0.5", - "ts-jest": "~27.1.3", + "ts-jest": "~28.0.8", "typescript": "~4.6.2" }, "peerDependencies": { - "@snowplow/browser-tracker": "~4.0.2" + "@snowplow/browser-tracker": "~4.10.1" } } diff --git a/plugins/browser-plugin-site-tracking/rollup.config.js b/plugins/browser-plugin-site-tracking/rollup.config.js index ed8d2fa44..71cebc6a2 100644 --- a/plugins/browser-plugin-site-tracking/rollup.config.js +++ b/plugins/browser-plugin-site-tracking/rollup.config.js @@ -32,7 +32,6 @@ import { nodeResolve } from '@rollup/plugin-node-resolve'; import commonjs from '@rollup/plugin-commonjs'; import ts from 'rollup-plugin-ts'; // Prefered over @rollup/plugin-typescript as it bundles .d.ts files import { banner } from '../../banner'; -import compiler from '@ampproject/rollup-plugin-closure-compiler'; import { terser } from 'rollup-plugin-terser'; import cleanup from 'rollup-plugin-cleanup'; import pkg from './package.json'; @@ -51,7 +50,7 @@ export default [ }, { input: './src/index.ts', - plugins: [...umdPlugins, compiler(), terser(), cleanup({ comments: 'none' }), banner()], + plugins: [...umdPlugins, terser(), cleanup({ comments: 'none' }), banner()], treeshake: { moduleSideEffects: ['sha1'] }, output: [{ file: pkg.main.replace('.js', '.min.js'), format: 'umd', sourcemap: true, name: umdName }], }, diff --git a/plugins/browser-plugin-snowplow-ecommerce/CHANGELOG.json b/plugins/browser-plugin-snowplow-ecommerce/CHANGELOG.json index c2b9a66ec..f2e9cfc58 100644 --- a/plugins/browser-plugin-snowplow-ecommerce/CHANGELOG.json +++ b/plugins/browser-plugin-snowplow-ecommerce/CHANGELOG.json @@ -1,6 +1,180 @@ { "name": "@snowplow/browser-plugin-snowplow-ecommerce", "entries": [ + { + "version": "4.10.1", + "tag": "@snowplow/browser-plugin-snowplow-ecommerce_v4.10.1", + "date": "Wed, 19 Aug 2026 14:26:05 GMT", + "comments": {} + }, + { + "version": "4.10.0", + "tag": "@snowplow/browser-plugin-snowplow-ecommerce_v4.10.0", + "date": "Mon, 27 Jul 2026 13:52:14 GMT", + "comments": {} + }, + { + "version": "4.9.0", + "tag": "@snowplow/browser-plugin-snowplow-ecommerce_v4.9.0", + "date": "Tue, 21 Jul 2026 14:53:08 GMT", + "comments": {} + }, + { + "version": "4.8.4", + "tag": "@snowplow/browser-plugin-snowplow-ecommerce_v4.8.4", + "date": "Thu, 02 Jul 2026 10:07:52 GMT", + "comments": {} + }, + { + "version": "4.8.3", + "tag": "@snowplow/browser-plugin-snowplow-ecommerce_v4.8.3", + "date": "Tue, 30 Jun 2026 14:22:03 GMT", + "comments": { + "none": [ + { + "comment": "Update uuid to v11 and remove closure-compiler from the build pipeline" + } + ] + } + }, + { + "version": "4.8.2", + "tag": "@snowplow/browser-plugin-snowplow-ecommerce_v4.8.2", + "date": "Wed, 17 Jun 2026 12:30:12 GMT", + "comments": {} + }, + { + "version": "4.8.1", + "tag": "@snowplow/browser-plugin-snowplow-ecommerce_v4.8.1", + "date": "Wed, 13 May 2026 09:26:05 GMT", + "comments": {} + }, + { + "version": "4.8.0", + "tag": "@snowplow/browser-plugin-snowplow-ecommerce_v4.8.0", + "date": "Tue, 28 Apr 2026 07:56:22 GMT", + "comments": {} + }, + { + "version": "4.7.0", + "tag": "@snowplow/browser-plugin-snowplow-ecommerce_v4.7.0", + "date": "Wed, 01 Apr 2026 12:59:29 GMT", + "comments": {} + }, + { + "version": "4.6.9", + "tag": "@snowplow/browser-plugin-snowplow-ecommerce_v4.6.9", + "date": "Mon, 16 Mar 2026 15:43:06 GMT", + "comments": {} + }, + { + "version": "4.6.8", + "tag": "@snowplow/browser-plugin-snowplow-ecommerce_v4.6.8", + "date": "Tue, 28 Oct 2025 09:46:42 GMT", + "comments": {} + }, + { + "version": "4.6.7", + "tag": "@snowplow/browser-plugin-snowplow-ecommerce_v4.6.7", + "date": "Tue, 07 Oct 2025 14:53:36 GMT", + "comments": {} + }, + { + "version": "4.6.6", + "tag": "@snowplow/browser-plugin-snowplow-ecommerce_v4.6.6", + "date": "Tue, 26 Aug 2025 08:42:27 GMT", + "comments": {} + }, + { + "version": "4.6.5", + "tag": "@snowplow/browser-plugin-snowplow-ecommerce_v4.6.5", + "date": "Wed, 25 Jun 2025 21:16:46 GMT", + "comments": {} + }, + { + "version": "4.6.4", + "tag": "@snowplow/browser-plugin-snowplow-ecommerce_v4.6.4", + "date": "Wed, 25 Jun 2025 12:08:50 GMT", + "comments": { + "none": [ + { + "comment": "Fixing GA4 Ecommerce functions to use finalCartValue within ecommerce object" + } + ] + } + }, + { + "version": "4.6.3", + "tag": "@snowplow/browser-plugin-snowplow-ecommerce_v4.6.3", + "date": "Thu, 29 May 2025 19:52:07 GMT", + "comments": {} + }, + { + "version": "4.6.2", + "tag": "@snowplow/browser-plugin-snowplow-ecommerce_v4.6.2", + "date": "Tue, 20 May 2025 07:39:05 GMT", + "comments": {} + }, + { + "version": "4.6.1", + "tag": "@snowplow/browser-plugin-snowplow-ecommerce_v4.6.1", + "date": "Tue, 06 May 2025 13:10:51 GMT", + "comments": {} + }, + { + "version": "4.6.0", + "tag": "@snowplow/browser-plugin-snowplow-ecommerce_v4.6.0", + "date": "Thu, 01 May 2025 09:58:59 GMT", + "comments": {} + }, + { + "version": "4.5.0", + "tag": "@snowplow/browser-plugin-snowplow-ecommerce_v4.5.0", + "date": "Fri, 04 Apr 2025 09:21:23 GMT", + "comments": {} + }, + { + "version": "4.4.0", + "tag": "@snowplow/browser-plugin-snowplow-ecommerce_v4.4.0", + "date": "Thu, 20 Mar 2025 12:14:34 GMT", + "comments": {} + }, + { + "version": "4.3.1", + "tag": "@snowplow/browser-plugin-snowplow-ecommerce_v4.3.1", + "date": "Tue, 21 Jan 2025 11:09:42 GMT", + "comments": {} + }, + { + "version": "4.3.0", + "tag": "@snowplow/browser-plugin-snowplow-ecommerce_v4.3.0", + "date": "Mon, 20 Jan 2025 11:45:13 GMT", + "comments": {} + }, + { + "version": "4.2.0", + "tag": "@snowplow/browser-plugin-snowplow-ecommerce_v4.2.0", + "date": "Mon, 13 Jan 2025 08:30:05 GMT", + "comments": {} + }, + { + "version": "4.1.0", + "tag": "@snowplow/browser-plugin-snowplow-ecommerce_v4.1.0", + "date": "Thu, 28 Nov 2024 10:57:30 GMT", + "comments": {} + }, + { + "version": "4.0.4", + "tag": "@snowplow/browser-plugin-snowplow-ecommerce_v4.0.4", + "date": "Thu, 21 Nov 2024 09:06:36 GMT", + "comments": {} + }, + { + "version": "4.0.3", + "tag": "@snowplow/browser-plugin-snowplow-ecommerce_v4.0.3", + "date": "Wed, 20 Nov 2024 09:30:31 GMT", + "comments": {} + }, { "version": "4.0.2", "tag": "@snowplow/browser-plugin-snowplow-ecommerce_v4.0.2", diff --git a/plugins/browser-plugin-snowplow-ecommerce/CHANGELOG.md b/plugins/browser-plugin-snowplow-ecommerce/CHANGELOG.md index 4b40f59cd..e2f4eaad7 100644 --- a/plugins/browser-plugin-snowplow-ecommerce/CHANGELOG.md +++ b/plugins/browser-plugin-snowplow-ecommerce/CHANGELOG.md @@ -1,6 +1,145 @@ # Change Log - @snowplow/browser-plugin-snowplow-ecommerce -This log was last generated on Mon, 11 Nov 2024 15:46:34 GMT and should not be manually modified. +This log was last generated on Wed, 19 Aug 2026 14:26:05 GMT and should not be manually modified. + +## 4.10.1 +Wed, 19 Aug 2026 14:26:05 GMT + +_Version update only_ + +## 4.10.0 +Mon, 27 Jul 2026 13:52:14 GMT + +_Version update only_ + +## 4.9.0 +Tue, 21 Jul 2026 14:53:08 GMT + +_Version update only_ + +## 4.8.4 +Thu, 02 Jul 2026 10:07:52 GMT + +_Version update only_ + +## 4.8.3 +Tue, 30 Jun 2026 14:22:03 GMT + +### Updates + +- Update uuid to v11 and remove closure-compiler from the build pipeline + +## 4.8.2 +Wed, 17 Jun 2026 12:30:12 GMT + +_Version update only_ + +## 4.8.1 +Wed, 13 May 2026 09:26:05 GMT + +_Version update only_ + +## 4.8.0 +Tue, 28 Apr 2026 07:56:22 GMT + +_Version update only_ + +## 4.7.0 +Wed, 01 Apr 2026 12:59:29 GMT + +_Version update only_ + +## 4.6.9 +Mon, 16 Mar 2026 15:43:06 GMT + +_Version update only_ + +## 4.6.8 +Tue, 28 Oct 2025 09:46:42 GMT + +_Version update only_ + +## 4.6.7 +Tue, 07 Oct 2025 14:53:36 GMT + +_Version update only_ + +## 4.6.6 +Tue, 26 Aug 2025 08:42:27 GMT + +_Version update only_ + +## 4.6.5 +Wed, 25 Jun 2025 21:16:46 GMT + +_Version update only_ + +## 4.6.4 +Wed, 25 Jun 2025 12:08:50 GMT + +### Updates + +- Fixing GA4 Ecommerce functions to use finalCartValue within ecommerce object + +## 4.6.3 +Thu, 29 May 2025 19:52:07 GMT + +_Version update only_ + +## 4.6.2 +Tue, 20 May 2025 07:39:05 GMT + +_Version update only_ + +## 4.6.1 +Tue, 06 May 2025 13:10:51 GMT + +_Version update only_ + +## 4.6.0 +Thu, 01 May 2025 09:58:59 GMT + +_Version update only_ + +## 4.5.0 +Fri, 04 Apr 2025 09:21:23 GMT + +_Version update only_ + +## 4.4.0 +Thu, 20 Mar 2025 12:14:34 GMT + +_Version update only_ + +## 4.3.1 +Tue, 21 Jan 2025 11:09:42 GMT + +_Version update only_ + +## 4.3.0 +Mon, 20 Jan 2025 11:45:13 GMT + +_Version update only_ + +## 4.2.0 +Mon, 13 Jan 2025 08:30:05 GMT + +_Version update only_ + +## 4.1.0 +Thu, 28 Nov 2024 10:57:30 GMT + +_Version update only_ + +## 4.0.4 +Thu, 21 Nov 2024 09:06:36 GMT + +_Version update only_ + +## 4.0.3 +Wed, 20 Nov 2024 09:30:31 GMT + +_Version update only_ ## 4.0.2 Mon, 11 Nov 2024 15:46:34 GMT diff --git a/plugins/browser-plugin-snowplow-ecommerce/package.json b/plugins/browser-plugin-snowplow-ecommerce/package.json index b1712e428..f5a58fc90 100644 --- a/plugins/browser-plugin-snowplow-ecommerce/package.json +++ b/plugins/browser-plugin-snowplow-ecommerce/package.json @@ -1,6 +1,6 @@ { "name": "@snowplow/browser-plugin-snowplow-ecommerce", - "version": "4.0.2", + "version": "4.10.1", "description": "Snowplow ecommerce tracking", "homepage": "http://bit.ly/sp-js", "bugs": "https://github.com/snowplow/snowplow-javascript-tracker/issues", @@ -27,18 +27,17 @@ "tslib": "^2.3.1" }, "devDependencies": { - "@ampproject/rollup-plugin-closure-compiler": "~0.27.0", "@rollup/plugin-commonjs": "~21.0.2", "@rollup/plugin-node-resolve": "~13.1.3", - "@types/jest": "~27.4.1", + "@types/jest": "~28.1.1", "@types/jsdom": "~16.2.14", "@types/lodash": "~4.14.180", "@typescript-eslint/eslint-plugin": "~5.15.0", "@typescript-eslint/parser": "~5.15.0", "eslint": "~8.11.0", - "jest": "~27.5.1", - "jest-environment-jsdom": "~27.5.1", - "jest-environment-jsdom-global": "~3.0.0", + "jest": "~28.1.3", + "jest-environment-jsdom": "~28.1.3", + "jest-environment-jsdom-global": "~4.0.0", "jest-standard-reporter": "~2.0.0", "lodash": "~4.17.21", "rollup": "~2.70.1", @@ -46,10 +45,10 @@ "rollup-plugin-license": "~2.6.1", "rollup-plugin-terser": "~7.0.2", "rollup-plugin-ts": "~2.0.5", - "ts-jest": "~27.1.3", + "ts-jest": "~28.0.8", "typescript": "~4.6.2" }, "peerDependencies": { - "@snowplow/browser-tracker": "~4.0.2" + "@snowplow/browser-tracker": "~4.10.1" } } diff --git a/plugins/browser-plugin-snowplow-ecommerce/rollup.config.js b/plugins/browser-plugin-snowplow-ecommerce/rollup.config.js index 7184f0fa3..e2fef0d06 100644 --- a/plugins/browser-plugin-snowplow-ecommerce/rollup.config.js +++ b/plugins/browser-plugin-snowplow-ecommerce/rollup.config.js @@ -32,7 +32,6 @@ import { nodeResolve } from '@rollup/plugin-node-resolve'; import commonjs from '@rollup/plugin-commonjs'; import ts from 'rollup-plugin-ts'; // Prefered over @rollup/plugin-typescript as it bundles .d.ts files import { banner } from '../../banner'; -import compiler from '@ampproject/rollup-plugin-closure-compiler'; import { terser } from 'rollup-plugin-terser'; import cleanup from 'rollup-plugin-cleanup'; import pkg from './package.json'; @@ -51,7 +50,7 @@ export default [ }, { input: './src/index.ts', - plugins: [...umdPlugins, compiler(), terser(), cleanup({ comments: 'none' }), banner()], + plugins: [...umdPlugins, terser(), cleanup({ comments: 'none' }), banner()], treeshake: { moduleSideEffects: ['sha1'] }, output: [{ file: pkg.main.replace('.js', '.min.js'), format: 'umd', sourcemap: true, name: umdName }], }, diff --git a/plugins/browser-plugin-snowplow-ecommerce/src/ga4/api.ts b/plugins/browser-plugin-snowplow-ecommerce/src/ga4/api.ts index 21d74d93c..c2a25284f 100644 --- a/plugins/browser-plugin-snowplow-ecommerce/src/ga4/api.ts +++ b/plugins/browser-plugin-snowplow-ecommerce/src/ga4/api.ts @@ -33,21 +33,23 @@ export function trackGA4SelectPromotion(ecommerce: GA4EcommerceObject & Promotio } export function trackGA4AddToCart( - ecommerce: GA4EcommerceObject & Currency, + ecommerce: GA4EcommerceObject & Currency & { finalCartValue?: number }, opts: Options & { finalCartValue: number } ) { const currency = (ecommerce.currency || opts.currency)!; + const finalCartValue = ecommerce.finalCartValue ?? opts.finalCartValue; const products = transformG4ItemsToSPProducts(ecommerce, currency); - trackAddToCart({ products, total_value: opts.finalCartValue, currency }); + trackAddToCart({ products, total_value: finalCartValue, currency }); } export function trackGA4RemoveFromCart( - ecommerce: GA4EcommerceObject & Currency, + ecommerce: GA4EcommerceObject & Currency & { finalCartValue?: number }, opts: Options & { finalCartValue: number } ) { const currency = (ecommerce.currency || opts.currency)!; + const finalCartValue = ecommerce.finalCartValue ?? opts.finalCartValue; const products = transformG4ItemsToSPProducts(ecommerce, currency); - trackRemoveFromCart({ products, total_value: opts.finalCartValue, currency }); + trackRemoveFromCart({ products, total_value: finalCartValue, currency }); } export function trackGA4ViewItem(ecommerce: GA4EcommerceObject, opts: Options = {}) { diff --git a/plugins/browser-plugin-timezone/CHANGELOG.json b/plugins/browser-plugin-timezone/CHANGELOG.json index c31d7548e..f972027e1 100644 --- a/plugins/browser-plugin-timezone/CHANGELOG.json +++ b/plugins/browser-plugin-timezone/CHANGELOG.json @@ -1,6 +1,174 @@ { "name": "@snowplow/browser-plugin-timezone", "entries": [ + { + "version": "4.10.1", + "tag": "@snowplow/browser-plugin-timezone_v4.10.1", + "date": "Wed, 19 Aug 2026 14:26:05 GMT", + "comments": {} + }, + { + "version": "4.10.0", + "tag": "@snowplow/browser-plugin-timezone_v4.10.0", + "date": "Mon, 27 Jul 2026 13:52:14 GMT", + "comments": {} + }, + { + "version": "4.9.0", + "tag": "@snowplow/browser-plugin-timezone_v4.9.0", + "date": "Tue, 21 Jul 2026 14:53:08 GMT", + "comments": {} + }, + { + "version": "4.8.4", + "tag": "@snowplow/browser-plugin-timezone_v4.8.4", + "date": "Thu, 02 Jul 2026 10:07:52 GMT", + "comments": {} + }, + { + "version": "4.8.3", + "tag": "@snowplow/browser-plugin-timezone_v4.8.3", + "date": "Tue, 30 Jun 2026 14:22:03 GMT", + "comments": { + "none": [ + { + "comment": "Update uuid to v11 and remove closure-compiler from the build pipeline" + } + ] + } + }, + { + "version": "4.8.2", + "tag": "@snowplow/browser-plugin-timezone_v4.8.2", + "date": "Wed, 17 Jun 2026 12:30:12 GMT", + "comments": {} + }, + { + "version": "4.8.1", + "tag": "@snowplow/browser-plugin-timezone_v4.8.1", + "date": "Wed, 13 May 2026 09:26:05 GMT", + "comments": {} + }, + { + "version": "4.8.0", + "tag": "@snowplow/browser-plugin-timezone_v4.8.0", + "date": "Tue, 28 Apr 2026 07:56:22 GMT", + "comments": {} + }, + { + "version": "4.7.0", + "tag": "@snowplow/browser-plugin-timezone_v4.7.0", + "date": "Wed, 01 Apr 2026 12:59:29 GMT", + "comments": {} + }, + { + "version": "4.6.9", + "tag": "@snowplow/browser-plugin-timezone_v4.6.9", + "date": "Mon, 16 Mar 2026 15:43:06 GMT", + "comments": {} + }, + { + "version": "4.6.8", + "tag": "@snowplow/browser-plugin-timezone_v4.6.8", + "date": "Tue, 28 Oct 2025 09:46:42 GMT", + "comments": {} + }, + { + "version": "4.6.7", + "tag": "@snowplow/browser-plugin-timezone_v4.6.7", + "date": "Tue, 07 Oct 2025 14:53:36 GMT", + "comments": {} + }, + { + "version": "4.6.6", + "tag": "@snowplow/browser-plugin-timezone_v4.6.6", + "date": "Tue, 26 Aug 2025 08:42:27 GMT", + "comments": {} + }, + { + "version": "4.6.5", + "tag": "@snowplow/browser-plugin-timezone_v4.6.5", + "date": "Wed, 25 Jun 2025 21:16:46 GMT", + "comments": {} + }, + { + "version": "4.6.4", + "tag": "@snowplow/browser-plugin-timezone_v4.6.4", + "date": "Wed, 25 Jun 2025 12:08:50 GMT", + "comments": {} + }, + { + "version": "4.6.3", + "tag": "@snowplow/browser-plugin-timezone_v4.6.3", + "date": "Thu, 29 May 2025 19:52:07 GMT", + "comments": {} + }, + { + "version": "4.6.2", + "tag": "@snowplow/browser-plugin-timezone_v4.6.2", + "date": "Tue, 20 May 2025 07:39:05 GMT", + "comments": {} + }, + { + "version": "4.6.1", + "tag": "@snowplow/browser-plugin-timezone_v4.6.1", + "date": "Tue, 06 May 2025 13:10:51 GMT", + "comments": {} + }, + { + "version": "4.6.0", + "tag": "@snowplow/browser-plugin-timezone_v4.6.0", + "date": "Thu, 01 May 2025 09:58:59 GMT", + "comments": {} + }, + { + "version": "4.5.0", + "tag": "@snowplow/browser-plugin-timezone_v4.5.0", + "date": "Fri, 04 Apr 2025 09:21:23 GMT", + "comments": {} + }, + { + "version": "4.4.0", + "tag": "@snowplow/browser-plugin-timezone_v4.4.0", + "date": "Thu, 20 Mar 2025 12:14:34 GMT", + "comments": {} + }, + { + "version": "4.3.1", + "tag": "@snowplow/browser-plugin-timezone_v4.3.1", + "date": "Tue, 21 Jan 2025 11:09:42 GMT", + "comments": {} + }, + { + "version": "4.3.0", + "tag": "@snowplow/browser-plugin-timezone_v4.3.0", + "date": "Mon, 20 Jan 2025 11:45:13 GMT", + "comments": {} + }, + { + "version": "4.2.0", + "tag": "@snowplow/browser-plugin-timezone_v4.2.0", + "date": "Mon, 13 Jan 2025 08:30:05 GMT", + "comments": {} + }, + { + "version": "4.1.0", + "tag": "@snowplow/browser-plugin-timezone_v4.1.0", + "date": "Thu, 28 Nov 2024 10:57:30 GMT", + "comments": {} + }, + { + "version": "4.0.4", + "tag": "@snowplow/browser-plugin-timezone_v4.0.4", + "date": "Thu, 21 Nov 2024 09:06:36 GMT", + "comments": {} + }, + { + "version": "4.0.3", + "tag": "@snowplow/browser-plugin-timezone_v4.0.3", + "date": "Wed, 20 Nov 2024 09:30:31 GMT", + "comments": {} + }, { "version": "4.0.2", "tag": "@snowplow/browser-plugin-timezone_v4.0.2", diff --git a/plugins/browser-plugin-timezone/CHANGELOG.md b/plugins/browser-plugin-timezone/CHANGELOG.md index 1a66d3785..31ff90735 100644 --- a/plugins/browser-plugin-timezone/CHANGELOG.md +++ b/plugins/browser-plugin-timezone/CHANGELOG.md @@ -1,6 +1,143 @@ # Change Log - @snowplow/browser-plugin-timezone -This log was last generated on Mon, 11 Nov 2024 15:46:34 GMT and should not be manually modified. +This log was last generated on Wed, 19 Aug 2026 14:26:05 GMT and should not be manually modified. + +## 4.10.1 +Wed, 19 Aug 2026 14:26:05 GMT + +_Version update only_ + +## 4.10.0 +Mon, 27 Jul 2026 13:52:14 GMT + +_Version update only_ + +## 4.9.0 +Tue, 21 Jul 2026 14:53:08 GMT + +_Version update only_ + +## 4.8.4 +Thu, 02 Jul 2026 10:07:52 GMT + +_Version update only_ + +## 4.8.3 +Tue, 30 Jun 2026 14:22:03 GMT + +### Updates + +- Update uuid to v11 and remove closure-compiler from the build pipeline + +## 4.8.2 +Wed, 17 Jun 2026 12:30:12 GMT + +_Version update only_ + +## 4.8.1 +Wed, 13 May 2026 09:26:05 GMT + +_Version update only_ + +## 4.8.0 +Tue, 28 Apr 2026 07:56:22 GMT + +_Version update only_ + +## 4.7.0 +Wed, 01 Apr 2026 12:59:29 GMT + +_Version update only_ + +## 4.6.9 +Mon, 16 Mar 2026 15:43:06 GMT + +_Version update only_ + +## 4.6.8 +Tue, 28 Oct 2025 09:46:42 GMT + +_Version update only_ + +## 4.6.7 +Tue, 07 Oct 2025 14:53:36 GMT + +_Version update only_ + +## 4.6.6 +Tue, 26 Aug 2025 08:42:27 GMT + +_Version update only_ + +## 4.6.5 +Wed, 25 Jun 2025 21:16:46 GMT + +_Version update only_ + +## 4.6.4 +Wed, 25 Jun 2025 12:08:50 GMT + +_Version update only_ + +## 4.6.3 +Thu, 29 May 2025 19:52:07 GMT + +_Version update only_ + +## 4.6.2 +Tue, 20 May 2025 07:39:05 GMT + +_Version update only_ + +## 4.6.1 +Tue, 06 May 2025 13:10:51 GMT + +_Version update only_ + +## 4.6.0 +Thu, 01 May 2025 09:58:59 GMT + +_Version update only_ + +## 4.5.0 +Fri, 04 Apr 2025 09:21:23 GMT + +_Version update only_ + +## 4.4.0 +Thu, 20 Mar 2025 12:14:34 GMT + +_Version update only_ + +## 4.3.1 +Tue, 21 Jan 2025 11:09:42 GMT + +_Version update only_ + +## 4.3.0 +Mon, 20 Jan 2025 11:45:13 GMT + +_Version update only_ + +## 4.2.0 +Mon, 13 Jan 2025 08:30:05 GMT + +_Version update only_ + +## 4.1.0 +Thu, 28 Nov 2024 10:57:30 GMT + +_Version update only_ + +## 4.0.4 +Thu, 21 Nov 2024 09:06:36 GMT + +_Version update only_ + +## 4.0.3 +Wed, 20 Nov 2024 09:30:31 GMT + +_Version update only_ ## 4.0.2 Mon, 11 Nov 2024 15:46:34 GMT diff --git a/plugins/browser-plugin-timezone/jest.config.js b/plugins/browser-plugin-timezone/jest.config.js index bd3ea4e2a..87d15da9b 100644 --- a/plugins/browser-plugin-timezone/jest.config.js +++ b/plugins/browser-plugin-timezone/jest.config.js @@ -1,5 +1,6 @@ module.exports = { preset: 'ts-jest', reporters: ['jest-standard-reporter'], + setupFilesAfterEnv: ['../../setupTestGlobals.ts'], testEnvironment: 'jest-environment-jsdom-global', }; diff --git a/plugins/browser-plugin-timezone/package.json b/plugins/browser-plugin-timezone/package.json index 6de954b24..6844c5a91 100644 --- a/plugins/browser-plugin-timezone/package.json +++ b/plugins/browser-plugin-timezone/package.json @@ -1,6 +1,6 @@ { "name": "@snowplow/browser-plugin-timezone", - "version": "4.0.2", + "version": "4.10.1", "description": "Attaches timezone to Snowplow events", "homepage": "http://bit.ly/sp-js", "bugs": "https://github.com/snowplow/snowplow-javascript-tracker/issues", @@ -28,18 +28,17 @@ "tslib": "^2.3.1" }, "devDependencies": { - "@ampproject/rollup-plugin-closure-compiler": "~0.27.0", "@rollup/plugin-commonjs": "~21.0.2", "@rollup/plugin-node-resolve": "~13.1.3", - "@types/jest": "~27.4.1", + "@types/jest": "~28.1.1", "@types/jsdom": "~16.2.14", "@types/jstimezonedetect": "~1.0.3", "@typescript-eslint/eslint-plugin": "~5.15.0", "@typescript-eslint/parser": "~5.15.0", "eslint": "~8.11.0", - "jest": "~27.5.1", - "jest-environment-jsdom": "~27.5.1", - "jest-environment-jsdom-global": "~3.0.0", + "jest": "~28.1.3", + "jest-environment-jsdom": "~28.1.3", + "jest-environment-jsdom-global": "~4.0.0", "jest-standard-reporter": "~2.0.0", "moment-timezone": "~0.5.26", "rollup": "~2.70.1", @@ -47,10 +46,10 @@ "rollup-plugin-license": "~2.6.1", "rollup-plugin-terser": "~7.0.2", "rollup-plugin-ts": "~2.0.5", - "ts-jest": "~27.1.3", + "ts-jest": "~28.0.8", "typescript": "~4.6.2" }, "peerDependencies": { - "@snowplow/browser-tracker": "~4.0.2" + "@snowplow/browser-tracker": "~4.10.1" } } diff --git a/plugins/browser-plugin-timezone/rollup.config.js b/plugins/browser-plugin-timezone/rollup.config.js index bc665d362..6a08dff32 100644 --- a/plugins/browser-plugin-timezone/rollup.config.js +++ b/plugins/browser-plugin-timezone/rollup.config.js @@ -32,7 +32,6 @@ import { nodeResolve } from '@rollup/plugin-node-resolve'; import commonjs from '@rollup/plugin-commonjs'; import ts from 'rollup-plugin-ts'; // Prefered over @rollup/plugin-typescript as it bundles .d.ts files import { banner } from '../../banner'; -import compiler from '@ampproject/rollup-plugin-closure-compiler'; import { terser } from 'rollup-plugin-terser'; import cleanup from 'rollup-plugin-cleanup'; import pkg from './package.json'; @@ -51,7 +50,7 @@ export default [ }, { input: './src/index.ts', - plugins: [...umdPlugins, compiler(), terser(), cleanup({ comments: 'none' }), banner()], + plugins: [...umdPlugins, terser(), cleanup({ comments: 'none' }), banner()], treeshake: { moduleSideEffects: ['sha1'] }, output: [{ file: pkg.main.replace('.js', '.min.js'), format: 'umd', sourcemap: true, name: umdName }], }, diff --git a/plugins/browser-plugin-vimeo-tracking/CHANGELOG.json b/plugins/browser-plugin-vimeo-tracking/CHANGELOG.json index ae7c4adaf..a7500f1c3 100644 --- a/plugins/browser-plugin-vimeo-tracking/CHANGELOG.json +++ b/plugins/browser-plugin-vimeo-tracking/CHANGELOG.json @@ -1,6 +1,174 @@ { "name": "@snowplow/browser-plugin-vimeo-tracking", "entries": [ + { + "version": "4.10.1", + "tag": "@snowplow/browser-plugin-vimeo-tracking_v4.10.1", + "date": "Wed, 19 Aug 2026 14:26:05 GMT", + "comments": {} + }, + { + "version": "4.10.0", + "tag": "@snowplow/browser-plugin-vimeo-tracking_v4.10.0", + "date": "Mon, 27 Jul 2026 13:52:14 GMT", + "comments": {} + }, + { + "version": "4.9.0", + "tag": "@snowplow/browser-plugin-vimeo-tracking_v4.9.0", + "date": "Tue, 21 Jul 2026 14:53:08 GMT", + "comments": {} + }, + { + "version": "4.8.4", + "tag": "@snowplow/browser-plugin-vimeo-tracking_v4.8.4", + "date": "Thu, 02 Jul 2026 10:07:52 GMT", + "comments": {} + }, + { + "version": "4.8.3", + "tag": "@snowplow/browser-plugin-vimeo-tracking_v4.8.3", + "date": "Tue, 30 Jun 2026 14:22:03 GMT", + "comments": { + "none": [ + { + "comment": "Update uuid to v11 and remove closure-compiler from the build pipeline" + } + ] + } + }, + { + "version": "4.8.2", + "tag": "@snowplow/browser-plugin-vimeo-tracking_v4.8.2", + "date": "Wed, 17 Jun 2026 12:30:12 GMT", + "comments": {} + }, + { + "version": "4.8.1", + "tag": "@snowplow/browser-plugin-vimeo-tracking_v4.8.1", + "date": "Wed, 13 May 2026 09:26:05 GMT", + "comments": {} + }, + { + "version": "4.8.0", + "tag": "@snowplow/browser-plugin-vimeo-tracking_v4.8.0", + "date": "Tue, 28 Apr 2026 07:56:22 GMT", + "comments": {} + }, + { + "version": "4.7.0", + "tag": "@snowplow/browser-plugin-vimeo-tracking_v4.7.0", + "date": "Wed, 01 Apr 2026 12:59:29 GMT", + "comments": {} + }, + { + "version": "4.6.9", + "tag": "@snowplow/browser-plugin-vimeo-tracking_v4.6.9", + "date": "Mon, 16 Mar 2026 15:43:06 GMT", + "comments": {} + }, + { + "version": "4.6.8", + "tag": "@snowplow/browser-plugin-vimeo-tracking_v4.6.8", + "date": "Tue, 28 Oct 2025 09:46:42 GMT", + "comments": {} + }, + { + "version": "4.6.7", + "tag": "@snowplow/browser-plugin-vimeo-tracking_v4.6.7", + "date": "Tue, 07 Oct 2025 14:53:36 GMT", + "comments": {} + }, + { + "version": "4.6.6", + "tag": "@snowplow/browser-plugin-vimeo-tracking_v4.6.6", + "date": "Tue, 26 Aug 2025 08:42:28 GMT", + "comments": {} + }, + { + "version": "4.6.5", + "tag": "@snowplow/browser-plugin-vimeo-tracking_v4.6.5", + "date": "Wed, 25 Jun 2025 21:16:46 GMT", + "comments": {} + }, + { + "version": "4.6.4", + "tag": "@snowplow/browser-plugin-vimeo-tracking_v4.6.4", + "date": "Wed, 25 Jun 2025 12:08:50 GMT", + "comments": {} + }, + { + "version": "4.6.3", + "tag": "@snowplow/browser-plugin-vimeo-tracking_v4.6.3", + "date": "Thu, 29 May 2025 19:52:07 GMT", + "comments": {} + }, + { + "version": "4.6.2", + "tag": "@snowplow/browser-plugin-vimeo-tracking_v4.6.2", + "date": "Tue, 20 May 2025 07:39:05 GMT", + "comments": {} + }, + { + "version": "4.6.1", + "tag": "@snowplow/browser-plugin-vimeo-tracking_v4.6.1", + "date": "Tue, 06 May 2025 13:10:51 GMT", + "comments": {} + }, + { + "version": "4.6.0", + "tag": "@snowplow/browser-plugin-vimeo-tracking_v4.6.0", + "date": "Thu, 01 May 2025 09:58:59 GMT", + "comments": {} + }, + { + "version": "4.5.0", + "tag": "@snowplow/browser-plugin-vimeo-tracking_v4.5.0", + "date": "Fri, 04 Apr 2025 09:21:23 GMT", + "comments": {} + }, + { + "version": "4.4.0", + "tag": "@snowplow/browser-plugin-vimeo-tracking_v4.4.0", + "date": "Thu, 20 Mar 2025 12:14:34 GMT", + "comments": {} + }, + { + "version": "4.3.1", + "tag": "@snowplow/browser-plugin-vimeo-tracking_v4.3.1", + "date": "Tue, 21 Jan 2025 11:09:42 GMT", + "comments": {} + }, + { + "version": "4.3.0", + "tag": "@snowplow/browser-plugin-vimeo-tracking_v4.3.0", + "date": "Mon, 20 Jan 2025 11:45:13 GMT", + "comments": {} + }, + { + "version": "4.2.0", + "tag": "@snowplow/browser-plugin-vimeo-tracking_v4.2.0", + "date": "Mon, 13 Jan 2025 08:30:05 GMT", + "comments": {} + }, + { + "version": "4.1.0", + "tag": "@snowplow/browser-plugin-vimeo-tracking_v4.1.0", + "date": "Thu, 28 Nov 2024 10:57:30 GMT", + "comments": {} + }, + { + "version": "4.0.4", + "tag": "@snowplow/browser-plugin-vimeo-tracking_v4.0.4", + "date": "Thu, 21 Nov 2024 09:06:36 GMT", + "comments": {} + }, + { + "version": "4.0.3", + "tag": "@snowplow/browser-plugin-vimeo-tracking_v4.0.3", + "date": "Wed, 20 Nov 2024 09:30:31 GMT", + "comments": {} + }, { "version": "4.0.2", "tag": "@snowplow/browser-plugin-vimeo-tracking_v4.0.2", diff --git a/plugins/browser-plugin-vimeo-tracking/CHANGELOG.md b/plugins/browser-plugin-vimeo-tracking/CHANGELOG.md index e5e027fb9..278a2891a 100644 --- a/plugins/browser-plugin-vimeo-tracking/CHANGELOG.md +++ b/plugins/browser-plugin-vimeo-tracking/CHANGELOG.md @@ -1,6 +1,143 @@ # Change Log - @snowplow/browser-plugin-vimeo-tracking -This log was last generated on Mon, 11 Nov 2024 15:46:34 GMT and should not be manually modified. +This log was last generated on Wed, 19 Aug 2026 14:26:05 GMT and should not be manually modified. + +## 4.10.1 +Wed, 19 Aug 2026 14:26:05 GMT + +_Version update only_ + +## 4.10.0 +Mon, 27 Jul 2026 13:52:14 GMT + +_Version update only_ + +## 4.9.0 +Tue, 21 Jul 2026 14:53:08 GMT + +_Version update only_ + +## 4.8.4 +Thu, 02 Jul 2026 10:07:52 GMT + +_Version update only_ + +## 4.8.3 +Tue, 30 Jun 2026 14:22:03 GMT + +### Updates + +- Update uuid to v11 and remove closure-compiler from the build pipeline + +## 4.8.2 +Wed, 17 Jun 2026 12:30:12 GMT + +_Version update only_ + +## 4.8.1 +Wed, 13 May 2026 09:26:05 GMT + +_Version update only_ + +## 4.8.0 +Tue, 28 Apr 2026 07:56:22 GMT + +_Version update only_ + +## 4.7.0 +Wed, 01 Apr 2026 12:59:29 GMT + +_Version update only_ + +## 4.6.9 +Mon, 16 Mar 2026 15:43:06 GMT + +_Version update only_ + +## 4.6.8 +Tue, 28 Oct 2025 09:46:42 GMT + +_Version update only_ + +## 4.6.7 +Tue, 07 Oct 2025 14:53:36 GMT + +_Version update only_ + +## 4.6.6 +Tue, 26 Aug 2025 08:42:28 GMT + +_Version update only_ + +## 4.6.5 +Wed, 25 Jun 2025 21:16:46 GMT + +_Version update only_ + +## 4.6.4 +Wed, 25 Jun 2025 12:08:50 GMT + +_Version update only_ + +## 4.6.3 +Thu, 29 May 2025 19:52:07 GMT + +_Version update only_ + +## 4.6.2 +Tue, 20 May 2025 07:39:05 GMT + +_Version update only_ + +## 4.6.1 +Tue, 06 May 2025 13:10:51 GMT + +_Version update only_ + +## 4.6.0 +Thu, 01 May 2025 09:58:59 GMT + +_Version update only_ + +## 4.5.0 +Fri, 04 Apr 2025 09:21:23 GMT + +_Version update only_ + +## 4.4.0 +Thu, 20 Mar 2025 12:14:34 GMT + +_Version update only_ + +## 4.3.1 +Tue, 21 Jan 2025 11:09:42 GMT + +_Version update only_ + +## 4.3.0 +Mon, 20 Jan 2025 11:45:13 GMT + +_Version update only_ + +## 4.2.0 +Mon, 13 Jan 2025 08:30:05 GMT + +_Version update only_ + +## 4.1.0 +Thu, 28 Nov 2024 10:57:30 GMT + +_Version update only_ + +## 4.0.4 +Thu, 21 Nov 2024 09:06:36 GMT + +_Version update only_ + +## 4.0.3 +Wed, 20 Nov 2024 09:30:31 GMT + +_Version update only_ ## 4.0.2 Mon, 11 Nov 2024 15:46:34 GMT diff --git a/plugins/browser-plugin-vimeo-tracking/package.json b/plugins/browser-plugin-vimeo-tracking/package.json index ec26086d4..b6d89f71b 100644 --- a/plugins/browser-plugin-vimeo-tracking/package.json +++ b/plugins/browser-plugin-vimeo-tracking/package.json @@ -1,6 +1,6 @@ { "name": "@snowplow/browser-plugin-vimeo-tracking", - "version": "4.0.2", + "version": "4.10.1", "description": "Vimeo tracking for Snowplow", "homepage": "https://github.com/snowplow/snowplow-javascript-tracker", "bugs": "https://github.com/snowplow/snowplow-javascript-tracker/issues", @@ -28,28 +28,27 @@ "@vimeo/player": "2.16.4" }, "devDependencies": { - "@ampproject/rollup-plugin-closure-compiler": "~0.27.0", "@rollup/plugin-commonjs": "~21.0.2", "@rollup/plugin-node-resolve": "~13.1.3", - "@types/jest": "~27.4.1", + "@types/jest": "~28.1.1", "@types/jsdom": "~16.2.14", "@types/vimeo__player": "~2.16.3", "@typescript-eslint/eslint-plugin": "~5.15.0", "@typescript-eslint/parser": "~5.15.0", "eslint": "~8.11.0", - "jest": "~27.5.1", - "jest-environment-jsdom": "~27.5.1", - "jest-environment-jsdom-global": "~3.0.0", + "jest": "~28.1.3", + "jest-environment-jsdom": "~28.1.3", + "jest-environment-jsdom-global": "~4.0.0", "jest-standard-reporter": "~2.0.0", "rollup": "~2.70.1", "rollup-plugin-cleanup": "~3.2.1", "rollup-plugin-license": "~2.6.1", "rollup-plugin-terser": "~7.0.2", "rollup-plugin-ts": "~2.0.5", - "ts-jest": "~27.1.3", + "ts-jest": "~28.0.8", "typescript": "~4.6.2" }, "peerDependencies": { - "@snowplow/browser-tracker": "~4.0.2" + "@snowplow/browser-tracker": "~4.10.1" } } diff --git a/plugins/browser-plugin-vimeo-tracking/rollup.config.js b/plugins/browser-plugin-vimeo-tracking/rollup.config.js index 474f254a8..ed22079ee 100644 --- a/plugins/browser-plugin-vimeo-tracking/rollup.config.js +++ b/plugins/browser-plugin-vimeo-tracking/rollup.config.js @@ -2,7 +2,6 @@ import { nodeResolve } from '@rollup/plugin-node-resolve'; import commonjs from '@rollup/plugin-commonjs'; import ts from 'rollup-plugin-ts'; // Prefered over @rollup/plugin-typescript as it bundles .d.ts files import { banner } from '../../banner'; -import compiler from '@ampproject/rollup-plugin-closure-compiler'; import { terser } from 'rollup-plugin-terser'; import cleanup from 'rollup-plugin-cleanup'; import pkg from './package.json'; @@ -21,7 +20,7 @@ export default [ }, { input: './src/index.ts', - plugins: [...umdPlugins, compiler(), terser(), cleanup({ comments: 'none' }), banner()], + plugins: [...umdPlugins, terser(), cleanup({ comments: 'none' }), banner()], treeshake: { moduleSideEffects: ['sha1'] }, output: [{ file: pkg.main.replace('.js', '.min.js'), format: 'umd', sourcemap: true, name: umdName }], }, diff --git a/plugins/browser-plugin-web-vitals/CHANGELOG.json b/plugins/browser-plugin-web-vitals/CHANGELOG.json index af6cbca22..dcfe61001 100644 --- a/plugins/browser-plugin-web-vitals/CHANGELOG.json +++ b/plugins/browser-plugin-web-vitals/CHANGELOG.json @@ -1,6 +1,180 @@ { "name": "@snowplow/browser-plugin-web-vitals", "entries": [ + { + "version": "4.10.1", + "tag": "@snowplow/browser-plugin-web-vitals_v4.10.1", + "date": "Wed, 19 Aug 2026 14:26:05 GMT", + "comments": {} + }, + { + "version": "4.10.0", + "tag": "@snowplow/browser-plugin-web-vitals_v4.10.0", + "date": "Mon, 27 Jul 2026 13:52:14 GMT", + "comments": {} + }, + { + "version": "4.9.0", + "tag": "@snowplow/browser-plugin-web-vitals_v4.9.0", + "date": "Tue, 21 Jul 2026 14:53:08 GMT", + "comments": {} + }, + { + "version": "4.8.4", + "tag": "@snowplow/browser-plugin-web-vitals_v4.8.4", + "date": "Thu, 02 Jul 2026 10:07:52 GMT", + "comments": {} + }, + { + "version": "4.8.3", + "tag": "@snowplow/browser-plugin-web-vitals_v4.8.3", + "date": "Tue, 30 Jun 2026 14:22:03 GMT", + "comments": { + "none": [ + { + "comment": "Update uuid to v11 and remove closure-compiler from the build pipeline" + } + ] + } + }, + { + "version": "4.8.2", + "tag": "@snowplow/browser-plugin-web-vitals_v4.8.2", + "date": "Wed, 17 Jun 2026 12:30:12 GMT", + "comments": {} + }, + { + "version": "4.8.1", + "tag": "@snowplow/browser-plugin-web-vitals_v4.8.1", + "date": "Wed, 13 May 2026 09:26:05 GMT", + "comments": {} + }, + { + "version": "4.8.0", + "tag": "@snowplow/browser-plugin-web-vitals_v4.8.0", + "date": "Tue, 28 Apr 2026 07:56:22 GMT", + "comments": {} + }, + { + "version": "4.7.0", + "tag": "@snowplow/browser-plugin-web-vitals_v4.7.0", + "date": "Wed, 01 Apr 2026 12:59:29 GMT", + "comments": {} + }, + { + "version": "4.6.9", + "tag": "@snowplow/browser-plugin-web-vitals_v4.6.9", + "date": "Mon, 16 Mar 2026 15:43:06 GMT", + "comments": {} + }, + { + "version": "4.6.8", + "tag": "@snowplow/browser-plugin-web-vitals_v4.6.8", + "date": "Tue, 28 Oct 2025 09:46:42 GMT", + "comments": {} + }, + { + "version": "4.6.7", + "tag": "@snowplow/browser-plugin-web-vitals_v4.6.7", + "date": "Tue, 07 Oct 2025 14:53:36 GMT", + "comments": {} + }, + { + "version": "4.6.6", + "tag": "@snowplow/browser-plugin-web-vitals_v4.6.6", + "date": "Tue, 26 Aug 2025 08:42:28 GMT", + "comments": {} + }, + { + "version": "4.6.5", + "tag": "@snowplow/browser-plugin-web-vitals_v4.6.5", + "date": "Wed, 25 Jun 2025 21:16:46 GMT", + "comments": {} + }, + { + "version": "4.6.4", + "tag": "@snowplow/browser-plugin-web-vitals_v4.6.4", + "date": "Wed, 25 Jun 2025 12:08:50 GMT", + "comments": {} + }, + { + "version": "4.6.3", + "tag": "@snowplow/browser-plugin-web-vitals_v4.6.3", + "date": "Thu, 29 May 2025 19:52:07 GMT", + "comments": {} + }, + { + "version": "4.6.2", + "tag": "@snowplow/browser-plugin-web-vitals_v4.6.2", + "date": "Tue, 20 May 2025 07:39:05 GMT", + "comments": {} + }, + { + "version": "4.6.1", + "tag": "@snowplow/browser-plugin-web-vitals_v4.6.1", + "date": "Tue, 06 May 2025 13:10:51 GMT", + "comments": {} + }, + { + "version": "4.6.0", + "tag": "@snowplow/browser-plugin-web-vitals_v4.6.0", + "date": "Thu, 01 May 2025 09:58:59 GMT", + "comments": {} + }, + { + "version": "4.5.0", + "tag": "@snowplow/browser-plugin-web-vitals_v4.5.0", + "date": "Fri, 04 Apr 2025 09:21:23 GMT", + "comments": {} + }, + { + "version": "4.4.0", + "tag": "@snowplow/browser-plugin-web-vitals_v4.4.0", + "date": "Thu, 20 Mar 2025 12:14:34 GMT", + "comments": { + "none": [ + { + "comment": "Update default external library version to v4. Add compatibility for future v5, which deprecates the FID metric." + } + ] + } + }, + { + "version": "4.3.1", + "tag": "@snowplow/browser-plugin-web-vitals_v4.3.1", + "date": "Tue, 21 Jan 2025 11:09:42 GMT", + "comments": {} + }, + { + "version": "4.3.0", + "tag": "@snowplow/browser-plugin-web-vitals_v4.3.0", + "date": "Mon, 20 Jan 2025 11:45:13 GMT", + "comments": {} + }, + { + "version": "4.2.0", + "tag": "@snowplow/browser-plugin-web-vitals_v4.2.0", + "date": "Mon, 13 Jan 2025 08:30:05 GMT", + "comments": {} + }, + { + "version": "4.1.0", + "tag": "@snowplow/browser-plugin-web-vitals_v4.1.0", + "date": "Thu, 28 Nov 2024 10:57:30 GMT", + "comments": {} + }, + { + "version": "4.0.4", + "tag": "@snowplow/browser-plugin-web-vitals_v4.0.4", + "date": "Thu, 21 Nov 2024 09:06:36 GMT", + "comments": {} + }, + { + "version": "4.0.3", + "tag": "@snowplow/browser-plugin-web-vitals_v4.0.3", + "date": "Wed, 20 Nov 2024 09:30:31 GMT", + "comments": {} + }, { "version": "4.0.2", "tag": "@snowplow/browser-plugin-web-vitals_v4.0.2", diff --git a/plugins/browser-plugin-web-vitals/CHANGELOG.md b/plugins/browser-plugin-web-vitals/CHANGELOG.md index 08a06d455..52d0d7e60 100644 --- a/plugins/browser-plugin-web-vitals/CHANGELOG.md +++ b/plugins/browser-plugin-web-vitals/CHANGELOG.md @@ -1,6 +1,145 @@ # Change Log - @snowplow/browser-plugin-web-vitals -This log was last generated on Mon, 11 Nov 2024 15:46:34 GMT and should not be manually modified. +This log was last generated on Wed, 19 Aug 2026 14:26:05 GMT and should not be manually modified. + +## 4.10.1 +Wed, 19 Aug 2026 14:26:05 GMT + +_Version update only_ + +## 4.10.0 +Mon, 27 Jul 2026 13:52:14 GMT + +_Version update only_ + +## 4.9.0 +Tue, 21 Jul 2026 14:53:08 GMT + +_Version update only_ + +## 4.8.4 +Thu, 02 Jul 2026 10:07:52 GMT + +_Version update only_ + +## 4.8.3 +Tue, 30 Jun 2026 14:22:03 GMT + +### Updates + +- Update uuid to v11 and remove closure-compiler from the build pipeline + +## 4.8.2 +Wed, 17 Jun 2026 12:30:12 GMT + +_Version update only_ + +## 4.8.1 +Wed, 13 May 2026 09:26:05 GMT + +_Version update only_ + +## 4.8.0 +Tue, 28 Apr 2026 07:56:22 GMT + +_Version update only_ + +## 4.7.0 +Wed, 01 Apr 2026 12:59:29 GMT + +_Version update only_ + +## 4.6.9 +Mon, 16 Mar 2026 15:43:06 GMT + +_Version update only_ + +## 4.6.8 +Tue, 28 Oct 2025 09:46:42 GMT + +_Version update only_ + +## 4.6.7 +Tue, 07 Oct 2025 14:53:36 GMT + +_Version update only_ + +## 4.6.6 +Tue, 26 Aug 2025 08:42:28 GMT + +_Version update only_ + +## 4.6.5 +Wed, 25 Jun 2025 21:16:46 GMT + +_Version update only_ + +## 4.6.4 +Wed, 25 Jun 2025 12:08:50 GMT + +_Version update only_ + +## 4.6.3 +Thu, 29 May 2025 19:52:07 GMT + +_Version update only_ + +## 4.6.2 +Tue, 20 May 2025 07:39:05 GMT + +_Version update only_ + +## 4.6.1 +Tue, 06 May 2025 13:10:51 GMT + +_Version update only_ + +## 4.6.0 +Thu, 01 May 2025 09:58:59 GMT + +_Version update only_ + +## 4.5.0 +Fri, 04 Apr 2025 09:21:23 GMT + +_Version update only_ + +## 4.4.0 +Thu, 20 Mar 2025 12:14:34 GMT + +### Updates + +- Update default external library version to v4. Add compatibility for future v5, which deprecates the FID metric. + +## 4.3.1 +Tue, 21 Jan 2025 11:09:42 GMT + +_Version update only_ + +## 4.3.0 +Mon, 20 Jan 2025 11:45:13 GMT + +_Version update only_ + +## 4.2.0 +Mon, 13 Jan 2025 08:30:05 GMT + +_Version update only_ + +## 4.1.0 +Thu, 28 Nov 2024 10:57:30 GMT + +_Version update only_ + +## 4.0.4 +Thu, 21 Nov 2024 09:06:36 GMT + +_Version update only_ + +## 4.0.3 +Wed, 20 Nov 2024 09:30:31 GMT + +_Version update only_ ## 4.0.2 Mon, 11 Nov 2024 15:46:34 GMT diff --git a/plugins/browser-plugin-web-vitals/jest.config.js b/plugins/browser-plugin-web-vitals/jest.config.js index bd3ea4e2a..87d15da9b 100644 --- a/plugins/browser-plugin-web-vitals/jest.config.js +++ b/plugins/browser-plugin-web-vitals/jest.config.js @@ -1,5 +1,6 @@ module.exports = { preset: 'ts-jest', reporters: ['jest-standard-reporter'], + setupFilesAfterEnv: ['../../setupTestGlobals.ts'], testEnvironment: 'jest-environment-jsdom-global', }; diff --git a/plugins/browser-plugin-web-vitals/package.json b/plugins/browser-plugin-web-vitals/package.json index ee29bebe5..ecd036c4d 100644 --- a/plugins/browser-plugin-web-vitals/package.json +++ b/plugins/browser-plugin-web-vitals/package.json @@ -1,6 +1,6 @@ { "name": "@snowplow/browser-plugin-web-vitals", - "version": "4.0.2", + "version": "4.10.1", "description": "Adds the capability to track web performance metrics categorized as Web Vitals.", "homepage": "https://github.com/snowplow/snowplow-javascript-tracker", "bugs": "https://github.com/snowplow/snowplow-javascript-tracker/issues", @@ -25,30 +25,29 @@ "@snowplow/browser-tracker-core": "workspace:*", "@snowplow/tracker-core": "workspace:*", "tslib": "^2.3.1", - "web-vitals": "~3.3.2" + "web-vitals": "~4.2.4" }, "devDependencies": { - "@ampproject/rollup-plugin-closure-compiler": "~0.27.0", "@rollup/plugin-commonjs": "~21.0.2", "@rollup/plugin-node-resolve": "~13.1.3", - "@types/jest": "~27.4.1", + "@types/jest": "~28.1.1", "@types/jsdom": "~16.2.14", "@typescript-eslint/eslint-plugin": "~5.15.0", "@typescript-eslint/parser": "~5.15.0", "eslint": "~8.11.0", - "jest": "~27.5.1", - "jest-environment-jsdom": "~27.5.1", - "jest-environment-jsdom-global": "~3.0.0", + "jest": "~28.1.3", + "jest-environment-jsdom": "~28.1.3", + "jest-environment-jsdom-global": "~4.0.0", "jest-standard-reporter": "~2.0.0", "rollup": "~2.70.1", "rollup-plugin-cleanup": "~3.2.1", "rollup-plugin-license": "~2.6.1", "rollup-plugin-terser": "~7.0.2", "rollup-plugin-ts": "~2.0.5", - "ts-jest": "~27.1.3", + "ts-jest": "~28.0.8", "typescript": "~4.6.2" }, "peerDependencies": { - "@snowplow/browser-tracker": "~4.0.2" + "@snowplow/browser-tracker": "~4.10.1" } } diff --git a/plugins/browser-plugin-web-vitals/rollup.config.js b/plugins/browser-plugin-web-vitals/rollup.config.js index 48d2287f5..16fe5d140 100644 --- a/plugins/browser-plugin-web-vitals/rollup.config.js +++ b/plugins/browser-plugin-web-vitals/rollup.config.js @@ -2,7 +2,6 @@ import { nodeResolve } from '@rollup/plugin-node-resolve'; import commonjs from '@rollup/plugin-commonjs'; import ts from 'rollup-plugin-ts'; // Preferred over @rollup/plugin-typescript as it bundles .d.ts files import { banner } from '../../banner'; -import compiler from '@ampproject/rollup-plugin-closure-compiler'; import { terser } from 'rollup-plugin-terser'; import cleanup from 'rollup-plugin-cleanup'; import pkg from './package.json'; @@ -21,7 +20,7 @@ export default [ }, { input: './src/index.ts', - plugins: [...umdPlugins, compiler(), terser(), cleanup({ comments: 'none' }), banner()], + plugins: [...umdPlugins, terser(), cleanup({ comments: 'none' }), banner()], treeshake: { moduleSideEffects: ['sha1'] }, output: [{ file: pkg.main.replace('.js', '.min.js'), format: 'umd', sourcemap: true, name: umdName }], }, diff --git a/plugins/browser-plugin-web-vitals/src/index.ts b/plugins/browser-plugin-web-vitals/src/index.ts index 600291bcb..e7e86f72f 100644 --- a/plugins/browser-plugin-web-vitals/src/index.ts +++ b/plugins/browser-plugin-web-vitals/src/index.ts @@ -4,7 +4,7 @@ import { WEB_VITALS_SCHEMA } from './schemata'; import { attachWebVitalsPageListeners, createWebVitalsScript, webVitalsListener } from './utils'; const _trackers: Record = {}; -const WEB_VITALS_SOURCE = 'https://unpkg.com/web-vitals@3/dist/web-vitals.iife.js'; +const WEB_VITALS_SOURCE = 'https://unpkg.com/web-vitals@4/dist/web-vitals.iife.js'; let listenersAttached = false; interface WebVitalsPluginOptions { diff --git a/plugins/browser-plugin-web-vitals/src/types.ts b/plugins/browser-plugin-web-vitals/src/types.ts index 681b8a70f..74b5ba003 100644 --- a/plugins/browser-plugin-web-vitals/src/types.ts +++ b/plugins/browser-plugin-web-vitals/src/types.ts @@ -1,12 +1,18 @@ -import type { ReportCallback, Metric, WebVitalsGlobal, onCLS, onLCP, onFID, onFCP, onINP, onTTFB } from 'web-vitals'; +import type { MetricType, Metric, onCLS, onLCP, onFID, onFCP, onINP, onTTFB } from 'web-vitals'; -export interface WebVitals extends WebVitalsGlobal { - onCLS: typeof onCLS; - onFID: typeof onFID; - onLCP: typeof onLCP; - onFCP: typeof onFCP; - onINP: typeof onINP; - onTTFB: typeof onTTFB; +export interface WebVitals { + onCLS?: typeof onCLS; + onFID?: typeof onFID; + onLCP?: typeof onLCP; + onFCP?: typeof onFCP; + onINP?: typeof onINP; + onTTFB?: typeof onTTFB; } -export { Metric, ReportCallback }; +declare global { + interface Window { + webVitals?: WebVitals; + } +} + +export { Metric, MetricType }; diff --git a/plugins/browser-plugin-web-vitals/src/utils.ts b/plugins/browser-plugin-web-vitals/src/utils.ts index 31916bfee..0434e378b 100644 --- a/plugins/browser-plugin-web-vitals/src/utils.ts +++ b/plugins/browser-plugin-web-vitals/src/utils.ts @@ -1,5 +1,5 @@ import { LOG } from '@snowplow/tracker-core'; -import { ReportCallback, WebVitals } from './types'; +import { MetricType } from './types'; /** * Attach page listeners to collect the Web Vitals values @@ -51,22 +51,23 @@ export function createWebVitalsScript(webVitalsSource: string) { * @return {void} */ export function webVitalsListener(webVitalsObject: Record) { - function addWebVitalsMeasurement(metricSchemaName: string): ReportCallback { + function addWebVitalsMeasurement(metricSchemaName: string): (arg: MetricType) => void { return (arg) => { webVitalsObject[metricSchemaName] = arg.value; webVitalsObject.navigationType = arg.navigationType; }; } - if (!window.webVitals) { + + const webVitals = window.webVitals; + if (!webVitals) { LOG.warn('The window.webVitals API is currently unavailable. web_vitals events will not be collected.'); return; } - const webVitals = window.webVitals as WebVitals; - webVitals.onCLS(addWebVitalsMeasurement('cls')); - webVitals.onFID(addWebVitalsMeasurement('fid')); - webVitals.onLCP(addWebVitalsMeasurement('lcp')); - webVitals.onFCP(addWebVitalsMeasurement('fcp')); - webVitals.onINP(addWebVitalsMeasurement('inp')); - webVitals.onTTFB(addWebVitalsMeasurement('ttfb')); + webVitals.onCLS?.(addWebVitalsMeasurement('cls')); + webVitals.onFID?.(addWebVitalsMeasurement('fid')); + webVitals.onLCP?.(addWebVitalsMeasurement('lcp')); + webVitals.onFCP?.(addWebVitalsMeasurement('fcp')); + webVitals.onINP?.(addWebVitalsMeasurement('inp')); + webVitals.onTTFB?.(addWebVitalsMeasurement('ttfb')); } diff --git a/plugins/browser-plugin-web-vitals/test/web-vitals.test.ts b/plugins/browser-plugin-web-vitals/test/web-vitals.test.ts index 8536d5b19..9a7691652 100644 --- a/plugins/browser-plugin-web-vitals/test/web-vitals.test.ts +++ b/plugins/browser-plugin-web-vitals/test/web-vitals.test.ts @@ -5,7 +5,6 @@ import { BrowserTracker } from '@snowplow/browser-tracker-core'; declare var jsdom: JSDOM; -// @ts-expect-error jsdom.window.webVitals = {}; describe('Web Vitals plugin', () => { diff --git a/plugins/browser-plugin-webview/CHANGELOG.json b/plugins/browser-plugin-webview/CHANGELOG.json new file mode 100644 index 000000000..e9e220f7c --- /dev/null +++ b/plugins/browser-plugin-webview/CHANGELOG.json @@ -0,0 +1,167 @@ +{ + "name": "@snowplow/browser-plugin-webview", + "entries": [ + { + "version": "4.10.1", + "tag": "@snowplow/browser-plugin-webview_v4.10.1", + "date": "Wed, 19 Aug 2026 14:26:05 GMT", + "comments": {} + }, + { + "version": "4.10.0", + "tag": "@snowplow/browser-plugin-webview_v4.10.0", + "date": "Mon, 27 Jul 2026 13:52:14 GMT", + "comments": { + "none": [ + { + "comment": "Add test coverage for disableSessionContextWithinWebView option suppressing client_session entity in hybrid native+WebView deployments" + } + ] + } + }, + { + "version": "4.9.0", + "tag": "@snowplow/browser-plugin-webview_v4.9.0", + "date": "Tue, 21 Jul 2026 14:53:08 GMT", + "comments": {} + }, + { + "version": "4.8.4", + "tag": "@snowplow/browser-plugin-webview_v4.8.4", + "date": "Thu, 02 Jul 2026 10:07:52 GMT", + "comments": {} + }, + { + "version": "4.8.3", + "tag": "@snowplow/browser-plugin-webview_v4.8.3", + "date": "Tue, 30 Jun 2026 14:22:03 GMT", + "comments": { + "none": [ + { + "comment": "Update uuid to v11 and remove closure-compiler from the build pipeline" + } + ] + } + }, + { + "version": "4.8.2", + "tag": "@snowplow/browser-plugin-webview_v4.8.2", + "date": "Wed, 17 Jun 2026 12:30:12 GMT", + "comments": {} + }, + { + "version": "4.8.1", + "tag": "@snowplow/browser-plugin-webview_v4.8.1", + "date": "Wed, 13 May 2026 09:26:05 GMT", + "comments": {} + }, + { + "version": "4.8.0", + "tag": "@snowplow/browser-plugin-webview_v4.8.0", + "date": "Tue, 28 Apr 2026 07:56:22 GMT", + "comments": {} + }, + { + "version": "4.7.0", + "tag": "@snowplow/browser-plugin-webview_v4.7.0", + "date": "Wed, 01 Apr 2026 12:59:29 GMT", + "comments": {} + }, + { + "version": "4.6.9", + "tag": "@snowplow/browser-plugin-webview_v4.6.9", + "date": "Mon, 16 Mar 2026 15:43:06 GMT", + "comments": {} + }, + { + "version": "4.6.8", + "tag": "@snowplow/browser-plugin-webview_v4.6.8", + "date": "Tue, 28 Oct 2025 09:46:42 GMT", + "comments": {} + }, + { + "version": "4.6.7", + "tag": "@snowplow/browser-plugin-webview_v4.6.7", + "date": "Tue, 07 Oct 2025 14:53:36 GMT", + "comments": {} + }, + { + "version": "4.6.6", + "tag": "@snowplow/browser-plugin-webview_v4.6.6", + "date": "Tue, 26 Aug 2025 08:42:28 GMT", + "comments": {} + }, + { + "version": "4.6.5", + "tag": "@snowplow/browser-plugin-webview_v4.6.5", + "date": "Wed, 25 Jun 2025 21:16:46 GMT", + "comments": {} + }, + { + "version": "4.6.4", + "tag": "@snowplow/browser-plugin-webview_v4.6.4", + "date": "Wed, 25 Jun 2025 12:08:50 GMT", + "comments": {} + }, + { + "version": "4.6.3", + "tag": "@snowplow/browser-plugin-webview_v4.6.3", + "date": "Thu, 29 May 2025 19:52:07 GMT", + "comments": {} + }, + { + "version": "4.6.2", + "tag": "@snowplow/browser-plugin-webview_v4.6.2", + "date": "Tue, 20 May 2025 07:39:05 GMT", + "comments": {} + }, + { + "version": "4.6.1", + "tag": "@snowplow/browser-plugin-webview_v4.6.1", + "date": "Tue, 06 May 2025 13:10:51 GMT", + "comments": {} + }, + { + "version": "4.6.0", + "tag": "@snowplow/browser-plugin-webview_v4.6.0", + "date": "Thu, 01 May 2025 09:58:59 GMT", + "comments": {} + }, + { + "version": "4.5.0", + "tag": "@snowplow/browser-plugin-webview_v4.5.0", + "date": "Fri, 04 Apr 2025 09:21:23 GMT", + "comments": {} + }, + { + "version": "4.4.0", + "tag": "@snowplow/browser-plugin-webview_v4.4.0", + "date": "Thu, 20 Mar 2025 12:14:34 GMT", + "comments": {} + }, + { + "version": "4.3.1", + "tag": "@snowplow/browser-plugin-webview_v4.3.1", + "date": "Tue, 21 Jan 2025 11:09:42 GMT", + "comments": { + "none": [ + { + "comment": "Update WebView tracker version WebView plugin to fix issue with tracking page view and page ping event properties" + } + ] + } + }, + { + "version": "4.3.0", + "tag": "@snowplow/browser-plugin-webview_v4.3.0", + "date": "Mon, 20 Jan 2025 11:45:13 GMT", + "comments": { + "none": [ + { + "comment": "Add WebView plugin (#1402)" + } + ] + } + } + ] +} diff --git a/plugins/browser-plugin-webview/CHANGELOG.md b/plugins/browser-plugin-webview/CHANGELOG.md new file mode 100644 index 000000000..1d246abd2 --- /dev/null +++ b/plugins/browser-plugin-webview/CHANGELOG.md @@ -0,0 +1,127 @@ +# Change Log - @snowplow/browser-plugin-webview + +This log was last generated on Wed, 19 Aug 2026 14:26:05 GMT and should not be manually modified. + +## 4.10.1 +Wed, 19 Aug 2026 14:26:05 GMT + +_Version update only_ + +## 4.10.0 +Mon, 27 Jul 2026 13:52:14 GMT + +### Updates + +- Add test coverage for disableSessionContextWithinWebView option suppressing client_session entity in hybrid native+WebView deployments + +## 4.9.0 +Tue, 21 Jul 2026 14:53:08 GMT + +_Version update only_ + +## 4.8.4 +Thu, 02 Jul 2026 10:07:52 GMT + +_Version update only_ + +## 4.8.3 +Tue, 30 Jun 2026 14:22:03 GMT + +### Updates + +- Update uuid to v11 and remove closure-compiler from the build pipeline + +## 4.8.2 +Wed, 17 Jun 2026 12:30:12 GMT + +_Version update only_ + +## 4.8.1 +Wed, 13 May 2026 09:26:05 GMT + +_Version update only_ + +## 4.8.0 +Tue, 28 Apr 2026 07:56:22 GMT + +_Version update only_ + +## 4.7.0 +Wed, 01 Apr 2026 12:59:29 GMT + +_Version update only_ + +## 4.6.9 +Mon, 16 Mar 2026 15:43:06 GMT + +_Version update only_ + +## 4.6.8 +Tue, 28 Oct 2025 09:46:42 GMT + +_Version update only_ + +## 4.6.7 +Tue, 07 Oct 2025 14:53:36 GMT + +_Version update only_ + +## 4.6.6 +Tue, 26 Aug 2025 08:42:28 GMT + +_Version update only_ + +## 4.6.5 +Wed, 25 Jun 2025 21:16:46 GMT + +_Version update only_ + +## 4.6.4 +Wed, 25 Jun 2025 12:08:50 GMT + +_Version update only_ + +## 4.6.3 +Thu, 29 May 2025 19:52:07 GMT + +_Version update only_ + +## 4.6.2 +Tue, 20 May 2025 07:39:05 GMT + +_Version update only_ + +## 4.6.1 +Tue, 06 May 2025 13:10:51 GMT + +_Version update only_ + +## 4.6.0 +Thu, 01 May 2025 09:58:59 GMT + +_Version update only_ + +## 4.5.0 +Fri, 04 Apr 2025 09:21:23 GMT + +_Version update only_ + +## 4.4.0 +Thu, 20 Mar 2025 12:14:34 GMT + +_Version update only_ + +## 4.3.1 +Tue, 21 Jan 2025 11:09:42 GMT + +### Updates + +- Update WebView tracker version WebView plugin to fix issue with tracking page view and page ping event properties + +## 4.3.0 +Mon, 20 Jan 2025 11:45:13 GMT + +### Updates + +- Add WebView plugin (#1402) + diff --git a/plugins/browser-plugin-webview/LICENSE b/plugins/browser-plugin-webview/LICENSE new file mode 100644 index 000000000..48c0a11e4 --- /dev/null +++ b/plugins/browser-plugin-webview/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2024 Snowplow Analytics Ltd +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/plugins/browser-plugin-webview/README.md b/plugins/browser-plugin-webview/README.md new file mode 100644 index 000000000..6f8cd40c0 --- /dev/null +++ b/plugins/browser-plugin-webview/README.md @@ -0,0 +1,59 @@ +# Snowplow WebView Plugin + +[![npm version][npm-image]][npm-url] +[![License][license-image]](LICENSE) + +Browser Plugin to be used with `@snowplow/browser-tracker`. + +This plugin is for use in WebViews. It forwards the events to the Snowplow Android, iOS, or React Native trackers via the [Snowplow WebView tracker](https://github.com/snowplow-incubator/snowplow-webview-tracker). + +## Maintainer quick start + +Part of the Snowplow JavaScript Tracker monorepo. +Build with [Node.js](https://nodejs.org/en/) (18 - 20) and [Rush](https://rushjs.io/). + +### Setup repository + +```bash +npm install -g @microsoft/rush +git clone https://github.com/snowplow/snowplow-javascript-tracker.git +rush update +``` + +## Package Installation + +With npm: + +```bash +npm install @snowplow/browser-plugin-webview +``` + +## Usage + +Initialize your tracker with the `WebViewPlugin`: + +```js +import { newTracker } from '@snowplow/browser-tracker'; +import { WebViewPlugin } from '@snowplow/browser-plugin-webview'; + +newTracker('sp1', '{{collector_url}}', { + appId: 'my-app-id', + plugins: [ WebViewPlugin() ], +}); +``` + +For a full API reference, you can read the plugin [documentation page](https://docs.snowplow.io/docs/collecting-data/collecting-from-own-applications/javascript-trackers/browser-tracker/browser-tracker-v3-reference/plugins/webview/). + +## Copyright and license + +Licensed and distributed under the [BSD 3-Clause License](LICENSE) ([An OSI Approved License][osi]). + +Copyright (c) 2024 Snowplow Analytics Ltd. + +All rights reserved. + +[npm-url]: https://www.npmjs.com/package/@snowplow/browser-plugin-webview +[npm-image]: https://img.shields.io/npm/v/@snowplow/browser-plugin-webview +[docs]: https://docs.snowplowanalytics.com/docs/collecting-data/collecting-from-own-applications/javascript-tracker/ +[osi]: https://opensource.org/licenses/BSD-3-Clause +[license-image]: https://img.shields.io/npm/l/@snowplow/browser-plugin-webview diff --git a/plugins/browser-plugin-webview/jest.config.js b/plugins/browser-plugin-webview/jest.config.js new file mode 100644 index 000000000..87d15da9b --- /dev/null +++ b/plugins/browser-plugin-webview/jest.config.js @@ -0,0 +1,6 @@ +module.exports = { + preset: 'ts-jest', + reporters: ['jest-standard-reporter'], + setupFilesAfterEnv: ['../../setupTestGlobals.ts'], + testEnvironment: 'jest-environment-jsdom-global', +}; diff --git a/plugins/browser-plugin-webview/package.json b/plugins/browser-plugin-webview/package.json new file mode 100644 index 000000000..2735c36d1 --- /dev/null +++ b/plugins/browser-plugin-webview/package.json @@ -0,0 +1,53 @@ +{ + "name": "@snowplow/browser-plugin-webview", + "version": "4.10.1", + "description": "Automatically forwards events to Snowplow mobile trackers running in a WebView.", + "homepage": "https://github.com/snowplow/snowplow-javascript-tracker", + "bugs": "https://github.com/snowplow/snowplow-javascript-tracker/issues", + "repository": { + "type": "git", + "url": "https://github.com/snowplow/snowplow-javascript-tracker.git" + }, + "license": "BSD-3-Clause", + "author": "Snowplow Analytics Ltd (https://snowplow.io/)", + "sideEffects": false, + "main": "./dist/index.umd.js", + "module": "./dist/index.module.js", + "types": "./dist/index.module.d.ts", + "files": [ + "dist" + ], + "scripts": { + "build": "rollup -c --silent --failAfterWarnings", + "test": "jest" + }, + "dependencies": { + "@snowplow/browser-tracker-core": "workspace:*", + "@snowplow/tracker-core": "workspace:*", + "tslib": "^2.3.1", + "@snowplow/webview-tracker": "^0.3.1" + }, + "devDependencies": { + "@rollup/plugin-commonjs": "~21.0.2", + "@rollup/plugin-node-resolve": "~13.1.3", + "@types/jest": "~28.1.1", + "@types/jsdom": "~16.2.14", + "@typescript-eslint/eslint-plugin": "~5.15.0", + "@typescript-eslint/parser": "~5.15.0", + "eslint": "~8.11.0", + "jest": "~28.1.3", + "jest-environment-jsdom": "~28.1.3", + "jest-environment-jsdom-global": "~4.0.0", + "jest-standard-reporter": "~2.0.0", + "rollup": "~2.70.1", + "rollup-plugin-cleanup": "~3.2.1", + "rollup-plugin-license": "~2.6.1", + "rollup-plugin-terser": "~7.0.2", + "rollup-plugin-ts": "~2.0.5", + "ts-jest": "~28.0.8", + "typescript": "~4.6.2" + }, + "peerDependencies": { + "@snowplow/browser-tracker": "~4.10.1" + } +} diff --git a/plugins/browser-plugin-webview/rollup.config.js b/plugins/browser-plugin-webview/rollup.config.js new file mode 100644 index 000000000..7bf700326 --- /dev/null +++ b/plugins/browser-plugin-webview/rollup.config.js @@ -0,0 +1,36 @@ +import { nodeResolve } from '@rollup/plugin-node-resolve'; +import commonjs from '@rollup/plugin-commonjs'; +import ts from 'rollup-plugin-ts'; // Preferred over @rollup/plugin-typescript as it bundles .d.ts files +import { banner } from '../../banner'; +import { terser } from 'rollup-plugin-terser'; +import cleanup from 'rollup-plugin-cleanup'; +import pkg from './package.json'; +import { builtinModules } from 'module'; + +const umdPlugins = [nodeResolve({ browser: true }), commonjs(), ts()]; +const umdName = 'snowplowWebViewTracking'; + +export default [ + // CommonJS (for Node) and ES module (for bundlers) build. + { + input: './src/index.ts', + plugins: [...umdPlugins, banner()], + treeshake: { moduleSideEffects: ['sha1'] }, + output: [{ file: pkg.main, format: 'umd', sourcemap: true, name: umdName }], + }, + { + input: './src/index.ts', + plugins: [...umdPlugins, terser(), cleanup({ comments: 'none' }), banner()], + treeshake: { moduleSideEffects: ['sha1'] }, + output: [{ file: pkg.main.replace('.js', '.min.js'), format: 'umd', sourcemap: true, name: umdName }], + }, + { + input: './src/index.ts', + external: [...builtinModules, ...Object.keys(pkg.dependencies), ...Object.keys(pkg.devDependencies)], + plugins: [ + ts(), // so Rollup can convert TypeScript to JavaScript + banner(), + ], + output: [{ file: pkg.module, format: 'es', sourcemap: true }], + }, +]; diff --git a/plugins/browser-plugin-webview/src/index.ts b/plugins/browser-plugin-webview/src/index.ts new file mode 100644 index 000000000..c7f5c2882 --- /dev/null +++ b/plugins/browser-plugin-webview/src/index.ts @@ -0,0 +1,80 @@ +import { BrowserPlugin, Payload } from '@snowplow/browser-tracker-core'; +import { hasMobileInterface, trackWebViewEvent } from '@snowplow/webview-tracker'; +import { Logger, SelfDescribingEvent, SelfDescribingJson } from '@snowplow/tracker-core'; +import { base64urldecode } from './utils'; +import { AtomicProperties } from '@snowplow/webview-tracker/dist/api'; + +type WebViewPluginOptions = { + /** + * Provide a list of tracker namespaces to forward events to. + * By default, the events will be forwarded to the default mobile tracker. + */ + trackerNamespaces?: string[]; +}; + +/** + * Forwards events to Snowplow mobile trackers running in a WebView. + * @param configuration - Configuration. Specify certain tracker namespaces to forward events to. + */ +export function WebViewPlugin(configuration?: WebViewPluginOptions): BrowserPlugin { + let LOG: Logger; + + return { + logger: (logger: Logger) => { + LOG = logger; + }, + + filter: (payload) => { + if (hasMobileInterface() === true) { + LOG.debug(`Payload (event ID: ${payload.eid}) was filtered out and forwarded to WebView tracker.`); + + let atomicProperties: AtomicProperties = { + eventName: payload.e as string, + trackerVersion: payload.tv as string, + useragent: (payload.ua as string) ?? window.navigator.userAgent, + pageUrl: payload.url as string | undefined, + pageTitle: payload.page as string | undefined, + referrer: payload.refr as string | undefined, + category: payload.se_ca as string | undefined, + action: payload.se_ac as string | undefined, + label: payload.se_la as string | undefined, + property: payload.se_pr as string | undefined, + value: payload.se_va !== undefined ? parseFloat(payload.se_va as string) : undefined, + pingXOffsetMin: payload.pp_mix !== undefined ? parseInt(payload.pp_mix as string) : undefined, + pingXOffsetMax: payload.pp_max !== undefined ? parseInt(payload.pp_max as string) : undefined, + pingYOffsetMin: payload.pp_miy !== undefined ? parseInt(payload.pp_miy as string) : undefined, + pingYOffsetMax: payload.pp_may !== undefined ? parseInt(payload.pp_may as string) : undefined, + }; + let event = getSelfDescribingEventData(payload); + let entities = getEntities(payload); + let trackers: Array | undefined = configuration?.trackerNamespaces; + + trackWebViewEvent({ properties: atomicProperties, event: event, context: entities }, trackers); + + return false; + } else { + return true; + } + }, + }; +} + +function getSelfDescribingEventData(payload: Payload): SelfDescribingEvent | undefined { + if (payload.ue_pr) { + return JSON.parse(payload.ue_pr as string).data; + } else if (payload.ue_px) { + let decoded = base64urldecode(payload.ue_px as string); + return JSON.parse(decoded).data; + } + return undefined; +} + +function getEntities(payload: Payload): SelfDescribingJson[] { + if (payload.co) { + return JSON.parse(payload.co as string)['data']; + } else if (payload.cx) { + let decoded = base64urldecode(payload.cx as string); + return JSON.parse(decoded)['data']; + } + return []; +} diff --git a/plugins/browser-plugin-webview/src/utils.ts b/plugins/browser-plugin-webview/src/utils.ts new file mode 100644 index 000000000..0c990096d --- /dev/null +++ b/plugins/browser-plugin-webview/src/utils.ts @@ -0,0 +1,102 @@ +/** + * Decodes base64-encoded strings. + * Copied from the core library. + */ +export function base64urldecode(data: string): string { + if (!data) { + return data; + } + const padding = 4 - (data.length % 4); + switch (padding) { + case 2: + data += '=='; + break; + case 3: + data += '='; + break; + } + const b64Data = data.replace(/-/g, '+').replace(/_/g, '/'); + return base64decode(b64Data); +} + +const b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + +function base64decode(encodedData: string): string { + // discuss at: http://locutus.io/php/base64_decode/ + // original by: Tyler Akins (http://rumkin.com) + // improved by: Thunder.m + // improved by: Kevin van Zonneveld (http://kvz.io) + // improved by: Kevin van Zonneveld (http://kvz.io) + // input by: Aman Gupta + // input by: Brett Zamir (http://brett-zamir.me) + // bugfixed by: Onno Marsman (https://twitter.com/onnomarsman) + // bugfixed by: Pellentesque Malesuada + // bugfixed by: Kevin van Zonneveld (http://kvz.io) + // improved by: Indigo744 + // example 1: base64_decode('S2V2aW4gdmFuIFpvbm5ldmVsZA==') + // returns 1: 'Kevin van Zonneveld' + // example 2: base64_decode('YQ==') + // returns 2: 'a' + // example 3: base64_decode('4pyTIMOgIGxhIG1vZGU=') + // returns 3: '✓ à la mode' + + // decodeUTF8string() + // Internal function to decode properly UTF8 string + // Adapted from Solution #1 at https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding + const decodeUTF8string = function (str: string) { + // Going backwards: from bytestream, to percent-encoding, to original string. + return decodeURIComponent( + str + .split('') + .map(function (c) { + return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); + }) + .join('') + ); + }; + + let o1, + o2, + o3, + h1, + h2, + h3, + h4, + bits, + i = 0, + ac = 0, + dec = ''; + const tmpArr: Array = []; + + if (!encodedData) { + return encodedData; + } + + encodedData += ''; + + do { + // unpack four hexets into three octets using index points in b64 + h1 = b64.indexOf(encodedData.charAt(i++)); + h2 = b64.indexOf(encodedData.charAt(i++)); + h3 = b64.indexOf(encodedData.charAt(i++)); + h4 = b64.indexOf(encodedData.charAt(i++)); + + bits = (h1 << 18) | (h2 << 12) | (h3 << 6) | h4; + + o1 = (bits >> 16) & 0xff; + o2 = (bits >> 8) & 0xff; + o3 = bits & 0xff; + + if (h3 === 64) { + tmpArr[ac++] = String.fromCharCode(o1); + } else if (h4 === 64) { + tmpArr[ac++] = String.fromCharCode(o1, o2); + } else { + tmpArr[ac++] = String.fromCharCode(o1, o2, o3); + } + } while (i < encodedData.length); + + dec = tmpArr.join(''); + + return decodeUTF8string(dec.replace(/\0+$/, '')); +} diff --git a/plugins/browser-plugin-webview/test/webview.test.ts b/plugins/browser-plugin-webview/test/webview.test.ts new file mode 100644 index 000000000..9b33e93f8 --- /dev/null +++ b/plugins/browser-plugin-webview/test/webview.test.ts @@ -0,0 +1,229 @@ +import { addTracker, SharedState, EventStore, BrowserTracker } from '@snowplow/browser-tracker-core'; +import { newInMemoryEventStore, buildSelfDescribingEvent } from '@snowplow/tracker-core'; +import { WebViewPlugin } from '../src'; +import { hasMobileInterface, trackWebViewEvent } from '@snowplow/webview-tracker'; + +jest.mock('@snowplow/webview-tracker'); + +describe('WebView plugin', () => { + afterEach(() => { + jest.clearAllMocks(); + }); + + let idx = 1; + let eventStore: EventStore; + let tracker: BrowserTracker | null; + + let mockHasMobileInterface = hasMobileInterface as jest.Mock; + let mockTrackWebViewEvent = trackWebViewEvent as jest.Mock; + + it('Does not filter events if mobile interface not found', async () => { + mockHasMobileInterface.mockImplementation(() => { + return false; + }); + + eventStore = newInMemoryEventStore({}); + const customFetch = async () => new Response(null, { status: 500 }); + tracker = addTracker(`sp${idx++}`, `sp${idx++}`, 'js-4.0.0', '', new SharedState(), { + plugins: [WebViewPlugin()], + eventStore, + customFetch, + }); + + tracker?.trackPageView(); + + let events = await eventStore.getAllPayloads(); + expect(events).toHaveLength(1); + expect(mockTrackWebViewEvent).not.toHaveBeenCalled(); + }); + + it('Filters out the events if a mobile interface is present', async () => { + mockHasMobileInterface.mockImplementation(() => { + return true; + }); + + eventStore = newInMemoryEventStore({}); + const customFetch = async () => new Response(null, { status: 500 }); + tracker = addTracker(`sp${idx++}`, `sp${idx++}`, 'js-4.0.0', '', new SharedState(), { + plugins: [WebViewPlugin()], + eventStore, + customFetch, + }); + + tracker?.trackPageView(); + tracker?.core.track( + buildSelfDescribingEvent({ + event: { + schema: 'iglu:com.snowplowanalytics.snowplow.media/play_event/jsonschema/1-0-0', + data: { + a: 'b', + }, + }, + }) + ); + + let events = await eventStore.getAllPayloads(); + expect(events).toHaveLength(0); + expect(mockTrackWebViewEvent).toHaveBeenCalled(); + + let calls = mockTrackWebViewEvent.mock.calls; + // tracked two events + expect(calls).toHaveLength(2); + + // page view event properties + expect(calls[0][0]).toMatchObject({ + properties: { + eventName: 'pv', + trackerVersion: 'js-4.0.0', + useragent: expect.any(String), + pageUrl: expect.any(String), + }, + context: [ + { + schema: 'iglu:com.snowplowanalytics.snowplow/web_page/jsonschema/1-0-0', + data: { + id: expect.any(String), + }, + }, + ], + }); + + // self-describing event properties + expect(calls[1][0]).toMatchObject({ + properties: { + eventName: 'ue', + trackerVersion: 'js-4.0.0', + useragent: expect.any(String), + pageUrl: expect.any(String), + pageTitle: undefined, + referrer: undefined, + category: undefined, + action: undefined, + label: undefined, + property: undefined, + value: undefined, + pingXOffsetMin: undefined, + pingXOffsetMax: undefined, + pingYOffsetMin: undefined, + pingYOffsetMax: undefined, + }, + event: { + schema: 'iglu:com.snowplowanalytics.snowplow.media/play_event/jsonschema/1-0-0', + data: { a: 'b' }, + }, + context: [ + { + schema: 'iglu:com.snowplowanalytics.snowplow/web_page/jsonschema/1-0-0', + data: { + id: expect.any(String), + }, + }, + ], + }); + + // no tracker namespaces provided + expect(calls[0][1]).toBeUndefined(); + }); + + it('Decodes base64-encoded payloads', async () => { + mockHasMobileInterface.mockImplementation(() => { + return true; + }); + + eventStore = newInMemoryEventStore({}); + const customFetch = async () => new Response(null, { status: 500 }); + tracker = addTracker(`sp${idx++}`, `sp${idx++}`, 'js-4.0.0', '', new SharedState(), { + plugins: [WebViewPlugin()], + eventStore, + customFetch, + }); + + tracker?.core.setBase64Encoding(true); + + tracker?.core.track( + buildSelfDescribingEvent({ + event: { + schema: 'iglu:com.snowplowanalytics.snowplow/example/jsonschema/1-0-0', + data: { + hello: 'world', + }, + }, + }) + ); + + let events = await eventStore.getAllPayloads(); + expect(events).toHaveLength(0); + expect(mockTrackWebViewEvent).toHaveBeenCalled(); + + let calls = mockTrackWebViewEvent.mock.calls; + expect(calls).toHaveLength(1); + + // decoded event properties + expect(calls[0][0]).toMatchObject({ + properties: { + eventName: 'ue', + trackerVersion: 'js-4.0.0', + useragent: expect.any(String), + pageUrl: expect.any(String), + }, + event: { + schema: 'iglu:com.snowplowanalytics.snowplow/example/jsonschema/1-0-0', + data: { hello: 'world' }, + }, + context: [ + { + schema: 'iglu:com.snowplowanalytics.snowplow/web_page/jsonschema/1-0-0', + data: { + id: expect.any(String), + }, + }, + ], + }); + }); + + it('Does not forward client_session entity when disableSessionContextWithinWebView is true', async () => { + mockHasMobileInterface.mockImplementation(() => true); + (window as any).ReactNativeWebView = { postMessage: () => {} }; + + eventStore = newInMemoryEventStore({}); + const customFetch = async () => new Response(null, { status: 500 }); + tracker = addTracker(`sp${idx++}`, `sp${idx++}`, 'js-4.0.0', '', new SharedState(), { + plugins: [WebViewPlugin()], + eventStore, + customFetch, + contexts: { session: true }, + stateStorageStrategy: 'cookieAndLocalStorage', + encodeBase64: false, + disableSessionContextWithinWebView: true, + }); + + tracker?.trackPageView(); + + let calls = mockTrackWebViewEvent.mock.calls; + expect(calls).toHaveLength(1); + const forwardedContext: Array<{ schema: string }> = calls[0][0].context; + const hasClientSession = forwardedContext.some((entity) => entity.schema.includes('client_session')); + expect(hasClientSession).toBe(false); + + delete (window as any).ReactNativeWebView; + }); + + it('Passes a configured list of tracker namespaces', async () => { + mockHasMobileInterface.mockImplementation(() => { + return true; + }); + + eventStore = newInMemoryEventStore({}); + const customFetch = async () => new Response(null, { status: 500 }); + tracker = addTracker(`sp${idx++}`, `sp${idx++}`, 'js-4.0.0', '', new SharedState(), { + plugins: [WebViewPlugin({ trackerNamespaces: ['sp1', 'sp2'] })], + eventStore, + customFetch, + }); + + tracker?.trackPageView(); + let calls = mockTrackWebViewEvent.mock.calls; + expect(calls).toHaveLength(1); + expect(calls[0][1]).toEqual(['sp1', 'sp2']); + }); +}); diff --git a/plugins/browser-plugin-webview/tsconfig.json b/plugins/browser-plugin-webview/tsconfig.json new file mode 100644 index 000000000..4082f16a5 --- /dev/null +++ b/plugins/browser-plugin-webview/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "../../tsconfig.json" +} diff --git a/plugins/browser-plugin-youtube-tracking/CHANGELOG.json b/plugins/browser-plugin-youtube-tracking/CHANGELOG.json index a874d6d0e..b700577cf 100644 --- a/plugins/browser-plugin-youtube-tracking/CHANGELOG.json +++ b/plugins/browser-plugin-youtube-tracking/CHANGELOG.json @@ -1,6 +1,174 @@ { "name": "@snowplow/browser-plugin-youtube-tracking", "entries": [ + { + "version": "4.10.1", + "tag": "@snowplow/browser-plugin-youtube-tracking_v4.10.1", + "date": "Wed, 19 Aug 2026 14:26:05 GMT", + "comments": {} + }, + { + "version": "4.10.0", + "tag": "@snowplow/browser-plugin-youtube-tracking_v4.10.0", + "date": "Mon, 27 Jul 2026 13:52:14 GMT", + "comments": {} + }, + { + "version": "4.9.0", + "tag": "@snowplow/browser-plugin-youtube-tracking_v4.9.0", + "date": "Tue, 21 Jul 2026 14:53:08 GMT", + "comments": {} + }, + { + "version": "4.8.4", + "tag": "@snowplow/browser-plugin-youtube-tracking_v4.8.4", + "date": "Thu, 02 Jul 2026 10:07:52 GMT", + "comments": {} + }, + { + "version": "4.8.3", + "tag": "@snowplow/browser-plugin-youtube-tracking_v4.8.3", + "date": "Tue, 30 Jun 2026 14:22:03 GMT", + "comments": { + "none": [ + { + "comment": "Update uuid to v11 and remove closure-compiler from the build pipeline" + } + ] + } + }, + { + "version": "4.8.2", + "tag": "@snowplow/browser-plugin-youtube-tracking_v4.8.2", + "date": "Wed, 17 Jun 2026 12:30:12 GMT", + "comments": {} + }, + { + "version": "4.8.1", + "tag": "@snowplow/browser-plugin-youtube-tracking_v4.8.1", + "date": "Wed, 13 May 2026 09:26:05 GMT", + "comments": {} + }, + { + "version": "4.8.0", + "tag": "@snowplow/browser-plugin-youtube-tracking_v4.8.0", + "date": "Tue, 28 Apr 2026 07:56:22 GMT", + "comments": {} + }, + { + "version": "4.7.0", + "tag": "@snowplow/browser-plugin-youtube-tracking_v4.7.0", + "date": "Wed, 01 Apr 2026 12:59:29 GMT", + "comments": {} + }, + { + "version": "4.6.9", + "tag": "@snowplow/browser-plugin-youtube-tracking_v4.6.9", + "date": "Mon, 16 Mar 2026 15:43:06 GMT", + "comments": {} + }, + { + "version": "4.6.8", + "tag": "@snowplow/browser-plugin-youtube-tracking_v4.6.8", + "date": "Tue, 28 Oct 2025 09:46:42 GMT", + "comments": {} + }, + { + "version": "4.6.7", + "tag": "@snowplow/browser-plugin-youtube-tracking_v4.6.7", + "date": "Tue, 07 Oct 2025 14:53:36 GMT", + "comments": {} + }, + { + "version": "4.6.6", + "tag": "@snowplow/browser-plugin-youtube-tracking_v4.6.6", + "date": "Tue, 26 Aug 2025 08:42:28 GMT", + "comments": {} + }, + { + "version": "4.6.5", + "tag": "@snowplow/browser-plugin-youtube-tracking_v4.6.5", + "date": "Wed, 25 Jun 2025 21:16:46 GMT", + "comments": {} + }, + { + "version": "4.6.4", + "tag": "@snowplow/browser-plugin-youtube-tracking_v4.6.4", + "date": "Wed, 25 Jun 2025 12:08:50 GMT", + "comments": {} + }, + { + "version": "4.6.3", + "tag": "@snowplow/browser-plugin-youtube-tracking_v4.6.3", + "date": "Thu, 29 May 2025 19:52:07 GMT", + "comments": {} + }, + { + "version": "4.6.2", + "tag": "@snowplow/browser-plugin-youtube-tracking_v4.6.2", + "date": "Tue, 20 May 2025 07:39:05 GMT", + "comments": {} + }, + { + "version": "4.6.1", + "tag": "@snowplow/browser-plugin-youtube-tracking_v4.6.1", + "date": "Tue, 06 May 2025 13:10:51 GMT", + "comments": {} + }, + { + "version": "4.6.0", + "tag": "@snowplow/browser-plugin-youtube-tracking_v4.6.0", + "date": "Thu, 01 May 2025 09:58:59 GMT", + "comments": {} + }, + { + "version": "4.5.0", + "tag": "@snowplow/browser-plugin-youtube-tracking_v4.5.0", + "date": "Fri, 04 Apr 2025 09:21:23 GMT", + "comments": {} + }, + { + "version": "4.4.0", + "tag": "@snowplow/browser-plugin-youtube-tracking_v4.4.0", + "date": "Thu, 20 Mar 2025 12:14:34 GMT", + "comments": {} + }, + { + "version": "4.3.1", + "tag": "@snowplow/browser-plugin-youtube-tracking_v4.3.1", + "date": "Tue, 21 Jan 2025 11:09:42 GMT", + "comments": {} + }, + { + "version": "4.3.0", + "tag": "@snowplow/browser-plugin-youtube-tracking_v4.3.0", + "date": "Mon, 20 Jan 2025 11:45:13 GMT", + "comments": {} + }, + { + "version": "4.2.0", + "tag": "@snowplow/browser-plugin-youtube-tracking_v4.2.0", + "date": "Mon, 13 Jan 2025 08:30:05 GMT", + "comments": {} + }, + { + "version": "4.1.0", + "tag": "@snowplow/browser-plugin-youtube-tracking_v4.1.0", + "date": "Thu, 28 Nov 2024 10:57:30 GMT", + "comments": {} + }, + { + "version": "4.0.4", + "tag": "@snowplow/browser-plugin-youtube-tracking_v4.0.4", + "date": "Thu, 21 Nov 2024 09:06:36 GMT", + "comments": {} + }, + { + "version": "4.0.3", + "tag": "@snowplow/browser-plugin-youtube-tracking_v4.0.3", + "date": "Wed, 20 Nov 2024 09:30:31 GMT", + "comments": {} + }, { "version": "4.0.2", "tag": "@snowplow/browser-plugin-youtube-tracking_v4.0.2", diff --git a/plugins/browser-plugin-youtube-tracking/CHANGELOG.md b/plugins/browser-plugin-youtube-tracking/CHANGELOG.md index 4ab6b4f87..a573c9b70 100644 --- a/plugins/browser-plugin-youtube-tracking/CHANGELOG.md +++ b/plugins/browser-plugin-youtube-tracking/CHANGELOG.md @@ -1,6 +1,143 @@ # Change Log - @snowplow/browser-plugin-youtube-tracking -This log was last generated on Mon, 11 Nov 2024 15:46:34 GMT and should not be manually modified. +This log was last generated on Wed, 19 Aug 2026 14:26:05 GMT and should not be manually modified. + +## 4.10.1 +Wed, 19 Aug 2026 14:26:05 GMT + +_Version update only_ + +## 4.10.0 +Mon, 27 Jul 2026 13:52:14 GMT + +_Version update only_ + +## 4.9.0 +Tue, 21 Jul 2026 14:53:08 GMT + +_Version update only_ + +## 4.8.4 +Thu, 02 Jul 2026 10:07:52 GMT + +_Version update only_ + +## 4.8.3 +Tue, 30 Jun 2026 14:22:03 GMT + +### Updates + +- Update uuid to v11 and remove closure-compiler from the build pipeline + +## 4.8.2 +Wed, 17 Jun 2026 12:30:12 GMT + +_Version update only_ + +## 4.8.1 +Wed, 13 May 2026 09:26:05 GMT + +_Version update only_ + +## 4.8.0 +Tue, 28 Apr 2026 07:56:22 GMT + +_Version update only_ + +## 4.7.0 +Wed, 01 Apr 2026 12:59:29 GMT + +_Version update only_ + +## 4.6.9 +Mon, 16 Mar 2026 15:43:06 GMT + +_Version update only_ + +## 4.6.8 +Tue, 28 Oct 2025 09:46:42 GMT + +_Version update only_ + +## 4.6.7 +Tue, 07 Oct 2025 14:53:36 GMT + +_Version update only_ + +## 4.6.6 +Tue, 26 Aug 2025 08:42:28 GMT + +_Version update only_ + +## 4.6.5 +Wed, 25 Jun 2025 21:16:46 GMT + +_Version update only_ + +## 4.6.4 +Wed, 25 Jun 2025 12:08:50 GMT + +_Version update only_ + +## 4.6.3 +Thu, 29 May 2025 19:52:07 GMT + +_Version update only_ + +## 4.6.2 +Tue, 20 May 2025 07:39:05 GMT + +_Version update only_ + +## 4.6.1 +Tue, 06 May 2025 13:10:51 GMT + +_Version update only_ + +## 4.6.0 +Thu, 01 May 2025 09:58:59 GMT + +_Version update only_ + +## 4.5.0 +Fri, 04 Apr 2025 09:21:23 GMT + +_Version update only_ + +## 4.4.0 +Thu, 20 Mar 2025 12:14:34 GMT + +_Version update only_ + +## 4.3.1 +Tue, 21 Jan 2025 11:09:42 GMT + +_Version update only_ + +## 4.3.0 +Mon, 20 Jan 2025 11:45:13 GMT + +_Version update only_ + +## 4.2.0 +Mon, 13 Jan 2025 08:30:05 GMT + +_Version update only_ + +## 4.1.0 +Thu, 28 Nov 2024 10:57:30 GMT + +_Version update only_ + +## 4.0.4 +Thu, 21 Nov 2024 09:06:36 GMT + +_Version update only_ + +## 4.0.3 +Wed, 20 Nov 2024 09:30:31 GMT + +_Version update only_ ## 4.0.2 Mon, 11 Nov 2024 15:46:34 GMT diff --git a/plugins/browser-plugin-youtube-tracking/package.json b/plugins/browser-plugin-youtube-tracking/package.json index 390c109d0..e0f869fa8 100644 --- a/plugins/browser-plugin-youtube-tracking/package.json +++ b/plugins/browser-plugin-youtube-tracking/package.json @@ -1,6 +1,6 @@ { "name": "@snowplow/browser-plugin-youtube-tracking", - "version": "4.0.2", + "version": "4.10.1", "description": "YouTube tracking for Snowplow", "homepage": "http://bit.ly/sp-js", "bugs": "https://github.com/snowplow/snowplow-javascript-tracker/issues", @@ -25,32 +25,30 @@ "@snowplow/tracker-core": "workspace:*", "@snowplow/browser-plugin-media": "workspace:*", "tslib": "^2.3.1", - "uuid": "^10.0.0" + "uuid": "^11.1.1" }, "devDependencies": { - "@ampproject/rollup-plugin-closure-compiler": "~0.27.0", "@rollup/plugin-commonjs": "~21.0.2", "@rollup/plugin-node-resolve": "~13.1.3", - "@types/jest": "~27.4.1", + "@types/jest": "~28.1.1", "@types/jsdom": "~16.2.14", - "@types/uuid": "^10.0.0", "@types/youtube": "~0.0.46", "@typescript-eslint/eslint-plugin": "~5.15.0", "@typescript-eslint/parser": "~5.15.0", "eslint": "~8.11.0", - "jest": "~27.5.1", - "jest-environment-jsdom": "~27.5.1", - "jest-environment-jsdom-global": "~3.0.0", + "jest": "~28.1.3", + "jest-environment-jsdom": "~28.1.3", + "jest-environment-jsdom-global": "~4.0.0", "jest-standard-reporter": "~2.0.0", "rollup": "~2.70.1", "rollup-plugin-cleanup": "~3.2.1", "rollup-plugin-license": "~2.6.1", "rollup-plugin-terser": "~7.0.2", "rollup-plugin-ts": "~2.0.5", - "ts-jest": "~27.1.3", + "ts-jest": "~28.0.8", "typescript": "~4.6.2" }, "peerDependencies": { - "@snowplow/browser-tracker": "~4.0.2" + "@snowplow/browser-tracker": "~4.10.1" } } diff --git a/plugins/browser-plugin-youtube-tracking/rollup.config.js b/plugins/browser-plugin-youtube-tracking/rollup.config.js index e75485d15..bf6095639 100644 --- a/plugins/browser-plugin-youtube-tracking/rollup.config.js +++ b/plugins/browser-plugin-youtube-tracking/rollup.config.js @@ -32,7 +32,6 @@ import { nodeResolve } from '@rollup/plugin-node-resolve'; import commonjs from '@rollup/plugin-commonjs'; import ts from 'rollup-plugin-ts'; import { banner } from '../../banner'; -import compiler from '@ampproject/rollup-plugin-closure-compiler'; import { terser } from 'rollup-plugin-terser'; import cleanup from 'rollup-plugin-cleanup'; import pkg from './package.json'; @@ -51,7 +50,7 @@ export default [ }, { input: './src/index.ts', - plugins: [...umdPlugins, compiler(), terser(), cleanup({ comments: 'none' }), banner(true)], + plugins: [...umdPlugins, terser(), cleanup({ comments: 'none' }), banner(true)], treeshake: { moduleSideEffects: ['sha1'] }, output: [{ file: pkg.main.replace('.js', '.min.js'), format: 'umd', sourcemap: true, name: umdName }], }, diff --git a/rush.json b/rush.json index 338d6707b..2bd623727 100644 --- a/rush.json +++ b/rush.json @@ -118,7 +118,7 @@ * Specify a SemVer range to ensure developers use a Node.js version that is appropriate * for your repo. */ - "nodeSupportedVersionRange": ">=18.0.0 <25.0.0", + "nodeSupportedVersionRange": ">=20.19.0 <25.0.0", /** * Odd-numbered major versions of Node.js are experimental. Even-numbered releases @@ -371,6 +371,12 @@ "reviewCategory": "trackers", "versionPolicyName": "tracker" }, + { + "packageName": "@snowplow/react-native-tracker", + "projectFolder": "trackers/react-native-tracker", + "reviewCategory": "trackers", + "versionPolicyName": "tracker" + }, { "packageName": "@snowplow/tracker-core", @@ -421,6 +427,12 @@ "reviewCategory": "plugins", "versionPolicyName": "tracker" }, + { + "packageName": "@snowplow/browser-plugin-element-tracking", + "projectFolder": "plugins/browser-plugin-element-tracking", + "reviewCategory": "plugins", + "versionPolicyName": "tracker" + }, { "packageName": "@snowplow/browser-plugin-form-tracking", "projectFolder": "plugins/browser-plugin-form-tracking", @@ -451,6 +463,12 @@ "reviewCategory": "plugins", "versionPolicyName": "tracker" }, + { + "packageName": "@snowplow/browser-plugin-bot-detection", + "projectFolder": "plugins/browser-plugin-bot-detection", + "reviewCategory": "plugins", + "versionPolicyName": "tracker" + }, { "packageName": "@snowplow/browser-plugin-site-tracking", "projectFolder": "plugins/browser-plugin-site-tracking", @@ -534,6 +552,18 @@ "projectFolder": "plugins/browser-plugin-event-specifications", "reviewCategory": "plugins", "versionPolicyName": "tracker" + }, + { + "packageName": "@snowplow/browser-plugin-screen-tracking", + "projectFolder": "plugins/browser-plugin-screen-tracking", + "reviewCategory": "plugins", + "versionPolicyName": "tracker" + }, + { + "packageName": "@snowplow/browser-plugin-webview", + "projectFolder": "plugins/browser-plugin-webview", + "reviewCategory": "plugins", + "versionPolicyName": "tracker" } ] } diff --git a/setupTestGlobals.ts b/setupTestGlobals.ts index 0784784e7..0551dab10 100644 --- a/setupTestGlobals.ts +++ b/setupTestGlobals.ts @@ -7,3 +7,12 @@ global.crypto = { return nodeCrypto.randomFillSync(buffer); }, }; + +global.console = { + ...console, + log: jest.fn(), + debug: jest.fn(), + info: jest.fn(), + warn: jest.fn(), + error: jest.fn(), +}; diff --git a/trackers/CLAUDE.md b/trackers/CLAUDE.md new file mode 100644 index 000000000..90ce98560 --- /dev/null +++ b/trackers/CLAUDE.md @@ -0,0 +1,474 @@ +# Platform Trackers - CLAUDE.md + +## Tracker Implementations Overview + +The `trackers/` directory contains platform-specific implementations that build upon the core libraries. Each tracker is optimized for its target environment while maintaining API consistency across platforms. + +## Tracker Types + +### 1. Browser Tracker (`browser-tracker`) +Modern browser tracking with full TypeScript support and tree-shaking: +```typescript +// ✅ Correct: Modern import syntax +import { newTracker, trackPageView } from '@snowplow/browser-tracker'; + +// ❌ Wrong: Legacy global access +window.snowplow('newTracker', ...); // Use imports +``` + +### 2. JavaScript Tracker (`javascript-tracker`) +Legacy SP.js compatible tracker for backward compatibility: +```typescript +// Legacy API maintained for compatibility +window.snowplow('newTracker', 'sp', 'collector.example.com'); +window.snowplow('trackPageView'); +``` + +### 3. Node Tracker (`node-tracker`) +Server-side tracking for Node.js applications: +```typescript +// ✅ Correct: Node-specific implementation +import { tracker } from '@snowplow/node-tracker'; +const t = tracker(emitters, 'namespace', 'appId'); + +// ❌ Wrong: Browser APIs in Node +window.snowplow(...); // Not available in Node +``` + +### 4. React Native Tracker (`react-native-tracker`) +Mobile app tracking with React Native specific features: +```typescript +// ✅ Correct: React Native patterns +import { createTracker } from '@snowplow/react-native-tracker'; +const t = createTracker('namespace', { + endpoint: 'collector.example.com', + method: 'post' +}); +``` + +## Browser Tracker Patterns + +### Initialization Pattern +```typescript +// ✅ Correct: Typed configuration +import { newTracker, BrowserTracker } from '@snowplow/browser-tracker'; + +newTracker('sp1', 'collector.example.com', { + appId: 'my-app', + platform: 'web', + cookieDomain: '.example.com', + discoverRootDomain: true, + plugins: [/* plugins */] +}); + +// ❌ Wrong: Untyped config +newTracker('sp1', 'collector.example.com', { + someOption: 'value' // Type error +}); +``` + +### Plugin Integration +```typescript +// ✅ Correct: Plugin array in config +import { PerformanceTimingPlugin } from '@snowplow/browser-plugin-performance-timing'; +import { ErrorTrackingPlugin } from '@snowplow/browser-plugin-error-tracking'; + +newTracker('sp', 'collector.example.com', { + plugins: [ + PerformanceTimingPlugin(), + ErrorTrackingPlugin() + ] +}); + +// ❌ Wrong: Adding plugins after initialization +const t = newTracker('sp', 'collector.example.com'); +t.addPlugin(plugin); // Not supported +``` + +### Multi-Tracker Pattern +```typescript +// ✅ Correct: Named trackers with specific targeting +newTracker('marketing', 'marketing.collector.com'); +newTracker('product', 'product.collector.com'); + +trackPageView({}, ['marketing']); // Only marketing +trackPageView({}, ['product']); // Only product +trackPageView({}); // All trackers + +// ❌ Wrong: Assuming single tracker +trackPageView(); // Which tracker? +``` + +## JavaScript Tracker (Legacy) + +### Global Queue Pattern +```typescript +// ✅ Correct: Queue-based API +window.snowplow = window.snowplow || []; +window.snowplow.push(['newTracker', 'sp', 'collector.example.com']); +window.snowplow.push(['trackPageView']); + +// ❌ Wrong: Direct function calls before load +window.snowplow('trackPageView'); // May not be ready +``` + +### Async Loading Pattern +```typescript +// ✅ Correct: Async script loading +(function(p,l,o,w,i,n,g){if(!p[i]){p.GlobalSnowplowNamespace=p.GlobalSnowplowNamespace||[]; +p.GlobalSnowplowNamespace.push(i);p[i]=function(){(p[i].q=p[i].q||[]).push(arguments)}; +p[i].q=p[i].q||[];n=l.createElement(o);g=l.getElementsByTagName(o)[0];n.async=1; +n.src=w;g.parentNode.insertBefore(n,g)}}(window,document,'script','//cdn.jsdelivr.net/npm/@snowplow/javascript-tracker@latest/dist/sp.js','snowplow')); +``` + +### Bundle Size Optimization +```typescript +// sp.js - Full bundle with common plugins +// sp.lite.js - Minimal bundle, add plugins as needed + + +``` + +## Node Tracker Patterns + +### Emitter Configuration +```typescript +// ✅ Correct: Node-specific emitter +import { gotEmitter, tracker } from '@snowplow/node-tracker'; + +const emitter = gotEmitter({ + endpoint: 'collector.example.com', + protocol: 'https', + bufferSize: 5, + retries: 3 +}); + +const t = tracker(emitter, 'namespace', 'appId'); + +// ❌ Wrong: Browser emitter in Node +import { Emitter } from '@snowplow/browser-tracker-core'; +``` + +### Server-Side Events +```typescript +// ✅ Correct: Server context +t.track(buildPageView({ + pageUrl: req.url, + referrer: req.headers.referer, + userAgent: req.headers['user-agent'] +}), [{ + schema: 'iglu:com.example/server_context/jsonschema/1-0-0', + data: { + requestId: req.id, + serverTime: Date.now() + } +}]); + +// ❌ Wrong: Browser APIs +t.track(buildPageView({ + pageUrl: window.location.href // Not available +})); +``` + +## React Native Tracker Patterns + +### Platform-Specific Plugins +```typescript +// ✅ Correct: Mobile-specific plugins +import { + InstallTracker, + ScreenViewTracker, + AppLifecycleTracker +} from '@snowplow/react-native-tracker'; + +const tracker = createTracker('namespace', config, { + plugins: [ + InstallTracker(), + ScreenViewTracker(), + AppLifecycleTracker() + ] +}); + +// ❌ Wrong: Browser plugins in React Native +import { LinkClickTracking } from '@snowplow/browser-plugin-link-click-tracking'; +``` + +### Native Bridge Pattern +```typescript +// ✅ Correct: Platform detection +import { Platform } from 'react-native'; + +const config = { + endpoint: 'collector.example.com', + method: Platform.OS === 'ios' ? 'post' : 'get' +}; + +// ❌ Wrong: Assuming platform +const config = { method: 'post' }; // What about Android? +``` + +### Async Storage Integration +```typescript +// ✅ Correct: React Native storage +import AsyncStorage from '@react-native-async-storage/async-storage'; + +const tracker = createTracker('namespace', { + endpoint: 'collector.example.com', + sessionContext: true, + applicationContext: true, + platformContext: true +}); + +// ❌ Wrong: Browser storage +localStorage.setItem(...); // Not available +``` + +## Common Tracker Patterns + +### Event Context Pattern +```typescript +// ✅ Correct: Structured contexts +trackStructEvent({ + category: 'video', + action: 'play', + label: 'tutorial', + property: 'intro', + value: 1.5 +}, [{ + schema: 'iglu:com.example/video_context/jsonschema/1-0-0', + data: { videoId: '123', duration: 120 } +}]); + +// ❌ Wrong: Unstructured data +trackEvent('video', 'play', { videoId: '123' }); +``` + +### Batch Configuration +```typescript +// ✅ Correct: Platform-appropriate batching +// Browser - smaller batches, more frequent +{ bufferSize: 1, maxPostBytes: 40000 } + +// Node - larger batches, less frequent +{ bufferSize: 10, maxPostBytes: 100000 } + +// React Native - mobile-optimized +{ bufferSize: 5, maxPostBytes: 50000 } +``` + +## Testing Patterns + +### Test Organization by Tracker Type +``` +trackers/ +├── browser-tracker/test/ +│ ├── unit/ # Unit tests +│ └── integration/ # Integration tests +├── javascript-tracker/test/ +│ ├── integration/ # Snowplow Micro tests +│ └── functional/ # Browser automation tests +├── node-tracker/test/ +│ └── *.test.ts # Node-specific tests +└── react-native-tracker/test/ + └── *.test.ts # RN-specific tests +``` + +### Browser Tracker Tests +```typescript +// ✅ Correct: Complete browser environment mock +import { JSDOM } from 'jsdom'; + +const dom = new JSDOM('', { + url: 'http://localhost', + referrer: 'http://example.com', + contentType: 'text/html' +}); + +global.window = dom.window; +global.document = window.document; +global.navigator = window.navigator; + +// ❌ Wrong: Partial mocks +global.window = { location: {} }; // Missing properties +``` + +### Integration Testing with Snowplow Micro +```typescript +// ✅ Correct: Test against local collector +describe('Snowplow Micro integration', () => { + const microUrl = 'http://localhost:9090'; + + beforeAll(async () => { + // Ensure Micro is running + await fetch(`${microUrl}/micro/all`); + }); + + it('sends events to collector', async () => { + newTracker('sp', `${microUrl}`, { bufferSize: 1 }); + trackPageView(); + + // Wait for event to be sent + await new Promise(r => setTimeout(r, 100)); + + // Verify in Micro + const response = await fetch(`${microUrl}/micro/all`); + const data = await response.json(); + expect(data.total).toBeGreaterThan(0); + }); +}); +``` + +### Functional/E2E Browser Tests +```typescript +// ✅ Correct: WebdriverIO test pattern +describe('Activity tracking', () => { + it('tracks time on page', async () => { + await browser.url('/test-page.html'); + + // Enable activity tracking + await browser.execute(() => { + window.snowplow('enableActivityTracking', { + minimumVisitLength: 10, + heartbeatDelay: 10 + }); + }); + + // Wait for activity + await browser.pause(11000); + + // Check for ping event + const events = await browser.execute(() => window.capturedEvents); + const pingEvent = events.find(e => e.e === 'pp'); + expect(pingEvent).toBeDefined(); + }); +}); +``` + +### Node Tracker Tests +```typescript +// ✅ Correct: Mock HTTP with nock +import nock from 'nock'; +import { tracker, gotEmitter } from '@snowplow/node-tracker'; + +describe('Node tracker', () => { + let scope: nock.Scope; + + beforeEach(() => { + scope = nock('https://collector.example.com') + .post('/com.snowplowanalytics.snowplow/tp2') + .reply(200); + }); + + afterEach(() => { + nock.cleanAll(); + }); + + it('sends batch of events', async () => { + const emitter = gotEmitter({ + endpoint: 'collector.example.com', + bufferSize: 2 + }); + const t = tracker(emitter, 'namespace', 'appId'); + + t.trackPageView({ pageUrl: 'http://example.com' }); + t.trackPageView({ pageUrl: 'http://example.com/page2' }); + + await t.flush(); + expect(scope.isDone()).toBe(true); + }); +}); +``` + +### React Native Tests +```typescript +// ✅ Correct: Mock RN dependencies +jest.mock('@react-native-async-storage/async-storage', () => ({ + getItem: jest.fn(), + setItem: jest.fn(), + removeItem: jest.fn() +})); + +jest.mock('react-native', () => ({ + Platform: { + OS: 'ios', + select: jest.fn(obj => obj.ios) + }, + Dimensions: { + get: () => ({ width: 375, height: 812 }) + } +})); + +describe('React Native tracker', () => { + it('uses mobile-specific configuration', () => { + const tracker = createTracker('namespace', { + endpoint: 'collector.example.com' + }); + + expect(tracker.getSubjectData()).toMatchObject({ + platform: 'mob' + }); + }); +}); +``` + +### Performance Testing +```typescript +// ✅ Correct: Measure bundle impact +it('keeps bundle size under limit', () => { + const stats = require('../dist/stats.json'); + const maxSize = 50 * 1024; // 50KB + + expect(stats.bundleSize).toBeLessThan(maxSize); +}); +``` + +## Performance Optimization + +### Tree Shaking (Browser Tracker) +```typescript +// ✅ Correct: Named imports for tree shaking +import { trackPageView, trackStructEvent } from '@snowplow/browser-tracker'; + +// ❌ Wrong: Importing everything +import * as snowplow from '@snowplow/browser-tracker'; +``` + +### Code Splitting (JavaScript Tracker) +```typescript +// ✅ Correct: Load plugins on demand +if (needsMediaTracking) { + import('@snowplow/browser-plugin-media-tracking').then(({ MediaTrackingPlugin }) => { + // Use plugin + }); +} +``` + +## Quick Reference + +### Tracker Initialization +```typescript +// Browser Tracker +import { newTracker } from '@snowplow/browser-tracker'; +newTracker('sp', 'collector.com', config); + +// JavaScript Tracker +window.snowplow('newTracker', 'sp', 'collector.com', config); + +// Node Tracker +import { tracker, gotEmitter } from '@snowplow/node-tracker'; +const t = tracker(gotEmitter(config), 'namespace', 'appId'); + +// React Native Tracker +import { createTracker } from '@snowplow/react-native-tracker'; +const t = createTracker('namespace', config); +``` + +## Contributing to CLAUDE.md + +When working with trackers: + +1. **Maintain platform separation** - Don't mix browser/node APIs +2. **Use appropriate storage** for each platform +3. **Test with platform-specific mocks** +4. **Optimize for platform constraints** (bundle size, network, battery) +5. **Document platform-specific behavior** clearly \ No newline at end of file diff --git a/trackers/browser-tracker/CHANGELOG.json b/trackers/browser-tracker/CHANGELOG.json index 45a05bb45..16c00a442 100644 --- a/trackers/browser-tracker/CHANGELOG.json +++ b/trackers/browser-tracker/CHANGELOG.json @@ -1,6 +1,186 @@ { "name": "@snowplow/browser-tracker", "entries": [ + { + "version": "4.10.1", + "tag": "@snowplow/browser-tracker_v4.10.1", + "date": "Wed, 19 Aug 2026 14:26:05 GMT", + "comments": {} + }, + { + "version": "4.10.0", + "tag": "@snowplow/browser-tracker_v4.10.0", + "date": "Mon, 27 Jul 2026 13:52:14 GMT", + "comments": {} + }, + { + "version": "4.9.0", + "tag": "@snowplow/browser-tracker_v4.9.0", + "date": "Tue, 21 Jul 2026 14:53:08 GMT", + "comments": { + "none": [ + { + "comment": "Add getDomainSessionId method" + } + ] + } + }, + { + "version": "4.8.4", + "tag": "@snowplow/browser-tracker_v4.8.4", + "date": "Thu, 02 Jul 2026 10:07:52 GMT", + "comments": {} + }, + { + "version": "4.8.3", + "tag": "@snowplow/browser-tracker_v4.8.3", + "date": "Tue, 30 Jun 2026 14:22:03 GMT", + "comments": { + "none": [ + { + "comment": "Update uuid to v11 and remove closure-compiler from the build pipeline" + } + ] + } + }, + { + "version": "4.8.2", + "tag": "@snowplow/browser-tracker_v4.8.2", + "date": "Wed, 17 Jun 2026 12:30:12 GMT", + "comments": {} + }, + { + "version": "4.8.1", + "tag": "@snowplow/browser-tracker_v4.8.1", + "date": "Wed, 13 May 2026 09:26:05 GMT", + "comments": {} + }, + { + "version": "4.8.0", + "tag": "@snowplow/browser-tracker_v4.8.0", + "date": "Tue, 28 Apr 2026 07:56:22 GMT", + "comments": { + "none": [ + { + "comment": "Add opt-in activity metrics tracking with activity_metrics entity" + } + ] + } + }, + { + "version": "4.7.0", + "tag": "@snowplow/browser-tracker_v4.7.0", + "date": "Wed, 01 Apr 2026 12:59:29 GMT", + "comments": {} + }, + { + "version": "4.6.9", + "tag": "@snowplow/browser-tracker_v4.6.9", + "date": "Mon, 16 Mar 2026 15:43:06 GMT", + "comments": {} + }, + { + "version": "4.6.8", + "tag": "@snowplow/browser-tracker_v4.6.8", + "date": "Tue, 28 Oct 2025 09:46:42 GMT", + "comments": {} + }, + { + "version": "4.6.7", + "tag": "@snowplow/browser-tracker_v4.6.7", + "date": "Tue, 07 Oct 2025 14:53:36 GMT", + "comments": {} + }, + { + "version": "4.6.6", + "tag": "@snowplow/browser-tracker_v4.6.6", + "date": "Tue, 26 Aug 2025 08:42:28 GMT", + "comments": {} + }, + { + "version": "4.6.5", + "tag": "@snowplow/browser-tracker_v4.6.5", + "date": "Wed, 25 Jun 2025 21:16:46 GMT", + "comments": {} + }, + { + "version": "4.6.4", + "tag": "@snowplow/browser-tracker_v4.6.4", + "date": "Wed, 25 Jun 2025 12:08:50 GMT", + "comments": {} + }, + { + "version": "4.6.3", + "tag": "@snowplow/browser-tracker_v4.6.3", + "date": "Thu, 29 May 2025 19:52:07 GMT", + "comments": {} + }, + { + "version": "4.6.2", + "tag": "@snowplow/browser-tracker_v4.6.2", + "date": "Tue, 20 May 2025 07:39:05 GMT", + "comments": {} + }, + { + "version": "4.6.1", + "tag": "@snowplow/browser-tracker_v4.6.1", + "date": "Tue, 06 May 2025 13:10:51 GMT", + "comments": {} + }, + { + "version": "4.6.0", + "tag": "@snowplow/browser-tracker_v4.6.0", + "date": "Thu, 01 May 2025 09:58:59 GMT", + "comments": {} + }, + { + "version": "4.5.0", + "tag": "@snowplow/browser-tracker_v4.5.0", + "date": "Fri, 04 Apr 2025 09:21:23 GMT", + "comments": {} + }, + { + "version": "4.4.0", + "tag": "@snowplow/browser-tracker_v4.4.0", + "date": "Thu, 20 Mar 2025 12:14:34 GMT", + "comments": {} + }, + { + "version": "4.3.1", + "tag": "@snowplow/browser-tracker_v4.3.1", + "date": "Tue, 21 Jan 2025 11:09:42 GMT", + "comments": {} + }, + { + "version": "4.3.0", + "tag": "@snowplow/browser-tracker_v4.3.0", + "date": "Mon, 20 Jan 2025 11:45:13 GMT", + "comments": {} + }, + { + "version": "4.2.0", + "tag": "@snowplow/browser-tracker_v4.2.0", + "date": "Mon, 13 Jan 2025 08:30:05 GMT", + "comments": {} + }, + { + "version": "4.1.0", + "tag": "@snowplow/browser-tracker_v4.1.0", + "date": "Thu, 28 Nov 2024 10:57:30 GMT", + "comments": {} + }, + { + "version": "4.0.4", + "tag": "@snowplow/browser-tracker_v4.0.4", + "date": "Thu, 21 Nov 2024 09:06:36 GMT", + "comments": {} + }, + { + "version": "4.0.3", + "tag": "@snowplow/browser-tracker_v4.0.3", + "date": "Wed, 20 Nov 2024 09:30:31 GMT", + "comments": {} + }, { "version": "4.0.2", "tag": "@snowplow/browser-tracker_v4.0.2", diff --git a/trackers/browser-tracker/CHANGELOG.md b/trackers/browser-tracker/CHANGELOG.md index 53a8cb299..63b04eb40 100644 --- a/trackers/browser-tracker/CHANGELOG.md +++ b/trackers/browser-tracker/CHANGELOG.md @@ -1,6 +1,147 @@ # Change Log - @snowplow/browser-tracker -This log was last generated on Mon, 11 Nov 2024 15:46:34 GMT and should not be manually modified. +This log was last generated on Wed, 19 Aug 2026 14:26:05 GMT and should not be manually modified. + +## 4.10.1 +Wed, 19 Aug 2026 14:26:05 GMT + +_Version update only_ + +## 4.10.0 +Mon, 27 Jul 2026 13:52:14 GMT + +_Version update only_ + +## 4.9.0 +Tue, 21 Jul 2026 14:53:08 GMT + +### Updates + +- Add getDomainSessionId method + +## 4.8.4 +Thu, 02 Jul 2026 10:07:52 GMT + +_Version update only_ + +## 4.8.3 +Tue, 30 Jun 2026 14:22:03 GMT + +### Updates + +- Update uuid to v11 and remove closure-compiler from the build pipeline + +## 4.8.2 +Wed, 17 Jun 2026 12:30:12 GMT + +_Version update only_ + +## 4.8.1 +Wed, 13 May 2026 09:26:05 GMT + +_Version update only_ + +## 4.8.0 +Tue, 28 Apr 2026 07:56:22 GMT + +### Updates + +- Add opt-in activity metrics tracking with activity_metrics entity + +## 4.7.0 +Wed, 01 Apr 2026 12:59:29 GMT + +_Version update only_ + +## 4.6.9 +Mon, 16 Mar 2026 15:43:06 GMT + +_Version update only_ + +## 4.6.8 +Tue, 28 Oct 2025 09:46:42 GMT + +_Version update only_ + +## 4.6.7 +Tue, 07 Oct 2025 14:53:36 GMT + +_Version update only_ + +## 4.6.6 +Tue, 26 Aug 2025 08:42:28 GMT + +_Version update only_ + +## 4.6.5 +Wed, 25 Jun 2025 21:16:46 GMT + +_Version update only_ + +## 4.6.4 +Wed, 25 Jun 2025 12:08:50 GMT + +_Version update only_ + +## 4.6.3 +Thu, 29 May 2025 19:52:07 GMT + +_Version update only_ + +## 4.6.2 +Tue, 20 May 2025 07:39:05 GMT + +_Version update only_ + +## 4.6.1 +Tue, 06 May 2025 13:10:51 GMT + +_Version update only_ + +## 4.6.0 +Thu, 01 May 2025 09:58:59 GMT + +_Version update only_ + +## 4.5.0 +Fri, 04 Apr 2025 09:21:23 GMT + +_Version update only_ + +## 4.4.0 +Thu, 20 Mar 2025 12:14:34 GMT + +_Version update only_ + +## 4.3.1 +Tue, 21 Jan 2025 11:09:42 GMT + +_Version update only_ + +## 4.3.0 +Mon, 20 Jan 2025 11:45:13 GMT + +_Version update only_ + +## 4.2.0 +Mon, 13 Jan 2025 08:30:05 GMT + +_Version update only_ + +## 4.1.0 +Thu, 28 Nov 2024 10:57:30 GMT + +_Version update only_ + +## 4.0.4 +Thu, 21 Nov 2024 09:06:36 GMT + +_Version update only_ + +## 4.0.3 +Wed, 20 Nov 2024 09:30:31 GMT + +_Version update only_ ## 4.0.2 Mon, 11 Nov 2024 15:46:34 GMT diff --git a/trackers/browser-tracker/package.json b/trackers/browser-tracker/package.json index 722c894a4..a45beaf9d 100644 --- a/trackers/browser-tracker/package.json +++ b/trackers/browser-tracker/package.json @@ -1,6 +1,6 @@ { "name": "@snowplow/browser-tracker", - "version": "4.0.2", + "version": "4.10.1", "description": "Browser tracker for Snowplow", "keywords": [ "tracking", @@ -41,18 +41,17 @@ "tslib": "^2.3.1" }, "devDependencies": { - "@ampproject/rollup-plugin-closure-compiler": "~0.27.0", "@rollup/plugin-commonjs": "~21.0.2", "@rollup/plugin-node-resolve": "~13.1.3", - "@types/jest": "~27.4.1", + "@types/jest": "~28.1.1", "@types/jsdom": "~16.2.14", "@types/lodash": "~4.14.180", "@typescript-eslint/eslint-plugin": "~5.15.0", "@typescript-eslint/parser": "~5.15.0", "eslint": "~8.11.0", - "jest": "~27.5.1", - "jest-environment-jsdom": "~27.5.1", - "jest-environment-jsdom-global": "~3.0.0", + "jest": "~28.1.3", + "jest-environment-jsdom": "~28.1.3", + "jest-environment-jsdom-global": "~4.0.0", "jest-standard-reporter": "~2.0.0", "lodash": "~4.17.21", "rollup": "~2.70.1", @@ -60,7 +59,7 @@ "rollup-plugin-license": "~2.6.1", "rollup-plugin-terser": "~7.0.2", "rollup-plugin-ts": "~2.0.5", - "ts-jest": "~27.1.3", + "ts-jest": "~28.0.8", "typescript": "~4.6.2", "whatwg-fetch": "~3.6.20" } diff --git a/trackers/browser-tracker/rollup.config.js b/trackers/browser-tracker/rollup.config.js index 1825f4fe5..316285a1c 100644 --- a/trackers/browser-tracker/rollup.config.js +++ b/trackers/browser-tracker/rollup.config.js @@ -32,7 +32,7 @@ import { nodeResolve } from '@rollup/plugin-node-resolve'; import ts from 'rollup-plugin-ts'; // Prefered over @rollup/plugin-typescript as it bundles .d.ts files import commonjs from '@rollup/plugin-commonjs'; import { banner } from '../../banner'; -import compiler from '@ampproject/rollup-plugin-closure-compiler'; +import { terser } from 'rollup-plugin-terser'; import cleanup from 'rollup-plugin-cleanup'; import pkg from './package.json'; @@ -56,7 +56,7 @@ export default [ }, { input: './src/index.ts', - plugins: [...umdPlugins, compiler(), cleanup({ comments: 'none' }), banner()], + plugins: [...umdPlugins, terser(), cleanup({ comments: 'none' }), banner()], treeshake: { moduleSideEffects: ['jstimezonedetect'] }, output: [{ file: pkg.main.replace('.js', '.min.js'), format: 'umd', name: umdName, sourcemap: true }], }, diff --git a/trackers/browser-tracker/src/api.ts b/trackers/browser-tracker/src/api.ts index 4a69c3687..1916e48b9 100644 --- a/trackers/browser-tracker/src/api.ts +++ b/trackers/browser-tracker/src/api.ts @@ -30,10 +30,13 @@ import { dispatchToTrackers, + getTracker, + allTrackerNames, ActivityTrackingConfiguration, ActivityTrackingConfigurationCallback, ActivityCallback, ActivityCallbackData, + ActivityMetrics, BrowserPlugin, BrowserPluginConfiguration, BuiltInContexts, @@ -69,6 +72,7 @@ export { ActivityTrackingConfigurationCallback, ActivityCallback, ActivityCallbackData, + ActivityMetrics, BrowserPlugin, BrowserPluginConfiguration, BuiltInContexts, @@ -106,6 +110,20 @@ export function newSession(trackers?: Array) { }); } +/** + * Get the domain session ID (from the first-party cookie) for a tracker. + * + * @param trackerId - The tracker identifier which the domain session ID will be retrieved from. + * Defaults to the first initialised tracker. + * @returns The domain session ID, or undefined if no matching tracker is found + */ +export function getDomainSessionId(trackerId?: string): string | undefined { + const resolvedTrackerId = trackerId ?? allTrackerNames()[0]; + if (!resolvedTrackerId) return undefined; + const tracker = getTracker(resolvedTrackerId); + return tracker ? tracker.getDomainSessionId() : undefined; +} + /** * Override referrer * diff --git a/trackers/browser-tracker/test/api.test.ts b/trackers/browser-tracker/test/api.test.ts new file mode 100644 index 000000000..06aa2f6de --- /dev/null +++ b/trackers/browser-tracker/test/api.test.ts @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2022 Snowplow Analytics Ltd, 2010 Anthon Pang + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +import { newTracker, getDomainSessionId } from '../src'; + +describe('Browser Tracker API: #getDomainSessionId', () => { + let cookieJar: string; + + beforeAll(() => { + cookieJar = ''; + jest.spyOn(document, 'cookie', 'set').mockImplementation((cookie) => { + cookieJar += cookie; + }); + jest.spyOn(document, 'cookie', 'get').mockImplementation(() => cookieJar); + }); + + afterEach(() => { + cookieJar = ''; + }); + + afterAll(() => { + jest.restoreAllMocks(); + }); + + it('exposes the domain session id of a named tracker', () => { + const tracker = newTracker('sp-api-1', '', { stateStorageStrategy: 'cookie' }); + const sessionId = tracker?.getDomainSessionId(); + + expect(sessionId).toMatch(/^[0-9a-f-]+$/); + expect(getDomainSessionId('sp-api-1')).toEqual(sessionId); + }); + + it('defaults to the first initialised tracker when no id is provided', () => { + // 'sp-api-1' is the only/first tracker registered in this module + expect(getDomainSessionId()).toEqual(getDomainSessionId('sp-api-1')); + }); + + it('returns undefined for an unknown tracker id', () => { + expect(getDomainSessionId('missing-tracker')).toBeUndefined(); + }); +}); diff --git a/trackers/browser-tracker/test/tracker.test.ts b/trackers/browser-tracker/test/tracker.test.ts index 686e92f61..cb5608d09 100644 --- a/trackers/browser-tracker/test/tracker.test.ts +++ b/trackers/browser-tracker/test/tracker.test.ts @@ -32,7 +32,7 @@ import { SharedState, addTracker, EventStore, Payload } from '@snowplow/browser- import F from 'lodash/fp'; import { newInMemoryEventStore } from '@snowplow/tracker-core'; -jest.useFakeTimers('modern'); +jest.useFakeTimers(); const getPPEvents: (events: readonly Payload[]) => Payload[] = (events) => { return events.filter((payload) => payload.e === 'pp'); diff --git a/trackers/javascript-tracker/CHANGELOG.json b/trackers/javascript-tracker/CHANGELOG.json index 1a495f74c..3f101ffcb 100644 --- a/trackers/javascript-tracker/CHANGELOG.json +++ b/trackers/javascript-tracker/CHANGELOG.json @@ -1,6 +1,210 @@ { "name": "@snowplow/javascript-tracker", "entries": [ + { + "version": "4.10.1", + "tag": "@snowplow/javascript-tracker_v4.10.1", + "date": "Wed, 19 Aug 2026 14:26:05 GMT", + "comments": {} + }, + { + "version": "4.10.0", + "tag": "@snowplow/javascript-tracker_v4.10.0", + "date": "Mon, 27 Jul 2026 13:52:14 GMT", + "comments": { + "minor": [ + { + "comment": "Add WebView plugin as opt-in build-time feature flag (webView, default false)" + } + ] + } + }, + { + "version": "4.9.0", + "tag": "@snowplow/javascript-tracker_v4.9.0", + "date": "Tue, 21 Jul 2026 14:53:08 GMT", + "comments": {} + }, + { + "version": "4.8.4", + "tag": "@snowplow/javascript-tracker_v4.8.4", + "date": "Thu, 02 Jul 2026 10:07:52 GMT", + "comments": {} + }, + { + "version": "4.8.3", + "tag": "@snowplow/javascript-tracker_v4.8.3", + "date": "Tue, 30 Jun 2026 14:22:03 GMT", + "comments": { + "none": [ + { + "comment": "Update uuid to v11 and remove closure-compiler from the build pipeline" + } + ] + } + }, + { + "version": "4.8.2", + "tag": "@snowplow/javascript-tracker_v4.8.2", + "date": "Wed, 17 Jun 2026 12:30:12 GMT", + "comments": {} + }, + { + "version": "4.8.1", + "tag": "@snowplow/javascript-tracker_v4.8.1", + "date": "Wed, 13 May 2026 09:26:05 GMT", + "comments": {} + }, + { + "version": "4.8.0", + "tag": "@snowplow/javascript-tracker_v4.8.0", + "date": "Tue, 28 Apr 2026 07:56:22 GMT", + "comments": {} + }, + { + "version": "4.7.0", + "tag": "@snowplow/javascript-tracker_v4.7.0", + "date": "Wed, 01 Apr 2026 12:59:29 GMT", + "comments": {} + }, + { + "version": "4.6.9", + "tag": "@snowplow/javascript-tracker_v4.6.9", + "date": "Mon, 16 Mar 2026 15:43:06 GMT", + "comments": {} + }, + { + "version": "4.6.8", + "tag": "@snowplow/javascript-tracker_v4.6.8", + "date": "Tue, 28 Oct 2025 09:46:42 GMT", + "comments": {} + }, + { + "version": "4.6.7", + "tag": "@snowplow/javascript-tracker_v4.6.7", + "date": "Tue, 07 Oct 2025 14:53:36 GMT", + "comments": {} + }, + { + "version": "4.6.6", + "tag": "@snowplow/javascript-tracker_v4.6.6", + "date": "Tue, 26 Aug 2025 08:42:28 GMT", + "comments": {} + }, + { + "version": "4.6.5", + "tag": "@snowplow/javascript-tracker_v4.6.5", + "date": "Wed, 25 Jun 2025 21:16:46 GMT", + "comments": {} + }, + { + "version": "4.6.4", + "tag": "@snowplow/javascript-tracker_v4.6.4", + "date": "Wed, 25 Jun 2025 12:08:50 GMT", + "comments": {} + }, + { + "version": "4.6.3", + "tag": "@snowplow/javascript-tracker_v4.6.3", + "date": "Thu, 29 May 2025 19:52:07 GMT", + "comments": { + "none": [ + { + "comment": "Resume sessions when disabling anonymous tracking that was already tracking session state" + } + ] + } + }, + { + "version": "4.6.2", + "tag": "@snowplow/javascript-tracker_v4.6.2", + "date": "Tue, 20 May 2025 07:39:05 GMT", + "comments": {} + }, + { + "version": "4.6.1", + "tag": "@snowplow/javascript-tracker_v4.6.1", + "date": "Tue, 06 May 2025 13:10:51 GMT", + "comments": {} + }, + { + "version": "4.6.0", + "tag": "@snowplow/javascript-tracker_v4.6.0", + "date": "Thu, 01 May 2025 09:58:59 GMT", + "comments": { + "none": [ + { + "comment": "Add support for element tracking plugin" + } + ] + } + }, + { + "version": "4.5.0", + "tag": "@snowplow/javascript-tracker_v4.5.0", + "date": "Fri, 04 Apr 2025 09:21:23 GMT", + "comments": { + "none": [ + { + "comment": "Fix inactive button-click test" + } + ] + } + }, + { + "version": "4.4.0", + "tag": "@snowplow/javascript-tracker_v4.4.0", + "date": "Thu, 20 Mar 2025 12:14:34 GMT", + "comments": { + "none": [ + { + "comment": "Allow usage of Snowplow callback without 'this' keyword" + } + ] + } + }, + { + "version": "4.3.1", + "tag": "@snowplow/javascript-tracker_v4.3.1", + "date": "Tue, 21 Jan 2025 11:09:42 GMT", + "comments": {} + }, + { + "version": "4.3.0", + "tag": "@snowplow/javascript-tracker_v4.3.0", + "date": "Mon, 20 Jan 2025 11:45:13 GMT", + "comments": {} + }, + { + "version": "4.2.0", + "tag": "@snowplow/javascript-tracker_v4.2.0", + "date": "Mon, 13 Jan 2025 08:30:05 GMT", + "comments": {} + }, + { + "version": "4.1.0", + "tag": "@snowplow/javascript-tracker_v4.1.0", + "date": "Thu, 28 Nov 2024 10:57:30 GMT", + "comments": {} + }, + { + "version": "4.0.4", + "tag": "@snowplow/javascript-tracker_v4.0.4", + "date": "Thu, 21 Nov 2024 09:06:36 GMT", + "comments": {} + }, + { + "version": "4.0.3", + "tag": "@snowplow/javascript-tracker_v4.0.3", + "date": "Wed, 20 Nov 2024 09:30:31 GMT", + "comments": { + "none": [ + { + "comment": "Serialize new session cookie synchronously to avoid overlapping sessions (#1381)" + } + ] + } + }, { "version": "4.0.2", "tag": "@snowplow/javascript-tracker_v4.0.2", diff --git a/trackers/javascript-tracker/CHANGELOG.md b/trackers/javascript-tracker/CHANGELOG.md index c8790e797..645a1eb2f 100644 --- a/trackers/javascript-tracker/CHANGELOG.md +++ b/trackers/javascript-tracker/CHANGELOG.md @@ -1,6 +1,155 @@ # Change Log - @snowplow/javascript-tracker -This log was last generated on Mon, 11 Nov 2024 15:46:34 GMT and should not be manually modified. +This log was last generated on Wed, 19 Aug 2026 14:26:05 GMT and should not be manually modified. + +## 4.10.1 +Wed, 19 Aug 2026 14:26:05 GMT + +_Version update only_ + +## 4.10.0 +Mon, 27 Jul 2026 13:52:14 GMT + +### Minor changes + +- Add WebView plugin as opt-in build-time feature flag (webView, default false) + +## 4.9.0 +Tue, 21 Jul 2026 14:53:08 GMT + +_Version update only_ + +## 4.8.4 +Thu, 02 Jul 2026 10:07:52 GMT + +_Version update only_ + +## 4.8.3 +Tue, 30 Jun 2026 14:22:03 GMT + +### Updates + +- Update uuid to v11 and remove closure-compiler from the build pipeline + +## 4.8.2 +Wed, 17 Jun 2026 12:30:12 GMT + +_Version update only_ + +## 4.8.1 +Wed, 13 May 2026 09:26:05 GMT + +_Version update only_ + +## 4.8.0 +Tue, 28 Apr 2026 07:56:22 GMT + +_Version update only_ + +## 4.7.0 +Wed, 01 Apr 2026 12:59:29 GMT + +_Version update only_ + +## 4.6.9 +Mon, 16 Mar 2026 15:43:06 GMT + +_Version update only_ + +## 4.6.8 +Tue, 28 Oct 2025 09:46:42 GMT + +_Version update only_ + +## 4.6.7 +Tue, 07 Oct 2025 14:53:36 GMT + +_Version update only_ + +## 4.6.6 +Tue, 26 Aug 2025 08:42:28 GMT + +_Version update only_ + +## 4.6.5 +Wed, 25 Jun 2025 21:16:46 GMT + +_Version update only_ + +## 4.6.4 +Wed, 25 Jun 2025 12:08:50 GMT + +_Version update only_ + +## 4.6.3 +Thu, 29 May 2025 19:52:07 GMT + +### Updates + +- Resume sessions when disabling anonymous tracking that was already tracking session state + +## 4.6.2 +Tue, 20 May 2025 07:39:05 GMT + +_Version update only_ + +## 4.6.1 +Tue, 06 May 2025 13:10:51 GMT + +_Version update only_ + +## 4.6.0 +Thu, 01 May 2025 09:58:59 GMT + +### Updates + +- Add support for element tracking plugin + +## 4.5.0 +Fri, 04 Apr 2025 09:21:23 GMT + +### Updates + +- Fix inactive button-click test + +## 4.4.0 +Thu, 20 Mar 2025 12:14:34 GMT + +### Updates + +- Allow usage of Snowplow callback without 'this' keyword + +## 4.3.1 +Tue, 21 Jan 2025 11:09:42 GMT + +_Version update only_ + +## 4.3.0 +Mon, 20 Jan 2025 11:45:13 GMT + +_Version update only_ + +## 4.2.0 +Mon, 13 Jan 2025 08:30:05 GMT + +_Version update only_ + +## 4.1.0 +Thu, 28 Nov 2024 10:57:30 GMT + +_Version update only_ + +## 4.0.4 +Thu, 21 Nov 2024 09:06:36 GMT + +_Version update only_ + +## 4.0.3 +Wed, 20 Nov 2024 09:30:31 GMT + +### Updates + +- Serialize new session cookie synchronously to avoid overlapping sessions (#1381) ## 4.0.2 Mon, 11 Nov 2024 15:46:34 GMT diff --git a/trackers/javascript-tracker/package.json b/trackers/javascript-tracker/package.json index 14c1e1e70..3f07b7f4c 100644 --- a/trackers/javascript-tracker/package.json +++ b/trackers/javascript-tracker/package.json @@ -1,6 +1,6 @@ { "name": "@snowplow/javascript-tracker", - "version": "4.0.2", + "version": "4.10.1", "description": "Web analytics for Snowplow", "keywords": [ "tracking", @@ -41,6 +41,7 @@ "dependencies": { "@snowplow/browser-plugin-ad-tracking": "workspace:*", "@snowplow/browser-plugin-client-hints": "workspace:*", + "@snowplow/browser-plugin-element-tracking": "workspace:*", "@snowplow/browser-plugin-enhanced-ecommerce": "workspace:*", "@snowplow/browser-plugin-error-tracking": "workspace:*", "@snowplow/browser-plugin-form-tracking": "workspace:*", @@ -65,17 +66,17 @@ "@snowplow/browser-plugin-enhanced-consent": "workspace:*", "@snowplow/browser-plugin-privacy-sandbox": "workspace:*", "@snowplow/browser-plugin-button-click-tracking": "workspace:*", - "@snowplow/browser-plugin-event-specifications": "workspace:*" + "@snowplow/browser-plugin-event-specifications": "workspace:*", + "@snowplow/browser-plugin-webview": "workspace:*" }, "devDependencies": { - "@ampproject/rollup-plugin-closure-compiler": "~0.27.0", "@rollup/plugin-alias": "~3.1.9", "@rollup/plugin-commonjs": "~21.0.2", "@rollup/plugin-json": "~4.1.0", "@rollup/plugin-node-resolve": "~13.1.3", "@rollup/plugin-replace": "~4.0.0", "@types/dockerode": "~3.3.5", - "@types/jest": "~27.4.1", + "@types/jest": "~28.1.1", "@types/jsdom": "~16.2.14", "@types/lodash": "~4.14.180", "@types/node": "~14.6.0", @@ -87,11 +88,11 @@ "@wdio/static-server-service": "~8.39.0", "@wdio/types": "~8.39.0", "chalk": "4.1.2", - "chromedriver": "~129.0.0", + "chromedriver": "~131.0.0", "dockerode": "~3.3.1", - "jest": "~27.5.1", - "jest-environment-jsdom": "~27.5.1", - "jest-environment-jsdom-global": "~3.0.0", + "jest": "~28.1.3", + "jest-environment-jsdom": "~28.1.3", + "jest-environment-jsdom-global": "~4.0.0", "jest-standard-reporter": "~2.0.0", "lodash": "~4.17.21", "npm-run-all": "~4.1.5", @@ -103,7 +104,7 @@ "rollup-plugin-terser": "~7.0.2", "rollup-plugin-ts": "~2.0.5", "saucelabs": "~7.5.0", - "ts-jest": "~27.1.3", + "ts-jest": "~28.0.8", "ts-node": "~10.9.1", "typescript": "~4.6.2", "wdio-chromedriver-service": "~8.1.1", diff --git a/trackers/javascript-tracker/rollup.config.js b/trackers/javascript-tracker/rollup.config.js index 6b7c7ddf2..65ee9df18 100644 --- a/trackers/javascript-tracker/rollup.config.js +++ b/trackers/javascript-tracker/rollup.config.js @@ -34,7 +34,6 @@ import commonjs from '@rollup/plugin-commonjs'; import json from '@rollup/plugin-json'; import { banner } from '../../banner'; import { whitelabelBuild } from './build-config/index'; -import compiler from '@ampproject/rollup-plugin-closure-compiler'; import { terser } from 'rollup-plugin-terser'; import cleanup from 'rollup-plugin-cleanup'; import sizes from 'rollup-plugin-sizes'; @@ -48,7 +47,6 @@ export default (cmdlineArgs) => { nodeResolve({ browser: true }), commonjs(), ts(), - compiler(), terser(), cleanup({ comments: 'none' }), banner(), diff --git a/trackers/javascript-tracker/src/features.ts b/trackers/javascript-tracker/src/features.ts index a667a772e..182b7ad74 100644 --- a/trackers/javascript-tracker/src/features.ts +++ b/trackers/javascript-tracker/src/features.ts @@ -24,6 +24,8 @@ import * as ButtonClickTracking from '@snowplow/browser-plugin-button-click-trac import * as EventSpecifications from '@snowplow/browser-plugin-event-specifications'; import * as PerformanceNavigationTiming from '@snowplow/browser-plugin-performance-navigation-timing'; import * as WebVitals from '@snowplow/browser-plugin-web-vitals'; +import * as ElementTracking from '@snowplow/browser-plugin-element-tracking'; +import * as WebViewTracking from '@snowplow/browser-plugin-webview'; /** * Calculates the required plugins to intialise per tracker @@ -153,5 +155,15 @@ export function Plugins(configuration: JavaScriptTrackerConfiguration) { activatedPlugins.push([WebVitalsPlugin(typeof webVitals === 'object' ? webVitals : undefined), apiMethods]); } + if (plugins.elementTracking) { + const { SnowplowElementTrackingPlugin, ...apiMethods } = ElementTracking; + activatedPlugins.push([SnowplowElementTrackingPlugin(), apiMethods]); + } + + if (plugins.webView) { + const { WebViewPlugin, ...apiMethods } = WebViewTracking; + activatedPlugins.push([WebViewPlugin(), apiMethods]); + } + return activatedPlugins; } diff --git a/trackers/javascript-tracker/src/in_queue.ts b/trackers/javascript-tracker/src/in_queue.ts index e9b9fd44f..3b6a8db90 100644 --- a/trackers/javascript-tracker/src/in_queue.ts +++ b/trackers/javascript-tracker/src/in_queue.ts @@ -265,7 +265,15 @@ export function InQueueManager(functionName: string, asyncQueue: Array) // Strip GlobalSnowplowNamespace from ID fnTrackers[tracker.id.replace(`${functionName}_`, '')] = tracker; } - input.apply(fnTrackers, parameterArray); + + // Create a new array from `parameterArray` to avoid mutating the original + const parameterArrayCopy = Array.prototype.slice.call(parameterArray); + + // Add the `fnTrackers` object as the last element of the new array to allow it to be accessed in the callback + // as the final argument, useful in environments that don't support `this` (GTM) + const args = Array.prototype.concat.apply(parameterArrayCopy, [fnTrackers]); + + input.apply(fnTrackers, args); } catch (ex) { LOG.error('Tracker callback failed', ex); } finally { diff --git a/trackers/javascript-tracker/test/integration/buttonClick.test.ts b/trackers/javascript-tracker/test/integration/buttonClick.test.ts index 6d4272ef6..cdbcc233e 100644 --- a/trackers/javascript-tracker/test/integration/buttonClick.test.ts +++ b/trackers/javascript-tracker/test/integration/buttonClick.test.ts @@ -30,11 +30,11 @@ describe('Snowplow Micro integration', () => { name?: string; }; - const makeEvent = (button: Button, method: string) => { + const makeEvent = (button: Button, method: string, suffix: string = '') => { return { event: { event: 'unstruct', - app_id: 'button-click-tracking-' + testIdentifier, + app_id: 'button-click-tracking-' + testIdentifier + suffix, page_url: `http://snowplow-js-tracker.local:8080/button-click-tracking.html?eventMethod=${method}`, unstruct_event: { data: { @@ -81,6 +81,11 @@ describe('Snowplow Micro integration', () => { await (await $('#disabled-click')).click(); await browser.pause(500); + await (await $('#selective')).click(); + await browser.pause(500); + await (await $('#selective-click')).click(); + await browser.pause(500); + await (await $('#enable')).click(); await browser.pause(500); await (await $('#enabled-click')).click(); @@ -155,14 +160,29 @@ describe('Snowplow Micro integration', () => { expect(logContains(ev)).toBe(false); }); + it('should get one selective-click', () => { + const ev1 = makeEvent({ id: 'selective-click', label: 'SelectiveEnabledClick' }, method); + expect(logContains(ev1)).toBe(false); + + const ev2 = makeEvent({ id: 'selective-click', label: 'SelectiveEnabledClick' }, method, '-second'); + logContainsButtonClick(ev2); + }); + it('should get enabled-click', () => { const ev = makeEvent({ id: 'enabled-click', label: 'EnabledClick' }, method); logContainsButtonClick(ev); }); it('should get `final-config` as it is the last config set', () => { - const ev = makeEvent({ id: 'final-config', classes: ['final-config'], label: 'Final Config' }, method); - logContainsButtonClick(ev); + const ev1 = makeEvent({ id: 'final-config', classes: ['final-config'], label: 'Final Config' }, method); + logContainsButtonClick(ev1); + + const ev2 = makeEvent( + { id: 'final-config', classes: ['final-config'], label: 'Final Config' }, + method, + '-second' + ); + expect(logContains(ev2)).toBe(false); }); }); }); diff --git a/trackers/javascript-tracker/test/integration/cookies.test.ts b/trackers/javascript-tracker/test/integration/cookies.test.ts new file mode 100644 index 000000000..e811b735a --- /dev/null +++ b/trackers/javascript-tracker/test/integration/cookies.test.ts @@ -0,0 +1,24 @@ +import { fetchResults } from '../micro'; +import { pageSetup } from './helpers'; + +describe('Tracker created domain cookies across multiple pages', () => { + let log: Array = []; + let testIdentifier = ''; + + beforeAll(async () => { + testIdentifier = await pageSetup(); + await browser.url('/multi_page_cookies'); + await browser.pause(5000); + + log = await browser.call(async () => await fetchResults()); + log = log.filter((ev) => (ev as any).event.app_id === 'cookies-iframe-' + testIdentifier); + }); + + it('all events should have the same session id', () => { + expect(log.length).toBeGreaterThanOrEqual(15); + + const sessionIds = log.map((ev) => (ev as any).event.domain_sessionid); + const uniqueSessionIds = Array.from(new Set(sessionIds)); + expect(uniqueSessionIds.length).toBe(1); + }); +}); diff --git a/trackers/javascript-tracker/test/integration/sessionStorage.test.ts b/trackers/javascript-tracker/test/integration/sessionStorage.test.ts index 04d3046aa..db538de02 100644 --- a/trackers/javascript-tracker/test/integration/sessionStorage.test.ts +++ b/trackers/javascript-tracker/test/integration/sessionStorage.test.ts @@ -181,7 +181,20 @@ describe('Sessions', () => { log ) ) - ).toBe(3); + ).toBe(4); + expect( + F.size( + F.uniqBy( + F.get('event.domain_sessionid'), + F.filter( + (e) => + F.get('event.name_tracker', e) === 'anonymousSessionTracker' && + F.get('event.app_id', e) === 'session-integration-' + testIdentifier, + log + ) + ) + ) + ).toBe(2); }); it('should only increment domain_sessionidx outside of session timeout (cookie storage)', () => { diff --git a/trackers/javascript-tracker/test/pages/button-click-tracking.html b/trackers/javascript-tracker/test/pages/button-click-tracking.html index 1fe2f6966..c1682f1c1 100644 --- a/trackers/javascript-tracker/test/pages/button-click-tracking.html +++ b/trackers/javascript-tracker/test/pages/button-click-tracking.html @@ -59,17 +59,20 @@ + + + - + @@ -112,6 +115,10 @@ appId: 'button-click-tracking-' + testIdentifier, method: parseQuery().eventMethod, }); + snowplow('newTracker', 'sp2', collector_endpoint, { + appId: 'button-click-tracking-' + testIdentifier + '-second', + method: parseQuery().eventMethod, + }); snowplow(function () { document.getElementById('init').innerText = 'true'; }); diff --git a/trackers/javascript-tracker/test/pages/form-tracking.html b/trackers/javascript-tracker/test/pages/form-tracking.html index 728b8ceb0..1404f5e4c 100644 --- a/trackers/javascript-tracker/test/pages/form-tracking.html +++ b/trackers/javascript-tracker/test/pages/form-tracking.html @@ -144,14 +144,15 @@ switch (parseQuery().filter) { case 'exclude': - snowplow('enableFormTracking', { options: { fields: { denylist: ['fname'] } } }); + snowplow('enableFormTracking', { options: { useCapture: true, fields: { denylist: ['fname'] } } }); break; case 'include': - snowplow('enableFormTracking', { options: { fields: { allowlist: ['lname'] } } }); + snowplow('enableFormTracking', { options: { useCapture: false, fields: { allowlist: ['lname'] } } }); break; case 'filter': snowplow('enableFormTracking', { options: { + useCapture: undefined, forms: { allowlist: ['formy-mcformface'] }, fields: { filter: formFilter }, }, @@ -160,22 +161,23 @@ case 'transform': snowplow('enableFormTracking', { options: { + useCapture: true, fields: { transform: redactPII }, }, }); break; case 'excludedForm': - snowplow('enableFormTracking', { options: { forms: { denylist: ['excluded-form'] } } }); + snowplow('enableFormTracking', { options: { useCapture: false, forms: { denylist: ['excluded-form'] } } }); break; case 'onlyFocus': - snowplow('enableFormTracking', { options: { events: ['focus_form'] } }); + snowplow('enableFormTracking', { options: { useCapture: undefined, events: ['focus_form'] } }); break; case 'iframeForm': var forms = iframe.contentWindow.document.getElementsByTagName('form'); - snowplow('enableFormTracking', { options: { forms: forms } }); + snowplow('enableFormTracking', { options: { useCapture: true, forms: forms } }); break; case 'shadow': - snowplow('enableFormTracking', { options: { forms: { allowlist: ['shadow-form'] } } }); + snowplow('enableFormTracking', { options: { useCapture: false, forms: { allowlist: ['shadow-form'] } } }); break; default: snowplow('enableFormTracking', { diff --git a/trackers/javascript-tracker/test/pages/multi_page_cookies/iframe.html b/trackers/javascript-tracker/test/pages/multi_page_cookies/iframe.html new file mode 100644 index 000000000..f2427bba9 --- /dev/null +++ b/trackers/javascript-tracker/test/pages/multi_page_cookies/iframe.html @@ -0,0 +1,45 @@ + + + + Cookies iframe test page + + +
+
+ + + diff --git a/trackers/javascript-tracker/test/pages/multi_page_cookies/index.html b/trackers/javascript-tracker/test/pages/multi_page_cookies/index.html new file mode 100644 index 000000000..b5da19e21 --- /dev/null +++ b/trackers/javascript-tracker/test/pages/multi_page_cookies/index.html @@ -0,0 +1,21 @@ + + + + + Cookies test page + + + + + + + diff --git a/trackers/javascript-tracker/test/pages/session-integration.html b/trackers/javascript-tracker/test/pages/session-integration.html index c63d738ea..f517ca369 100644 --- a/trackers/javascript-tracker/test/pages/session-integration.html +++ b/trackers/javascript-tracker/test/pages/session-integration.html @@ -52,7 +52,7 @@ window.snowplow('newTracker', 'anonymousSessionTracker', collector_endpoint, { appId: 'session-integration-' + testIdentifier, - cookieName: testIdentifier, + cookieName: testIdentifier + 'anon', sessionCookieTimeout: 1, stateStorageStrategy: 'localStorage', anonymousTracking: { withSessionTracking: true }, @@ -60,13 +60,17 @@ const currentUrl = window.location.href; const url = new URL(currentUrl); - if (url.searchParams.has("delayed")) { + if (url.searchParams.has('delayed')) { setTimeout(function () { window.snowplow('trackPageView:cookieSessionTracker'); window.snowplow('trackPageView:localStorageSessionTracker'); window.snowplow('trackPageView:anonymousSessionTracker'); + window.snowplow('disableAnonymousTracking:anonymousSessionTracker', { + stateStorageStrategy: 'cookieAndLocalStorage', + }); + window.snowplow('trackPageView:anonymousSessionTracker'); }, 0); } else { setTimeout(function () { @@ -81,7 +85,7 @@ }, 0); setTimeout(function () { - url.searchParams.set("delayed", "1"); + url.searchParams.set('delayed', '1'); window.location.href = url.toString(); }, 3000); } diff --git a/trackers/javascript-tracker/test/unit/in_queue.test.ts b/trackers/javascript-tracker/test/unit/in_queue.test.ts index 7df31124d..34ef8ac5c 100644 --- a/trackers/javascript-tracker/test/unit/in_queue.test.ts +++ b/trackers/javascript-tracker/test/unit/in_queue.test.ts @@ -163,6 +163,34 @@ describe('InQueueManager', () => { asyncQueue.push(['updatePageActivity:firstTracker;secondTracker']); expect(output).toEqual(29); }); +}); + +describe('Snowplow callback', () => { + const asyncQueue = InQueueManager('callback', []); + const mockTrackers: Record = {}; + + let userId: string | null | undefined; + + const newTracker = (trackerId: string): any => { + return { + id: trackerId, + setUserId: function (s?: string | null) { + userId = s; + }, + getUserId: function () { + return userId; + }, + }; + }; + + beforeEach(() => { + const tracker = newTracker('sp1'); + mockTrackers.sp1 = tracker; + }); + + afterEach(() => { + delete mockTrackers.sp1; + }); it('Execute a user-defined custom callback', () => { let callbackExecuted = false; @@ -183,4 +211,37 @@ describe('InQueueManager', () => { ]); }).not.toThrow(); }); + + it('A custom callback with arguments provided will pass those arguments into the callback parameters', () => { + asyncQueue.push([ + function (a: number, b: number) { + expect(a).toEqual(1); + expect(b).toEqual(2); + }, + 1, + 2, + ]); + }); + + it('The callback will be passed the tracker dictionary as the argument if there is only one parameter', () => { + asyncQueue.push([ + function (trackers: Record) { + const tracker = trackers.sp1; + expect(tracker).toEqual(mockTrackers.callback_sp1); + }, + ]); + }); + + it('The callback can access the tracker dictionary using both `this` and the last argument, along with arguments', () => { + asyncQueue.push([ + function (this: any, a: number, b: number, trackers: Record) { + expect(this.sp1).toEqual(mockTrackers.callback_sp1); + expect(a).toEqual(1); + expect(b).toEqual(2); + expect(trackers.sp1).toEqual(mockTrackers.callback_sp1); + }, + 1, + 2, + ]); + }); }); diff --git a/trackers/javascript-tracker/test/unit/plugin_features.test.ts b/trackers/javascript-tracker/test/unit/plugin_features.test.ts index ce75881b9..7db97287f 100644 --- a/trackers/javascript-tracker/test/unit/plugin_features.test.ts +++ b/trackers/javascript-tracker/test/unit/plugin_features.test.ts @@ -59,3 +59,39 @@ describe('Performance Navigation Timing', () => { expect(hasPerformanceNavigationTimingContext(plugins)).toBe(false); }); }); + +describe('WebView plugin', () => { + it('WebViewPlugin is not activated when webView flag is false', () => { + jest.isolateModules(() => { + const mockWebViewPlugin = jest.fn(() => ({})); + jest.mock('@snowplow/browser-plugin-webview', () => ({ + WebViewPlugin: mockWebViewPlugin, + })); + jest.mock('../../tracker.config', () => ({ webView: false })); + // Vimeo player crashes on fresh module load in jsdom; mock it to prevent that + jest.mock('@snowplow/browser-plugin-vimeo-tracking', () => ({ + VimeoTrackingPlugin: jest.fn(() => ({})), + })); + const { Plugins: PluginsFresh } = require('../../src/features'); + PluginsFresh({}); + expect(mockWebViewPlugin).not.toHaveBeenCalled(); + }); + }); + + it('WebViewPlugin is activated when webView flag is true', () => { + jest.isolateModules(() => { + const mockWebViewPlugin = jest.fn(() => ({})); + jest.mock('@snowplow/browser-plugin-webview', () => ({ + WebViewPlugin: mockWebViewPlugin, + })); + jest.mock('../../tracker.config', () => ({ webView: true })); + // Vimeo player crashes on fresh module load in jsdom; mock it to prevent that + jest.mock('@snowplow/browser-plugin-vimeo-tracking', () => ({ + VimeoTrackingPlugin: jest.fn(() => ({})), + })); + const { Plugins: PluginsFresh } = require('../../src/features'); + PluginsFresh({}); + expect(mockWebViewPlugin).toHaveBeenCalled(); + }); + }); +}); diff --git a/trackers/javascript-tracker/test/wdio.default.conf.ts b/trackers/javascript-tracker/test/wdio.default.conf.ts index af5a1a8ee..c2030db20 100644 --- a/trackers/javascript-tracker/test/wdio.default.conf.ts +++ b/trackers/javascript-tracker/test/wdio.default.conf.ts @@ -9,13 +9,15 @@ function getFullPath(path: string): string { type CustomTestRunnerConfig = Options.Testrunner & { dockerInstance?: DockerWrapper }; export const config: Omit = { - specs: [[ - getFullPath('test/functional/*.test.ts'), - getFullPath('test/integration/*.test.ts'), - getFullPath('test/media/media.test.ts'), - getFullPath('test/performance/*.test.ts'), - // YouTube and Vimeo tests are disabled since they block SauceLabs on CI - ]], + specs: [ + [ + getFullPath('test/functional/*.test.ts'), + getFullPath('test/integration/*.test.ts'), + getFullPath('test/media/media.test.ts'), + getFullPath('test/performance/*.test.ts'), + // YouTube and Vimeo tests are disabled since they block SauceLabs on CI + ], + ], logLevel: 'warn', baseUrl: 'http://snowplow-js-tracker.local:8080', waitforTimeout: 30000, @@ -31,7 +33,11 @@ export const config: Omit = { defaultTimeoutInterval: 120000, }, async onPrepare(config: CustomTestRunnerConfig) { - const isSauce = config.services?.some((service) => Array.isArray(service) && service[0] === 'sauce'); + // Tolerate both the `'sauce'` and `['sauce', opts]` service forms, since Micro must be + // advertised under the tunnel hostname rather than loopback whenever tests run on Sauce. + const isSauce = config.services?.some((service) => + Array.isArray(service) ? service[0] === 'sauce' : service === 'sauce' + ); config.dockerInstance = await start(isSauce); await setValue('dockerInstanceUrl', config.dockerInstance.url); return; diff --git a/trackers/javascript-tracker/test/wdio.sauce.conf.ts b/trackers/javascript-tracker/test/wdio.sauce.conf.ts index c0de2fea3..e30a88545 100644 --- a/trackers/javascript-tracker/test/wdio.sauce.conf.ts +++ b/trackers/javascript-tracker/test/wdio.sauce.conf.ts @@ -8,6 +8,15 @@ if (process.env.GITHUB_WORKFLOW) { const buildName = `snowplow-js-tracker-${buildIdentifier}`; +// The Sauce Connect tunnel is started outside of WebdriverIO (see the `Start Saucelabs Tunnel` +// step in `.github/workflows/build.yml`) since Sauce Connect 4, the only version the pinned +// `@wdio/sauce-service` can launch, is no longer accepted by Sauce Labs. +const tunnelName = process.env.SAUCE_TUNNEL_NAME; +const sauceOptions = { + build: buildName, + ...(tunnelName ? { tunnelName } : {}), +}; + export const config: Partial = { ...defaultConfig, @@ -20,67 +29,41 @@ export const config: Partial = { browserName: 'firefox', platformName: 'macOS 10.15', browserVersion: '96', - 'sauce:options': { - build: buildName, - }, + 'sauce:options': { ...sauceOptions }, }, { browserName: 'firefox', browserVersion: '78', platformName: 'Windows 10', - 'sauce:options': { - build: buildName, - }, + 'sauce:options': { ...sauceOptions }, }, { browserName: 'chrome', platformName: 'Windows 10', browserVersion: '109', - 'sauce:options': { - build: buildName, - }, + 'sauce:options': { ...sauceOptions }, }, { browserName: 'chrome', platformName: 'macOS 10.15', browserVersion: '95', - 'sauce:options': { - build: buildName, - }, + 'sauce:options': { ...sauceOptions }, }, { browserName: 'MicrosoftEdge', platformName: 'Windows 10', browserVersion: 'latest', - 'sauce:options': { - build: buildName, - }, + 'sauce:options': { ...sauceOptions }, }, { browserName: 'safari', browserVersion: '14', platformName: 'macOS 11.00', - 'sauce:options': { - build: buildName, - }, - }, - { - browserName: 'safari', - browserVersion: '12.1', - platformName: 'macOS 10.13', - 'sauce:options': { - build: buildName, - }, + 'sauce:options': { ...sauceOptions }, }, ], services: [ - [ - 'sauce', - { - sauceConnect: true, - sauceConnectOpts: {}, - }, - ], + 'sauce', [ 'static-server', { diff --git a/trackers/javascript-tracker/tracker.config.ts b/trackers/javascript-tracker/tracker.config.ts index db9e10ab6..7d73397df 100644 --- a/trackers/javascript-tracker/tracker.config.ts +++ b/trackers/javascript-tracker/tracker.config.ts @@ -22,6 +22,8 @@ export const privacySandbox = false; export const eventSpecifications = false; export const geolocation = false; export const timezone = false; +export const elementTracking = false; +export const webView = false; /* Deprecated */ export const enhancedEcommerce = false; diff --git a/trackers/javascript-tracker/tracker.lite.config.ts b/trackers/javascript-tracker/tracker.lite.config.ts index 0bac546e3..5e212e838 100644 --- a/trackers/javascript-tracker/tracker.lite.config.ts +++ b/trackers/javascript-tracker/tracker.lite.config.ts @@ -21,3 +21,5 @@ export const privacySandbox = false; export const buttonClickTracking = false; export const eventSpecifications = false; export const webVitals = false; +export const elementTracking = false; +export const webView = false; diff --git a/trackers/javascript-tracker/tracker.test.config.ts b/trackers/javascript-tracker/tracker.test.config.ts index 0aed42800..a6c3d24d3 100644 --- a/trackers/javascript-tracker/tracker.test.config.ts +++ b/trackers/javascript-tracker/tracker.test.config.ts @@ -21,3 +21,5 @@ export const privacySandbox = false; export const buttonClickTracking = true; export const eventSpecifications = false; export const webVitals = false; +export const elementTracking = true; +export const webView = true; diff --git a/trackers/node-tracker/CHANGELOG.json b/trackers/node-tracker/CHANGELOG.json index 42821ed90..f94c08777 100644 --- a/trackers/node-tracker/CHANGELOG.json +++ b/trackers/node-tracker/CHANGELOG.json @@ -1,6 +1,168 @@ { "name": "@snowplow/node-tracker", "entries": [ + { + "version": "4.10.1", + "tag": "@snowplow/node-tracker_v4.10.1", + "date": "Wed, 19 Aug 2026 14:26:05 GMT", + "comments": {} + }, + { + "version": "4.10.0", + "tag": "@snowplow/node-tracker_v4.10.0", + "date": "Mon, 27 Jul 2026 13:52:14 GMT", + "comments": {} + }, + { + "version": "4.9.0", + "tag": "@snowplow/node-tracker_v4.9.0", + "date": "Tue, 21 Jul 2026 14:53:08 GMT", + "comments": {} + }, + { + "version": "4.8.4", + "tag": "@snowplow/node-tracker_v4.8.4", + "date": "Thu, 02 Jul 2026 10:07:52 GMT", + "comments": {} + }, + { + "version": "4.8.3", + "tag": "@snowplow/node-tracker_v4.8.3", + "date": "Tue, 30 Jun 2026 14:22:03 GMT", + "comments": {} + }, + { + "version": "4.8.2", + "tag": "@snowplow/node-tracker_v4.8.2", + "date": "Wed, 17 Jun 2026 12:30:12 GMT", + "comments": {} + }, + { + "version": "4.8.1", + "tag": "@snowplow/node-tracker_v4.8.1", + "date": "Wed, 13 May 2026 09:26:05 GMT", + "comments": {} + }, + { + "version": "4.8.0", + "tag": "@snowplow/node-tracker_v4.8.0", + "date": "Tue, 28 Apr 2026 07:56:22 GMT", + "comments": {} + }, + { + "version": "4.7.0", + "tag": "@snowplow/node-tracker_v4.7.0", + "date": "Wed, 01 Apr 2026 12:59:29 GMT", + "comments": {} + }, + { + "version": "4.6.9", + "tag": "@snowplow/node-tracker_v4.6.9", + "date": "Mon, 16 Mar 2026 15:43:06 GMT", + "comments": {} + }, + { + "version": "4.6.8", + "tag": "@snowplow/node-tracker_v4.6.8", + "date": "Tue, 28 Oct 2025 09:46:42 GMT", + "comments": {} + }, + { + "version": "4.6.7", + "tag": "@snowplow/node-tracker_v4.6.7", + "date": "Tue, 07 Oct 2025 14:53:36 GMT", + "comments": {} + }, + { + "version": "4.6.6", + "tag": "@snowplow/node-tracker_v4.6.6", + "date": "Tue, 26 Aug 2025 08:42:28 GMT", + "comments": {} + }, + { + "version": "4.6.5", + "tag": "@snowplow/node-tracker_v4.6.5", + "date": "Wed, 25 Jun 2025 21:16:46 GMT", + "comments": {} + }, + { + "version": "4.6.4", + "tag": "@snowplow/node-tracker_v4.6.4", + "date": "Wed, 25 Jun 2025 12:08:50 GMT", + "comments": {} + }, + { + "version": "4.6.3", + "tag": "@snowplow/node-tracker_v4.6.3", + "date": "Thu, 29 May 2025 19:52:07 GMT", + "comments": {} + }, + { + "version": "4.6.2", + "tag": "@snowplow/node-tracker_v4.6.2", + "date": "Tue, 20 May 2025 07:39:05 GMT", + "comments": {} + }, + { + "version": "4.6.1", + "tag": "@snowplow/node-tracker_v4.6.1", + "date": "Tue, 06 May 2025 13:10:51 GMT", + "comments": {} + }, + { + "version": "4.6.0", + "tag": "@snowplow/node-tracker_v4.6.0", + "date": "Thu, 01 May 2025 09:58:59 GMT", + "comments": {} + }, + { + "version": "4.5.0", + "tag": "@snowplow/node-tracker_v4.5.0", + "date": "Fri, 04 Apr 2025 09:21:23 GMT", + "comments": {} + }, + { + "version": "4.4.0", + "tag": "@snowplow/node-tracker_v4.4.0", + "date": "Thu, 20 Mar 2025 12:14:34 GMT", + "comments": {} + }, + { + "version": "4.3.1", + "tag": "@snowplow/node-tracker_v4.3.1", + "date": "Tue, 21 Jan 2025 11:09:42 GMT", + "comments": {} + }, + { + "version": "4.3.0", + "tag": "@snowplow/node-tracker_v4.3.0", + "date": "Mon, 20 Jan 2025 11:45:13 GMT", + "comments": {} + }, + { + "version": "4.2.0", + "tag": "@snowplow/node-tracker_v4.2.0", + "date": "Mon, 13 Jan 2025 08:30:05 GMT", + "comments": {} + }, + { + "version": "4.1.0", + "tag": "@snowplow/node-tracker_v4.1.0", + "date": "Thu, 28 Nov 2024 10:57:30 GMT", + "comments": {} + }, + { + "version": "4.0.4", + "tag": "@snowplow/node-tracker_v4.0.4", + "date": "Thu, 21 Nov 2024 09:06:36 GMT", + "comments": {} + }, + { + "version": "4.0.3", + "tag": "@snowplow/node-tracker_v4.0.3", + "date": "Wed, 20 Nov 2024 09:30:31 GMT", + "comments": {} + }, { "version": "4.0.2", "tag": "@snowplow/node-tracker_v4.0.2", diff --git a/trackers/node-tracker/CHANGELOG.md b/trackers/node-tracker/CHANGELOG.md index 82142d8e7..538d6ac4c 100644 --- a/trackers/node-tracker/CHANGELOG.md +++ b/trackers/node-tracker/CHANGELOG.md @@ -1,6 +1,141 @@ # Change Log - @snowplow/node-tracker -This log was last generated on Mon, 11 Nov 2024 15:46:34 GMT and should not be manually modified. +This log was last generated on Wed, 19 Aug 2026 14:26:05 GMT and should not be manually modified. + +## 4.10.1 +Wed, 19 Aug 2026 14:26:05 GMT + +_Version update only_ + +## 4.10.0 +Mon, 27 Jul 2026 13:52:14 GMT + +_Version update only_ + +## 4.9.0 +Tue, 21 Jul 2026 14:53:08 GMT + +_Version update only_ + +## 4.8.4 +Thu, 02 Jul 2026 10:07:52 GMT + +_Version update only_ + +## 4.8.3 +Tue, 30 Jun 2026 14:22:03 GMT + +_Version update only_ + +## 4.8.2 +Wed, 17 Jun 2026 12:30:12 GMT + +_Version update only_ + +## 4.8.1 +Wed, 13 May 2026 09:26:05 GMT + +_Version update only_ + +## 4.8.0 +Tue, 28 Apr 2026 07:56:22 GMT + +_Version update only_ + +## 4.7.0 +Wed, 01 Apr 2026 12:59:29 GMT + +_Version update only_ + +## 4.6.9 +Mon, 16 Mar 2026 15:43:06 GMT + +_Version update only_ + +## 4.6.8 +Tue, 28 Oct 2025 09:46:42 GMT + +_Version update only_ + +## 4.6.7 +Tue, 07 Oct 2025 14:53:36 GMT + +_Version update only_ + +## 4.6.6 +Tue, 26 Aug 2025 08:42:28 GMT + +_Version update only_ + +## 4.6.5 +Wed, 25 Jun 2025 21:16:46 GMT + +_Version update only_ + +## 4.6.4 +Wed, 25 Jun 2025 12:08:50 GMT + +_Version update only_ + +## 4.6.3 +Thu, 29 May 2025 19:52:07 GMT + +_Version update only_ + +## 4.6.2 +Tue, 20 May 2025 07:39:05 GMT + +_Version update only_ + +## 4.6.1 +Tue, 06 May 2025 13:10:51 GMT + +_Version update only_ + +## 4.6.0 +Thu, 01 May 2025 09:58:59 GMT + +_Version update only_ + +## 4.5.0 +Fri, 04 Apr 2025 09:21:23 GMT + +_Version update only_ + +## 4.4.0 +Thu, 20 Mar 2025 12:14:34 GMT + +_Version update only_ + +## 4.3.1 +Tue, 21 Jan 2025 11:09:42 GMT + +_Version update only_ + +## 4.3.0 +Mon, 20 Jan 2025 11:45:13 GMT + +_Version update only_ + +## 4.2.0 +Mon, 13 Jan 2025 08:30:05 GMT + +_Version update only_ + +## 4.1.0 +Thu, 28 Nov 2024 10:57:30 GMT + +_Version update only_ + +## 4.0.4 +Thu, 21 Nov 2024 09:06:36 GMT + +_Version update only_ + +## 4.0.3 +Wed, 20 Nov 2024 09:30:31 GMT + +_Version update only_ ## 4.0.2 Mon, 11 Nov 2024 15:46:34 GMT diff --git a/trackers/node-tracker/package.json b/trackers/node-tracker/package.json index fb6aa293e..0c15d113a 100644 --- a/trackers/node-tracker/package.json +++ b/trackers/node-tracker/package.json @@ -1,6 +1,6 @@ { "name": "@snowplow/node-tracker", - "version": "4.0.2", + "version": "4.10.1", "description": "Node tracker for Snowplow", "keywords": [ "snowplow", diff --git a/trackers/react-native-tracker/CHANGELOG.json b/trackers/react-native-tracker/CHANGELOG.json new file mode 100644 index 000000000..d07a4a657 --- /dev/null +++ b/trackers/react-native-tracker/CHANGELOG.json @@ -0,0 +1,227 @@ +{ + "name": "@snowplow/react-native-tracker", + "entries": [ + { + "version": "4.10.1", + "tag": "@snowplow/react-native-tracker_v4.10.1", + "date": "Wed, 19 Aug 2026 14:26:05 GMT", + "comments": {} + }, + { + "version": "4.10.0", + "tag": "@snowplow/react-native-tracker_v4.10.0", + "date": "Mon, 27 Jul 2026 13:52:14 GMT", + "comments": {} + }, + { + "version": "4.9.0", + "tag": "@snowplow/react-native-tracker_v4.9.0", + "date": "Tue, 21 Jul 2026 14:53:08 GMT", + "comments": {} + }, + { + "version": "4.8.4", + "tag": "@snowplow/react-native-tracker_v4.8.4", + "date": "Thu, 02 Jul 2026 10:07:52 GMT", + "comments": { + "none": [ + { + "comment": "Widen react-native-get-random-values peer dependency range to allow v2.0.0 for React Native 0.81+ compatibility" + } + ] + } + }, + { + "version": "4.8.3", + "tag": "@snowplow/react-native-tracker_v4.8.3", + "date": "Tue, 30 Jun 2026 14:22:03 GMT", + "comments": { + "none": [ + { + "comment": "Update uuid to v11 and remove closure-compiler from the build pipeline" + } + ] + } + }, + { + "version": "4.8.2", + "tag": "@snowplow/react-native-tracker_v4.8.2", + "date": "Wed, 17 Jun 2026 12:30:12 GMT", + "comments": { + "none": [ + { + "comment": "Emit .d.ts files with .js extensions for nodenext type resolution by upgrading react-native-builder-bob to 0.42.1" + } + ] + } + }, + { + "version": "4.8.1", + "tag": "@snowplow/react-native-tracker_v4.8.1", + "date": "Wed, 13 May 2026 09:26:05 GMT", + "comments": { + "patch": [ + { + "comment": "Widen @react-native-async-storage/async-storage peer dependency range to ^2.0.0 to support React Native 0.80" + } + ] + } + }, + { + "version": "4.8.0", + "tag": "@snowplow/react-native-tracker_v4.8.0", + "date": "Tue, 28 Apr 2026 07:56:22 GMT", + "comments": {} + }, + { + "version": "4.7.0", + "tag": "@snowplow/react-native-tracker_v4.7.0", + "date": "Wed, 01 Apr 2026 12:59:29 GMT", + "comments": {} + }, + { + "version": "4.6.9", + "tag": "@snowplow/react-native-tracker_v4.6.9", + "date": "Mon, 16 Mar 2026 15:43:06 GMT", + "comments": {} + }, + { + "version": "4.6.8", + "tag": "@snowplow/react-native-tracker_v4.6.8", + "date": "Tue, 28 Oct 2025 09:46:42 GMT", + "comments": {} + }, + { + "version": "4.6.7", + "tag": "@snowplow/react-native-tracker_v4.6.7", + "date": "Tue, 07 Oct 2025 14:53:36 GMT", + "comments": { + "none": [ + { + "comment": "Add TypeScript definitions to \"package.json\" for \"react-native-tracker\"" + } + ] + } + }, + { + "version": "4.6.6", + "tag": "@snowplow/react-native-tracker_v4.6.6", + "date": "Tue, 26 Aug 2025 08:42:28 GMT", + "comments": { + "none": [ + { + "comment": "Make mobile_context values more consistent with v2 tracker" + }, + { + "comment": "Extract WebViewMessageHandler type to fix API documentation" + } + ] + } + }, + { + "version": "4.6.5", + "tag": "@snowplow/react-native-tracker_v4.6.5", + "date": "Wed, 25 Jun 2025 21:16:46 GMT", + "comments": {} + }, + { + "version": "4.6.4", + "tag": "@snowplow/react-native-tracker_v4.6.4", + "date": "Wed, 25 Jun 2025 12:08:50 GMT", + "comments": {} + }, + { + "version": "4.6.3", + "tag": "@snowplow/react-native-tracker_v4.6.3", + "date": "Thu, 29 May 2025 19:52:07 GMT", + "comments": {} + }, + { + "version": "4.6.2", + "tag": "@snowplow/react-native-tracker_v4.6.2", + "date": "Tue, 20 May 2025 07:39:05 GMT", + "comments": {} + }, + { + "version": "4.6.1", + "tag": "@snowplow/react-native-tracker_v4.6.1", + "date": "Tue, 06 May 2025 13:10:51 GMT", + "comments": {} + }, + { + "version": "4.6.0", + "tag": "@snowplow/react-native-tracker_v4.6.0", + "date": "Thu, 01 May 2025 09:58:59 GMT", + "comments": {} + }, + { + "version": "4.5.0", + "tag": "@snowplow/react-native-tracker_v4.5.0", + "date": "Fri, 04 Apr 2025 09:21:23 GMT", + "comments": { + "none": [ + { + "comment": "Allow configuring a custom event store in React Native tracker (close #1413)" + } + ] + } + }, + { + "version": "4.4.0", + "tag": "@snowplow/react-native-tracker_v4.4.0", + "date": "Thu, 20 Mar 2025 12:14:34 GMT", + "comments": { + "none": [ + { + "comment": "Add react-native-get-random-values as a peer dependency in the React Native tracker (close #1409)" + } + ] + } + }, + { + "version": "4.3.1", + "tag": "@snowplow/react-native-tracker_v4.3.1", + "date": "Tue, 21 Jan 2025 11:09:42 GMT", + "comments": {} + }, + { + "version": "4.3.0", + "tag": "@snowplow/react-native-tracker_v4.3.0", + "date": "Mon, 20 Jan 2025 11:45:13 GMT", + "comments": {} + }, + { + "version": "4.2.0", + "tag": "@snowplow/react-native-tracker_v4.2.0", + "date": "Mon, 13 Jan 2025 08:30:05 GMT", + "comments": { + "none": [ + { + "comment": "Add new tracker for React Native" + }, + { + "comment": "Add app install, foreground and background event and application entity tracking (#1396)" + }, + { + "comment": "Add a platform context plugin to the React Native tracker to track device information (#1395)" + }, + { + "comment": "Add internal session plugin to the React Native tracker (#1388)" + }, + { + "comment": "Add deep link tracking to the React Native tracker" + }, + { + "comment": "Round resolution in mobile context to avoid validation failures on Android" + }, + { + "comment": "Add screen tracking plugin and add support for browser plugins (#1394)" + }, + { + "comment": "Add WebView tracker integration to the React Native tracker (#1399)" + } + ] + } + } + ] +} diff --git a/trackers/react-native-tracker/CHANGELOG.md b/trackers/react-native-tracker/CHANGELOG.md new file mode 100644 index 000000000..da24035bd --- /dev/null +++ b/trackers/react-native-tracker/CHANGELOG.md @@ -0,0 +1,150 @@ +# Change Log - @snowplow/react-native-tracker + +This log was last generated on Wed, 19 Aug 2026 14:26:05 GMT and should not be manually modified. + +## 4.10.1 +Wed, 19 Aug 2026 14:26:05 GMT + +_Version update only_ + +## 4.10.0 +Mon, 27 Jul 2026 13:52:14 GMT + +_Version update only_ + +## 4.9.0 +Tue, 21 Jul 2026 14:53:08 GMT + +_Version update only_ + +## 4.8.4 +Thu, 02 Jul 2026 10:07:52 GMT + +### Updates + +- Widen react-native-get-random-values peer dependency range to allow v2.0.0 for React Native 0.81+ compatibility + +## 4.8.3 +Tue, 30 Jun 2026 14:22:03 GMT + +### Updates + +- Update uuid to v11 and remove closure-compiler from the build pipeline + +## 4.8.2 +Wed, 17 Jun 2026 12:30:12 GMT + +### Updates + +- Emit .d.ts files with .js extensions for nodenext type resolution by upgrading react-native-builder-bob to 0.42.1 + +## 4.8.1 +Wed, 13 May 2026 09:26:05 GMT + +### Patches + +- Widen @react-native-async-storage/async-storage peer dependency range to ^2.0.0 to support React Native 0.80 + +## 4.8.0 +Tue, 28 Apr 2026 07:56:22 GMT + +_Version update only_ + +## 4.7.0 +Wed, 01 Apr 2026 12:59:29 GMT + +_Version update only_ + +## 4.6.9 +Mon, 16 Mar 2026 15:43:06 GMT + +_Version update only_ + +## 4.6.8 +Tue, 28 Oct 2025 09:46:42 GMT + +_Version update only_ + +## 4.6.7 +Tue, 07 Oct 2025 14:53:36 GMT + +### Updates + +- Add TypeScript definitions to "package.json" for "react-native-tracker" + +## 4.6.6 +Tue, 26 Aug 2025 08:42:28 GMT + +### Updates + +- Make mobile_context values more consistent with v2 tracker +- Extract WebViewMessageHandler type to fix API documentation + +## 4.6.5 +Wed, 25 Jun 2025 21:16:46 GMT + +_Version update only_ + +## 4.6.4 +Wed, 25 Jun 2025 12:08:50 GMT + +_Version update only_ + +## 4.6.3 +Thu, 29 May 2025 19:52:07 GMT + +_Version update only_ + +## 4.6.2 +Tue, 20 May 2025 07:39:05 GMT + +_Version update only_ + +## 4.6.1 +Tue, 06 May 2025 13:10:51 GMT + +_Version update only_ + +## 4.6.0 +Thu, 01 May 2025 09:58:59 GMT + +_Version update only_ + +## 4.5.0 +Fri, 04 Apr 2025 09:21:23 GMT + +### Updates + +- Allow configuring a custom event store in React Native tracker (close #1413) + +## 4.4.0 +Thu, 20 Mar 2025 12:14:34 GMT + +### Updates + +- Add react-native-get-random-values as a peer dependency in the React Native tracker (close #1409) + +## 4.3.1 +Tue, 21 Jan 2025 11:09:42 GMT + +_Version update only_ + +## 4.3.0 +Mon, 20 Jan 2025 11:45:13 GMT + +_Version update only_ + +## 4.2.0 +Mon, 13 Jan 2025 08:30:05 GMT + +### Updates + +- Add new tracker for React Native +- Add app install, foreground and background event and application entity tracking (#1396) +- Add a platform context plugin to the React Native tracker to track device information (#1395) +- Add internal session plugin to the React Native tracker (#1388) +- Add deep link tracking to the React Native tracker +- Round resolution in mobile context to avoid validation failures on Android +- Add screen tracking plugin and add support for browser plugins (#1394) +- Add WebView tracker integration to the React Native tracker (#1399) + diff --git a/trackers/react-native-tracker/LICENSE b/trackers/react-native-tracker/LICENSE new file mode 100644 index 000000000..f697ebc56 --- /dev/null +++ b/trackers/react-native-tracker/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2022 Snowplow Analytics Ltd +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/trackers/react-native-tracker/README.md b/trackers/react-native-tracker/README.md new file mode 100644 index 000000000..c43a5082d --- /dev/null +++ b/trackers/react-native-tracker/README.md @@ -0,0 +1,94 @@ +# Snowplow React Native Tracker + +[![npm version][npm-image]][npm-url] +[![License][license-image]](LICENSE) + +Add Snowplow Tracking to your React Native Application with `@snowplow/react-native-tracker`. + +## Package Installation + +With npm: + +```bash +npm install @snowplow/react-native-tracker +``` + +## Usage + +Initialize your tracker with your desired configuration: + +```js +import { newTracker } from '@snowplow/react-native-tracker'; +const t = newTracker({ + namespace: 'myTracker', + appId: 'myApp', + endpoint: 'http://0.0.0.0:9090' +}); +``` + +Then use the `track` function from this package, along with the `buildX` functions to send events to your configured emitters: + +```js +const context = [ + { + schema: 'iglu:com.acme/user/jsonschema/1-0-0', + data: { + type: 'tester', + }, + }, +]; + +t.trackScreenViewEvent({ name: 'myScreenName' }); + +t.trackPageView( + { pageUrl: 'http://www.example.com', pageTitle: 'example page' }, + context +); + +const eventJson = { + schema: 'iglu:com.acme/viewed_product/jsonschema/1-0-0', + data: { + price: 20, + }, +}; + +t.trackSelfDescribingEvent(eventJson, context); +``` + +## Maintainer quick start + +Part of the Snowplow JavaScript Tracker monorepo. +Build with [Node.js](https://nodejs.org/en/) (18 - 20) and [Rush](https://rushjs.io/). + +### Setup repository + +```bash +npm install -g @microsoft/rush +git clone https://github.com/snowplow/snowplow-javascript-tracker.git +rush update +``` + +## Find out more + +| Technical Docs | Setup Guide | +|-----------------------------------|-----------------------------| +| [![i1][techdocs-image]][techdocs] | [![i2][setup-image]][setup] | +| [Technical Docs][techdocs] | [Setup Guide][setup] | + +## Copyright and license + +Licensed and distributed under the [BSD 3-Clause License](LICENSE) ([An OSI Approved License][osi]). + +Copyright (c) 2022 Snowplow Analytics Ltd. + +All rights reserved. + +[osi]: https://opensource.org/licenses/BSD-3-Clause +[license-image]: https://img.shields.io/npm/l/@snowplow/node-tracker +[npm-url]: https://www.npmjs.com/package/@snowplow/node-tracker +[npm-image]: https://img.shields.io/npm/v/@snowplow/node-tracker + +[techdocs]: https://docs.snowplowanalytics.com/docs/collecting-data/collecting-from-own-applications/react-native-tracker/introduction +[techdocs-image]: https://d3i6fms1cm1j0i.cloudfront.net/github/images/techdocs.png +[setup]: https://docs.snowplowanalytics.com/docs/collecting-data/collecting-from-own-applications/react-native-tracker/quick-start-guide/ +[setup-image]: https://d3i6fms1cm1j0i.cloudfront.net/github/images/setup.png diff --git a/trackers/react-native-tracker/api-extractor.json b/trackers/react-native-tracker/api-extractor.json new file mode 100644 index 000000000..30d2e44b2 --- /dev/null +++ b/trackers/react-native-tracker/api-extractor.json @@ -0,0 +1,361 @@ +/** + * Config file for API Extractor. For more info, please visit: https://api-extractor.com + */ +{ + "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", + + /** + * Optionally specifies another JSON config file that this file extends from. This provides a way for + * standard settings to be shared across multiple projects. + * + * If the path starts with "./" or "../", the path is resolved relative to the folder of the file that contains + * the "extends" field. Otherwise, the first path segment is interpreted as an NPM package name, and will be + * resolved using NodeJS require(). + * + * SUPPORTED TOKENS: none + * DEFAULT VALUE: "" + */ + // "extends": "./shared/api-extractor-base.json" + // "extends": "my-package/include/api-extractor-base.json" + + /** + * Determines the "" token that can be used with other config file settings. The project folder + * typically contains the tsconfig.json and package.json config files, but the path is user-defined. + * + * The path is resolved relative to the folder of the config file that contains the setting. + * + * The default value for "projectFolder" is the token "", which means the folder is determined by traversing + * parent folders, starting from the folder containing api-extractor.json, and stopping at the first folder + * that contains a tsconfig.json file. If a tsconfig.json file cannot be found in this way, then an error + * will be reported. + * + * SUPPORTED TOKENS: + * DEFAULT VALUE: "" + */ + // "projectFolder": "..", + + /** + * (REQUIRED) Specifies the .d.ts file to be used as the starting point for analysis. API Extractor + * analyzes the symbols exported by this module. + * + * The file extension must be ".d.ts" and not ".ts". + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + */ + "mainEntryPointFilePath": "/dist/typescript/module/src/index.d.ts", + + /** + * A list of NPM package names whose exports should be treated as part of this package. + * + * For example, suppose that Webpack is used to generate a distributed bundle for the project "library1", + * and another NPM package "library2" is embedded in this bundle. Some types from library2 may become part + * of the exported API for library1, but by default API Extractor would generate a .d.ts rollup that explicitly + * imports library2. To avoid this, we can specify: + * + * "bundledPackages": [ "library2" ], + * + * This would direct API Extractor to embed those types directly in the .d.ts rollup, as if they had been + * local files for library1. + */ + "bundledPackages": ["@snowplow/tracker-core"], + + /** + * Determines how the TypeScript compiler engine will be invoked by API Extractor. + */ + "compiler": { + /** + * Specifies the path to the tsconfig.json file to be used by API Extractor when analyzing the project. + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * Note: This setting will be ignored if "overrideTsconfig" is used. + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "/tsconfig.json" + */ + // "tsconfigFilePath": "/tsconfig.json", + /** + * Provides a compiler configuration that will be used instead of reading the tsconfig.json file from disk. + * The object must conform to the TypeScript tsconfig schema: + * + * http://json.schemastore.org/tsconfig + * + * If omitted, then the tsconfig.json file will be read from the "projectFolder". + * + * DEFAULT VALUE: no overrideTsconfig section + */ + // "overrideTsconfig": { + // . . . + // } + /** + * This option causes the compiler to be invoked with the --skipLibCheck option. This option is not recommended + * and may cause API Extractor to produce incomplete or incorrect declarations, but it may be required when + * dependencies contain declarations that are incompatible with the TypeScript engine that API Extractor uses + * for its analysis. Where possible, the underlying issue should be fixed rather than relying on skipLibCheck. + * + * DEFAULT VALUE: false + */ + // "skipLibCheck": true, + }, + + /** + * Configures how the API report file (*.api.md) will be generated. + */ + "apiReport": { + /** + * (REQUIRED) Whether to generate an API report. + */ + "enabled": true, + + /** + * The filename for the API report files. It will be combined with "reportFolder" or "reportTempFolder" to produce + * a full file path. + * + * The file extension should be ".api.md", and the string should not contain a path separator such as "\" or "/". + * + * SUPPORTED TOKENS: , + * DEFAULT VALUE: ".api.md" + */ + // "reportFileName": ".api.md", + + /** + * Specifies the folder where the API report file is written. The file name portion is determined by + * the "reportFileName" setting. + * + * The API report file is normally tracked by Git. Changes to it can be used to trigger a branch policy, + * e.g. for an API review. + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "/etc/" + */ + "reportFolder": "../../api-docs/docs/react-native-tracker/" + + /** + * Specifies the folder where the temporary report file is written. The file name portion is determined by + * the "reportFileName" setting. + * + * After the temporary file is written to disk, it is compared with the file in the "reportFolder". + * If they are different, a production build will fail. + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "/temp/" + */ + // "reportTempFolder": "/temp/" + }, + + /** + * Configures how the doc model file (*.api.json) will be generated. + */ + "docModel": { + /** + * (REQUIRED) Whether to generate a doc model file. + */ + "enabled": true, + + /** + * The output path for the doc model file. The file extension should be ".api.json". + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "/temp/.api.json" + */ + "apiJsonFilePath": "/temp/.api.json" + }, + + /** + * Configures how the .d.ts rollup file will be generated. + */ + "dtsRollup": { + /** + * (REQUIRED) Whether to generate the .d.ts rollup file. + */ + "enabled": false + + /** + * Specifies the output path for a .d.ts rollup file to be generated without any trimming. + * This file will include all declarations that are exported by the main entry point. + * + * If the path is an empty string, then this file will not be written. + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "/dist/.d.ts" + */ + // "untrimmedFilePath": "/dist/.d.ts", + + /** + * Specifies the output path for a .d.ts rollup file to be generated with trimming for a "beta" release. + * This file will include only declarations that are marked as "@public" or "@beta". + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "" + */ + // "betaTrimmedFilePath": "/dist/-beta.d.ts", + + /** + * Specifies the output path for a .d.ts rollup file to be generated with trimming for a "public" release. + * This file will include only declarations that are marked as "@public". + * + * If the path is an empty string, then this file will not be written. + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "" + */ + // "publicTrimmedFilePath": "/dist/-public.d.ts", + + /** + * When a declaration is trimmed, by default it will be replaced by a code comment such as + * "Excluded from this release type: exampleMember". Set "omitTrimmingComments" to true to remove the + * declaration completely. + * + * DEFAULT VALUE: false + */ + // "omitTrimmingComments": true + }, + + /** + * Configures how the tsdoc-metadata.json file will be generated. + */ + "tsdocMetadata": { + /** + * Whether to generate the tsdoc-metadata.json file. + * + * DEFAULT VALUE: true + */ + // "enabled": true, + /** + * Specifies where the TSDoc metadata file should be written. + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * The default value is "", which causes the path to be automatically inferred from the "tsdocMetadata", + * "typings" or "main" fields of the project's package.json. If none of these fields are set, the lookup + * falls back to "tsdoc-metadata.json" in the package folder. + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "" + */ + // "tsdocMetadataFilePath": "/dist/tsdoc-metadata.json" + }, + + /** + * Specifies what type of newlines API Extractor should use when writing output files. By default, the output files + * will be written with Windows-style newlines. To use POSIX-style newlines, specify "lf" instead. + * To use the OS's default newline kind, specify "os". + * + * DEFAULT VALUE: "crlf" + */ + "newlineKind": "lf", + + /** + * Configures how API Extractor reports error and warning messages produced during analysis. + * + * There are three sources of messages: compiler messages, API Extractor messages, and TSDoc messages. + */ + "messages": { + /** + * Configures handling of diagnostic messages reported by the TypeScript compiler engine while analyzing + * the input .d.ts files. + * + * TypeScript message identifiers start with "TS" followed by an integer. For example: "TS2551" + * + * DEFAULT VALUE: A single "default" entry with logLevel=warning. + */ + "compilerMessageReporting": { + /** + * Configures the default routing for messages that don't match an explicit rule in this table. + */ + "default": { + /** + * Specifies whether the message should be written to the the tool's output log. Note that + * the "addToApiReportFile" property may supersede this option. + * + * Possible values: "error", "warning", "none" + * + * Errors cause the build to fail and return a nonzero exit code. Warnings cause a production build fail + * and return a nonzero exit code. For a non-production build (e.g. when "api-extractor run" includes + * the "--local" option), the warning is displayed but the build will not fail. + * + * DEFAULT VALUE: "warning" + */ + "logLevel": "warning" + + /** + * When addToApiReportFile is true: If API Extractor is configured to write an API report file (.api.md), + * then the message will be written inside that file; otherwise, the message is instead logged according to + * the "logLevel" option. + * + * DEFAULT VALUE: false + */ + // "addToApiReportFile": false + } + + // "TS2551": { + // "logLevel": "warning", + // "addToApiReportFile": true + // }, + // + // . . . + }, + + /** + * Configures handling of messages reported by API Extractor during its analysis. + * + * API Extractor message identifiers start with "ae-". For example: "ae-extra-release-tag" + * + * DEFAULT VALUE: See api-extractor-defaults.json for the complete table of extractorMessageReporting mappings + */ + "extractorMessageReporting": { + "default": { + "logLevel": "warning" + // "addToApiReportFile": false + }, + + "ae-missing-release-tag": { + "logLevel": "none" + } + }, + + /** + * Configures handling of messages reported by the TSDoc parser when analyzing code comments. + * + * TSDoc message identifiers start with "tsdoc-". For example: "tsdoc-link-tag-unescaped-text" + * + * DEFAULT VALUE: A single "default" entry with logLevel=warning. + */ + "tsdocMessageReporting": { + "default": { + "logLevel": "warning" + // "addToApiReportFile": false + } + + // "tsdoc-link-tag-unescaped-text": { + // "logLevel": "warning", + // "addToApiReportFile": true + // }, + // + // . . . + } + } +} diff --git a/trackers/react-native-tracker/babel.config.js b/trackers/react-native-tracker/babel.config.js new file mode 100644 index 000000000..29f3a6069 --- /dev/null +++ b/trackers/react-native-tracker/babel.config.js @@ -0,0 +1,5 @@ +module.exports = { + presets: [ + ['module:react-native-builder-bob/babel-preset', { modules: 'commonjs' }], + ], +}; diff --git a/trackers/react-native-tracker/jest.config.js b/trackers/react-native-tracker/jest.config.js new file mode 100644 index 000000000..55d4d9fb4 --- /dev/null +++ b/trackers/react-native-tracker/jest.config.js @@ -0,0 +1,7 @@ +module.exports = { + preset: 'react-native', + reporters: ['jest-standard-reporter'], + transformIgnorePatterns: [], + setupFilesAfterEnv: ['../../setupTestGlobals.ts'], + modulePathIgnorePatterns: ['/dist/'], +}; diff --git a/trackers/react-native-tracker/package.json b/trackers/react-native-tracker/package.json new file mode 100644 index 000000000..446d33016 --- /dev/null +++ b/trackers/react-native-tracker/package.json @@ -0,0 +1,105 @@ +{ + "name": "@snowplow/react-native-tracker", + "version": "4.10.1", + "description": "React Native tracker for Snowplow", + "keywords": [ + "snowplow", + "analytics", + "tracking", + "events", + "open source" + ], + "homepage": "https://docs.snowplow.io/docs/collecting-data/collecting-from-own-applications/javascript-trackers/", + "bugs": "https://github.com/snowplow/snowplow-javascript-tracker/issues", + "repository": { + "type": "git", + "url": "https://github.com/snowplow/snowplow-javascript-tracker.git" + }, + "license": "BSD-3-Clause", + "contributors": [ + "Snowplow" + ], + "sideEffects": false, + "source": "./src/index.tsx", + "main": "./dist/commonjs/index.js", + "module": "./dist/module/index.js", + "types": "./dist/typescript/module/src/index.d.ts", + "exports": { + ".": { + "import": { + "types": "./dist/typescript/module/src/index.d.ts", + "default": "./dist/module/index.js" + }, + "require": { + "types": "./dist/typescript/commonjs/src/index.d.ts", + "default": "./dist/commonjs/index.js" + } + } + }, + "files": [ + "dist" + ], + "scripts": { + "build": "bob build", + "test": "jest" + }, + "peerDependencies": { + "@react-native-async-storage/async-storage": "^2.0.0", + "react": "*", + "react-native": "*", + "react-native-get-random-values": "^1.11.0 || ^2.0.0" + }, + "dependencies": { + "@snowplow/tracker-core": "workspace:*", + "@snowplow/browser-tracker-core": "workspace:*", + "@snowplow/browser-plugin-screen-tracking": "workspace:*", + "tslib": "^2.3.1", + "uuid": "^11.1.1" + }, + "devDependencies": { + "@react-native-async-storage/async-storage": "^2.0.0", + "@snowplow/browser-plugin-snowplow-ecommerce": "workspace:*", + "@typescript-eslint/eslint-plugin": "~5.15.0", + "@typescript-eslint/parser": "~5.15.0", + "eslint": "~8.11.0", + "typescript": "~4.6.2", + "@types/jest": "~28.1.1", + "@types/node": "~14.6.0", + "jest": "~28.1.3", + "react": "18.2.0", + "ts-jest": "~28.0.8", + "@types/react": "^18.2.44", + "react-native": "0.74.5", + "node-fetch": "~3.3.2", + "react-native-builder-bob": "^0.42.1", + "react-native-get-random-values": "^1.11.0 || ^2.0.0" + }, + "resolutions": { + "@types/react": "^18.2.44" + }, + "browserslist": {}, + "react-native-builder-bob": { + "source": "src", + "output": "dist", + "targets": [ + [ + "commonjs", + { + "esm": true + } + ], + [ + "module", + { + "esm": true + } + ], + [ + "typescript", + { + "project": "tsconfig.build.json" + } + ] + ] + } +} diff --git a/trackers/react-native-tracker/src/__mocks__/@react-native-async-storage/async-storage.js b/trackers/react-native-tracker/src/__mocks__/@react-native-async-storage/async-storage.js new file mode 100644 index 000000000..125233a46 --- /dev/null +++ b/trackers/react-native-tracker/src/__mocks__/@react-native-async-storage/async-storage.js @@ -0,0 +1,2 @@ +import AsyncStorage from "@react-native-async-storage/async-storage/jest/async-storage-mock"; +export default AsyncStorage; diff --git a/trackers/react-native-tracker/src/constants.ts b/trackers/react-native-tracker/src/constants.ts new file mode 100644 index 000000000..5c1fbb0d7 --- /dev/null +++ b/trackers/react-native-tracker/src/constants.ts @@ -0,0 +1,15 @@ +export const FOREGROUND_EVENT_SCHEMA = 'iglu:com.snowplowanalytics.snowplow/application_foreground/jsonschema/1-0-0'; +export const BACKGROUND_EVENT_SCHEMA = 'iglu:com.snowplowanalytics.snowplow/application_background/jsonschema/1-0-0'; +export const DEEP_LINK_RECEIVED_EVENT_SCHEMA = 'iglu:com.snowplowanalytics.mobile/deep_link_received/jsonschema/1-0-0'; +export const SCREEN_VIEW_EVENT_SCHEMA = 'iglu:com.snowplowanalytics.mobile/screen_view/jsonschema/1-0-0'; +export const APPLICATION_INSTALL_EVENT_SCHEMA = 'iglu:com.snowplowanalytics.mobile/application_install/jsonschema/1-0-0'; + +export const CLIENT_SESSION_ENTITY_SCHEMA ='iglu:com.snowplowanalytics.snowplow/client_session/jsonschema/1-0-2' +export const MOBILE_CONTEXT_SCHEMA = 'iglu:com.snowplowanalytics.snowplow/mobile_context/jsonschema/1-0-3'; +export const DEEP_LINK_ENTITY_SCHEMA = 'iglu:com.snowplowanalytics.mobile/deep_link/jsonschema/1-0-0'; +export const LIFECYCLE_CONTEXT_SCHEMA = 'iglu:com.snowplowanalytics.mobile/application_lifecycle/jsonschema/1-0-0'; +export const MOBILE_APPLICATION_CONTEXT_SCHEMA = 'iglu:com.snowplowanalytics.mobile/application/jsonschema/1-0-0'; +export const APPLICATION_CONTEXT_SCHEMA = 'iglu:com.snowplowanalytics.snowplow/application/jsonschema/1-0-0'; + +export const PAGE_URL_PROPERTY = 'url'; +export const PAGE_REFERRER_PROPERTY = 'refr'; diff --git a/trackers/react-native-tracker/src/event_store.ts b/trackers/react-native-tracker/src/event_store.ts new file mode 100644 index 000000000..0bd6d2de8 --- /dev/null +++ b/trackers/react-native-tracker/src/event_store.ts @@ -0,0 +1,49 @@ +import { EventStore, EventStorePayload, newInMemoryEventStore } from '@snowplow/tracker-core'; +import { EventStoreConfiguration, TrackerConfiguration } from './types'; +import DefaultAsyncStorage from '@react-native-async-storage/async-storage'; + +export async function newReactNativeEventStore({ + namespace, + maxEventStoreSize = 1000, + useAsyncStorageForEventStore: useAsyncStorage = true, + asyncStorage = DefaultAsyncStorage, +}: TrackerConfiguration & EventStoreConfiguration): Promise { + const queueName = `snowplow_${namespace}`; + + async function newInMemoryEventStoreForReactNative() { + if (useAsyncStorage) { + const data = await asyncStorage.getItem(queueName); + const events: EventStorePayload[] = data ? JSON.parse(data) : []; + return newInMemoryEventStore({ maxSize: maxEventStoreSize, events }); + } else { + return newInMemoryEventStore({ maxSize: maxEventStoreSize }); + } + } + + const eventStore = await newInMemoryEventStoreForReactNative(); + + const { getAll, getAllPayloads, add, count, iterator, removeHead } = eventStore; + + async function sync() { + if (useAsyncStorage) { + const events = await getAll(); + await asyncStorage.setItem(queueName, JSON.stringify(events)); + } + } + + return { + count, + add: async (payload: EventStorePayload) => { + await add(payload); + await sync(); + return await count(); + }, + removeHead: async (n: number) => { + removeHead(n); + await sync(); + }, + iterator, + getAll, + getAllPayloads, + }; +} diff --git a/trackers/react-native-tracker/src/events.ts b/trackers/react-native-tracker/src/events.ts new file mode 100644 index 000000000..02e1ef523 --- /dev/null +++ b/trackers/react-native-tracker/src/events.ts @@ -0,0 +1,54 @@ +import { + buildPageView, + buildSelfDescribingEvent, + buildStructEvent, + PageViewEvent, + SelfDescribingJson, + TrackerCore, +} from '@snowplow/tracker-core'; +import { EventContext, MessageNotificationProps, StructuredProps, TimingProps } from './types'; + +export function newTrackEventFunctions(core: TrackerCore) { + const trackSelfDescribingEvent = = Record>( + argmap: SelfDescribingJson, + contexts?: EventContext[] + ) => { + core.track(buildSelfDescribingEvent({ event: argmap }), contexts); + }; + + const trackStructuredEvent = (argmap: StructuredProps, contexts?: EventContext[]) => { + return core.track(buildStructEvent(argmap), contexts)?.eid; + }; + + const trackPageViewEvent = (argmap: PageViewEvent, contexts?: EventContext[]) => { + return core.track(buildPageView(argmap), contexts)?.eid; + }; + + const trackTimingEvent = (argmap: TimingProps, contexts?: EventContext[]) => { + trackSelfDescribingEvent( + { + schema: 'iglu:com.snowplowanalytics.snowplow/timing/jsonschema/1-0-0', + data: argmap, + }, + contexts + ); + }; + + const trackMessageNotificationEvent = (argmap: MessageNotificationProps, contexts?: EventContext[]) => { + trackSelfDescribingEvent( + { + schema: 'iglu:com.snowplowanalytics.mobile/message_notification/jsonschema/1-0-0', + data: argmap, + }, + contexts + ); + }; + + return { + trackSelfDescribingEvent, + trackStructuredEvent, + trackPageViewEvent, + trackTimingEvent, + trackMessageNotificationEvent, + }; +} diff --git a/trackers/react-native-tracker/src/index.ts b/trackers/react-native-tracker/src/index.ts new file mode 100644 index 000000000..a4cdb5590 --- /dev/null +++ b/trackers/react-native-tracker/src/index.ts @@ -0,0 +1,6 @@ +// polyfill for Web crypto module required by uuidjs +import 'react-native-get-random-values'; + +export * from './types'; +export { newTracker, getTracker, getAllTrackers, removeTracker, removeAllTrackers } from './tracker'; +export * from './web_view_interface'; diff --git a/trackers/react-native-tracker/src/plugins.ts b/trackers/react-native-tracker/src/plugins.ts new file mode 100644 index 000000000..05741e32f --- /dev/null +++ b/trackers/react-native-tracker/src/plugins.ts @@ -0,0 +1,72 @@ +import { BrowserPluginConfiguration, BrowserTracker, ParsedIdCookie } from '@snowplow/browser-tracker-core'; +import { TrackerCore } from '@snowplow/tracker-core'; + +/** + * Creates a fake BrowserTracker from a TrackerCore instance in order to use in browser plugins. + * Most of the methods are not implemented and will throw an error if called. + * However, our plugins mostly only call the `core` methods. + */ +function toBrowserTracker(namespace: string, core: TrackerCore): BrowserTracker { + const notImplemented = () => { + throw new Error('Not implemented in React Native'); + }; + return { + id: namespace, + namespace, + core, + sharedState: { + bufferFlushers: [], + hasLoaded: true, + registeredOnLoadHandlers: [], + }, + getDomainSessionIndex: () => 0, + getPageViewId: () => '', + getTabId: () => null, + getCookieName: () => '', + getUserId: () => undefined, + getDomainUserId: () => '', + getDomainUserInfo: (): ParsedIdCookie => ['', '', 0, 0, 0, undefined, '', '', '', undefined, 0], + getDomainSessionId: () => '', + setReferrerUrl: () => notImplemented, + setCustomUrl: () => notImplemented, + setDocumentTitle: () => notImplemented, + discardHashTag: () => notImplemented, + discardBrace: () => notImplemented, + setCookiePath: () => notImplemented, + setVisitorCookieTimeout: () => notImplemented, + newSession: () => notImplemented, + crossDomainLinker: () => notImplemented, + enableActivityTracking: () => notImplemented, + enableActivityTrackingCallback: () => notImplemented, + disableActivityTracking: () => notImplemented, + disableActivityTrackingCallback: () => notImplemented, + updatePageActivity: () => notImplemented, + setOptOutCookie: () => notImplemented, + setUserId: () => notImplemented, + setUserIdFromLocation: () => notImplemented, + setUserIdFromReferrer: () => notImplemented, + setUserIdFromCookie: () => notImplemented, + setCollectorUrl: () => notImplemented, + setBufferSize: () => notImplemented, + flushBuffer: () => notImplemented, + preservePageViewId: () => notImplemented, + preservePageViewIdForUrl: () => notImplemented, + trackPageView: () => notImplemented, + disableAnonymousTracking: () => notImplemented, + enableAnonymousTracking: () => notImplemented, + clearUserData: () => notImplemented, + addPlugin: () => notImplemented, + }; +} + +export function newPlugins(namespace: string, core: TrackerCore) { + return { + addPlugin: (plugin: BrowserPluginConfiguration) => { + core.addPlugin(plugin); + if (plugin.plugin.activateBrowserPlugin) { + const browserTracker = toBrowserTracker(namespace, core); + plugin.plugin.activateBrowserPlugin?.(browserTracker); + } + }, + }; +} diff --git a/trackers/react-native-tracker/src/plugins/app_context/index.ts b/trackers/react-native-tracker/src/plugins/app_context/index.ts new file mode 100644 index 000000000..417020df2 --- /dev/null +++ b/trackers/react-native-tracker/src/plugins/app_context/index.ts @@ -0,0 +1,44 @@ +import { CorePluginConfiguration, SelfDescribingJson } from '@snowplow/tracker-core'; +import { AppLifecycleConfiguration } from '../../types'; +import { APPLICATION_CONTEXT_SCHEMA, MOBILE_APPLICATION_CONTEXT_SCHEMA } from '../../constants'; + +/** + * Tracks the application context entity with information about the app version. + * If appBuild is provided, a mobile application context is tracked, otherwise the Web equivalent is tracked. + * + * Entity schema if `appBuild` property is set: `iglu:com.snowplowanalytics.mobile/application/jsonschema/1-0-0` + * Entity schema if `appBuild` property is not set: `iglu:com.snowplowanalytics.snowplow/application/jsonschema/1-0-0` + */ +export function newAppContextPlugin({ appVersion, appBuild }: AppLifecycleConfiguration): CorePluginConfiguration { + const contexts = () => { + let entities: SelfDescribingJson[] = []; + + if (appVersion) { + // Add application context to all events + if (appBuild) { + entities.push({ + schema: MOBILE_APPLICATION_CONTEXT_SCHEMA, + data: { + version: appVersion, + build: appBuild, + }, + }); + } else { + entities.push({ + schema: APPLICATION_CONTEXT_SCHEMA, + data: { + version: appVersion, + }, + }); + } + } + + return entities; + }; + + return { + plugin: { + contexts, + }, + }; +} diff --git a/trackers/react-native-tracker/src/plugins/app_install/index.ts b/trackers/react-native-tracker/src/plugins/app_install/index.ts new file mode 100644 index 000000000..954f41296 --- /dev/null +++ b/trackers/react-native-tracker/src/plugins/app_install/index.ts @@ -0,0 +1,41 @@ +import type { CorePluginConfiguration, TrackerCore } from '@snowplow/tracker-core'; +import { buildSelfDescribingEvent } from '@snowplow/tracker-core'; +import { APPLICATION_INSTALL_EVENT_SCHEMA } from '../../constants'; +import type { AppLifecycleConfiguration, AsyncStorage, TrackerConfiguration } from '../../types'; + +/** + * Tracks an application install event on the first run of the app. + * Stores the install event in AsyncStorage to prevent tracking on subsequent runs. + * + * Event schema: `iglu:com.snowplowanalytics.mobile/application_install/jsonschema/1-0-0` + */ +export function newAppInstallPlugin( + { + asyncStorage, + namespace, + installAutotracking = false, + }: TrackerConfiguration & AppLifecycleConfiguration & { asyncStorage: AsyncStorage }, + core: TrackerCore +): CorePluginConfiguration { + if (installAutotracking) { + // Track install event on first run + const key = `snowplow_${namespace}_install`; + setTimeout(async () => { + const installEvent = await asyncStorage.getItem(key); + if (!installEvent) { + core.track( + buildSelfDescribingEvent({ + event: { + schema: APPLICATION_INSTALL_EVENT_SCHEMA, + data: {}, + }, + }) + ); + await asyncStorage.setItem(key, new Date().toISOString()); + } + }, 0); + } + return { + plugin: {}, + }; +} diff --git a/trackers/react-native-tracker/src/plugins/app_lifecycle/index.ts b/trackers/react-native-tracker/src/plugins/app_lifecycle/index.ts new file mode 100644 index 000000000..c7eaae200 --- /dev/null +++ b/trackers/react-native-tracker/src/plugins/app_lifecycle/index.ts @@ -0,0 +1,97 @@ +import { + buildSelfDescribingEvent, + CorePluginConfiguration, + SelfDescribingJson, + TrackerCore, +} from '@snowplow/tracker-core'; +import { AppLifecycleConfiguration, EventContext } from '../../types'; +import { BACKGROUND_EVENT_SCHEMA, FOREGROUND_EVENT_SCHEMA, LIFECYCLE_CONTEXT_SCHEMA } from '../../constants'; +import { AppState } from 'react-native'; + +export interface AppLifecyclePlugin extends CorePluginConfiguration { + getIsInBackground: () => boolean | undefined; + getBackgroundIndex: () => number | undefined; + getForegroundIndex: () => number | undefined; +} + +/** + * Tracks foreground and background events automatically when the app state changes. + * Also adds a lifecycle context to all events with information about the app visibility. + */ +export async function newAppLifecyclePlugin( + { lifecycleAutotracking = true }: AppLifecycleConfiguration, + core: TrackerCore +): Promise { + let isInForeground = AppState.currentState !== 'background'; + let foregroundIndex = isInForeground ? 1 : 0; + let backgroundIndex = isInForeground ? 0 : 1; + let subscription: ReturnType | undefined; + + if (lifecycleAutotracking) { + // Subscribe to app state changes and track foreground/background events + subscription = AppState.addEventListener('change', async (nextAppState) => { + if (nextAppState === 'active' && !isInForeground) { + trackForegroundEvent(); + } + if (nextAppState === 'background' && isInForeground) { + trackBackgroundEvent(); + } + }); + } + + const contexts = () => { + let entities: SelfDescribingJson[] = []; + + if (lifecycleAutotracking) { + // Add lifecycle context to all events + entities.push({ + schema: LIFECYCLE_CONTEXT_SCHEMA, + data: { + isVisible: isInForeground, + index: isInForeground ? foregroundIndex : backgroundIndex, + }, + }); + } + + return entities; + }; + + const deactivatePlugin = () => { + if (subscription) { + subscription.remove(); + subscription = undefined; + } + }; + + const trackForegroundEvent = (contexts?: EventContext[]) => { + if (!isInForeground) { + isInForeground = true; + foregroundIndex += 1; + } + core.track( + buildSelfDescribingEvent({ event: { schema: FOREGROUND_EVENT_SCHEMA, data: { foregroundIndex } } }), + contexts + ); + }; + + const trackBackgroundEvent = (contexts?: EventContext[]) => { + if (isInForeground) { + isInForeground = false; + backgroundIndex += 1; + } + core.track( + buildSelfDescribingEvent({ event: { schema: BACKGROUND_EVENT_SCHEMA, data: { backgroundIndex } } }), + contexts + ); + }; + + return { + getIsInBackground: () => (lifecycleAutotracking ? !isInForeground : undefined), + getBackgroundIndex: () => (lifecycleAutotracking ? backgroundIndex : undefined), + getForegroundIndex: () => (lifecycleAutotracking ? foregroundIndex : undefined), + plugin: { + contexts, + deactivatePlugin, + }, + }; +} diff --git a/trackers/react-native-tracker/src/plugins/deep_links/index.ts b/trackers/react-native-tracker/src/plugins/deep_links/index.ts new file mode 100644 index 000000000..d3370e854 --- /dev/null +++ b/trackers/react-native-tracker/src/plugins/deep_links/index.ts @@ -0,0 +1,68 @@ +import { buildSelfDescribingEvent, CorePluginConfiguration, PayloadBuilder, TrackerCore } from '@snowplow/tracker-core'; +import { DeepLinkConfiguration, DeepLinkReceivedProps, EventContext } from '../../types'; +import { DEEP_LINK_ENTITY_SCHEMA, DEEP_LINK_RECEIVED_EVENT_SCHEMA, PAGE_REFERRER_PROPERTY, PAGE_URL_PROPERTY, SCREEN_VIEW_EVENT_SCHEMA } from '../../constants'; +import { getUsefulSchema } from '../../utils'; + +interface DeepLinksPlugin extends CorePluginConfiguration { + trackDeepLinkReceivedEvent: (argmap: DeepLinkReceivedProps, contexts?: EventContext[]) => void; +} + +export function newDeepLinksPlugin( + { deepLinkContext = true }: DeepLinkConfiguration, + core: TrackerCore +): DeepLinksPlugin { + let lastDeepLink: DeepLinkReceivedProps | undefined; + + const beforeTrack = (payloadBuilder: PayloadBuilder) => { + const schema = getUsefulSchema(payloadBuilder); + + if (schema == SCREEN_VIEW_EVENT_SCHEMA && lastDeepLink) { + const { url, referrer } = lastDeepLink; + if (url) { + payloadBuilder.add(PAGE_URL_PROPERTY, url); + } + if (referrer) { + payloadBuilder.add(PAGE_REFERRER_PROPERTY, referrer); + } + + if (deepLinkContext) { + payloadBuilder.addContextEntity({ + schema: DEEP_LINK_ENTITY_SCHEMA, + data: lastDeepLink, + }); + } + + // Clear the last deep link since we only add it to the first screen view event + lastDeepLink = undefined; + } + }; + + const trackDeepLinkReceivedEvent = (argmap: DeepLinkReceivedProps, contexts?: EventContext[]) => { + lastDeepLink = argmap; + + const payload = buildSelfDescribingEvent({ + event: { + schema: DEEP_LINK_RECEIVED_EVENT_SCHEMA, + data: argmap, + }, + }); + + // Add atomic event properties + const { url, referrer } = argmap; + if (url) { + payload.add(PAGE_URL_PROPERTY, url); + } + if (referrer) { + payload.add(PAGE_REFERRER_PROPERTY, referrer); + } + + core.track(payload, contexts); + }; + + return { + trackDeepLinkReceivedEvent, + plugin: { + beforeTrack, + }, + }; +} diff --git a/trackers/react-native-tracker/src/plugins/platform_context/index.ts b/trackers/react-native-tracker/src/plugins/platform_context/index.ts new file mode 100644 index 000000000..1ae3145ba --- /dev/null +++ b/trackers/react-native-tracker/src/plugins/platform_context/index.ts @@ -0,0 +1,318 @@ +import { CorePluginConfiguration } from '@snowplow/tracker-core'; +import { PlatformContextConfiguration, PlatformContextProperty } from '../../types'; +import { MOBILE_CONTEXT_SCHEMA } from '../../constants'; +import { + Platform, + PlatformAndroidStatic, + PlatformIOSStatic, + Dimensions, + PixelRatio, + NativeModules, +} from 'react-native'; +import { removeEmptyProperties } from '@snowplow/tracker-core'; + +export interface PlatformContextPlugin extends CorePluginConfiguration { + enablePlatformContext: () => Promise; + disablePlatformContext: () => void; + refreshPlatformContext: () => Promise; +} + +function getIOSConstants() { + // Example Platform info on iOS: + // { + // "OS": "ios", + // "Version": "18.0", + // "constants": { + // "forceTouchAvailable": false, + // "interfaceIdiom": "phone", + // "isMacCatalyst": false, + // "isTesting": false, + // "osVersion": "18.0", + // "systemName": "iOS" + // }, + // "isMacCatalyst": false, + // "isPad": false, + // "isTV": false, + // "isVision": false + // } + + // Example NativeModules.SettingsManager?.settings info on iOS: + // { + // "AppleLanguages": [ + // "en-GB" + // ], + // "AppleLocale": "en_GB" + // } + + const { isPad, isTV, isVision, isMacCatalyst, constants } = Platform as PlatformIOSStatic; + return { + osType: constants.systemName, + deviceManufacturer: 'Apple Inc.', + osVersion: constants.osVersion, + deviceModel: isPad ? 'iPad' : isTV ? 'Apple TV' : isVision ? 'Vision' : isMacCatalyst ? 'Mac' : 'iPhone', + language: + NativeModules.SettingsManager?.settings?.AppleLocale || + NativeModules.SettingsManager?.settings?.AppleLanguages[0], //iOS 13 + }; +} + +function getAndroidConstants() { + // Example Platform info on Android: + // { + // "OS": "android", + // "Version": 33, + // "constants": { + // "Brand": "google", + // "Manufacturer": "Google", + // "Model": "sdk_gphone64_arm64", + // "Release": "13", + // "Version": 33, + // }, + // } + + // Example NativeModules.I18nManager info on Android: + // { "localeIdentifier": "en_US" } + const constants = Platform.constants as PlatformAndroidStatic['constants']; + return { + osType: 'android', + deviceManufacturer: constants.Manufacturer, + osVersion: constants.Release, + deviceModel: constants.Model, + language: NativeModules.I18nManager?.localeIdentifier, + }; +} + +/** + * Tracks a mobile_context entity with all events if platformContext is enabled. + */ +export async function newPlatformContextPlugin({ + platformContext = true, + platformContextProperties, + platformContextRetriever, +}: PlatformContextConfiguration = {}): Promise { + let deviceModel: string | undefined; + let osType: string | undefined; + let deviceManufacturer: string | undefined; + let osVersion: string | undefined; + let carrier: string | undefined; + let networkType: 'mobile' | 'wifi' | 'offline' | undefined; + let networkTechnology: string | undefined; + let appleIdfa: string | undefined; + let appleIdfv: string | undefined; + let androidIdfa: string | undefined; + let physicalMemory: number | undefined; + let systemAvailableMemory: number | undefined; + let appAvailableMemory: number | undefined; + let batteryLevel: number | undefined; + let batteryState: 'unplugged' | 'charging' | 'full' | undefined; + let lowPowerMode: boolean | undefined; + let availableStorage: number | undefined; + let totalStorage: number | undefined; + let isPortrait: boolean | undefined; + let resolution: string | undefined; + let scale: number | undefined; + let language: string | undefined; + let appSetId: string | undefined; + let appSetIdScope: string | undefined; + + const refreshPlatformContext = async () => { + const constants = + Platform.OS === 'ios' ? getIOSConstants() : Platform.OS == 'android' ? getAndroidConstants() : undefined; + + deviceModel = platformContextRetriever?.getDeviceModel + ? await platformContextRetriever?.getDeviceModel() + : constants?.deviceModel; + osType = platformContextRetriever?.getOsType ? await platformContextRetriever?.getOsType() : constants?.osType; + deviceManufacturer = platformContextRetriever?.getDeviceManufacturer + ? await platformContextRetriever?.getDeviceManufacturer() + : constants?.deviceManufacturer; + osVersion = platformContextRetriever?.getOsVersion + ? await platformContextRetriever?.getOsVersion() + : constants?.osVersion; + carrier = + platformContextProperties?.includes(PlatformContextProperty.Carrier) ?? true + ? platformContextRetriever?.getCarrier + ? await platformContextRetriever?.getCarrier() + : undefined + : undefined; + networkType = + platformContextProperties?.includes(PlatformContextProperty.NetworkType) ?? true + ? platformContextRetriever?.getNetworkType + ? await platformContextRetriever?.getNetworkType() + : undefined + : undefined; + networkTechnology = platformContextRetriever?.getNetworkTechnology + ? await platformContextRetriever?.getNetworkTechnology() + : undefined; + appleIdfa = + platformContextProperties?.includes(PlatformContextProperty.AppleIdfa) ?? true + ? platformContextRetriever?.getAppleIdfa + ? await platformContextRetriever?.getAppleIdfa() + : undefined + : undefined; + appleIdfv = + platformContextProperties?.includes(PlatformContextProperty.AppleIdfv) ?? true + ? platformContextRetriever?.getAppleIdfv + ? await platformContextRetriever?.getAppleIdfv() + : undefined + : undefined; + androidIdfa = + platformContextProperties?.includes(PlatformContextProperty.AndroidIdfa) ?? true + ? platformContextRetriever?.getAndroidIdfa + ? await platformContextRetriever?.getAndroidIdfa() + : undefined + : undefined; + physicalMemory = + platformContextProperties?.includes(PlatformContextProperty.PhysicalMemory) ?? true + ? platformContextRetriever?.getPhysicalMemory + ? await platformContextRetriever.getPhysicalMemory() + : undefined + : undefined; + systemAvailableMemory = + platformContextProperties?.includes(PlatformContextProperty.SystemAvailableMemory) ?? true + ? platformContextRetriever?.getSystemAvailableMemory + ? await platformContextRetriever.getSystemAvailableMemory() + : undefined + : undefined; + appAvailableMemory = + platformContextProperties?.includes(PlatformContextProperty.AppAvailableMemory) ?? true + ? platformContextRetriever?.getAppAvailableMemory + ? await platformContextRetriever?.getAppAvailableMemory() + : undefined + : undefined; + batteryLevel = + platformContextProperties?.includes(PlatformContextProperty.BatteryLevel) ?? true + ? platformContextRetriever?.getBatteryLevel + ? await platformContextRetriever?.getBatteryLevel() + : undefined + : undefined; + batteryState = + platformContextProperties?.includes(PlatformContextProperty.BatteryState) ?? true + ? platformContextRetriever?.getBatteryState + ? await platformContextRetriever?.getBatteryState() + : undefined + : undefined; + lowPowerMode = + platformContextProperties?.includes(PlatformContextProperty.LowPowerMode) ?? true + ? platformContextRetriever?.getLowPowerMode + ? await platformContextRetriever?.getLowPowerMode() + : undefined + : undefined; + availableStorage = + platformContextProperties?.includes(PlatformContextProperty.AvailableStorage) ?? true + ? platformContextRetriever?.getAvailableStorage + ? await platformContextRetriever?.getAvailableStorage() + : undefined + : undefined; + totalStorage = + platformContextProperties?.includes(PlatformContextProperty.TotalStorage) ?? true + ? platformContextRetriever?.getTotalStorage + ? await platformContextRetriever?.getTotalStorage() + : undefined + : undefined; + isPortrait = + platformContextProperties?.includes(PlatformContextProperty.IsPortrait) ?? true + ? platformContextRetriever?.isPortrait + ? await platformContextRetriever.isPortrait() + : undefined + : undefined; + resolution = + platformContextProperties?.includes(PlatformContextProperty.Resolution) ?? true + ? platformContextRetriever?.getResolution + ? await platformContextRetriever?.getResolution() + : Math.floor(Dimensions.get('window').width) + 'x' + Math.floor(Dimensions.get('window').height) + : undefined; + scale = + platformContextProperties?.includes(PlatformContextProperty.Scale) ?? true + ? platformContextRetriever?.getScale + ? await platformContextRetriever?.getScale() + : PixelRatio.get() + : undefined; + language = ( + platformContextProperties?.includes(PlatformContextProperty.Language) ?? true + ? platformContextRetriever?.getLanguage + ? await platformContextRetriever?.getLanguage() + : constants?.language + : undefined + )?.substring(0, 8); + appSetId = + platformContextProperties?.includes(PlatformContextProperty.AppSetId) ?? true + ? platformContextRetriever?.getAppSetId + ? await platformContextRetriever?.getAppSetId() + : undefined + : undefined; + appSetIdScope = + platformContextProperties?.includes(PlatformContextProperty.AppSetIdScope) ?? true + ? platformContextRetriever?.getAppSetIdScope + ? await platformContextRetriever?.getAppSetIdScope() + : undefined + : undefined; + }; + + const enablePlatformContext = async () => { + platformContext = true; + await refreshPlatformContext(); + }; + + const disablePlatformContext = () => { + platformContext = false; + }; + + if (platformContext) { + await refreshPlatformContext(); + } + + const contexts = () => { + // check required properties + if ( + platformContext && + osType !== undefined && + osVersion !== undefined && + deviceManufacturer !== undefined && + deviceModel !== undefined + ) { + return [ + { + schema: MOBILE_CONTEXT_SCHEMA, + data: removeEmptyProperties({ + osType, + osVersion, + deviceManufacturer, + deviceModel, + carrier, + networkType, + networkTechnology, + appleIdfa, + appleIdfv, + androidIdfa, + physicalMemory, + systemAvailableMemory, + appAvailableMemory, + batteryLevel, + batteryState, + lowPowerMode, + availableStorage, + totalStorage, + isPortrait, + resolution, + scale, + language, + appSetId, + appSetIdScope, + }), + }, + ]; + } else { + return []; + } + }; + + return { + enablePlatformContext, + disablePlatformContext, + refreshPlatformContext, + plugin: { + contexts, + }, + }; +} diff --git a/trackers/react-native-tracker/src/plugins/session/index.ts b/trackers/react-native-tracker/src/plugins/session/index.ts new file mode 100644 index 000000000..41dfdd5e6 --- /dev/null +++ b/trackers/react-native-tracker/src/plugins/session/index.ts @@ -0,0 +1,127 @@ +import { CorePluginConfiguration, PayloadBuilder } from '@snowplow/tracker-core'; +import { v4 as uuidv4 } from 'uuid'; +import { BACKGROUND_EVENT_SCHEMA, CLIENT_SESSION_ENTITY_SCHEMA, FOREGROUND_EVENT_SCHEMA } from '../../constants'; +import { AsyncStorage, SessionConfiguration, SessionState, TrackerConfiguration } from '../../types'; +import { getUsefulSchema } from '../../utils'; + +interface StoredSessionState { + userId: string; + sessionId: string; + sessionIndex: number; +} + +interface SessionPlugin extends CorePluginConfiguration { + getSessionUserId: () => Promise; + getSessionId: () => Promise; + getSessionIndex: () => Promise; + getSessionState: () => Promise; + startNewSession: () => Promise; +} + +async function storeSessionState(namespace: string, state: StoredSessionState, asyncStorage: AsyncStorage) { + const { userId, sessionId, sessionIndex } = state; + await asyncStorage.setItem(`snowplow_${namespace}_session`, JSON.stringify({ userId, sessionId, sessionIndex })); +} + +async function resumeStoredSession(namespace: string, asyncStorage: AsyncStorage): Promise { + const storedState = await asyncStorage.getItem(`snowplow_${namespace}_session`); + if (storedState) { + const state = JSON.parse(storedState) as StoredSessionState; + return { + userId: state.userId, + sessionId: uuidv4(), + previousSessionId: state.sessionId, + sessionIndex: state.sessionIndex + 1, + storageMechanism: 'LOCAL_STORAGE', + }; + } else { + return { + userId: uuidv4(), + sessionId: uuidv4(), + sessionIndex: 1, + storageMechanism: 'LOCAL_STORAGE', + }; + } +} + +/** + * Creates a new session plugin for tracking the session information. + * The plugin will add the session context to all events and start a new session if the current one has timed out. + * + * The session state is stored in the defined application storage. + * Each restart of the app or creation of a new tracker instance will trigger a new session with reference to the previous session. + */ +export async function newSessionPlugin({ + asyncStorage, + namespace, + sessionContext = true, + foregroundSessionTimeout, + backgroundSessionTimeout, +}: TrackerConfiguration & SessionConfiguration & { asyncStorage: AsyncStorage }): Promise { + let sessionState = await resumeStoredSession(namespace, asyncStorage); + await storeSessionState(namespace, sessionState, asyncStorage); + + let inBackground = false; + let lastUpdateTs = new Date().getTime(); + + const startNewSession = async () => { + sessionState = { + userId: sessionState.userId, + storageMechanism: sessionState.storageMechanism, + sessionId: uuidv4(), + sessionIndex: sessionState.sessionIndex + 1, + previousSessionId: sessionState.sessionId, + }; + }; + + const getTimeoutMs = () => { + return ((inBackground ? backgroundSessionTimeout : foregroundSessionTimeout) ?? 30 * 60) * 1000; + }; + + const beforeTrack = (payloadBuilder: PayloadBuilder) => { + // check if session has timed out and start a new one if necessary + const now = new Date(); + const timeDiff = now.getTime() - lastUpdateTs; + if (timeDiff > getTimeoutMs()) { + startNewSession(); + storeSessionState(namespace, sessionState, asyncStorage); + } + lastUpdateTs = now.getTime(); + + // update event properties + sessionState.eventIndex = (sessionState.eventIndex ?? 0) + 1; + if (sessionState.eventIndex === 1) { + sessionState.firstEventId = payloadBuilder.getPayload().eid as string; + sessionState.firstEventTimestamp = now.toISOString(); + } + + // update background state + if (payloadBuilder.getPayload().e === 'ue') { + const schema = getUsefulSchema(payloadBuilder); + if (schema === FOREGROUND_EVENT_SCHEMA) { + inBackground = false; + } else if (schema === BACKGROUND_EVENT_SCHEMA) { + inBackground = true; + } + } + + // add session context to the payload + if (sessionContext) { + payloadBuilder.addContextEntity({ + schema: CLIENT_SESSION_ENTITY_SCHEMA, + data: { ...sessionState }, + }); + } + }; + + return { + getSessionUserId: () => Promise.resolve(sessionState.userId), + getSessionId: () => Promise.resolve(sessionState.sessionId), + getSessionIndex: () => Promise.resolve(sessionState.sessionIndex), + getSessionState: () => Promise.resolve(sessionState), + startNewSession, + plugin: { + beforeTrack, + }, + }; +} diff --git a/trackers/react-native-tracker/src/subject.ts b/trackers/react-native-tracker/src/subject.ts new file mode 100644 index 000000000..1a141e481 --- /dev/null +++ b/trackers/react-native-tracker/src/subject.ts @@ -0,0 +1,87 @@ +import { CorePluginConfiguration, PayloadBuilder, TrackerCore } from '@snowplow/tracker-core'; +import { ScreenSize, SubjectConfiguration } from './types'; + +export function newSubject(core: TrackerCore, configuration?: SubjectConfiguration) { + let domainUserId: string | undefined; + let networkUserId: string | undefined; + + const addSubjectToPayload = (payload: PayloadBuilder) => { + payload.add('duid', domainUserId); + payload.add('nuid', networkUserId); + }; + + const setScreenResolution = (screenSize: ScreenSize) => + core.setScreenResolution(String(screenSize[0]), String(screenSize[1])); + + const setNetworkUserId = (userId: string | undefined) => { + networkUserId = userId; + }; + + const setDomainUserId = (userId: string | undefined) => { + domainUserId = userId; + }; + + const setColorDepth = (colorDepth: number) => { + core.setColorDepth(String(colorDepth)); + }; + + const setScreenViewport = (screenSize: ScreenSize) => { + core.setViewport(String(screenSize[0]), String(screenSize[1])); + }; + + const setSubjectData = (data: SubjectConfiguration) => { + setNetworkUserId(data.networkUserId); + setDomainUserId(data.domainUserId); + if (data.userId) { + core.setUserId(data.userId); + } + if (data.useragent) { + core.setUseragent(data.useragent); + } + if (data.ipAddress) { + core.setIpAddress(data.ipAddress); + } + if (data.timezone) { + core.setTimezone(data.timezone); + } + if (data.language) { + core.setLang(data.language); + } + if (data.screenResolution) { + setScreenResolution(data.screenResolution); + } + if (data.colorDepth) { + setColorDepth(data.colorDepth); + } + if (data.screenViewport) { + setScreenViewport(data.screenViewport); + } + }; + + if (configuration) { + setSubjectData(configuration); + } + + const subjectPlugin: CorePluginConfiguration = { + plugin: { + beforeTrack: addSubjectToPayload, + }, + }; + + return { + subjectPlugin, + properties: { + setUserId: core.setUserId, + setIpAddress: core.setIpAddress, + setUseragent: core.setUseragent, + setTimezone: core.setTimezone, + setLanguage: core.setLang, + setScreenResolution, + setNetworkUserId, + setDomainUserId, + setSubjectData, + setColorDepth, + setScreenViewport, + }, + }; +} diff --git a/trackers/react-native-tracker/src/tracker.ts b/trackers/react-native-tracker/src/tracker.ts new file mode 100644 index 000000000..6a0738d01 --- /dev/null +++ b/trackers/react-native-tracker/src/tracker.ts @@ -0,0 +1,233 @@ +import { trackerCore, PayloadBuilder, version, EmitterConfiguration, TrackerCore } from '@snowplow/tracker-core'; + +import { newEmitter } from '@snowplow/tracker-core'; +import { newReactNativeEventStore } from './event_store'; +import { newTrackEventFunctions } from './events'; +import { newSubject } from './subject'; +import { + ScreenTrackingConfiguration, + ScreenTrackingPlugin, + trackListItemView, + trackScreenView, + trackScrollChanged, +} from '@snowplow/browser-plugin-screen-tracking'; + +import { + DeepLinkConfiguration, + AppLifecycleConfiguration, + EventContext, + EventStoreConfiguration, + ListItemViewProps, + PlatformContextConfiguration, + ReactNativeTracker, + ScreenViewProps, + ScrollChangedProps, + SessionConfiguration, + SubjectConfiguration, + TrackerConfiguration, +} from './types'; +import { newSessionPlugin } from './plugins/session'; +import { newDeepLinksPlugin } from './plugins/deep_links'; +import { newPlugins } from './plugins'; +import { newPlatformContextPlugin } from './plugins/platform_context'; +import { newAppLifecyclePlugin } from './plugins/app_lifecycle'; +import { newAppInstallPlugin } from './plugins/app_install'; +import { newAppContextPlugin } from './plugins/app_context'; +import DefaultAsyncStorage from '@react-native-async-storage/async-storage'; + +const initializedTrackers: Record = {}; + +type SetPropertiesAsNonNullable = Omit & { + [K in Properties]-?: NonNullable; +}; + +type Configuration = TrackerConfiguration & + EmitterConfiguration & + SessionConfiguration & + SubjectConfiguration & + EventStoreConfiguration & + ScreenTrackingConfiguration & + PlatformContextConfiguration & + DeepLinkConfiguration & + AppLifecycleConfiguration; + +type NormalizedConfiguration = SetPropertiesAsNonNullable< + Configuration, + 'asyncStorage' | 'devicePlatform' | 'encodeBase64' | 'eventStore' | 'plugins' +>; + +const normalizeTrackerConfiguration = async (configuration: Configuration): Promise => { + const eventStore = configuration.eventStore ?? (await newReactNativeEventStore(configuration)); + const asyncStorage = configuration.asyncStorage ?? DefaultAsyncStorage; + const plugins = configuration.plugins ?? []; + const devicePlatform = configuration.devicePlatform ?? 'mob'; + const encodeBase64 = configuration.encodeBase64 ?? false; + + return { + ...configuration, + devicePlatform, + encodeBase64, + asyncStorage, + eventStore, + plugins, + }; +}; + +/** + * Creates a new tracker instance with the given configuration + * @param configuration - Configuration for the tracker + * @returns Tracker instance + */ +export async function newTracker(configuration: Configuration): Promise { + const normalizedConfiguration = await normalizeTrackerConfiguration(configuration); + + const { namespace, appId, encodeBase64 } = normalizedConfiguration; + + const emitter = newEmitter(normalizedConfiguration); + const callback = (payload: PayloadBuilder): void => { + emitter.input(payload.build()); + }; + + const core = trackerCore({ base64: encodeBase64, callback }); + + core.setPlatform(normalizedConfiguration.devicePlatform); + core.setTrackerVersion('rn-' + version); + core.setTrackerNamespace(namespace); + if (appId) { + core.setAppId(appId); + } + + const { addPlugin } = newPlugins(namespace, core); + + const sessionPlugin = await newSessionPlugin(normalizedConfiguration); + addPlugin(sessionPlugin); + + const deepLinksPlugin = newDeepLinksPlugin(normalizedConfiguration, core); + addPlugin(deepLinksPlugin); + + const subject = newSubject(core, normalizedConfiguration); + addPlugin(subject.subjectPlugin); + + const screenPlugin = ScreenTrackingPlugin(normalizedConfiguration); + addPlugin({ plugin: screenPlugin }); + + const platformContextPlugin = await newPlatformContextPlugin(normalizedConfiguration); + addPlugin(platformContextPlugin); + + const lifecyclePlugin = await newAppLifecyclePlugin(normalizedConfiguration, core); + addPlugin(lifecyclePlugin); + + const installPlugin = newAppInstallPlugin(normalizedConfiguration, core); + addPlugin(installPlugin); + + const appContextPlugin = newAppContextPlugin(normalizedConfiguration); + addPlugin(appContextPlugin); + + normalizedConfiguration.plugins.forEach((plugin) => addPlugin({ plugin })); + + const tracker: ReactNativeTracker = { + ...newTrackEventFunctions(core), + ...subject.properties, + namespace, + setAppId: core.setAppId, + setPlatform: core.setPlatform, + flush: emitter.flush, + addGlobalContexts: core.addGlobalContexts, + removeGlobalContexts: core.removeGlobalContexts, + clearGlobalContexts: core.clearGlobalContexts, + enablePlatformContext: platformContextPlugin.enablePlatformContext, + disablePlatformContext: platformContextPlugin.disablePlatformContext, + refreshPlatformContext: platformContextPlugin.refreshPlatformContext, + getSessionId: sessionPlugin.getSessionId, + getSessionIndex: sessionPlugin.getSessionIndex, + getSessionUserId: sessionPlugin.getSessionUserId, + getSessionState: sessionPlugin.getSessionState, + addPlugin, + trackScreenViewEvent: (argmap: ScreenViewProps, context?: EventContext[]) => + trackScreenView( + { + ...argmap, + context, + }, + [namespace] + ), + trackScrollChangedEvent: (argmap: ScrollChangedProps, context?: EventContext[]) => + trackScrollChanged( + { + ...argmap, + context, + }, + [namespace] + ), + trackListItemViewEvent: (argmap: ListItemViewProps, context?: EventContext[]) => + trackListItemView( + { + ...argmap, + context, + }, + [namespace] + ), + trackDeepLinkReceivedEvent: deepLinksPlugin.trackDeepLinkReceivedEvent, + getIsInBackground: lifecyclePlugin.getIsInBackground, + getBackgroundIndex: lifecyclePlugin.getBackgroundIndex, + getForegroundIndex: lifecyclePlugin.getForegroundIndex, + }; + initializedTrackers[namespace] = { tracker, core }; + + return tracker; +} + +/** + * Retrieves an initialized tracker given its namespace + * @param trackerNamespace - Tracker namespace + * @returns Tracker instance if exists + */ +export function getTracker(trackerNamespace: string): ReactNativeTracker | undefined { + return initializedTrackers[trackerNamespace]?.tracker; +} + +/** + * Retrieves all initialized trackers + * @returns All initialized trackers + */ +export function getAllTrackers(): ReactNativeTracker[] { + return Object.values(initializedTrackers).map(({ tracker }) => tracker); +} + +/** + * Internal function to retrieve the tracker core given its namespace + * @param trackerNamespace - Tracker namespace + * @returns Tracker core if exists + */ +export function getTrackerCore(trackerNamespace: string): TrackerCore | undefined { + return initializedTrackers[trackerNamespace]?.core; +} + +/** + * Internal function to retrieve all initialized tracker cores + * @returns All initialized tracker cores + */ +export function getAllTrackerCores(): TrackerCore[] { + return Object.values(initializedTrackers).map(({ core }) => core); +} + +/** + * Removes a tracker given its namespace + * + * @param trackerNamespace - Tracker namespace + */ +export function removeTracker(trackerNamespace: string): void { + if (initializedTrackers[trackerNamespace]) { + initializedTrackers[trackerNamespace]?.core.deactivate(); + delete initializedTrackers[trackerNamespace]; + } +} + +/** + * Removes all initialized trackers + * + * @returns - A boolean promise + */ +export function removeAllTrackers(): void { + Object.keys(initializedTrackers).forEach(removeTracker); +} diff --git a/trackers/react-native-tracker/src/types.ts b/trackers/react-native-tracker/src/types.ts new file mode 100755 index 000000000..e9681b7fa --- /dev/null +++ b/trackers/react-native-tracker/src/types.ts @@ -0,0 +1,962 @@ +import { BrowserPlugin, BrowserPluginConfiguration, Platform } from '@snowplow/browser-tracker-core'; +import { + ConditionalContextProvider, + ContextPrimitive, + PageViewEvent, + SelfDescribingJson, + StructuredEvent, +} from '@snowplow/tracker-core'; + +export interface AsyncStorage { + getItem: (key: string) => Promise; + setItem: (key: string, value: string) => Promise; +} + +/** + * Configuration for the event store + */ +export interface EventStoreConfiguration { + /** + * The maximum amount of events that will be buffered in the event store + * + * Will drop events once the limit is hit + * @defaultValue 1000 + */ + maxEventStoreSize?: number; + + /** + * Whether to use the AsyncStorage library as the persistent event store for the event store + * @defaultValue true + */ + useAsyncStorageForEventStore?: boolean; + + /** + * The Async storage implementation. + * In environments where AsyncStorage is not available or where another kind of storage is used, + * you can provide a custom implementation. + * + * @defaultValue AsyncStorage from `@react-native-async-storage/async-storage` + * */ + asyncStorage?: AsyncStorage; +} + +/** + * Configuration for session tracking + */ +export interface SessionConfiguration { + /** + * The amount of time in seconds before the session id is updated while the app is in the foreground + * @defaultValue 1800 + */ + foregroundSessionTimeout?: number; + /** + * The amount of time in seconds before the session id is updated while the app is in the background + * @defaultValue 1800 + */ + backgroundSessionTimeout?: number; + /** + * Whether session context is attached to tracked events. + * @defaultValue true + */ + sessionContext?: boolean; +} + +/** + * A callback to be used for the `onMessage` prop of a `WebView` component. + */ +export type WebViewMessageHandler = (message: { nativeEvent: { data: string } }) => void; + +/** + * Configuration for app lifecycle tracking + */ +export interface AppLifecycleConfiguration { + /** + * Whether to automatically track app lifecycle events (app foreground and background events). + * Also adds a lifecycle context entity to all events. + * + * Foreground event schema: `iglu:com.snowplowanalytics.snowplow/application_foreground/jsonschema/1-0-0` + * Background event schema: `iglu:com.snowplowanalytics.snowplow/application_background/jsonschema/1-0-0` + * Context entity schema: `iglu:com.snowplowanalytics.mobile/application_lifecycle/jsonschema/1-0-0` + * + * @defaultValue true + */ + lifecycleAutotracking?: boolean; + /** + * Whether to automatically track app install event on first run. + * + * Schema: `iglu:com.snowplowanalytics.mobile/application_install/jsonschema/1-0-0` + * + * @defaultValue false + */ + installAutotracking?: boolean; + /** + * Version number of the application e.g 1.1.0 (semver or git commit hash). + * + * Entity schema if `appBuild` property is set: `iglu:com.snowplowanalytics.mobile/application/jsonschema/1-0-0` + * Entity schema if `appBuild` property is not set: `iglu:com.snowplowanalytics.snowplow/application/jsonschema/1-0-0` + */ + appVersion?: string; + /** + * Build name of the application e.g s9f2k2d or 1.1.0 beta + * + * Entity schema: `iglu:com.snowplowanalytics.mobile/application/jsonschema/1-0-0` + */ + appBuild?: string; +} + +/** + * The configuration object for initialising the tracker + */ +export interface TrackerConfiguration { + /** The namespace of the tracker */ + namespace: string; + /** The application ID */ + appId?: string; + /** + * Whether unstructured events and custom contexts should be base64 encoded. + * @defaultValue false + **/ + encodeBase64?: boolean; + /** + * Inject plugins which will be evaluated for each event + * @defaultValue [] + */ + plugins?: BrowserPlugin[]; + /** + * The device platform the tracker runs on. + * @defaultValue 'mob' + */ + devicePlatform?: Platform; +} + +export enum PlatformContextProperty { + /** + * The carrier of the SIM inserted in the device. + * Note: this property is not automatically assigned but can be assigned using the PlatformContextRetriever. + */ + Carrier = 'carrier', + /** + * Type of network the device is connected to. + * Note: this property is not automatically assigned but can be assigned using the PlatformContextRetriever. + */ + NetworkType = 'networkType', + /** + * Radio access technology that the device is using. + * Note: this property is not automatically assigned but can be assigned using the PlatformContextRetriever. + */ + NetworkTechnology = 'networkTechnology', + /** + * Advertising identifier on iOS. + * Note: this property is not automatically assigned but can be assigned using the PlatformContextRetriever. + */ + AppleIdfa = 'appleIdfa', + /** + * UUID identifier for vendors on iOS. + * Note: this property is not automatically assigned but can be assigned using the PlatformContextRetriever. + */ + AppleIdfv = 'appleIdfv', + /** + * Total physical system memory in bytes. + * Note: this property is not automatically assigned but can be assigned using the PlatformContextRetriever. + */ + PhysicalMemory = 'physicalMemory', + /** + * Amount of memory in bytes available to the current app. + * The property is not tracked in the current version of the tracker due to the tracker not being able to access the API, see the issue here: https://github.com/snowplow/snowplow-ios-tracker/issues/772 + * Note: this property is not automatically assigned but can be assigned using the PlatformContextRetriever. + */ + AppAvailableMemory = 'appAvailableMemory', + /** + * Remaining battery level as an integer percentage of total battery capacity. + * Note: this property is not automatically assigned but can be assigned using the PlatformContextRetriever. + */ + BatteryLevel = 'batteryLevel', + /** + * Battery state for the device. + * Note: this property is not automatically assigned but can be assigned using the PlatformContextRetriever. + */ + BatteryState = 'batteryState', + /** A Boolean indicating whether Low Power Mode is enabled. */ + LowPowerMode = 'lowPowerMode', + /** + * Bytes of storage remaining. + * Note: This is not automatically assigned by the tracker as it may be considered as fingerprinting. You can assign it using the PlatformContextRetriever. + */ + AvailableStorage = 'availableStorage', + /** + * Total size of storage in bytes. + * Note: This is not automatically assigned by the tracker as it may be considered as fingerprinting. You can assign it using the PlatformContextRetriever. + */ + TotalStorage = 'totalStorage', + /** + * A Boolean indicating whether the device orientation is portrait (either upright or upside down). + * Note: This is not automatically assigned by the tracker as it may be considered as fingerprinting. You can assign it using the PlatformContextRetriever. + */ + IsPortrait = 'isPortrait', + /** + * Screen resolution in pixels. Arrives in the form of WIDTHxHEIGHT (e.g., 1200x900). Doesn't change when device orientation changes. + * Note: This is not automatically assigned by the tracker as it may be considered as fingerprinting. You can assign it using the PlatformContextRetriever. + */ + Resolution = 'resolution', + /** + * Scale factor used to convert logical coordinates to device coordinates of the screen (uses UIScreen.scale on iOS). + */ + Scale = 'scale', + /** + * System language currently used on the device (ISO 639). + */ + Language = 'language', + /** + * Advertising identifier on Android. + * Note: This is not automatically assigned by the tracker as it may be considered as fingerprinting. You can assign it using the PlatformContextRetriever. + */ + AndroidIdfa = 'androidIdfa', + /** + * Available memory on the system in bytes (Android only). + * Note: This is not automatically assigned by the tracker as it may be considered as fingerprinting. You can assign it using the PlatformContextRetriever. + */ + SystemAvailableMemory = 'systemAvailableMemory', + /** + * Android vendor ID scoped to the set of apps published under the same Google Play developer account (see https://developer.android.com/training/articles/app-set-id). + * Note: This is not automatically assigned by the tracker as it may be considered as fingerprinting. You can assign it using the PlatformContextRetriever. + */ + AppSetId = 'appSetId', + /** + * Scope of the `appSetId`. Can be scoped to the app or to a developer account on an app store (all apps from the same developer on the same device will have the same ID). + * Note: This is not automatically assigned by the tracker as it may be considered as fingerprinting. You can assign it using the PlatformContextRetriever. + */ + AppSetIdScope = 'appSetIdScope', +} + +/** + * Overrides for the values for properties of the platform context. + */ +export interface PlatformContextRetriever { + /** Operating system type (e.g., ios, tvos, watchos, osx, android) */ + getOsType?: () => Promise; + + /** The current version of the operating system */ + getOsVersion?: () => Promise; + + /** The end-user-visible name for the end product */ + getDeviceModel?: () => Promise; + + /** The manufacturer of the product/hardware */ + getDeviceManufacturer?: () => Promise; + + /** The carrier of the SIM inserted in the device */ + getCarrier?: () => Promise; + + /** Type of network the device is connected to */ + getNetworkType?: () => Promise<'mobile' | 'wifi' | 'offline' | undefined>; + + /** Radio access technology that the device is using */ + getNetworkTechnology?: () => Promise; + + /** Advertising identifier on iOS (UUID formatted string) */ + getAppleIdfa?: () => Promise; + + /** UUID identifier for vendors on iOS */ + getAppleIdfv?: () => Promise; + + /** Bytes of storage remaining */ + getAvailableStorage?: () => Promise; + + /** Total size of storage in bytes */ + getTotalStorage?: () => Promise; + + /** Total physical system memory in bytes */ + getPhysicalMemory?: () => Promise; + + /** Amount of memory in bytes available to the current app */ + getAppAvailableMemory?: () => Promise; + + /** Remaining battery level as an integer percentage of total battery capacity */ + getBatteryLevel?: () => Promise; + + /** Battery state for the device */ + getBatteryState?: () => Promise<'unplugged' | 'charging' | 'full' | undefined>; + + /** A Boolean indicating whether Low Power Mode is enabled */ + getLowPowerMode?: () => Promise; + + /** A Boolean indicating whether the device orientation is portrait (either upright or upside down) */ + isPortrait?: () => Promise; + + /** Screen resolution in pixels. Arrives in the form of WIDTHxHEIGHT (e.g., 1200x900). Doesn't change when device orientation changes */ + getResolution?: () => Promise; + + /** Scale factor used to convert logical coordinates to device coordinates of the screen (uses UIScreen.scale on iOS) */ + getScale?: () => Promise; + + /** System language currently used on the device (ISO 639) */ + getLanguage?: () => Promise; + + /** Advertising identifier on Android. */ + getAndroidIdfa?: () => Promise; + + /** Available memory on the system in bytes (Android only). */ + getSystemAvailableMemory?: () => Promise; + + /** Android vendor ID scoped to the set of apps published under the same Google Play developer account (see https://developer.android.com/training/articles/app-set-id). */ + getAppSetId?: () => Promise; + + /** Scope of the `appSetId`. Can be scoped to the app or to a developer account on an app store (all apps from the same developer on the same device will have the same ID). */ + getAppSetIdScope?: () => Promise; +} + +export interface PlatformContextConfiguration { + /** + * Whether to track the mobile context with information about the device. + * Note: Only some properties (osType, osVersion, deviceManufacturer, deviceModel, resolution, language, scale) will be tracked by default. Other properties can be assigned using the PlatformContextRetriever. + * @defaultValue true + */ + platformContext?: boolean; + + /** + * List of properties of the platform context to track. If not passed and `platformContext` is enabled, all available properties will be tracked. + * The required `osType`, `osVersion`, `deviceManufacturer`, and `deviceModel` properties will be tracked in the entity regardless of this setting. + */ + platformContextProperties?: PlatformContextProperty[]; + + /** + * Set of callbacks to be used to retrieve properties of the platform context. + * Overrides the tracker implementation for setting the properties. + */ + platformContextRetriever?: PlatformContextRetriever; +} + +/** + * Configuration for deep link tracking + */ +export interface DeepLinkConfiguration { + /** + * Whether to track the deep link context entity with information from the deep link received event on the first screen view event. + * @defaultValue true + */ + deepLinkContext?: boolean; +} + +/** + * Configuration of subject properties tracked with events + */ +export interface SubjectConfiguration { + /** + * Business-defined user ID for this user + */ + userId?: string; + /** + * Override the network user id (UUIDv4) that is assigned by the collector and stored in cookies + */ + networkUserId?: string; + /** + * The domain user id (DUID) is a generated identifier that is stored in a first party cookie on Web. + * The React Native tracker does not assign it automatically. + */ + domainUserId?: string; + /** + * The custom user-agent. It overrides the user-agent used by default. + */ + useragent?: string; + /** + * Override the IP address of the device + */ + ipAddress?: string; + /** + * The timezone label + */ + timezone?: string; + /** + * The language set in the device + */ + language?: string; + /** + * The screen resolution + */ + screenResolution?: ScreenSize; + /** + * The screen viewport size + */ + screenViewport?: ScreenSize; + /** + * Color depth (integer) + */ + colorDepth?: number; +} + +/** + * Screen size in pixels + */ +export type ScreenSize = [number, number]; + +/** + * Trigger for MessageNotification event + */ +export type Trigger = 'push' | 'location' | 'calendar' | 'timeInterval' | 'other'; + +/** + * Attachment object that identify an attachment in the MessageNotification. + */ +export type MessageNotificationAttachmentProps = { + identifier: string; + type: string; + url: string; +}; + +/** + * MessageNotification event properties + * schema: iglu:com.snowplowanalytics.mobile/message_notification/jsonschema/1-0-0 + */ +export type MessageNotificationProps = { + /** + * The action associated with the notification. + */ + action?: string; + /* + * Attachments added to the notification (they can be part of the data object). + */ + attachments?: MessageNotificationAttachmentProps[]; + /** + * The notification's body. + */ + body: string; + /* + * Variable string values to be used in place of the format specifiers in bodyLocArgs to use to localize the body text to the user's current localization. + */ + bodyLocArgs?: string[]; + /** + * The key to the body string in the app's string resources to use to localize the body text to the user's current localization. + */ + bodyLocKey?: string; + /** + * The category associated to the notification. + */ + category?: string; + /** + * The application is notified of the delivery of the notification if it's in the foreground or background, the app will be woken up (iOS only). + */ + contentAvailable?: boolean; + /** + * The group which this notification is part of. + */ + group?: string; + /** + * The icon associated to the notification (Android only). + */ + icon?: string; + /** + * The number of items this notification represent. + */ + notificationCount?: number; + /** + * The time when the event of the notification occurred. + */ + notificationTimestamp?: string; + /** + * The sound played when the device receives the notification. + */ + sound?: string; + /** + * The notification's subtitle. (iOS only) + */ + subtitle?: string; + /** + * An identifier similar to 'group' but usable for different purposes (Android only). + */ + tag?: string; + /** + * An identifier similar to 'group' but usable for different purposes (iOS only). + */ + threadIdentifier?: string; + /** + * The notification's title. + */ + title: string; + /** + * Variable string values to be used in place of the format specifiers in titleLocArgs to use to localize the title text to the user's current localization. + */ + titleLocArgs?: string[]; + /** + * The key to the title string in the app's string resources to use to localize the title text to the user's current localization. + */ + titleLocKey?: string; + /** + * The trigger that raised the notification message. Must be one of: push, location, calendar, timeInterval, other + */ + trigger: Trigger; +}; + +/** + * EventContext type + */ +export type EventContext = SelfDescribingJson; + +/** + * ScreenView event properties + * schema: iglu:com.snowplowanalytics.mobile/screen_view/jsonschema/1-0-0 + */ +export type ScreenViewProps = { + /** + * The name of the screen viewed + */ + name: string; + /** + * The id(UUID) of screen that was viewed + */ + id?: string; + /** + * The type of screen that was viewed + */ + type?: string; + /** + * The name of the previous screen that was viewed + */ + previousName?: string; + /** + * The id(UUID) of the previous screen that was viewed + */ + previousId?: string; + /** + * The type of the previous screen that was viewed + */ + previousType?: string; + /** + * The type of transition that led to the screen being viewed + */ + transitionType?: string; +}; + +/** + * Event tracked when a scroll view's scroll position changes. + * If screen engagement tracking is enabled, the scroll changed events will be aggregated into a `screen_summary` entity. + * + * Schema: `iglu:com.snowplowanalytics.mobile/scroll_changed/jsonschema/1-0-0` + */ +export type ScrollChangedProps = { + /** + * Vertical scroll offset in pixels + */ + yOffset?: number; + /** + * Horizontal scroll offset in pixels. + */ + xOffset?: number; + /** + * The height of the scroll view in pixels + */ + viewHeight?: number; + /** + * The width of the scroll view in pixels + */ + viewWidth?: number; + /** + * The height of the content in the scroll view in pixels + */ + contentHeight?: number; + /** + * The width of the content in the scroll view in pixels + */ + contentWidth?: number; +}; + +/** + * Event tracking the view of an item in a list. + * If screen engagement tracking is enabled, the list item view events will be aggregated into a `screen_summary` entity. + * + * Schema: `iglu:com.snowplowanalytics.mobile/list_item_view/jsonschema/1-0-0` + */ +export type ListItemViewProps = { + /** + * Index of the item in the list + */ + index: number; + /** + * Total number of items in the list + */ + itemsCount?: number; +}; + +/** + * Timing event properties + */ +export type TimingProps = { + /** + * The timing category + */ + category: string; + /** + * The timing variable + */ + variable: string; + /** + * The time + */ + timing: number; + /** + * The timing label + */ + label?: string; +}; + +/** + * DeepLinkReceived event properties + * schema: iglu:com.snowplowanalytics.mobile/deep_link_received/jsonschema/1-0-0 + */ +export type DeepLinkReceivedProps = { + /** + * URL in the received deep-link. + */ + url: string; + /** + * Referrer URL, source of this deep-link. + */ + referrer?: string; +}; + +/** + * Current session state that is tracked in events. + */ +export interface SessionState { + /** + * An identifier for the user of the session + */ + userId: string; + /** + * An identifier for the session + */ + sessionId: string; + /** + * The index of the current session for this user + */ + sessionIndex: number; + /** + * Optional index of the current event in the session + */ + eventIndex?: number; + /** + * The previous session identifier for this user + */ + previousSessionId?: string; + /** + * The mechanism that the session information has been stored on the device + */ + storageMechanism: string; + /** + * The optional identifier of the first event for this session + */ + firstEventId?: string; + /** + * Optional date-time timestamp of when the first event in the session was tracked + */ + firstEventTimestamp?: string; +} + +/** + * Properties for a structured event. + * A classic style of event tracking, allows for easier movement between analytics systems. + * Self-describing events are preferred for their schema validation. + */ +export type StructuredProps = StructuredEvent; + +/** + * Interface for any self-describing JSON such as context entities or self-describing events + * @typeParam T - The type of the data object within a SelfDescribingJson + */ +export type SelfDescribing> = SelfDescribingJson; + +/** + * The ReactNativeTracker type + */ +export type ReactNativeTracker = { + /** + * The namespace of the tracker + */ + namespace: string; + /** + * Tracks a self-describing event + * + * @param argmap - The self-describing event properties + * @param contexts - The array of event contexts + * @typeParam TData - The type of the data object within the SelfDescribing object + */ + readonly trackSelfDescribingEvent: = Record>( + argmap: SelfDescribing, + contexts?: EventContext[] + ) => void; + + /** + * Tracks a screen-view event + * + * @param argmap - The screen-view event's properties + * @param contexts - The array of event contexts + */ + readonly trackScreenViewEvent: (argmap: ScreenViewProps, contexts?: EventContext[]) => void; + + /** + * Tracks a scroll changed event + * + * @param argmap - The scroll changed event's properties + * @param contexts - The array of event contexts + */ + readonly trackScrollChangedEvent: (argmap: ScrollChangedProps, contexts?: EventContext[]) => void; + + /** + * Tracks a list item view event + * + * @param argmap - The list item view event's properties + * @param contexts - The array of event contexts + */ + readonly trackListItemViewEvent: (argmap: ListItemViewProps, contexts?: EventContext[]) => void; + + /** + * Tracks a structured event + * + * @param argmap - The structured event properties + * @param contexts - The array of event contexts + */ + readonly trackStructuredEvent: (argmap: StructuredProps, contexts?: EventContext[]) => void; + + /** + * Tracks a page-view event + * + * @param argmap - The page-view event properties + * @param contexts - The array of event contexts + */ + readonly trackPageViewEvent: (argmap: PageViewEvent, contexts?: EventContext[]) => void; + + /** + * Tracks a timing event + * + * @param argmap - The timing event properties + * @param contexts - The array of event contexts + */ + readonly trackTimingEvent: (argmap: TimingProps, contexts?: EventContext[]) => void; + + /** + * Tracks a deep link received event + * + * @param argmap - The deep link received event properties + * @param contexts - The array of event contexts + */ + readonly trackDeepLinkReceivedEvent: (argmap: DeepLinkReceivedProps, contexts?: EventContext[]) => void; + + /** + * Tracks a message notification event + * + * @param argmap - The message notification event properties + * @param contexts - The array of event contexts + */ + readonly trackMessageNotificationEvent: (argmap: MessageNotificationProps, contexts?: EventContext[]) => void; + + /** + * Adds contexts globally, contexts added here will be attached to all applicable events + * @param contexts - An array containing either contexts or a conditional contexts + */ + addGlobalContexts( + contexts: + | Array + | Record + ): void; + + /** + * Removes all global contexts + */ + clearGlobalContexts(): void; + + /** + * Removes previously added global context, performs a deep comparison of the contexts or conditional contexts + * @param contexts - An array containing either contexts or a conditional contexts + */ + removeGlobalContexts(contexts: Array): void; + + /** + * Add a plugin into the plugin collection after Core has already been initialised + * @param configuration - The plugin to add + */ + addPlugin(configuration: BrowserPluginConfiguration): void; + + /** + * Calls flush on all emitters in order to send all queued events to the collector + * @returns Promise - Promise that resolves when all emitters have flushed + */ + flush: () => Promise; + + /** + * Set the application ID + * + * @param appId - An application ID which identifies the current application + */ + readonly setAppId: (appId: string) => void; + + /** + * Set the platform + * + * @param value - A valid Snowplow platform value + */ + readonly setPlatform: (value: string) => void; + + /** + * Sets the business-defined user ID for this user + * + * @param newUid - The new userId + */ + readonly setUserId: (newUid: string) => void; + + /** + * Override the network user id (UUIDv4) that is assigned by the collector and stored in cookies + * + * @param newNuid - The new networkUserId + */ + readonly setNetworkUserId: (newNuid: string | undefined) => void; + + /** + * The domain user id (DUID) is a generated identifier that is stored in a first party cookie on Web. + * The React Native tracker does not assign it automatically. + * + * @param newDuid - The new domainUserId + */ + readonly setDomainUserId: (newDuid: string | undefined) => void; + + /** + * Override the IP address of the device + * + * @param newIp - The new ipAddress + */ + readonly setIpAddress: (newIp: string) => void; + + /** + * The custom user-agent. It overrides the user-agent used by default. + * + * @param newUagent - The new useragent + */ + readonly setUseragent: (newUagent: string) => void; + + /** + * Sets the timezone of the tracker subject + * + * @param newTz - The new timezone + */ + readonly setTimezone: (newTz: string) => void; + + /** + * Sets the language of the tracker subject + * + * @param newLang - The new language + */ + readonly setLanguage: (newLang: string) => void; + + /** + * Sets the screenResolution of the tracker subject + * + * @param newRes - The new screenResolution + */ + readonly setScreenResolution: (newRes: ScreenSize) => void; + + /** + * Sets the screenViewport of the tracker subject + * + * @param newView - The new screenViewport + */ + readonly setScreenViewport: (newView: ScreenSize) => void; + + /** + * Sets the colorDepth of the tracker subject + * + * @param newColorD - The new colorDepth + */ + readonly setColorDepth: (newLang: number) => void; + + /** + * Sets subject data + * + * @param config - The new subject data + */ + readonly setSubjectData: (config: SubjectConfiguration) => void; + + /** + * Gets the identifier for the user of the session + */ + readonly getSessionUserId: () => Promise; + + /** + * Gets the identifier for the session + */ + readonly getSessionId: () => Promise; + + /** + * Gets the index of the current session for this user + */ + readonly getSessionIndex: () => Promise; + + /** + * Gets the current session state + */ + readonly getSessionState: () => Promise; + + /** + * Gets whether the app is currently in background state + */ + readonly getIsInBackground: () => boolean | undefined; + + /** + * Gets the number of background transitions in the current session + */ + readonly getBackgroundIndex: () => number | undefined; + + /** + * Gets the number of foreground transitions in the current session. + */ + readonly getForegroundIndex: () => number | undefined; + + /** + * Enables tracking the platform context with information about the device. + * Note: Only some properties (osType, osVersion, deviceManufacturer, deviceModel, resolution, language, scale) will be tracked by default. Other properties can be assigned using the PlatformContextRetriever. + */ + readonly enablePlatformContext: () => Promise; + + /** + * Disables tracking the platform context with information about the device. + */ + readonly disablePlatformContext: () => void; + + /** + * Refreshes the platform context with the latest values. + */ + readonly refreshPlatformContext: () => Promise; +}; + +export { + version, + PageViewEvent, + FormFocusOrChangeEvent, + Timestamp, + PayloadBuilder, + Payload, + CorePlugin, + CoreConfiguration, + ContextGenerator, + ContextFilter, + EventPayloadAndContext, + EventStoreIterator, + EventStorePayload, + TrackerCore, + Logger, + EmitterConfiguration, + EmitterConfigurationBase, + EventJson, + JsonProcessor, + TrueTimestamp, + DeviceTimestamp, + EventMethod, + RequestFailure, + EventBatch, + EventJsonWithKeys, + LOG_LEVEL, + ConditionalContextProvider, + ContextPrimitive, + CorePluginConfiguration, + Emitter, + FilterProvider, + RuleSetProvider, + RuleSet, +} from '@snowplow/tracker-core'; diff --git a/trackers/react-native-tracker/src/utils.ts b/trackers/react-native-tracker/src/utils.ts new file mode 100644 index 000000000..f39190da0 --- /dev/null +++ b/trackers/react-native-tracker/src/utils.ts @@ -0,0 +1,17 @@ +import { PayloadBuilder } from '@snowplow/tracker-core'; + +// Returns the "useful" schema, i.e. what would someone want to use to identify events. +// For some events this is the 'e' property but for self-describing events, this is the +// 'schema' from the 'ue_px' field. +export function getUsefulSchema(sb: PayloadBuilder): string { + let eventJson = sb.getJson(); + for (const json of eventJson) { + if (json.keyIfEncoded === 'ue_px' && typeof json.json['data'] === 'object') { + const schema = (json.json['data'] as Record)['schema']; + if (typeof schema == 'string') { + return schema; + } + } + } + return ''; +} diff --git a/trackers/react-native-tracker/src/web_view_interface.ts b/trackers/react-native-tracker/src/web_view_interface.ts new file mode 100644 index 000000000..d831a76f7 --- /dev/null +++ b/trackers/react-native-tracker/src/web_view_interface.ts @@ -0,0 +1,215 @@ +'use strict'; + +import { buildSelfDescribingEvent, payloadBuilder } from '@snowplow/tracker-core'; +import { getAllTrackerCores, getAllTrackers, getTracker, getTrackerCore } from './tracker'; +import type { + ScreenViewProps, + SelfDescribing, + StructuredProps, + ReactNativeTracker, + TrackerCore, + PayloadBuilder, + Payload, + WebViewMessageHandler, +} from './types'; + +/** + * Internal event type for events with payload properties tracked using the WebView tracker. + */ +interface WebViewEvent { + selfDescribingEventData?: SelfDescribing; + eventName?: string; + trackerVersion?: string; + useragent?: string; + pageUrl?: string; + pageTitle?: string; + referrer?: string; + category?: string; + action?: string; + label?: string; + property?: string; + value?: number; + pingXOffsetMin?: number; + pingXOffsetMax?: number; + pingYOffsetMin?: number; + pingYOffsetMax?: number; +} + +/** + * Internal event type for page views tracked using the WebView tracker. + */ +interface WebViewPageViewEvent { + title?: string | null; + url?: string; + referrer?: string; +} + +/** + * Internal type exchanged in messages received from the WebView tracker in Web views through the web view callback. + */ +type WebViewMessage = { + command: 'trackSelfDescribingEvent' | 'trackStructEvent' | 'trackPageView' | 'trackScreenView' | 'trackWebViewEvent'; + event: StructuredProps | SelfDescribing | ScreenViewProps | WebViewPageViewEvent | WebViewEvent; + context?: Array | null; + trackers?: Array; +}; + +function forEachTracker(trackers: Array | undefined, iterator: (tracker: ReactNativeTracker) => void): void { + if (trackers && trackers.length > 0) { + trackers + .map(getTracker) + .filter((t) => t !== undefined) + .map((t) => t!) + .forEach(iterator); + } else { + getAllTrackers().forEach(iterator); + } +} + +function forEachTrackerCore(trackers: Array | undefined, iterator: (tracker: TrackerCore) => void): void { + if (trackers && trackers.length > 0) { + trackers + .map(getTrackerCore) + .filter((t) => t !== undefined) + .map((t) => t!) + .forEach(iterator); + } else { + getAllTrackerCores().forEach(iterator); + } +} + +/** + * Wrapper around the PayloadBuilder that disables overriding property values. + * This is to prevent the tracker overriding values like tracker version set in the WebView. + */ +function webViewPayloadBuilder(pb: PayloadBuilder): PayloadBuilder { + const addedKeys = new Set(); + + const add = (key: string, value: unknown): void => { + if (!addedKeys.has(key)) { + addedKeys.add(key); + pb.add(key, value); + } + }; + + const addDict = (dict: Payload): void => { + for (const key in dict) { + if (Object.prototype.hasOwnProperty.call(dict, key)) { + add(key, dict[key]); + } + } + }; + + return { + ...pb, + add, + addDict, + }; +} + +/** + * Enables tracking events from apps rendered in react-native-webview components. + * The apps need to use the Snowplow WebView tracker to track the events. + * + * To subscribe for the events, use as the `onMessage` prop for a `WebView` component. + * + * @returns Callback to subscribe for events from Web views tracked using the Snowplow WebView tracker. + */ +export function getWebViewCallback(): WebViewMessageHandler { + return (message) => { + const data = JSON.parse(message.nativeEvent.data) as WebViewMessage; + switch (data.command) { + case 'trackSelfDescribingEvent': + forEachTracker(data.trackers, (tracker) => { + tracker.trackSelfDescribingEvent(data.event as SelfDescribing, data.context || []); + }); + break; + + case 'trackStructEvent': + forEachTracker(data.trackers, (tracker) => { + tracker.trackStructuredEvent(data.event as StructuredProps, data.context || []); + }); + break; + + case 'trackPageView': + forEachTracker(data.trackers, (tracker) => { + const event = data.event as WebViewPageViewEvent; + tracker.trackPageViewEvent({ + pageTitle: event.title, + pageUrl: event.url, + referrer: event.referrer, + }); + }); + break; + + case 'trackScreenView': + forEachTracker(data.trackers, (tracker) => { + tracker.trackScreenViewEvent(data.event as ScreenViewProps, data.context || []); + }); + break; + + case 'trackWebViewEvent': + forEachTrackerCore(data.trackers, (tracker) => { + const event = data.event as WebViewEvent; + let pb: PayloadBuilder; + if (event.selfDescribingEventData) { + pb = buildSelfDescribingEvent({ event: event.selfDescribingEventData }); + } else { + pb = payloadBuilder(); + } + pb = webViewPayloadBuilder(pb); + + if (event.eventName !== undefined) { + pb.add('e', event.eventName); + } + if (event.action !== undefined) { + pb.add('se_ac', event.action); + } + if (event.category !== undefined) { + pb.add('se_ca', event.category); + } + if (event.label !== undefined) { + pb.add('se_la', event.label); + } + if (event.property !== undefined) { + pb.add('se_pr', event.property); + } + if (event.value !== undefined) { + pb.add('se_va', event.value.toString()); + } + if (event.pageUrl !== undefined) { + pb.add('url', event.pageUrl); + } + if (event.pageTitle !== undefined) { + pb.add('page', event.pageTitle); + } + if (event.referrer !== undefined) { + pb.add('refr', event.referrer); + } + if (event.pingXOffsetMin !== undefined) { + pb.add('pp_mix', event.pingXOffsetMin.toString()); + } + if (event.pingXOffsetMax !== undefined) { + pb.add('pp_max', event.pingXOffsetMax.toString()); + } + if (event.pingYOffsetMin !== undefined) { + pb.add('pp_miy', event.pingYOffsetMin.toString()); + } + if (event.pingYOffsetMax !== undefined) { + pb.add('pp_may', event.pingYOffsetMax.toString()); + } + if (event.trackerVersion !== undefined) { + pb.add('tv', event.trackerVersion); + } + if (event.useragent !== undefined) { + pb.add('ua', event.useragent); + } + tracker.track(pb, data.context || []); + }); + break; + + default: + console.warn(`Unknown command from WebView: ${data.command}`); + } + }; +} diff --git a/trackers/react-native-tracker/test/ecommerce.test.ts b/trackers/react-native-tracker/test/ecommerce.test.ts new file mode 100644 index 000000000..7fbc06ee5 --- /dev/null +++ b/trackers/react-native-tracker/test/ecommerce.test.ts @@ -0,0 +1,54 @@ +import { newTracker } from '../src'; +import { setEcommerceUser, SnowplowEcommercePlugin, trackProductView } from '@snowplow/browser-plugin-snowplow-ecommerce'; + +function createMockFetch(status: number, requests: Request[]) { + return async (input: Request) => { + requests.push(input); + let response = new Response(null, { status }); + return response; + }; +} + +describe('Tracking ecommerce events using the ecomerce plugin', () => { + let requests: Request[]; + let mockFetch: ReturnType; + + beforeEach(async () => { + requests = []; + mockFetch = createMockFetch(200, requests); + }); + + it('tracks ecommerce events', async () => { + const tracker = await newTracker({ + namespace: 'test', + endpoint: 'http://localhost:9090', + customFetch: mockFetch, + plugins: [SnowplowEcommercePlugin()], + }); + + setEcommerceUser({ + id: 'my-user', + email: 'my-email@email.com', + }); + + trackProductView({ + id: 'my-product', + name: 'My Product', + category: 'my-category', + price: 100, + currency: 'USD', + }) + + await tracker.flush(); + expect(requests.length).toBe(1); + + const [request] = requests; + const payload = await request?.json(); + expect(payload.data.length).toBe(1); + expect(payload.data[0].ue_pr).toBeDefined(); + expect(payload.data[0].ue_pr).toContain('/snowplow_ecommerce_action/'); + expect(payload.data[0].co).toBeDefined(); + expect(payload.data[0].co).toContain('My Product'); + expect(payload.data[0].co).toContain('my-email@email.com'); + }); +}); diff --git a/trackers/react-native-tracker/test/event_store.test.ts b/trackers/react-native-tracker/test/event_store.test.ts new file mode 100644 index 000000000..8c95e51ed --- /dev/null +++ b/trackers/react-native-tracker/test/event_store.test.ts @@ -0,0 +1,91 @@ +import AsyncStorage from '@react-native-async-storage/async-storage'; +import { newReactNativeEventStore } from '../src/event_store'; + +function createAsyncStorageMock() { + const storageState: Record = {}; + + return { + getItem: (key: string) => Promise.resolve(storageState[key] ?? null), + setItem: (key: string, value: string) => { + storageState[key] = value; + + return Promise.resolve(); + }, + }; +} + +describe('React Native event store', () => { + it('keeps track of added events', async () => { + const eventStore = await newReactNativeEventStore({ + asyncStorage: AsyncStorage, + namespace: 'test', + }); + + expect(await eventStore.add({ payload: { e: 'pv' } })).toBe(1); + expect(await eventStore.add({ payload: { e: 'pp' } })).toBe(2); + expect(await eventStore.count()).toBe(2); + + expect(await eventStore.getAll()).toEqual([{ payload: { e: 'pv' } }, { payload: { e: 'pp' } }]); + + expect((await eventStore.iterator().next()).value?.payload).toEqual({ e: 'pv' }); + + await eventStore.removeHead(1); + expect(await eventStore.count()).toBe(1); + expect(await eventStore.getAll()).toEqual([{ payload: { e: 'pp' } }]); + }); + + it('separates event stores by namespace', async () => { + const eventStore1 = await newReactNativeEventStore({ + asyncStorage: AsyncStorage, + namespace: 'test1', + }); + const eventStore2 = await newReactNativeEventStore({ + asyncStorage: AsyncStorage, + namespace: 'test2', + }); + + await eventStore1.add({ payload: { e: 'pv1' } }); + await eventStore2.add({ payload: { e: 'pv2' } }); + + expect(await eventStore1.count()).toBe(1); + expect(await eventStore2.count()).toBe(1); + + expect(await eventStore1.getAll()).toEqual([{ payload: { e: 'pv1' } }]); + expect(await eventStore2.getAll()).toEqual([{ payload: { e: 'pv2' } }]); + }); + + it('syncs with AsyncStorage', async () => { + const eventStore1 = await newReactNativeEventStore({ + asyncStorage: AsyncStorage, + namespace: 'testA', + }); + + await eventStore1.add({ payload: { e: 'pv' } }); + await eventStore1.add({ payload: { e: 'pp' } }); + + const eventStore2 = await newReactNativeEventStore({ + asyncStorage: AsyncStorage, + namespace: 'testA', + }); + + expect(await eventStore2.count()).toBe(2); + }); + + it('syncs with the custom async storage implementation', async () => { + const asyncStorage = createAsyncStorageMock(); + const eventStore1 = await newReactNativeEventStore({ + asyncStorage, + namespace: 'testA', + }); + + await eventStore1.add({ payload: { e: 'pv' } }); + await eventStore1.add({ payload: { e: 'pp' } }); + + const eventStore2 = await newReactNativeEventStore({ + asyncStorage, + namespace: 'testA', + }); + + expect(await eventStore2.count()).toBe(2); + }); +}); diff --git a/trackers/react-native-tracker/test/events.test.ts b/trackers/react-native-tracker/test/events.test.ts new file mode 100644 index 000000000..f16b80a23 --- /dev/null +++ b/trackers/react-native-tracker/test/events.test.ts @@ -0,0 +1,139 @@ +import { Payload } from '@snowplow/tracker-core'; +import { newTracker, ReactNativeTracker } from '../src'; + +describe('Events', () => { + let tracker: ReactNativeTracker; + let payloads: Payload[]; + + beforeEach(async () => { + payloads = []; + tracker = await newTracker({ namespace: 'test', endpoint: 'http://localhost:9090' }); + tracker.addPlugin({ + plugin: { + filter: (payload) => { + payloads.push(payload); + return false; + }, + }, + }); + }); + + it('tracks a page view event', () => { + tracker.trackPageViewEvent({ + pageUrl: 'http://localhost:9090', + pageTitle: 'Home', + }); + + expect(payloads.length).toBe(1); + const [payload] = payloads; + expect(payload?.e).toBe('pv'); + expect(payload?.url).toBe('http://localhost:9090'); + expect(payload?.page).toBe('Home'); + }); + + it('tracks a structured event', () => { + tracker.trackStructuredEvent({ + category: 'category', + action: 'action', + label: 'label', + property: 'property', + value: 1, + }); + + expect(payloads.length).toBe(1); + const [payload] = payloads; + expect(payload?.e).toBe('se'); + expect(payload?.se_ca).toBe('category'); + expect(payload?.se_ac).toBe('action'); + expect(payload?.se_la).toBe('label'); + expect(payload?.se_pr).toBe('property'); + expect(payload?.se_va).toBe('1'); + }); + + it('tracks a timing event', () => { + tracker.trackTimingEvent({ + category: 'category', + variable: 'variable', + timing: 1, + label: 'label', + }); + + expect(payloads.length).toBe(1); + const [payload] = payloads; + expect(payload?.e).toBe('ue'); + const { ue_pr } = payload!; + const event = JSON.parse(ue_pr as string); + const { schema, data } = event.data; + expect(schema).toContain('timing'); + expect(data.category).toBe('category'); + expect(data.variable).toBe('variable'); + expect(data.timing).toBe(1); + expect(data.label).toBe('label'); + }); + + it('tracks a message notification event', () => { + tracker.trackMessageNotificationEvent({ + action: 'a', + category: 'c', + trigger: 'calendar', + body: 'b', + title: 't', + }); + + expect(payloads.length).toBe(1); + const [payload] = payloads; + expect(payload?.e).toBe('ue'); + const { ue_pr } = payload!; + const event = JSON.parse(ue_pr as string); + const { schema, data } = event.data; + expect(schema).toContain('message_notification'); + expect(data.action).toBe('a'); + expect(data.category).toBe('c'); + expect(data.trigger).toBe('calendar'); + expect(data.body).toBe('b'); + expect(data.title).toBe('t'); + }); + + it('tracks a self-describing event', () => { + tracker.trackSelfDescribingEvent({ + schema: 'iglu:com.acme/event/jsonschema/1-0-0', + data: { + field: 'value', + }, + }); + + expect(payloads.length).toBe(1); + const [payload] = payloads; + expect(payload?.e).toBe('ue'); + const { ue_pr } = payload!; + const event = JSON.parse(ue_pr as string); + const { schema, data } = event.data; + expect(schema).toBe('iglu:com.acme/event/jsonschema/1-0-0'); + expect(data.field).toBe('value'); + }); + + it('tracks context entities with events', () => { + tracker.trackPageViewEvent( + { + pageUrl: 'http://localhost:9090', + }, + [ + { + schema: 'iglu:com.acme/page/jsonschema/1-0-0', + data: { + field: 'value', + }, + }, + ] + ); + + expect(payloads.length).toBe(1); + const [payload] = payloads; + expect(payload?.co).toBeDefined(); + const { co } = payload!; + const context = JSON.parse(co as string); + const [{ schema, data }] = context.data; + expect(schema).toBe('iglu:com.acme/page/jsonschema/1-0-0'); + expect(data.field).toBe('value'); + }); +}); diff --git a/trackers/react-native-tracker/test/plugins/app_context.test.ts b/trackers/react-native-tracker/test/plugins/app_context.test.ts new file mode 100644 index 000000000..449f0efdd --- /dev/null +++ b/trackers/react-native-tracker/test/plugins/app_context.test.ts @@ -0,0 +1,76 @@ +import { APPLICATION_CONTEXT_SCHEMA, MOBILE_APPLICATION_CONTEXT_SCHEMA } from '../../src/constants'; +import { newAppContextPlugin } from '../../src/plugins/app_context'; +import { buildPageView, Payload, trackerCore } from '@snowplow/tracker-core'; + +describe('Application context plugin', () => { + it('attaches mobile application context to events if both version and build passed', async () => { + const appContext = await newAppContextPlugin({ + appBuild: '19', + appVersion: '1.0.1', + }); + + const payloads: Payload[] = []; + const tracker = trackerCore({ + corePlugins: [appContext.plugin], + callback: (pb) => payloads.push(pb.build()), + base64: false, + }); + + tracker.track(buildPageView({ pageUrl: 'http://localhost' })); + + expect(payloads.length).toBe(1); + expect(JSON.parse(payloads[0]?.co as string).data).toEqual([ + { + schema: MOBILE_APPLICATION_CONTEXT_SCHEMA, + data: { + version: '1.0.1', + build: '19', + }, + }, + ]); + }); + + it('attaches application context to events if only version passed', async () => { + const appContext = await newAppContextPlugin({ + appVersion: '1.0.1', + }); + + const payloads: Payload[] = []; + const tracker = trackerCore({ + corePlugins: [appContext.plugin], + callback: (pb) => payloads.push(pb.build()), + base64: false, + }); + + tracker.track(buildPageView({ pageUrl: 'http://localhost' })); + + expect(payloads.length).toBe(1); + expect(JSON.parse(payloads[0]?.co as string).data).toEqual([ + { + schema: APPLICATION_CONTEXT_SCHEMA, + data: { + version: '1.0.1', + }, + }, + ]); + }); + + it('doesnt attach any application context to events if version not passed', async () => { + const appContext = await newAppContextPlugin({ + appBuild: '19', + }); + + const payloads: Payload[] = []; + const tracker = trackerCore({ + corePlugins: [appContext.plugin], + callback: (pb) => payloads.push(pb.build()), + base64: false, + }); + + tracker.track(buildPageView({ pageUrl: 'http://localhost' })); + + expect(payloads.length).toBe(1); + expect((payloads[0]?.co as string) ?? '').not.toContain(MOBILE_APPLICATION_CONTEXT_SCHEMA); + expect((payloads[0]?.co as string) ?? '').not.toContain(APPLICATION_CONTEXT_SCHEMA); + }); +}); diff --git a/trackers/react-native-tracker/test/plugins/app_install.test.ts b/trackers/react-native-tracker/test/plugins/app_install.test.ts new file mode 100644 index 000000000..9a99287d4 --- /dev/null +++ b/trackers/react-native-tracker/test/plugins/app_install.test.ts @@ -0,0 +1,94 @@ +import { Payload, trackerCore } from '@snowplow/tracker-core'; +import { newAppInstallPlugin } from '../../src/plugins/app_install'; +import AsyncStorage from '@react-native-async-storage/async-storage'; +import { APPLICATION_INSTALL_EVENT_SCHEMA } from '../../src/constants'; + +describe('Application install plugin', () => { + beforeEach(async () => { + await AsyncStorage.clear(); + }); + + it('tracks an app install event on first tracker init', async () => { + const tracker = trackerCore({ + callback: (pb) => payloads.push(pb.build()), + base64: false, + }); + const appInstallPlugin = newAppInstallPlugin( + { + asyncStorage: AsyncStorage, + namespace: 'test', + installAutotracking: true, + }, + tracker + ); + tracker.addPlugin(appInstallPlugin); + + const payloads: Payload[] = []; + + await new Promise((resolve) => setTimeout(resolve, 50)); + + expect(payloads.length).toBe(1); + const [{ ue_pr }] = payloads as any; + expect(ue_pr).toContain(APPLICATION_INSTALL_EVENT_SCHEMA); + }); + + it('does not track an app install event on subsequent tracker inits', async () => { + const tracker1 = trackerCore({ + callback: (pb) => payloads.push(pb.build()), + base64: false, + }); + tracker1.addPlugin( + newAppInstallPlugin( + { + asyncStorage: AsyncStorage, + namespace: 'test', + installAutotracking: true, + }, + tracker1 + ) + ); + + const payloads: Payload[] = []; + await new Promise((resolve) => setTimeout(resolve, 50)); + expect(payloads.length).toBe(1); + + const tracker2 = trackerCore({ + callback: (pb) => payloads.push(pb.build()), + base64: false, + }); + tracker2.addPlugin( + newAppInstallPlugin( + { + asyncStorage: AsyncStorage, + namespace: 'test', + installAutotracking: true, + }, + tracker2 + ) + ); + + await new Promise((resolve) => setTimeout(resolve, 50)); + expect(payloads.length).toBe(1); + }); + + it('does not track an app install event when autotracking is disabled', async () => { + const tracker = trackerCore({ + callback: (pb) => payloads.push(pb.build()), + base64: false, + }); + const appInstallPlugin = newAppInstallPlugin( + { + asyncStorage: AsyncStorage, + namespace: 'test', + }, + tracker + ); + tracker.addPlugin(appInstallPlugin); + + const payloads: Payload[] = []; + + await new Promise((resolve) => setTimeout(resolve, 50)); + + expect(payloads.length).toBe(0); + }); +}); diff --git a/trackers/react-native-tracker/test/plugins/app_lifecycle.test.ts b/trackers/react-native-tracker/test/plugins/app_lifecycle.test.ts new file mode 100644 index 000000000..f4cb35824 --- /dev/null +++ b/trackers/react-native-tracker/test/plugins/app_lifecycle.test.ts @@ -0,0 +1,97 @@ +import { AppState } from 'react-native'; +import { BACKGROUND_EVENT_SCHEMA, LIFECYCLE_CONTEXT_SCHEMA } from '../../src/constants'; +import { buildPageView, Payload, trackerCore } from '@snowplow/tracker-core'; +import { newAppLifecyclePlugin } from '../../src/plugins/app_lifecycle'; + +describe('Application lifecycle plugin', () => { + afterEach(() => { + jest.clearAllMocks(); + }); + + it('tracks events on app state changes', async () => { + const appStateSpy = jest.spyOn(AppState, 'addEventListener'); + + const payloads: Payload[] = []; + const tracker = trackerCore({ + callback: (pb) => payloads.push(pb.build()), + base64: false, + }); + const appLifecyclePlugin = await newAppLifecyclePlugin({}, tracker); + tracker.addPlugin(appLifecyclePlugin); + + appStateSpy.mock.calls?.[0]?.[1]('background'); + + expect(payloads.length).toBe(1); + expect(payloads[0]?.ue_pr ?? '').toContain(BACKGROUND_EVENT_SCHEMA); + }); + + it('attaches lifecycle context to events with the correct properties', async () => { + const appStateSpy = jest.spyOn(AppState, 'addEventListener'); + + const payloads: Payload[] = []; + const tracker = trackerCore({ + callback: (pb) => payloads.push(pb.build()), + base64: false, + }); + const appLifecyclePlugin = await newAppLifecyclePlugin({}, tracker); + tracker.addPlugin(appLifecyclePlugin); + + tracker.track(buildPageView({ pageUrl: 'http://localhost' })); + + expect(payloads.length).toBe(1); + expect(JSON.parse(payloads[0]?.co as string).data).toEqual([ + { + schema: LIFECYCLE_CONTEXT_SCHEMA, + data: { + isVisible: true, + index: 1, + }, + }, + ]); + + payloads.length = 0; + appStateSpy.mock.calls?.[0]?.[1]('background'); + + expect(payloads.length).toBe(1); + expect(JSON.parse(payloads[0]?.co as string).data).toEqual([ + { + schema: LIFECYCLE_CONTEXT_SCHEMA, + data: { + isVisible: false, + index: 1, + }, + }, + ]); + + payloads.length = 0; + appStateSpy.mock.calls?.[0]?.[1]('active'); + + expect(payloads.length).toBe(1); + expect(JSON.parse(payloads[0]?.co as string).data).toEqual([ + { + schema: LIFECYCLE_CONTEXT_SCHEMA, + data: { + isVisible: true, + index: 2, + }, + }, + ]); + }); + + it('removes subscription on tracker deactivation', async () => { + const appStateSpy = jest.spyOn(AppState, 'addEventListener'); + const removeSpy = jest.fn(); + appStateSpy.mockReturnValue({ remove: removeSpy }); + + const tracker = trackerCore({ + callback: () => {}, + base64: false, + }); + const appLifecyclePlugin = await newAppLifecyclePlugin({}, tracker); + tracker.addPlugin(appLifecyclePlugin); + + expect(appStateSpy).toHaveBeenCalledTimes(1); + tracker.deactivate(); + expect(removeSpy).toHaveBeenCalledTimes(1); + }); +}); diff --git a/trackers/react-native-tracker/test/plugins/deep_links.test.ts b/trackers/react-native-tracker/test/plugins/deep_links.test.ts new file mode 100644 index 000000000..8a6365990 --- /dev/null +++ b/trackers/react-native-tracker/test/plugins/deep_links.test.ts @@ -0,0 +1,107 @@ +import { + DEEP_LINK_ENTITY_SCHEMA, + DEEP_LINK_RECEIVED_EVENT_SCHEMA, + SCREEN_VIEW_EVENT_SCHEMA, +} from '../../src/constants'; +import { newDeepLinksPlugin } from '../../src/plugins/deep_links'; +import { buildSelfDescribingEvent, Payload, trackerCore } from '@snowplow/tracker-core'; + +describe('Deep Link plugin', () => { + it('adds the url and refr properties on the deep link event', () => { + const payloads: Payload[] = []; + const tracker = trackerCore({ + callback: (pb) => payloads.push(pb.build()), + base64: false, + }); + const deepLinksPlugin = newDeepLinksPlugin({}, tracker); + tracker.addPlugin(deepLinksPlugin); + + deepLinksPlugin.trackDeepLinkReceivedEvent({ + url: 'http://url.com', + referrer: 'http://referrer.com', + }); + + expect(payloads.length).toBe(1); + const [{ url, refr, ue_pr }] = payloads as any; + expect(url).toBe('http://url.com'); + expect(refr).toBe('http://referrer.com'); + + const { data } = JSON.parse(ue_pr); + expect(data.schema).toBe(DEEP_LINK_RECEIVED_EVENT_SCHEMA); + expect(data.data.url).toBe('http://url.com'); + expect(data.data.referrer).toBe('http://referrer.com'); + }); + + it('adds the deep link context to the first screen view event', () => { + const payloads: Payload[] = []; + const tracker = trackerCore({ + callback: (pb) => payloads.push(pb.build()), + base64: false, + }); + const deepLinksPlugin = newDeepLinksPlugin({}, tracker); + tracker.addPlugin(deepLinksPlugin); + + deepLinksPlugin.trackDeepLinkReceivedEvent({ + url: 'http://url.com', + referrer: 'http://referrer.com', + }); + tracker.track( + buildSelfDescribingEvent({ + event: { + schema: SCREEN_VIEW_EVENT_SCHEMA, + data: {}, + }, + }) + ); + tracker.track( + buildSelfDescribingEvent({ + event: { + schema: SCREEN_VIEW_EVENT_SCHEMA, + data: {}, + }, + }) + ); + + expect(payloads.length).toBe(3); + const [, { url, refr, co }, { co: co2 }] = payloads as any; + expect(url).toBe('http://url.com'); + expect(refr).toBe('http://referrer.com'); + expect(co).not.toBeUndefined(); + const entities = JSON.parse(co).data; + const deepLinkEntity = entities.find((entity: any) => entity.schema === DEEP_LINK_ENTITY_SCHEMA); + expect(deepLinkEntity).not.toBeUndefined(); + expect(deepLinkEntity.data.url).toBe('http://url.com'); + expect(deepLinkEntity.data.referrer).toBe('http://referrer.com'); + + expect(co2 ?? '').not.toContain(DEEP_LINK_ENTITY_SCHEMA); + }); + + it('does not add the deep link entity if disabled', () => { + const payloads: Payload[] = []; + const tracker = trackerCore({ + callback: (pb) => payloads.push(pb.build()), + base64: false, + }); + const deepLinksPlugin = newDeepLinksPlugin({ deepLinkContext: false }, tracker); + tracker.addPlugin(deepLinksPlugin); + + deepLinksPlugin.trackDeepLinkReceivedEvent({ + url: 'http://url.com', + referrer: 'http://referrer.com', + }); + tracker.track( + buildSelfDescribingEvent({ + event: { + schema: SCREEN_VIEW_EVENT_SCHEMA, + data: {}, + }, + }) + ); + + expect(payloads.length).toBe(2); + const [, { url, refr, co }] = payloads as any; + expect(url).toBe('http://url.com'); + expect(refr).toBe('http://referrer.com'); + expect(co ?? '').not.toContain(DEEP_LINK_ENTITY_SCHEMA); + }); +}); diff --git a/trackers/react-native-tracker/test/plugins/platform_context_android.test.ts b/trackers/react-native-tracker/test/plugins/platform_context_android.test.ts new file mode 100644 index 000000000..c7597886e --- /dev/null +++ b/trackers/react-native-tracker/test/plugins/platform_context_android.test.ts @@ -0,0 +1,81 @@ +import { buildPageView, Payload, trackerCore } from '@snowplow/tracker-core'; +import { newPlatformContextPlugin } from '../../src/plugins/platform_context'; +import { MOBILE_CONTEXT_SCHEMA } from '../../src/constants'; +import { NativeModules } from 'react-native'; +import { Dimensions } from 'react-native'; + +describe('PlatformContextPlugin on Android', () => { + beforeAll(() => { + jest.mock('react-native/Libraries/Utilities/Platform', () => ({ + OS: 'android', + Version: 33, + constants: { + Brand: 'google', + Manufacturer: 'Google', + Model: 'sdk_gphone64_arm64', + Release: '13', + Version: 33, + }, + select: () => null, + })); + jest.spyOn(Dimensions, 'get').mockReturnValue({ + width: 123.4567, + height: 89.1234, + scale: 0, + fontScale: 0, + }); + NativeModules.I18nManager = { + localeIdentifier: 'en-GB', + }; + }); + + afterAll(() => { + jest.clearAllMocks(); + }); + + it('adds platform context to events', async () => { + const sessionPlugin = await newPlatformContextPlugin(); + + const payloads: Payload[] = []; + const tracker = trackerCore({ + corePlugins: [sessionPlugin.plugin], + callback: (pb) => payloads.push(pb.build()), + base64: false, + }); + tracker.track(buildPageView({ pageUrl: 'http://localhost' })); + + expect(payloads.length).toBe(1); + const [payload] = payloads; + expect(payload?.co).toBeDefined(); + expect(payload?.co).toContain(MOBILE_CONTEXT_SCHEMA); + expect(payload?.co).toContain('"13"'); + expect(payload?.co).toContain('"sdk_gphone64_arm64"'); + expect(payload?.co).toContain('"Google"'); + expect(payload?.co).toContain('"Google"'); + expect(payload?.co).toContain('"en-GB"'); + expect(payload?.co).toContain('"123x89"'); + }); + + it('truncates language to 8 characters', async () => { + const sessionPlugin = await newPlatformContextPlugin({ + platformContextRetriever: { + getLanguage: () => Promise.resolve('1234567890'), + }, + }); + + const payloads: Payload[] = []; + const tracker = trackerCore({ + corePlugins: [sessionPlugin.plugin], + callback: (pb) => payloads.push(pb.build()), + base64: false, + }); + tracker.track(buildPageView({ pageUrl: 'http://localhost' })); + + expect(payloads.length).toBe(1); + const [payload] = payloads; + expect(payload?.co).toBeDefined(); + const entities = JSON.parse(payload?.co as string).data; + const mobileContext = entities.find((entity: any) => entity.schema === MOBILE_CONTEXT_SCHEMA); + expect(mobileContext?.data.language).toBe('12345678'); + }); +}); diff --git a/trackers/react-native-tracker/test/plugins/platform_context_ios.test.ts b/trackers/react-native-tracker/test/plugins/platform_context_ios.test.ts new file mode 100644 index 000000000..3a239377e --- /dev/null +++ b/trackers/react-native-tracker/test/plugins/platform_context_ios.test.ts @@ -0,0 +1,193 @@ +import { buildPageView, Payload, trackerCore } from '@snowplow/tracker-core'; +import { newPlatformContextPlugin } from '../../src/plugins/platform_context'; +import { NativeModules } from 'react-native'; +import { MOBILE_CONTEXT_SCHEMA } from '../../src/constants'; +import { Dimensions } from 'react-native'; + +describe('PlatformContextPlugin on iOS', () => { + beforeAll(() => { + jest.mock('react-native/Libraries/Utilities/Platform', () => ({ + OS: 'ios', + Version: '18.0', + constants: { + forceTouchAvailable: false, + interfaceIdiom: 'phone', + isMacCatalyst: false, + isTesting: false, + osVersion: '18.0', + systemName: 'iOS', + }, + isMacCatalyst: false, + isPad: false, + isTV: false, + isVision: false, + select: () => null, + })); + jest.spyOn(Dimensions, 'get').mockReturnValue({ + width: 123.4567, + height: 89.1234, + scale: 0, + fontScale: 0, + }); + NativeModules.SettingsManager = { + settings: { + AppleLanguages: ['en-GB'], + }, + }; + }); + + afterAll(() => { + jest.clearAllMocks(); + }); + + it('adds platform context to events', async () => { + const sessionPlugin = await newPlatformContextPlugin(); + + const payloads: Payload[] = []; + const tracker = trackerCore({ + corePlugins: [sessionPlugin.plugin], + callback: (pb) => payloads.push(pb.build()), + base64: false, + }); + tracker.track(buildPageView({ pageUrl: 'http://localhost' })); + + expect(payloads.length).toBe(1); + const [payload] = payloads; + expect(payload?.co).toBeDefined(); + expect(payload?.co).toContain(MOBILE_CONTEXT_SCHEMA); + expect(payload?.co).toContain('"iOS"'); + expect(payload?.co).toContain('"18.0"'); + expect(payload?.co).toContain('"en-GB"'); + expect(payload?.co).toContain('"123x89"'); + }); + + it('does not add platform context to events if disabled', async () => { + const sessionPlugin = await newPlatformContextPlugin({ platformContext: false }); + + const payloads: Payload[] = []; + const tracker = trackerCore({ + corePlugins: [sessionPlugin.plugin], + callback: (pb) => payloads.push(pb.build()), + base64: false, + }); + tracker.track(buildPageView({ pageUrl: 'http://localhost' })); + + expect(payloads.length).toBe(1); + const [payload] = payloads; + expect(payload?.co ?? '').not.toContain(MOBILE_CONTEXT_SCHEMA); + }); + + it('skips properties not enabled', async () => { + const sessionPlugin = await newPlatformContextPlugin({ platformContextProperties: [] }); + + const payloads: Payload[] = []; + const tracker = trackerCore({ + corePlugins: [sessionPlugin.plugin], + callback: (pb) => payloads.push(pb.build()), + base64: false, + }); + tracker.track(buildPageView({ pageUrl: 'http://localhost' })); + + expect(payloads.length).toBe(1); + const [payload] = payloads; + expect(payload?.co).toBeDefined(); + expect(payload?.co).toContain(MOBILE_CONTEXT_SCHEMA); + expect(payload?.co).toContain('"iOS"'); + expect(payload?.co).not.toContain('"en-GB"'); + }); + + it('overrides properties using the retriever', async () => { + const sessionPlugin = await newPlatformContextPlugin({ + platformContextRetriever: { + getOsType: () => Promise.resolve('Android'), + getOsVersion: () => Promise.resolve('11.0'), + getDeviceModel: () => Promise.resolve('Galaxy S21'), + getDeviceManufacturer: () => Promise.resolve('Samsung'), + getCarrier: () => Promise.resolve('Vodafone'), + getNetworkType: () => Promise.resolve('wifi'), + getNetworkTechnology: () => Promise.resolve('5G'), + getAppleIdfa: () => Promise.resolve('my-idfa'), + getAppleIdfv: () => Promise.resolve('my-idfv'), + getAvailableStorage: () => Promise.resolve(1000000000), + getTotalStorage: () => Promise.resolve(2000000000), + getPhysicalMemory: () => Promise.resolve(8000000000), + getAppAvailableMemory: () => Promise.resolve(2000000000), + getBatteryLevel: () => Promise.resolve(50), + getBatteryState: () => Promise.resolve('full'), + getLowPowerMode: () => Promise.resolve(false), + isPortrait: () => Promise.resolve(true), + getResolution: () => Promise.resolve('1920x1080'), + getScale: () => Promise.resolve(2), + getLanguage: () => Promise.resolve('en-US'), + getAndroidIdfa: () => Promise.resolve('my-android-idfa'), + getSystemAvailableMemory: () => Promise.resolve(2000000000), + getAppSetId: () => Promise.resolve('my-app-set'), + getAppSetIdScope: () => Promise.resolve('my-app-set-scope'), + }, + }); + + const payloads: Payload[] = []; + const tracker = trackerCore({ + corePlugins: [sessionPlugin.plugin], + callback: (pb) => payloads.push(pb.build()), + base64: false, + }); + tracker.track(buildPageView({ pageUrl: 'http://localhost' })); + + expect(payloads.length).toBe(1); + const [payload] = payloads; + expect(payload?.co).toBeDefined(); + const entities = JSON.parse(payload?.co as string).data; + const mobileContext = entities.find((entity: any) => entity.schema === MOBILE_CONTEXT_SCHEMA); + expect(mobileContext).toBeDefined(); + expect(mobileContext.data).toMatchObject({ + osType: 'Android', + osVersion: '11.0', + deviceModel: 'Galaxy S21', + deviceManufacturer: 'Samsung', + carrier: 'Vodafone', + networkType: 'wifi', + networkTechnology: '5G', + appleIdfa: 'my-idfa', + appleIdfv: 'my-idfv', + availableStorage: 1000000000, + totalStorage: 2000000000, + physicalMemory: 8000000000, + appAvailableMemory: 2000000000, + batteryLevel: 50, + batteryState: 'full', + lowPowerMode: false, + isPortrait: true, + resolution: '1920x1080', + scale: 2, + language: 'en-US', + androidIdfa: 'my-android-idfa', + systemAvailableMemory: 2000000000, + appSetId: 'my-app-set', + appSetIdScope: 'my-app-set-scope', + }); + }); + + it('truncates language to 8 characters', async () => { + const sessionPlugin = await newPlatformContextPlugin({ + platformContextRetriever: { + getLanguage: () => Promise.resolve('1234567890'), + }, + }); + + const payloads: Payload[] = []; + const tracker = trackerCore({ + corePlugins: [sessionPlugin.plugin], + callback: (pb) => payloads.push(pb.build()), + base64: false, + }); + tracker.track(buildPageView({ pageUrl: 'http://localhost' })); + + expect(payloads.length).toBe(1); + const [payload] = payloads; + expect(payload?.co).toBeDefined(); + const entities = JSON.parse(payload?.co as string).data; + const mobileContext = entities.find((entity: any) => entity.schema === MOBILE_CONTEXT_SCHEMA); + expect(mobileContext?.data.language).toBe('12345678'); + }); +}); diff --git a/trackers/react-native-tracker/test/plugins/session.test.ts b/trackers/react-native-tracker/test/plugins/session.test.ts new file mode 100644 index 000000000..bd8fd3563 --- /dev/null +++ b/trackers/react-native-tracker/test/plugins/session.test.ts @@ -0,0 +1,270 @@ +import { buildPageView, buildSelfDescribingEvent, Payload, trackerCore } from '@snowplow/tracker-core'; +import { newSessionPlugin } from '../../src/plugins/session'; +import AsyncStorage from '@react-native-async-storage/async-storage'; + +function createAsyncStorageMock() { + const storageState: Record = {}; + + return { + getItem: (key: string) => Promise.resolve(storageState[key] ?? null), + setItem: (key: string, value: string) => { + storageState[key] = value; + + return Promise.resolve(); + }, + }; +} + +describe('Session plugin', () => { + beforeAll(() => { + jest.useFakeTimers(); + }); + + beforeEach(async () => { + await AsyncStorage.clear(); + }); + + afterAll(() => { + jest.clearAllTimers(); + }); + + it('starts a new session when necessary', async () => { + jest.setSystemTime(new Date('2022-04-17T00:00:00.000Z')); + const sessionPlugin = await newSessionPlugin({ + asyncStorage: AsyncStorage, + namespace: 'test', + foregroundSessionTimeout: 5, + backgroundSessionTimeout: 5, + }); + + const sessionState = await sessionPlugin.getSessionState(); + expect(sessionState.sessionIndex).toBe(1); + + jest.setSystemTime(new Date('2022-04-17T00:00:10.000Z')); + + const tracker = trackerCore({ corePlugins: [sessionPlugin.plugin] }); + tracker.track(buildPageView({ pageUrl: 'http://localhost' })); + + const newSessionState = await sessionPlugin.getSessionState(); + expect(newSessionState.sessionIndex).toBe(2); + expect(newSessionState.previousSessionId).toBe(sessionState.sessionId); + }); + + it('attaches session context to events with the correct properties', async () => { + jest.setSystemTime(new Date('2022-04-17T00:00:00.000Z')); + const sessionPlugin = await newSessionPlugin({ + asyncStorage: AsyncStorage, + namespace: 'test', + foregroundSessionTimeout: 5, + backgroundSessionTimeout: 5, + }); + + const payloads: Payload[] = []; + const tracker = trackerCore({ + corePlugins: [sessionPlugin.plugin], + callback: (pb) => payloads.push(pb.build()), + base64: false, + }); + + tracker.track(buildPageView({ pageUrl: 'http://localhost' })); + tracker.track(buildPageView({ pageUrl: 'http://localhost' })); + + expect(payloads.length).toBe(2); + expect(JSON.parse(payloads[0]?.co as string).data).toEqual([ + { + schema: 'iglu:com.snowplowanalytics.snowplow/client_session/jsonschema/1-0-2', + data: { + userId: await sessionPlugin.getSessionUserId(), + sessionId: await sessionPlugin.getSessionId(), + sessionIndex: 1, + storageMechanism: 'LOCAL_STORAGE', + eventIndex: 1, + firstEventId: payloads[0]?.eid, + firstEventTimestamp: '2022-04-17T00:00:00.000Z', + }, + }, + ]); + expect(JSON.parse(payloads[1]?.co as string).data).toEqual([ + { + schema: 'iglu:com.snowplowanalytics.snowplow/client_session/jsonschema/1-0-2', + data: { + userId: await sessionPlugin.getSessionUserId(), + sessionId: await sessionPlugin.getSessionId(), + sessionIndex: 1, + storageMechanism: 'LOCAL_STORAGE', + eventIndex: 2, + firstEventId: payloads[0]?.eid, + firstEventTimestamp: '2022-04-17T00:00:00.000Z', + }, + }, + ]); + }); + + it('creates a new session when new tracker is created', async () => { + jest.setSystemTime(new Date('2022-04-17T00:00:00.000Z')); + const sessionPlugin = await newSessionPlugin({ + asyncStorage: AsyncStorage, + namespace: 'test', + foregroundSessionTimeout: 5, + backgroundSessionTimeout: 5, + }); + + const tracker1 = trackerCore({ corePlugins: [sessionPlugin.plugin] }); + tracker1.track(buildPageView({ pageUrl: 'http://localhost' })); + + const sessionState = await sessionPlugin.getSessionState(); + expect(sessionState.sessionIndex).toBe(1); + + const sessionPlugin2 = await newSessionPlugin({ + asyncStorage: AsyncStorage, + namespace: 'test', + foregroundSessionTimeout: 5, + backgroundSessionTimeout: 5, + }); + + const newSessionState = await sessionPlugin2.getSessionState(); + expect(newSessionState.sessionIndex).toBe(2); + expect(newSessionState.previousSessionId).toBe(sessionState.sessionId); + }); + + it('uses a background timeout when in background', async () => { + jest.setSystemTime(new Date('2022-04-17T00:00:00.000Z')); + const sessionPlugin = await newSessionPlugin({ + asyncStorage: AsyncStorage, + namespace: 'test', + foregroundSessionTimeout: 1000, + backgroundSessionTimeout: 5, + }); + + const tracker = trackerCore({ corePlugins: [sessionPlugin.plugin] }); + tracker.track( + buildSelfDescribingEvent({ + event: { + schema: 'iglu:com.snowplowanalytics.snowplow/application_background/jsonschema/1-0-0', + data: {}, + }, + }) + ); + + let sessionState = await sessionPlugin.getSessionState(); + expect(sessionState.sessionIndex).toBe(1); + const firstSessionId = sessionState.sessionId; + + jest.setSystemTime(new Date('2022-04-17T00:00:05.000Z')); + tracker.track(buildPageView({ pageUrl: 'http://localhost' })); + sessionState = await sessionPlugin.getSessionState(); + expect(sessionState.sessionIndex).toBe(1); + + jest.setSystemTime(new Date('2022-04-17T00:00:15.000Z')); + tracker.track(buildPageView({ pageUrl: 'http://localhost' })); + + sessionState = await sessionPlugin.getSessionState(); + expect(sessionState.sessionIndex).toBe(2); + expect(sessionState.previousSessionId).toBe(firstSessionId); + }); + + it('uses a foreground timeout when in foreground', async () => { + jest.setSystemTime(new Date('2022-04-17T00:00:00.000Z')); + const sessionPlugin = await newSessionPlugin({ + asyncStorage: AsyncStorage, + namespace: 'test', + foregroundSessionTimeout: 5, + backgroundSessionTimeout: 1, + }); + + const tracker = trackerCore({ corePlugins: [sessionPlugin.plugin] }); + + let sessionState = await sessionPlugin.getSessionState(); + expect(sessionState.sessionIndex).toBe(1); + const firstSessionId = sessionState.sessionId; + + jest.setSystemTime(new Date('2022-04-17T00:00:02.000Z')); + tracker.track(buildPageView({ pageUrl: 'http://localhost' })); + expect(sessionState.sessionIndex).toBe(1); + + jest.setSystemTime(new Date('2022-04-17T00:00:10.000Z')); + tracker.track(buildPageView({ pageUrl: 'http://localhost' })); + sessionState = await sessionPlugin.getSessionState(); + expect(sessionState.sessionIndex).toBe(2); + expect(sessionState.previousSessionId).toBe(firstSessionId); + }); + + it('has separate session state for different namespaces', async () => { + jest.setSystemTime(new Date('2022-04-17T00:00:00.000Z')); + const sessionPlugin1 = await newSessionPlugin({ + asyncStorage: AsyncStorage, + namespace: 'test1', + foregroundSessionTimeout: 5, + backgroundSessionTimeout: 5, + }); + + const sessionPlugin2 = await newSessionPlugin({ + asyncStorage: AsyncStorage, + namespace: 'test2', + foregroundSessionTimeout: 5, + backgroundSessionTimeout: 5, + }); + + const tracker1 = trackerCore({ corePlugins: [sessionPlugin1.plugin] }); + const tracker2 = trackerCore({ corePlugins: [sessionPlugin2.plugin] }); + + tracker1.track(buildPageView({ pageUrl: 'http://localhost' })); + tracker2.track(buildPageView({ pageUrl: 'http://localhost' })); + + const sessionState1 = await sessionPlugin1.getSessionState(); + const sessionState2 = await sessionPlugin2.getSessionState(); + + expect(sessionState1.sessionIndex).toBe(1); + expect(sessionState2.sessionIndex).toBe(1); + }); + + it('retrieves the correct information from the session plugin', async () => { + jest.setSystemTime(new Date('2022-04-17T00:00:00.000Z')); + const sessionPlugin = await newSessionPlugin({ + asyncStorage: AsyncStorage, + namespace: 'test', + foregroundSessionTimeout: 5, + backgroundSessionTimeout: 5, + }); + + const tracker = trackerCore({ corePlugins: [sessionPlugin.plugin] }); + tracker.track(buildPageView({ pageUrl: 'http://localhost' })); + + const userId = await sessionPlugin.getSessionUserId(); + const sessionId = await sessionPlugin.getSessionId(); + const sessionIndex = await sessionPlugin.getSessionIndex(); + const sessionState = await sessionPlugin.getSessionState(); + + expect(userId).toBeDefined(); + expect(sessionId).toBeDefined(); + expect(sessionIndex).toBe(1); + expect(sessionState.userId).toEqual(userId); + expect(sessionState.sessionId).toEqual(sessionId); + expect(sessionState.sessionIndex).toEqual(sessionIndex); + }); + + it('retrieves the correct information from the session plugin with a custom async storage', async () => { + jest.setSystemTime(new Date('2022-04-17T00:00:00.000Z')); + const sessionPlugin = await newSessionPlugin({ + asyncStorage: createAsyncStorageMock(), + namespace: 'test', + foregroundSessionTimeout: 5, + backgroundSessionTimeout: 5, + }); + + const tracker = trackerCore({ corePlugins: [sessionPlugin.plugin] }); + tracker.track(buildPageView({ pageUrl: 'http://localhost' })); + + const userId = await sessionPlugin.getSessionUserId(); + const sessionId = await sessionPlugin.getSessionId(); + const sessionIndex = await sessionPlugin.getSessionIndex(); + const sessionState = await sessionPlugin.getSessionState(); + + expect(userId).toBeDefined(); + expect(sessionId).toBeDefined(); + expect(sessionIndex).toBe(1); + expect(sessionState.userId).toEqual(userId); + expect(sessionState.sessionId).toEqual(sessionId); + expect(sessionState.sessionIndex).toEqual(sessionIndex); + }); +}); diff --git a/trackers/react-native-tracker/test/subject.test.ts b/trackers/react-native-tracker/test/subject.test.ts new file mode 100644 index 000000000..f1644a88c --- /dev/null +++ b/trackers/react-native-tracker/test/subject.test.ts @@ -0,0 +1,138 @@ +import { CorePluginConfiguration, Payload } from '@snowplow/tracker-core'; +import { newTracker, ReactNativeTracker } from '../src'; + +describe('Subject', () => { + let tracker: ReactNativeTracker; + let payloads: Payload[]; + const plugin: CorePluginConfiguration = { + plugin: { + filter: (payload) => { + payloads.push(payload); + return false; + }, + }, + }; + + beforeEach(() => { + payloads = []; + }); + + describe('Subject configuration', () => { + beforeEach(async () => { + tracker = await newTracker({ + namespace: 'test', + endpoint: 'http://localhost:9090', + userId: 'user-id', + networkUserId: 'network-user-id', + domainUserId: 'domain-user-id', + useragent: 'user-agent', + ipAddress: 'ip-address', + timezone: 'timezone', + language: 'sk', + screenResolution: [1920, 1080], + colorDepth: 24, + screenViewport: [1200, 800], + }); + tracker.addPlugin(plugin); + }); + + it('adds the subject props from configuration', async () => { + tracker.trackPageViewEvent({ pageUrl: 'http://localhost:9090', pageTitle: 'Home' }); + + expect(payloads.length).toBe(1); + const [payload] = payloads; + expect(payload?.uid).toBe('user-id'); + expect(payload?.nuid).toBe('network-user-id'); + expect(payload?.duid).toBe('domain-user-id'); + expect(payload?.ua).toBe('user-agent'); + expect(payload?.ip).toBe('ip-address'); + expect(payload?.tz).toBe('timezone'); + expect(payload?.lang).toBe('sk'); + expect(payload?.res).toBe('1920x1080'); + expect(payload?.cd).toBe('24'); + expect(payload?.vp).toBe('1200x800'); + }); + }); + + describe('Subject methods', () => { + beforeEach(async () => { + tracker = await newTracker({ namespace: 'test', endpoint: 'http://localhost:9090' }); + tracker.addPlugin(plugin); + }); + + it('sets the user id', () => { + tracker.setUserId('user-id'); + tracker.trackPageViewEvent({ pageUrl: 'http://localhost:9090', pageTitle: 'Home' }); + + expect(payloads.length).toBe(1); + const [payload] = payloads; + expect(payload?.uid).toBe('user-id'); + }); + + it('sets the network user id', () => { + tracker.setNetworkUserId('network-user-id'); + tracker.trackPageViewEvent({ pageUrl: 'http://localhost:9090', pageTitle: 'Home' }); + + expect(payloads.length).toBe(1); + const [payload] = payloads; + expect(payload?.nuid).toBe('network-user-id'); + }); + + it('sets the domain user id', () => { + tracker.setDomainUserId('domain-user-id'); + tracker.trackPageViewEvent({ pageUrl: 'http://localhost:9090', pageTitle: 'Home' }); + + expect(payloads.length).toBe(1); + const [payload] = payloads; + expect(payload?.duid).toBe('domain-user-id'); + }); + + it('sets the screen resolution', () => { + tracker.setScreenResolution([1920, 1080]); + tracker.trackPageViewEvent({ pageUrl: 'http://localhost:9090', pageTitle: 'Home' }); + + expect(payloads.length).toBe(1); + const [payload] = payloads; + expect(payload?.res).toBe('1920x1080'); + }); + + it('sets the color depth', () => { + tracker.setColorDepth(24); + tracker.trackPageViewEvent({ pageUrl: 'http://localhost:9090', pageTitle: 'Home' }); + + expect(payloads.length).toBe(1); + const [payload] = payloads; + expect(payload?.cd).toBe('24'); + }); + + it('sets the screen viewport', () => { + tracker.setScreenViewport([1200, 800]); + tracker.trackPageViewEvent({ pageUrl: 'http://localhost:9090', pageTitle: 'Home' }); + + expect(payloads.length).toBe(1); + const [payload] = payloads; + expect(payload?.vp).toBe('1200x800'); + }); + + it('sets the subject data', () => { + tracker.setSubjectData({ + networkUserId: 'network-user-id', + domainUserId: 'domain-user-id', + userId: 'user-id', + useragent: 'user-agent', + ipAddress: 'ip-address', + timezone: 'timezone', + }); + tracker.trackPageViewEvent({ pageUrl: 'http://localhost:9090', pageTitle: 'Home' }); + + expect(payloads.length).toBe(1); + const [payload] = payloads; + expect(payload?.nuid).toBe('network-user-id'); + expect(payload?.duid).toBe('domain-user-id'); + expect(payload?.uid).toBe('user-id'); + expect(payload?.ua).toBe('user-agent'); + expect(payload?.ip).toBe('ip-address'); + expect(payload?.tz).toBe('timezone'); + }); + }); +}); diff --git a/trackers/react-native-tracker/test/tracker.test.ts b/trackers/react-native-tracker/test/tracker.test.ts new file mode 100644 index 000000000..6be0a33a3 --- /dev/null +++ b/trackers/react-native-tracker/test/tracker.test.ts @@ -0,0 +1,331 @@ +import { getTracker, newTracker, removeAllTrackers, removeTracker } from '../src'; +import { MOBILE_CONTEXT_SCHEMA } from '../src/constants'; + +function createMockFetch(status: number, requests: Request[]) { + return async (input: Request) => { + requests.push(input); + let response = new Response(null, { status }); + return response; + }; +} + +describe('Tracker', () => { + let requests: Request[]; + let mockFetch: ReturnType; + + beforeEach(async () => { + requests = []; + mockFetch = createMockFetch(200, requests); + }); + + it('creates a tracker with minimal config', async () => { + expect(await newTracker({ namespace: 'test', endpoint: 'http://localhost:9090' })).toBeDefined(); + }); + + it('retrieves an existing tracker', async () => { + const tracker = await newTracker({ namespace: 'test', endpoint: 'http://localhost:9090' }); + expect(getTracker('test')).toBe(tracker); + expect(getTracker('non-existent')).toBeUndefined(); + }); + + it('removes a tracker', async () => { + await newTracker({ namespace: 'test', endpoint: 'http://localhost:9090' }); + expect(getTracker('test')).toBeDefined(); + removeTracker('test'); + expect(getTracker('test')).toBeUndefined(); + }); + + it('removes all trackers', async () => { + await newTracker({ namespace: 'test', endpoint: 'http://localhost:9090' }); + expect(getTracker('test')).toBeDefined(); + removeAllTrackers(); + expect(getTracker('test')).toBeUndefined(); + }); + + it('tracks a page view event with tracker properties', async () => { + const tracker = await newTracker({ + namespace: 'test', + appId: 'my-app', + endpoint: 'http://localhost:9090', + customFetch: mockFetch, + }); + tracker.trackPageViewEvent({ + pageUrl: 'http://localhost:9090', + pageTitle: 'Home', + }); + await tracker.flush(); + expect(requests.length).toBe(1); + + const [request] = requests; + const payload = await request?.json(); + expect(payload.data.length).toBe(1); + + const [event] = payload.data; + expect(event.p).toBe('mob'); + expect(event.tv).toContain('rn-'); + expect(event.tna).toBe('test'); + expect(event.dtm).toBeDefined(); + expect(event.stm).toBeDefined(); + expect(event.aid).toBe('my-app'); + }); + + it('tracks session along with events', async () => { + const tracker = await newTracker({ + namespace: 'test', + appId: 'my-app', + endpoint: 'http://localhost:9090', + customFetch: mockFetch, + }); + tracker.trackPageViewEvent({ + pageUrl: 'http://localhost:9090', + pageTitle: 'Home', + }); + await tracker.flush(); + expect(requests.length).toBe(1); + + const [request] = requests; + const payload = await request?.json(); + expect(payload.data.length).toBe(1); + expect(payload.data[0].co).toContain('/client_session/'); + expect(payload.data[0].co).toContain(await tracker.getSessionId()); + expect(payload.data[0].co).toContain(await tracker.getSessionUserId()); + expect(await tracker.getSessionId()).toBeDefined(); + expect(await tracker.getSessionUserId()).toBeDefined(); + }); + + it('attaches application context to events', async () => { + const tracker = await newTracker({ + namespace: 'test', + appId: 'my-app', + appVersion: '1.0.1', + endpoint: 'http://localhost:9090', + customFetch: mockFetch, + }); + tracker.trackPageViewEvent({ + pageUrl: 'http://localhost:9090', + pageTitle: 'Home', + }); + await tracker.flush(); + expect(requests.length).toBe(1); + + const [request] = requests; + const payload = await request?.json(); + expect(payload.data.length).toBe(1); + expect(payload.data[0].co).toContain('/application/'); + expect(payload.data[0].co).toContain('1.0.1'); + }); + + it('tracks screen engagement events', async () => { + const tracker = await newTracker({ + namespace: 'test', + endpoint: 'http://localhost:9090', + customFetch: mockFetch, + }); + + tracker.trackScreenViewEvent({ + name: 'Home', + }); + await tracker.flush(); + expect(requests.length).toBe(1); + + const [request] = requests; + const payload = await request?.json(); + expect(payload.data.length).toBe(1); + expect(payload.data[0].ue_pr).toBeDefined(); + expect(payload.data[0].ue_pr).toContain('/screen_view/'); + expect(payload.data[0].co).toContain('/screen/'); + + tracker.trackScrollChangedEvent({ + xOffset: 101, + }); + tracker.trackListItemViewEvent({ + index: 1, + itemsCount: 909, + }); + tracker.trackScreenViewEvent({ name: 'About' }); + await tracker.flush(); + + expect(requests.length).toBe(2); + const [, secondRequest] = requests; + const secondPayload = await secondRequest?.json(); + expect(secondPayload.data.length).toBe(2); + const [screenEndEvent] = secondPayload.data; + expect(screenEndEvent.ue_pr).toBeDefined(); + expect(screenEndEvent.ue_pr).toContain('screen_end'); + expect(screenEndEvent.co).toBeDefined(); + expect(screenEndEvent.co).toContain('screen_summary'); + expect(screenEndEvent.co).toContain('101'); + expect(screenEndEvent.co).toContain('909'); + }); + + it('doesnt track screen engagement events if disabled', async () => { + const tracker = await newTracker({ + namespace: 'test', + endpoint: 'http://localhost:9090', + customFetch: mockFetch, + screenContext: false, + screenEngagementAutotracking: false, + }); + + tracker.trackScreenViewEvent({ + name: 'Home', + }); + tracker.trackScreenViewEvent({ + name: 'About', + }); + await tracker.flush(); + expect(requests.length).toBe(1); + + const [request] = requests; + + const payload = await request?.json(); + expect(payload.data.length).toBe(2); + + const [screen1, screen2] = payload.data; + expect(screen1.ue_pr).toBeDefined(); + expect(screen1.ue_pr).toContain('/screen_view/'); + expect(screen1.co ?? '').not.toContain('/screen/'); + + expect(screen2.ue_pr).toBeDefined(); + expect(screen2.ue_pr).toContain('/screen_view/'); + expect(screen2.co ?? '').not.toContain('/screen/'); + }); + + it('adds a tracker plugin', async () => { + const tracker = await newTracker({ + namespace: 'test', + endpoint: 'http://localhost:9090', + customFetch: mockFetch, + }); + + let pluginCalled = false; + tracker.addPlugin({ + plugin: { + afterTrack: () => { + pluginCalled = true; + }, + }, + }); + + tracker.trackPageViewEvent({ + pageUrl: 'http://localhost:9090', + pageTitle: 'Home', + }); + await tracker.flush(); + expect(pluginCalled).toBe(true); + }); + + it('tracks a platform context entity along with events unless disabled', async () => { + jest.mock('react-native/Libraries/Utilities/Platform', () => ({ + OS: 'ios', + Version: '18.0', + constants: { + osVersion: '18.0', + systemName: 'iOS', + }, + select: () => null, + })); + + const tracker = await newTracker({ + namespace: 'test', + endpoint: 'http://localhost:9090', + customFetch: mockFetch, + }); + + tracker.trackPageViewEvent({ + pageUrl: 'http://localhost:9090', + pageTitle: 'Home', + }); + + await tracker.flush(); + const [request] = requests; + const payload = await request?.json(); + expect(payload.data.length).toBe(1); + + const [event] = payload.data; + expect(event.co).toBeDefined(); + expect(event.co).toContain(MOBILE_CONTEXT_SCHEMA); + + tracker.disablePlatformContext(); + tracker.trackPageViewEvent({ + pageUrl: 'http://localhost:9090', + pageTitle: 'Home', + }); + + await tracker.flush(); + const [, request2] = requests; + const payload2 = await request2?.json(); + expect(payload2.data.length).toBe(1); + + const [event2] = payload2.data; + expect(event2.co ?? '').not.toContain(MOBILE_CONTEXT_SCHEMA); + }); + + describe('Global contexts', () => { + it('adds a global context', async () => { + const tracker = await newTracker({ + namespace: 'test', + endpoint: 'http://localhost:9090', + customFetch: mockFetch, + }); + + tracker.addGlobalContexts([ + { + schema: 'iglu:com.acme/user/jsonschema/1-0-0', + data: { + userType: 'tester', + }, + }, + ]); + + tracker.trackPageViewEvent({ + pageUrl: 'http://localhost:9090', + pageTitle: 'Home', + }); + await tracker.flush(); + + const [request] = requests; + const payload = await request?.json(); + expect(payload.data.length).toBe(1); + + const [event] = payload.data; + expect(event.co).toBeDefined(); + const context = JSON.parse(event.co as string); + expect(context.data.length).toBeGreaterThanOrEqual(1); + const { data } = context.data.find((c: any) => c.schema === 'iglu:com.acme/user/jsonschema/1-0-0'); + + expect(data.userType).toBe('tester'); + }); + + it('removes a global context', async () => { + const tracker = await newTracker({ + namespace: 'test', + endpoint: 'http://localhost:9090', + customFetch: mockFetch, + }); + + const context = { + schema: 'iglu:com.acme/user/jsonschema/1-0-0', + data: { + userType: 'tester', + }, + }; + + tracker.addGlobalContexts({ c1: context }); + tracker.removeGlobalContexts(['c1']); + + tracker.trackPageViewEvent({ + pageUrl: 'http://localhost:9090', + pageTitle: 'Home', + }); + await tracker.flush(); + + const [request] = requests; + const payload = await request?.json(); + expect(payload.data.length).toBe(1); + + const [event] = payload.data; + expect(event.co ?? '').not.toContain(context.schema); + }); + }); +}); diff --git a/trackers/react-native-tracker/test/web_view_interface.test.ts b/trackers/react-native-tracker/test/web_view_interface.test.ts new file mode 100644 index 000000000..da33775af --- /dev/null +++ b/trackers/react-native-tracker/test/web_view_interface.test.ts @@ -0,0 +1,386 @@ +import { getWebViewCallback, newTracker, removeTracker } from '../src'; + +function createMockFetch(status: number, requests: Request[]) { + return async (input: Request) => { + requests.push(input); + let response = new Response(null, { status }); + return response; + }; +} + +describe('WebView interface', () => { + let requests: Request[]; + let mockFetch: ReturnType; + + beforeEach(async () => { + requests = []; + mockFetch = createMockFetch(200, requests); + }); + + afterEach(() => { + removeTracker('test'); + }); + + it('tracks a page view event', async () => { + const tracker = await newTracker({ + namespace: 'test', + appId: 'my-app', + endpoint: 'http://localhost:9090', + customFetch: mockFetch, + }); + + const webViewInterface = getWebViewCallback(); + webViewInterface({ + nativeEvent: { + data: JSON.stringify({ + command: 'trackPageView', + event: { + title: 'Home', + url: 'http://localhost:9090', + referrer: 'http://refr.com', + }, + }), + }, + }); + + await tracker.flush(); + expect(requests.length).toBe(1); + + const [request] = requests; + const payload = await request?.json(); + expect(payload.data.length).toBe(1); + + const [event] = payload.data; + expect(event.e).toBe('pv'); + expect(event.url).toBe('http://localhost:9090'); + expect(event.refr).toBe('http://refr.com'); + expect(event.page).toBe('Home'); + }); + + it('tracks a self-describing event', async () => { + const tracker = await newTracker({ + namespace: 'test', + appId: 'my-app', + endpoint: 'http://localhost:9090', + customFetch: mockFetch, + encodeBase64: false, + }); + + const webViewInterface = getWebViewCallback(); + webViewInterface({ + nativeEvent: { + data: JSON.stringify({ + command: 'trackSelfDescribingEvent', + event: { + schema: 'iglu:com.snowplowanalytics.snowplow/event/jsonschema/1-0-0', + data: { + key: 'value', + }, + }, + }), + }, + }); + + await tracker.flush(); + expect(requests.length).toBe(1); + + const [request] = requests; + const payload = await request?.json(); + expect(payload.data.length).toBe(1); + + const [event] = payload.data; + const { e, ue_pr } = event; + expect(e).toBe('ue'); + expect(ue_pr).toBeDefined(); + const { data } = JSON.parse(ue_pr); + expect(data.schema).toBe('iglu:com.snowplowanalytics.snowplow/event/jsonschema/1-0-0'); + expect(data.data.key).toBe('value'); + }); + + it('tracks a structured event', async () => { + const tracker = await newTracker({ + namespace: 'test', + appId: 'my-app', + endpoint: 'http://localhost:9090', + customFetch: mockFetch, + }); + + const webViewInterface = getWebViewCallback(); + webViewInterface({ + nativeEvent: { + data: JSON.stringify({ + command: 'trackStructEvent', + event: { + category: 'category', + action: 'action', + label: 'label', + property: 'property', + value: 1, + }, + }), + }, + }); + + await tracker.flush(); + expect(requests.length).toBe(1); + + const [request] = requests; + const payload = await request?.json(); + expect(payload.data.length).toBe(1); + + const [event] = payload.data; + const { e, se_ca, se_ac, se_la, se_pr, se_va } = event; + expect(e).toBe('se'); + expect(se_ca).toBe('category'); + expect(se_ac).toBe('action'); + expect(se_la).toBe('label'); + expect(se_pr).toBe('property'); + expect(se_va).toBe('1'); + }); + + it('tracks a screen view event', async () => { + const tracker = await newTracker({ + namespace: 'test', + appId: 'my-app', + endpoint: 'http://localhost:9090', + customFetch: mockFetch, + encodeBase64: false, + }); + + const webViewInterface = getWebViewCallback(); + webViewInterface({ + nativeEvent: { + data: JSON.stringify({ + command: 'trackScreenView', + event: { + name: 'Home', + id: 'home', + }, + }), + }, + }); + + await tracker.flush(); + expect(requests.length).toBe(1); + + const [request] = requests; + const payload = await request?.json(); + expect(payload.data.length).toBe(1); + + const [event] = payload.data; + expect(event.e).toBe('ue'); + expect(event.ue_pr).toBeDefined(); + const { data } = JSON.parse(event.ue_pr); + expect(data.schema).toBe('iglu:com.snowplowanalytics.mobile/screen_view/jsonschema/1-0-0'); + expect(data.data.name).toBe('Home'); + expect(data.data.id).toBe('home'); + }); + + describe('WebView event tracking', () => { + + it('tracks a page view event', async () => { + const tracker = await newTracker({ + namespace: 'test', + appId: 'my-app', + endpoint: 'http://localhost:9090', + customFetch: mockFetch, + }); + + const webViewInterface = getWebViewCallback(); + webViewInterface({ + nativeEvent: { + data: JSON.stringify({ + command: 'trackWebViewEvent', + event: { + eventName: 'pv', + pageTitle: 'Home', + pageUrl: 'http://localhost:9090', + referrer: 'http://refr.com', + }, + }), + }, + }); + + await tracker.flush(); + expect(requests.length).toBe(1); + + const [request] = requests; + const payload = await request?.json(); + expect(payload.data.length).toBe(1); + + const [event] = payload.data; + expect(event.e).toBe('pv'); + expect(event.url).toBe('http://localhost:9090'); + expect(event.refr).toBe('http://refr.com'); + expect(event.page).toBe('Home'); + }); + + it('tracks a self-describing event', async () => { + const tracker = await newTracker({ + namespace: 'test', + appId: 'my-app', + endpoint: 'http://localhost:9090', + customFetch: mockFetch, + encodeBase64: false, + }); + + const webViewInterface = getWebViewCallback(); + webViewInterface({ + nativeEvent: { + data: JSON.stringify({ + command: 'trackWebViewEvent', + event: { + selfDescribingEventData: { + schema: 'iglu:com.snowplowanalytics.snowplow/event/jsonschema/1-0-0', + data: { + key: 'value', + }, + }, + }, + }), + }, + }); + + await tracker.flush(); + expect(requests.length).toBe(1); + + const [request] = requests; + const payload = await request?.json(); + expect(payload.data.length).toBe(1); + + const [event] = payload.data; + const { e, ue_pr } = event; + expect(e).toBe('ue'); + expect(ue_pr).toBeDefined(); + const { data } = JSON.parse(ue_pr); + expect(data.schema).toBe('iglu:com.snowplowanalytics.snowplow/event/jsonschema/1-0-0'); + expect(data.data.key).toBe('value'); + }); + + it('tracks a structured event', async () => { + const tracker = await newTracker({ + namespace: 'test', + appId: 'my-app', + endpoint: 'http://localhost:9090', + customFetch: mockFetch, + }); + + const webViewInterface = getWebViewCallback(); + webViewInterface({ + nativeEvent: { + data: JSON.stringify({ + command: 'trackWebViewEvent', + event: { + eventName: 'se', + category: 'category', + action: 'action', + label: 'label', + property: 'property', + value: 1, + }, + }), + }, + }); + + await tracker.flush(); + expect(requests.length).toBe(1); + + const [request] = requests; + const payload = await request?.json(); + expect(payload.data.length).toBe(1); + + const [event] = payload.data; + const { e, se_ca, se_ac, se_la, se_pr, se_va } = event; + expect(e).toBe('se'); + expect(se_ca).toBe('category'); + expect(se_ac).toBe('action'); + expect(se_la).toBe('label'); + expect(se_pr).toBe('property'); + expect(se_va).toBe('1'); + }); + + it('tracks a page ping event', async () => { + const tracker = await newTracker({ + namespace: 'test', + appId: 'my-app', + endpoint: 'http://localhost:9090', + customFetch: mockFetch, + }); + + const webViewInterface = getWebViewCallback(); + webViewInterface({ + nativeEvent: { + data: JSON.stringify({ + command: 'trackWebViewEvent', + event: { + eventName: 'pp', + pageTitle: 'Home', + pageUrl: 'http://localhost:9090', + referrer: 'http://refr.com', + pingXOffsetMin: 1, + pingXOffsetMax: 2, + pingYOffsetMin: 3, + pingYOffsetMax: 4, + }, + }), + }, + }); + + await tracker.flush(); + expect(requests.length).toBe(1); + + const [request] = requests; + const payload = await request?.json(); + expect(payload.data.length).toBe(1); + + const [event] = payload.data; + expect(event.e).toBe('pp'); + expect(event.url).toBe('http://localhost:9090'); + expect(event.refr).toBe('http://refr.com'); + expect(event.page).toBe('Home'); + expect(event.pp_mix).toBe('1'); + expect(event.pp_max).toBe('2'); + expect(event.pp_miy).toBe('3'); + expect(event.pp_may).toBe('4'); + }); + }); + + it('tracks tracker version and useragent', async () => { + const tracker = await newTracker({ + namespace: 'test', + appId: 'my-app', + endpoint: 'http://localhost:9090', + customFetch: mockFetch, + }); + + const webViewInterface = getWebViewCallback(); + webViewInterface({ + nativeEvent: { + data: JSON.stringify({ + command: 'trackWebViewEvent', + event: { + eventName: 'pv', + pageTitle: 'Home', + pageUrl: 'http://localhost:9090', + trackerVersion: 'wv-1.0.0', + useragent: 'Mozilla/5.0', + }, + }), + }, + }); + + await tracker.flush(); + expect(requests.length).toBe(1); + + const [request] = requests; + const payload = await request?.json(); + expect(payload.data.length).toBe(1); + + const [event] = payload.data; + expect(event.e).toBe('pv'); + expect(event.url).toBe('http://localhost:9090'); + expect(event.page).toBe('Home'); + expect(event.tv).toBe('wv-1.0.0'); + expect(event.ua).toBe('Mozilla/5.0'); + }); +}); diff --git a/trackers/react-native-tracker/tsconfig.build.json b/trackers/react-native-tracker/tsconfig.build.json new file mode 100644 index 000000000..b33b82320 --- /dev/null +++ b/trackers/react-native-tracker/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig", + "exclude": ["dist", "test"] +} diff --git a/trackers/react-native-tracker/tsconfig.json b/trackers/react-native-tracker/tsconfig.json new file mode 100644 index 000000000..346146e71 --- /dev/null +++ b/trackers/react-native-tracker/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "rootDir": ".", + "paths": { + "@snowplow/react-native-tracker": ["./src/index"] + }, + "allowUnreachableCode": false, + "allowUnusedLabels": false, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "jsx": "react-jsx", + "lib": ["ESNext", "DOM"], + "module": "ESNext", + "moduleResolution": "node", + "noEmit": true, + "noFallthroughCasesInSwitch": true, + "noImplicitReturns": true, + "noImplicitUseStrict": false, + "noStrictGenericChecks": false, + "noUncheckedIndexedAccess": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "strict": true, + "target": "ESNext", + "types": ["node", "jest"] + } +}