diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 6951d34f..00000000 --- a/.editorconfig +++ /dev/null @@ -1,13 +0,0 @@ -# EditorConfig helps developers define and maintain consistent -# coding styles between different editors and IDEs -# editorconfig.org - -root = true - -[*] -indent_style = space -indent_size = 2 -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 00000000..585ac163 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,6 @@ +coverage +demo +dist +node_modules +temp +templates diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 00000000..2eef737c --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,284 @@ +const importRules = { + "import/extensions": [ + "error", + "never", + { + pattern: { + json: "always", + }, + }, + ], + "import/no-unresolved": "off", +}; + +module.exports = { + env: { + es2021: true, + es6: true, + node: true, + }, + extends: [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + ], + overrides: [ + { + env: { + jest: true, + }, + files: ["src/**/*.test.ts"], + rules: { + "max-lines": ["error", 510], + "max-lines-per-function": ["error", 495], + "max-statements": ["error", 28], + }, + }, + { + files: ["*.js"], + rules: { + "@typescript-eslint/no-unused-vars": "off", + "no-unused-vars": "off", + }, + }, + { + files: ["dist/cli.js", "src/cli/index.ts"], + rules: { + "no-process-exit": "off", + "node/shebang": "off", + }, + }, + { + files: ["**/*.md/*.js"], + rules: { + "@typescript-eslint/no-var-requires": "off", + "dot-location": "off", + "no-undef": "off", + }, + }, + ], + parser: "@typescript-eslint/parser", + parserOptions: { + ecmaVersion: 12, + sourceType: "module", + }, + plugins: ["@babel", "@typescript-eslint", "import", "jest", "node", "promise", "unicorn"], + rules: { + ...importRules, + "accessor-pairs": "error", + "array-bracket-newline": "error", + "array-bracket-spacing": "error", + "array-callback-return": "error", + "array-element-newline": "off", + "arrow-body-style": "error", + "arrow-parens": "error", + "arrow-spacing": "error", + "block-scoped-var": "error", + "block-spacing": "error", + "brace-style": "error", + "camelcase": "error", + "capitalized-comments": "error", + "class-methods-use-this": "error", + "comma-dangle": ["error", "always-multiline"], + "comma-spacing": "error", + "comma-style": "error", + "complexity": "error", + "computed-property-spacing": "error", + "consistent-return": "error", + "consistent-this": "error", + "curly": "error", + "default-case": "error", + "default-case-last": "error", + "default-param-last": "error", + "dot-location": "error", + "dot-notation": "error", + "eol-last": "error", + "eqeqeq": "error", + "func-call-spacing": "error", + "func-name-matching": "error", + "func-names": "error", + "func-style": "error", + "function-call-argument-newline": ["error", "never"], + "function-paren-newline": "error", + "generator-star-spacing": "error", + "grouped-accessor-pairs": "error", + "guard-for-in": "error", + "id-denylist": "error", + "id-length": "error", + "id-match": "error", + "implicit-arrow-linebreak": "error", + "indent": [ + "error", + 2, + ], + "init-declarations": "error", + "jsx-quotes": "error", + "key-spacing": "error", + "keyword-spacing": "error", + "line-comment-position": "error", + "linebreak-style": "error", + "lines-around-comment": "error", + "lines-between-class-members": "error", + "max-classes-per-file": "error", + "max-depth": "error", + "max-len": ["error", 115], + "max-lines": ["error", 395], + "max-lines-per-function": ["error", 181], + "max-nested-callbacks": "error", + "max-params": "error", + "max-statements": ["error", 47], + "max-statements-per-line": "error", + "multiline-comment-style": "error", + "multiline-ternary": "error", + "new-cap": "error", + "new-parens": "error", + "newline-per-chained-call": "error", + "no-alert": "error", + "no-array-constructor": "error", + "no-await-in-loop": "error", + "no-bitwise": "error", + "no-caller": "error", + "no-confusing-arrow": "error", + "no-console": "error", + "no-constructor-return": "error", + "no-continue": "error", + "no-div-regex": "error", + "no-duplicate-imports": "error", + "no-else-return": "error", + "no-empty-function": "error", + "no-eq-null": "error", + "no-eval": "error", + "no-extend-native": "error", + "no-extra-bind": "error", + "no-extra-label": "error", + "no-extra-parens": "error", + "no-floating-decimal": "error", + "no-implicit-coercion": "error", + "no-implicit-globals": "error", + "no-implied-eval": "error", + "no-inline-comments": "error", + "no-invalid-this": "error", + "no-iterator": "error", + "no-label-var": "error", + "no-labels": "error", + "no-lone-blocks": "error", + "no-lonely-if": "error", + "no-loop-func": "error", + "no-loss-of-precision": "error", + "no-magic-numbers": "off", + "no-mixed-operators": "error", + "no-multi-assign": "error", + "no-multi-spaces": "error", + "no-multi-str": "error", + "no-multiple-empty-lines": "error", + "no-negated-condition": "error", + "no-nested-ternary": "error", + "no-new": "error", + "no-new-func": "error", + "no-new-object": "error", + "no-new-wrappers": "error", + "no-nonoctal-decimal-escape": "error", + "no-octal-escape": "error", + "no-param-reassign": "error", + "no-plusplus": "error", + "no-process-env": "error", + "no-process-exit": "error", + "no-promise-executor-return": "error", + "no-proto": "error", + "no-restricted-exports": "error", + "no-restricted-globals": "error", + "no-restricted-imports": "error", + "no-restricted-properties": "error", + "no-restricted-syntax": "error", + "no-return-assign": "error", + "no-return-await": "error", + "no-script-url": "error", + "no-self-compare": "error", + "no-sequences": "error", + "no-shadow": "error", + "no-tabs": "error", + "no-template-curly-in-string": "error", + "no-ternary": "error", + "no-throw-literal": "error", + "no-trailing-spaces": "error", + "no-undef": "error", + "no-undef-init": "error", + "no-undefined": "error", + "no-underscore-dangle": "error", + "no-unmodified-loop-condition": "error", + "no-unneeded-ternary": "error", + "no-unreachable-loop": "error", + "no-unsafe-optional-chaining": "error", + "no-unused-expressions": "error", + "no-unused-vars": "error", + "no-use-before-define": "error", + "no-useless-backreference": "error", + "no-useless-call": "error", + "no-useless-computed-key": "error", + "no-useless-concat": "error", + "no-useless-constructor": "error", + "no-useless-rename": "error", + "no-useless-return": "error", + "no-var": "error", + "no-void": "error", + "no-warning-comments": "error", + "no-whitespace-before-property": "error", + "node/no-unpublished-require": "error", + "node/no-unsupported-features/es-syntax": "off", + "nonblock-statement-body-position": "error", + "object-curly-newline": "error", + "object-curly-spacing": "off", + "object-property-newline": "error", + "object-shorthand": "error", + "one-var": "off", + "one-var-declaration-per-line": "error", + "operator-assignment": "error", + "operator-linebreak": "error", + "padded-blocks": "off", + "padding-line-between-statements": "error", + "prefer-arrow-callback": "error", + "prefer-const": "error", + "prefer-destructuring": "error", + "prefer-exponentiation-operator": "error", + "prefer-named-capture-group": "error", + "prefer-numeric-literals": "error", + "prefer-object-spread": "error", + "prefer-promise-reject-errors": "error", + "prefer-regex-literals": "error", + "prefer-rest-params": "error", + "prefer-spread": "error", + "prefer-template": "error", + "quote-props": [ + "error", + "consistent-as-needed", + ], + "quotes": "error", + "radix": "error", + "require-atomic-updates": "error", + "require-await": "error", + "require-unicode-regexp": "error", + "rest-spread-spacing": "error", + "semi": "error", + "semi-spacing": "error", + "semi-style": "error", + "sort-imports": "error", + "sort-keys": "error", + "sort-vars": "error", + "space-before-blocks": "error", + "space-before-function-paren": "error", + "space-in-parens": "error", + "space-infix-ops": "error", + "space-unary-ops": "error", + "spaced-comment": "error", + "strict": "error", + "switch-colon-spacing": "error", + "symbol-description": "error", + "template-curly-spacing": "error", + "template-tag-spacing": "error", + "unicode-bom": "error", + "vars-on-top": "error", + "wrap-iife": "error", + "wrap-regex": "error", + "yield-star-spacing": "error", + "yoda": "error", + }, +}; diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index d4d9703d..f079153e 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -4,7 +4,7 @@ - [ ] I searched for other issues in this repository and none addresses my problem; - [ ] I already tried to make a clean install (deleting `node_modules` dir, `package-lock.json` or `yarn.lock` file and installing again); -- [ ] I am using Node.js >= 24.14.0 (see [`engines`](../../package.json) in `package.json`); +- [ ] I am using a version of Node.js equal to or greater than 10.13.0 (we recently removed support for Node.js versions 8 and below); - [ ] I tried to reproduce this issue with last version of `webpack`, if my project uses `webpack` directly. ## Describe the bug @@ -31,7 +31,7 @@ Please complete the following information: - OS (e.g. macOS): - OS Version (e.g. 10.15.7): -- Node Version (e.g. v26.1.0): +- Node Version (e.g. v12.17.0): - Webpack version, if applicable (e.g. 4.43.0): ### `package.json` diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 85b4708c..d1f0d085 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,50 +1,6 @@ version: 2 - -# Dependabot has two independent mechanisms: -# -# 1. Version updates — configured below. They follow `schedule` (weekly here) -# and cover every new version (patch, minor, and MAJOR — we keep majors so -# we still see them; we just never auto-merge). -# 2. Security updates — NOT scheduled here. They are event-driven: Dependabot -# opens them as soon as a GitHub advisory affects a dependency (faster than -# "daily"), so there is no `interval` for them. They must be enabled in -# Settings → Code security ("Dependabot security updates"). They inherit the -# labels, commit-message, and grouping below (but not the schedule). -# -# There is no literal "unlimited" pull-request cap: a high `open-pull-requests-limit` -# effectively removes the version-update limit. Do NOT use 0 — that disables -# version updates entirely. Security updates keep a fixed internal cap of 10. - updates: - # ── npm: runtime + dev dependencies ────────────────────────────────────── - package-ecosystem: "npm" directory: "/" schedule: - interval: "weekly" - day: "monday" - open-pull-requests-limit: 99 - commit-message: - # Produces "chore(deps): …" for runtime deps and "chore(deps-dev): …" - # for devDependencies — both valid Conventional Commits for this repo. - prefix: "chore" - include: "scope" - groups: - # `node` (the runtime) is not an npm package, so in practice this groups - # @types/node into a single PR. The `node` pattern is kept to match the - # intent and any future literal `node` package. - node: - patterns: - - "node" - - "@types/node" - - # ── GitHub Actions used in workflows (previously unmanaged) ─────────────── - - package-ecosystem: "github-actions" - directory: "/" - schedule: - interval: "weekly" - day: "monday" - open-pull-requests-limit: 99 - commit-message: - # CI tooling → "ci(deps): bump actions/checkout …" - prefix: "ci" - include: "scope" + interval: "daily" diff --git a/.github/instructions/webfont.instructions.md b/.github/instructions/webfont.instructions.md deleted file mode 120000 index b7e6491d..00000000 --- a/.github/instructions/webfont.instructions.md +++ /dev/null @@ -1 +0,0 @@ -../../AGENTS.md \ No newline at end of file diff --git a/.github/workflows/npm-publish.yml b/.github/workflows/npm-publish.yml index c773aed5..33bb0021 100644 --- a/.github/workflows/npm-publish.yml +++ b/.github/workflows/npm-publish.yml @@ -1,225 +1,16 @@ -name: npm publish +name: Node.js Package -# Release pipeline. Triggered by a published GitHub Release (or manually with a -# tag). It builds and validates once, then deploys to two environments: -# -# - `npm` → public registry (https://registry.npmjs.org, `webfont`) -# - `github-packages` → GitHub Packages (https://npm.pkg.github.com, `@itgalaxy/webfont`) -# - `homebrew-core` → PR on Homebrew/homebrew-core (`Formula/w/webfont.rb`) -# -# The `build` job is the single place that builds `dist/`, runs the full test -# suite, and validates the published surface (publint + attw + pack-smoke). It -# uploads `dist/` and the release archives as artifacts so the deploy jobs ship -# the exact same build without repeating it. Deploy jobs run -# `npm publish --ignore-scripts`, so `prepublishOnly` does not rebuild or -# re-validate on the publish runners (avoids the duplicated build in #742). -# -# Auth: `npm` uses the NODE_AUTH_TOKEN repository secret; `github-packages` uses the -# built-in GITHUB_TOKEN (`packages: write`). Environment deployment URLs link to -# each published package page. See CONTRIBUTING.md → "npm publishing". on: release: - types: [published] - workflow_dispatch: - inputs: - tag: - description: Git tag to publish (e.g. v12.0.1) - required: true - -env: - RELEASE_TAG: ${{ github.event_name == 'workflow_dispatch' && inputs.tag || github.event.release.tag_name }} - -permissions: - contents: read + types: [created] jobs: build: runs-on: ubuntu-latest - outputs: - version: ${{ steps.pack.outputs.version }} steps: - - uses: actions/checkout@v7 - with: - ref: ${{ env.RELEASE_TAG }} - - uses: actions/setup-node@v6 + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 with: - node-version: 26.x - cache: npm + node-version: 12 - run: npm ci - - run: npm run audit - run: npm test - - name: Validate published package surface (publint + attw + pack-smoke) - run: npm run test:package - - name: Pack npm tarball and archive dist/ - id: pack - run: | - version="$(node -p 'require("./packages/webfont/package.json").version')" - echo "version=$version" >> "$GITHUB_OUTPUT" - mkdir -p artifacts - npm pack --ignore-scripts --pack-destination artifacts -w webfont - ( cd packages/webfont/dist && zip -r "../../../artifacts/webfont-dist-$version.zip" . ) - - name: Upload built dist/ for the deploy jobs - uses: actions/upload-artifact@v7 - with: - name: dist - path: packages/webfont/dist - if-no-files-found: error - retention-days: 1 - - name: Upload release archives (npm tarball + dist zip) - uses: actions/upload-artifact@v7 - with: - name: release-artifacts - path: artifacts - if-no-files-found: error - retention-days: 1 - - release-assets: - needs: build - runs-on: ubuntu-latest - permissions: - contents: write - steps: - - name: Download release archives - uses: actions/download-artifact@v8 - with: - name: release-artifacts - path: artifacts - - name: Attach archives to the GitHub Release - env: - GH_TOKEN: ${{ github.token }} - run: gh release upload "$RELEASE_TAG" artifacts/* --clobber --repo "$GITHUB_REPOSITORY" - - publish-npm: - needs: build - runs-on: ubuntu-latest - environment: - name: npm - url: https://www.npmjs.com/package/webfont/v/${{ steps.meta.outputs.version }} - steps: - - uses: actions/checkout@v7 - with: - ref: ${{ env.RELEASE_TAG }} - - name: Resolve published version - id: meta - run: echo "version=$(node -p 'require("./packages/webfont/package.json").version')" >> "$GITHUB_OUTPUT" - - uses: actions/setup-node@v6 - with: - node-version: 26.x - package-manager-cache: false - - name: Download dist/ built by the build job - uses: actions/download-artifact@v8 - with: - name: dist - path: packages/webfont/dist - # CI is non-interactive (no `npm login`): write ~/.npmrc so `npm publish` - # reads the token from NODE_AUTH_TOKEN at runtime (npm expands - # ${NODE_AUTH_TOKEN}); the raw token never touches disk or the logs. - # The NODE_AUTH_TOKEN secret must be an npm access token (npmjs.com -> - # Access Tokens), not a GitHub PAT — npmjs.org rejects GitHub tokens. - - name: Write ~/.npmrc for npmjs.org - run: printf '%s\n' 'registry=https://registry.npmjs.org/' '//registry.npmjs.org/:_authToken=${NODE_AUTH_TOKEN}' > "$HOME/.npmrc" - - run: npm publish --ignore-scripts --access public -w webfont - env: - NODE_AUTH_TOKEN: ${{ secrets.NODE_AUTH_TOKEN }} - - publish-github-packages: - needs: build - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - environment: - name: github-packages - url: https://github.com/${{ github.repository }}/pkgs/npm/webfont - steps: - - uses: actions/checkout@v7 - with: - ref: ${{ env.RELEASE_TAG }} - - uses: actions/setup-node@v6 - with: - node-version: 26.x - package-manager-cache: false - - name: Download dist/ built by the build job - uses: actions/download-artifact@v8 - with: - name: dist - path: packages/webfont/dist - # GitHub Packages requires a scope matching the repo owner. Rename in the - # checkout only (not committed) so the same build publishes as - # `@itgalaxy/webfont` alongside the unscoped `webfont` on npmjs.org. - - name: Scope package to the repository owner - run: npm pkg set name=@itgalaxy/webfont -w webfont - # Non-interactive CI auth: write ~/.npmrc pointing the @itgalaxy scope at - # GitHub Packages, with the token read from NODE_AUTH_TOKEN at runtime. - # The built-in GITHUB_TOKEN (packages: write) works out of the box; swap - # for a PAT secret with `write:packages` if you prefer a personal token. - - name: Write ~/.npmrc for GitHub Packages - run: printf '%s\n' '@itgalaxy:registry=https://npm.pkg.github.com/' '//npm.pkg.github.com/:_authToken=${NODE_AUTH_TOKEN}' > "$HOME/.npmrc" - # Publish by workspace path: `npm pkg set name=…` above renames the package to - # `@itgalaxy/webfont`, so `-w webfont` no longer resolves. - - run: npm publish --ignore-scripts -w packages/webfont - env: - NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - update-homebrew-formula: - needs: [build, publish-npm] - runs-on: ubuntu-latest - permissions: - contents: write - steps: - - uses: actions/checkout@v7 - with: - ref: master - fetch-depth: 0 - - uses: actions/setup-node@v6 - with: - node-version: 26.x - cache: npm - - run: npm ci - - name: Bump Homebrew formula url and sha256 - run: node scripts/sync-homebrew-formula.mjs --version "${{ needs.build.outputs.version }}" - - name: Commit and push formula bump - run: | - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add HomebrewFormula/webfont.rb Aliases/webfonts - if git diff --staged --quiet; then - echo "Homebrew formula already up to date" - exit 0 - fi - git commit -m "chore(homebrew): bump formula to webfont@${{ needs.build.outputs.version }} [skip ci]" - git push - - bump-homebrew-core: - if: ${{ secrets.HOMEBREW_COMMITTER_TOKEN != '' }} - needs: [build, publish-npm] - runs-on: ubuntu-latest - permissions: - contents: read - steps: - - uses: actions/checkout@v7 - with: - ref: ${{ env.RELEASE_TAG }} - - uses: actions/setup-node@v6 - with: - node-version: 26.x - - name: Resolve npm tarball url and sha256 - id: npm - run: node scripts/sync-homebrew-formula.mjs --version "${{ needs.build.outputs.version }}" --github-output - - name: Open homebrew-core pull request - uses: mislav/bump-homebrew-formula-action@v4 - with: - formula-name: webfont - formula-path: Formula/w/webfont.rb - homebrew-tap: Homebrew/homebrew-core - base-branch: main - tag-name: ${{ env.RELEASE_TAG }} - download-url: ${{ steps.npm.outputs.url }} - download-sha256: ${{ steps.npm.outputs.sha256 }} - create-pullrequest: true - commit-message: | - webfont {{version}} - - Created by https://github.com/itgalaxy/webfont release workflow - env: - COMMITTER_TOKEN: ${{ secrets.HOMEBREW_COMMITTER_TOKEN }} diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 72627516..20a02ea1 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -11,22 +11,14 @@ jobs: strategy: matrix: - node-version: [24.x, 26.x] + node-version: [14.x, 16.x] steps: - - uses: actions/checkout@v7 + - uses: actions/checkout@v2 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v6 + uses: actions/setup-node@v2 with: node-version: ${{ matrix.node-version }} - cache: npm + cache: 'npm' - run: npm ci - - run: npm run audit - - run: npm run lint:suppressions - - run: npm run typecheck - - run: npm run depcheck - run: npm test - - name: Build VitePress docs site - run: npm run docs:site - - name: Validate published package surface (publint + attw + pack-smoke) - run: npm run test:package diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml deleted file mode 100644 index fab372ae..00000000 --- a/.github/workflows/release-please.yml +++ /dev/null @@ -1,59 +0,0 @@ -name: Release Please - -on: - push: - branches: - - master - -permissions: - contents: write - pull-requests: write - actions: write - -concurrency: - group: release-please-${{ github.repository }} - cancel-in-progress: false - -jobs: - release-please: - runs-on: ubuntu-latest - steps: - - uses: googleapis/release-please-action@v5 - id: release - with: - token: ${{ secrets.GITHUB_TOKEN }} - config-file: release-please-config.json - manifest-file: .release-please-manifest.json - include-component-in-tag: false - - # A GitHub Release created by this workflow uses the built-in GITHUB_TOKEN, - # and events triggered by GITHUB_TOKEN do not start other workflows. So the - # `release: published` event does NOT trigger npm-publish.yml on its own. - # workflow_dispatch is the documented exception: dispatching it with the - # GITHUB_TOKEN DOES start the run. Trigger the publish here when (and only - # when) release-please actually cut a release. - - name: Trigger the npm publish workflow for the new release - if: ${{ steps.release.outputs.releases_created == 'true' }} - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - REPO: ${{ github.repository }} - run: | - # This job does not check out the repo, so pass --repo explicitly - # (gh otherwise looks for a local git remote and fails). release-please - # just cut the release, so it is the most recent one. Retry a few times - # to absorb GitHub API propagation lag right after the release is made. - tag="" - for attempt in 1 2 3 4 5; do - tag="$(gh release list --repo "$REPO" --limit 1 --json tagName --jq '.[0].tagName')" - if [ -n "$tag" ]; then - break - fi - echo "No release visible yet (attempt $attempt/5); retrying in 5s..." - sleep 5 - done - if [ -z "$tag" ]; then - echo "::error::release-please reported a release but no tag could be resolved; not dispatching npm-publish." - exit 1 - fi - echo "Release created; dispatching npm-publish.yml for tag: $tag" - gh workflow run npm-publish.yml --repo "$REPO" --ref master --field tag="$tag" diff --git a/.github/workflows/vercel-deploy.yml b/.github/workflows/vercel-deploy.yml deleted file mode 100644 index e3b8de05..00000000 --- a/.github/workflows/vercel-deploy.yml +++ /dev/null @@ -1,53 +0,0 @@ -name: Deploy docs to Vercel - -# Docs production deploy. Maps to the GitHub Environment `vercel` so each run -# appears under the repo's Deployments tab with a link to the live site. -# See CONTRIBUTING.md → "Vercel docs deployment". -on: - push: - branches: [master] - workflow_dispatch: - -# Never run two production deploys at once; a newer push cancels an in-flight one. -concurrency: - group: vercel-production - cancel-in-progress: true - -permissions: - contents: read - -env: - VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} - VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} - # Pin the CLI for deterministic deploys; override via repo variable when bumping. - VERCEL_CLI_VERSION: ${{ vars.VERCEL_CLI_VERSION || '54.20.1' }} - -jobs: - deploy: - runs-on: ubuntu-latest - # Skip on forks: secrets are not available and the deploy would fail. - if: github.repository == 'itgalaxy/webfont' - environment: - name: vercel - url: ${{ steps.deploy.outputs.url }} - env: - VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }} - steps: - - uses: actions/checkout@v7 - - name: Use Node.js - uses: actions/setup-node@v6 - with: - node-version: 24.x - cache: npm - - name: Install Vercel CLI - run: npm install --global "vercel@${VERCEL_CLI_VERSION}" - - name: Pull Vercel project settings - run: vercel pull --yes --environment=production - - name: Build with Vercel (runs npm run docs:build) - run: vercel build --prod - - name: Deploy prebuilt output to Vercel - id: deploy - run: | - url="$(vercel deploy --prebuilt --prod)" - echo "url=$url" >> "$GITHUB_OUTPUT" - echo "Deployed to $url" diff --git a/.github/workflows/version-bump.yml b/.github/workflows/version-bump.yml new file mode 100644 index 00000000..511a77ba --- /dev/null +++ b/.github/workflows/version-bump.yml @@ -0,0 +1,33 @@ +name: Node.js Packages version bump +on: + push: + branches: [ master ] +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [14.x] + steps: + - name: Set commit author email + run: git config --global user.email "development@itgalaxy.company" + - name: Set commit author name + run: git config --global user.name "itgalaxy" + - name: Checkout repository + uses: actions/checkout@v2 + with: + fetch-depth: "0" + - name: Pull all tags from Lerna semantic release + run: git fetch --depth=1 origin +refs/tags/*:refs/tags/* + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - name: Install project dependencies + run: npm ci --no-optional + - name: Bump versions and create release + run: npm run release + - name: Push tags + run: npm run push-tags + - name: Push commits + run: git push origin diff --git a/.gitignore b/.gitignore index 0a087705..9092d0ef 100755 --- a/.gitignore +++ b/.gitignore @@ -43,6 +43,9 @@ jspm_packages .idea *.iml +#VSCode metadata +.vscode + # Mac files .DS_Store @@ -58,29 +61,9 @@ dist # Store temp files temp -# CLI output when run from repo root without --dest (default cwd) -/webfont.svg -packages/webfont/webfont.svg -output/ - # Environment variables files .env -# Lefthook local overrides (see ADR 0003) -lefthook-local.yml - # Don't commit JavaScript generated files -packages/webfont/src/**/*.js -!packages/webfont/src/fixtures/**/*.js -packages/webfont/src/**/*.d.ts - -# VitePress docs site build output and cache (project root is the srcDir) -.vitepress/dist -.vitepress/cache - -# Generated font demo for the docs site (built by `npm run docs:demo`) -public/font-demo - -# Vercel CLI local state (project link + pulled env) -.vercel -.env*.local +src/**/*.js +src/**/*.d.ts diff --git a/.npmrc b/.npmrc deleted file mode 100644 index cffe8cde..00000000 --- a/.npmrc +++ /dev/null @@ -1 +0,0 @@ -save-exact=true diff --git a/.nvmrc b/.nvmrc deleted file mode 100644 index 6f4247a6..00000000 --- a/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -26 diff --git a/.release-please-manifest.json b/.release-please-manifest.json deleted file mode 100644 index 05397cb1..00000000 --- a/.release-please-manifest.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "packages/webfont": "12.5.0" -} diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..8663fcbd --- /dev/null +++ b/.travis.yml @@ -0,0 +1,44 @@ +language: node_js +sudo: false +dist: trusty +git: + depth: 1 +branches: + only: + - master + - next +cache: + directories: + - $HOME/.npm + - node_modules +matrix: + fast_finish: true + include: + - os: linux + node_js: "14" + script: npm run $JOB_PART + env: JOB_PART=test + - os: linux + node_js: "12" + script: npm run $JOB_PART + env: JOB_PART=test + - os: osx + node_js: "14" + script: npm run $JOB_PART + env: JOB_PART=test + - os: osx + node_js: "12" + script: npm run $JOB_PART + env: JOB_PART=test + +before_install: + - npm install -g npm@latest + - nvm --version + - node --version + - npm --version + +install: + - npm ci + +after_success: + - bash <(curl -s https://codecov.io/bash) diff --git a/.vitepress/config.mts b/.vitepress/config.mts deleted file mode 100644 index 5cd08580..00000000 --- a/.vitepress/config.mts +++ /dev/null @@ -1,119 +0,0 @@ -import { readdirSync } from "node:fs"; -import { dirname, resolve } from "node:path"; -import { fileURLToPath } from "node:url"; -import { defineConfig } from "vitepress"; -import { applyMarkdownLinkRewrites } from "./rewriteMarkdownLinks.mts"; - -const repo = "https://github.com/itgalaxy/webfont"; -const root = resolve(dirname(fileURLToPath(import.meta.url)), ".."); -const migrationDir = resolve(root, "docs/migration"); - -// Read each migration doc in place (no copy) and expose it at /migrating/. -// They are not listed in the sidebar; the single "Migrating" page (MIGRATION.md) -// links to them, so keeping the routes built keeps those links working. -const migrationRewrites = Object.fromEntries( - readdirSync(migrationDir) - .filter((name) => name.endsWith(".md") && name !== "README.md") - .map((name) => [`docs/migration/${name}`, `migrating/${name}`]), -); - -const pageRewrites = { - "README.md": "introduction/getting-started.md", - "FEATURES.md": "introduction/features.md", - "TROUBLESHOOTING.md": "introduction/troubleshooting.md", - "NOTICE.md": "introduction/licenses.md", - "packages/webfont/CHANGELOG.md": "introduction/whats-new.md", - "CONTRIBUTING.md": "contributing/guidelines.md", - "CODE_OF_CONDUCT.md": "contributing/code-of-conduct.md", - "docs/migration/README.md": "contributing/migration-guide.md", - "MIGRATION.md": "migrating/index.md", - "packages/webfont/docs/cli.md": "introduction/cli.md", - "packages/webfont/install.md": "introduction/install.md", - "packages/webfont/docs/configuration.md": "introduction/configuration.md", - "packages/webfont/NOTICE.md": "introduction/licenses.md", - ...migrationRewrites, -} as const; - -const staticRepoLinks = { - LICENSE: `${repo}/blob/master/LICENSE`, - "packages/webfont/LICENSE": `${repo}/blob/master/packages/webfont/LICENSE`, -} as const; - -export default defineConfig({ - lang: "en-US", - title: "webfont", - description: "Generate fonts from SVG icons — with TTF encoding and WOFF/WOFF2 decoding.", - cleanUrls: true, - lastUpdated: true, - ignoreDeadLinks: true, - // packages/webfont/vite.config.ts is for the library build; VitePress must not - // load it as its own Vite config (it is ESM-only under "type":"commonjs"). - vite: { configFile: false }, - srcExclude: [ - "AGENTS.md", - "CLAUDE.md", - "MAINTAINERS.md", - "docs/adr/**", - "packages/grunt-webfont-recipe/**", - "coverage/**", - "packages/webfont/temp/**", - "packages/webfont/demo/**", - "packages/webfont/src/**", - "packages/webfont/templates/**", - "public/**", - ], - rewrites: pageRewrites, - markdown: { - config(md) { - applyMarkdownLinkRewrites(md, pageRewrites, root, staticRepoLinks); - }, - }, - head: [ - ["meta", { name: "theme-color", content: "#0b0b0c" }], - ["meta", { property: "og:title", content: "webfont" }], - ["meta", { property: "og:description", content: "Generate fonts from SVG icons." }], - ], - themeConfig: { - nav: [ - { text: "Guide", link: "/introduction/getting-started" }, - { text: "Install", link: "/introduction/install" }, - { text: "Configuration", link: "/introduction/configuration" }, - { text: "CLI", link: "/introduction/cli" }, - { text: "What's New", link: "/introduction/whats-new" }, - { text: "npm", link: "https://www.npmjs.com/package/webfont" }, - ], - sidebar: [ - { - text: "Introduction", - items: [ - { text: "Getting Started", link: "/introduction/getting-started" }, - { text: "Install", link: "/introduction/install" }, - { text: "Configuration", link: "/introduction/configuration" }, - { text: "CLI Reference", link: "/introduction/cli" }, - { text: "Demo", link: "/demo" }, - { text: "Features", link: "/introduction/features" }, - { text: "Troubleshooting", link: "/introduction/troubleshooting" }, - { text: "What's New", link: "/introduction/whats-new" }, - { text: "Migrating", link: "/migrating/" }, - { text: "Legal Notices", link: "/introduction/licenses" }, - ], - }, - { - text: "Contributing", - items: [ - { text: "Guidelines", link: "/contributing/guidelines" }, - { text: "Code of Conduct", link: "/contributing/code-of-conduct" }, - { text: "Migration Docs", link: "/contributing/migration-guide" }, - { text: "Reporting a Bug", link: `${repo}/blob/master/.github/ISSUE_TEMPLATE/bug_report.md` }, - { text: "Pull Request Template", link: `${repo}/blob/master/.github/pull_request_template.md` }, - ], - }, - ], - socialLinks: [{ icon: "github", link: repo }], - search: { provider: "local" }, - footer: { - message: "Released under the MIT License.", - copyright: "Copyright © itgalaxy", - }, - }, -}); diff --git a/.vitepress/rewriteMarkdownLinks.mts b/.vitepress/rewriteMarkdownLinks.mts deleted file mode 100644 index de074e4e..00000000 --- a/.vitepress/rewriteMarkdownLinks.mts +++ /dev/null @@ -1,144 +0,0 @@ -import { dirname, relative, resolve } from "node:path"; -import type MarkdownIt from "markdown-it"; - -const toSitePath = (rewrittenMd: string): string => { - let path = rewrittenMd.replace(/\.md$/u, ""); - - if (path.endsWith("/index")) { - path = `${path.slice(0, -"/index".length)}/`; - } - - return `/${path}`; -}; - -const isExternalHref = (href: string): boolean => /^https?:/iu.test(href) || href.startsWith("mailto:"); - -export const buildInverseRewrites = (rewrites: Record): Record => - Object.fromEntries(Object.entries(rewrites).map(([from, to]) => [to, from])); - -/** Resolve href to a repo-relative path (e.g. `packages/webfont/install.md`). */ -export const resolveRepoMarkdownPath = (hrefPath: string, pageSourcePath: string, repoRoot: string): string | undefined => { - if (hrefPath.startsWith("/")) { - return undefined; - } - - const absolute = resolve(repoRoot, dirname(pageSourcePath), hrefPath); - const repoRelative = relative(repoRoot, absolute).replace(/\\/gu, "/"); - - if (repoRelative.startsWith("..")) { - return undefined; - } - - return repoRelative; -}; - -const lookupRewrite = (repoRelative: string, rewrites: Record): string | undefined => { - const direct = rewrites[repoRelative]; - - if (direct) { - return direct; - } - - if (!repoRelative.endsWith(".md")) { - return rewrites[`${repoRelative}.md`]; - } - - return undefined; -}; - -export const resolvePageSourcePath = ( - env: { path?: string; relativePath?: string; filePath?: string } | undefined, - inverseRewrites: Record, -): string => { - if (typeof env?.relativePath === "string" && env.relativePath.length > 0) { - return inverseRewrites[env.relativePath] ?? env.relativePath; - } - - if (typeof env?.path === "string" && env.path.length > 0) { - const pagePath = env.path.replace(/\\/gu, "/"); - - if (!pagePath.startsWith("/")) { - return inverseRewrites[pagePath] ?? pagePath; - } - } - - if (typeof env?.filePath === "string" && env.filePath.length > 0) { - return inverseRewrites[env.filePath] ?? env.filePath; - } - - return ""; -}; - -export const rewriteMarkdownHref = ( - href: string, - pageSourcePath: string, - rewrites: Record, - repoRoot: string, - staticLinks: Record = {}, -): string => { - if (!href || isExternalHref(href) || href.startsWith("#")) { - return href; - } - - const hashIndex = href.indexOf("#"); - const pathPart = hashIndex === -1 ? href : href.slice(0, hashIndex); - const fragment = hashIndex === -1 ? "" : href.slice(hashIndex + 1); - - if (pathPart.startsWith("/")) { - return href; - } - - const repoRelative = resolveRepoMarkdownPath(pathPart, pageSourcePath, repoRoot); - - if (repoRelative) { - const staticTarget = staticLinks[repoRelative] ?? staticLinks[`${repoRelative}.md`]; - - if (staticTarget) { - return fragment ? `${staticTarget}#${fragment}` : staticTarget; - } - - const rewritten = lookupRewrite(repoRelative, rewrites); - - if (rewritten) { - const sitePath = toSitePath(rewritten); - - return fragment ? `${sitePath}#${fragment}` : sitePath; - } - } - - return href; -}; - -export const applyMarkdownLinkRewrites = ( - md: MarkdownIt, - rewrites: Record, - repoRoot: string, - staticLinks: Record = {}, -): void => { - const inverseRewrites = buildInverseRewrites(rewrites); - - const defaultLinkOpen = - md.renderer.rules.link_open ?? - ((tokens, idx, options, _env, self) => self.renderToken(tokens, idx, options)); - - md.renderer.rules.link_open = (tokens, idx, options, env, self) => { - const hrefIndex = tokens[idx].attrIndex("href"); - - if (hrefIndex >= 0) { - const href = tokens[idx].attrs?.[hrefIndex]?.[1]; - - if (typeof href === "string") { - const pageSourcePath = resolvePageSourcePath(env, inverseRewrites); - const next = pageSourcePath - ? rewriteMarkdownHref(href, pageSourcePath, rewrites, repoRoot, staticLinks) - : href; - - if (next !== href && tokens[idx].attrs?.[hrefIndex]) { - tokens[idx].attrs[hrefIndex][1] = next; - } - } - } - - return defaultLinkOpen(tokens, idx, options, env, self); - }; -}; diff --git a/.vitepress/rewriteMarkdownLinks.test.mts b/.vitepress/rewriteMarkdownLinks.test.mts deleted file mode 100644 index 512ee326..00000000 --- a/.vitepress/rewriteMarkdownLinks.test.mts +++ /dev/null @@ -1,75 +0,0 @@ -import { dirname, resolve } from "node:path"; -import { fileURLToPath } from "node:url"; -import { describe, expect, it } from "vitest"; -import { - buildInverseRewrites, - resolvePageSourcePath, - rewriteMarkdownHref, -} from "./rewriteMarkdownLinks.mts"; - -const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), ".."); -const repo = "https://github.com/itgalaxy/webfont"; - -const rewrites = { - "README.md": "introduction/getting-started.md", - "FEATURES.md": "introduction/features.md", - "TROUBLESHOOTING.md": "introduction/troubleshooting.md", - "NOTICE.md": "introduction/licenses.md", - "MIGRATION.md": "migrating/index.md", - "packages/webfont/install.md": "introduction/install.md", - "packages/webfont/docs/configuration.md": "introduction/configuration.md", - "packages/webfont/CHANGELOG.md": "introduction/whats-new.md", - "packages/webfont/docs/cli.md": "introduction/cli.md", - "docs/migration/issue-0618-esm-default-import.md": "migrating/issue-0618-esm-default-import.md", -}; - -const staticLinks = { - LICENSE: `${repo}/blob/master/LICENSE`, -}; - -describe("rewriteMarkdownLinks", () => { - it("should resolve page source from VitePress relativePath env", () => { - const inverse = buildInverseRewrites(rewrites); - - expect(resolvePageSourcePath({ relativePath: "introduction/getting-started.md" }, inverse)).toBe("README.md"); - }); - - it("should map install links from the rewritten getting-started page to /introduction/install", () => { - expect(rewriteMarkdownHref("./packages/webfont/install.md", "README.md", rewrites, repoRoot)).toBe("/introduction/install"); - }); - - it("should rewrite links without a .md extension after cleanUrls", () => { - expect(rewriteMarkdownHref("./FEATURES", "README.md", rewrites, repoRoot)).toBe("/introduction/features"); - expect(rewriteMarkdownHref("./TROUBLESHOOTING#icon-details-missing-after-export", "README.md", rewrites, repoRoot)).toBe( - "/introduction/troubleshooting#icon-details-missing-after-export", - ); - }); - - it("should rewrite NOTICE.md alias and LICENSE to static targets", () => { - expect(rewriteMarkdownHref("./NOTICE.md", "README.md", rewrites, repoRoot)).toBe("/introduction/licenses"); - expect(rewriteMarkdownHref("./LICENSE", "README.md", rewrites, repoRoot, staticLinks)).toBe(`${repo}/blob/master/LICENSE`); - }); - - it("should preserve hash fragments when rewriting configuration links", () => { - expect( - rewriteMarkdownHref( - "./packages/webfont/docs/configuration.md#ttfpostprocess", - "README.md", - rewrites, - repoRoot, - ), - ).toBe("/introduction/configuration#ttfpostprocess"); - }); - - it("should rewrite migration and changelog links from README", () => { - expect(rewriteMarkdownHref("./MIGRATION.md", "README.md", rewrites, repoRoot)).toBe("/migrating/"); - expect(rewriteMarkdownHref("./docs/migration/issue-0618-esm-default-import.md", "README.md", rewrites, repoRoot)).toBe( - "/migrating/issue-0618-esm-default-import", - ); - expect(rewriteMarkdownHref("./packages/webfont/CHANGELOG.md", "README.md", rewrites, repoRoot)).toBe("/introduction/whats-new"); - }); - - it("should leave external URLs unchanged", () => { - expect(rewriteMarkdownHref("https://example.com", "README.md", rewrites, repoRoot)).toBe("https://example.com"); - }); -}); diff --git a/.vitepress/theme/HeroDemo.vue b/.vitepress/theme/HeroDemo.vue deleted file mode 100644 index 73536740..00000000 --- a/.vitepress/theme/HeroDemo.vue +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - diff --git a/.vitepress/theme/Layout.vue b/.vitepress/theme/Layout.vue deleted file mode 100644 index 299a4de7..00000000 --- a/.vitepress/theme/Layout.vue +++ /dev/null @@ -1,14 +0,0 @@ - - - diff --git a/.vitepress/theme/index.ts b/.vitepress/theme/index.ts deleted file mode 100644 index def43a0e..00000000 --- a/.vitepress/theme/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -import DefaultTheme from "vitepress/theme"; -import Layout from "./Layout.vue"; - -// Extend the default theme and render the live font demo in the hero's image -// slot (right side on large screens, stacked below the text on small ones). -export default { - extends: DefaultTheme, - Layout, -}; diff --git a/.vitepress/vitest.config.ts b/.vitepress/vitest.config.ts deleted file mode 100644 index 82e8492e..00000000 --- a/.vitepress/vitest.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { defineConfig } from "vitest/config"; - -export default defineConfig({ - test: { - environment: "node", - include: [".vitepress/**/*.test.mts"], - name: "vitepress", - }, -}); diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index b6c80aad..00000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "terminal.integrated.env.osx": { - "npm_config_devdir": "" - }, - "terminal.integrated.env.linux": { - "npm_config_devdir": "" - } -} diff --git a/AGENTS.md b/AGENTS.md deleted file mode 100644 index 9b965be1..00000000 --- a/AGENTS.md +++ /dev/null @@ -1,294 +0,0 @@ -# Agent guidelines - -Instructions for AI agents and contributors automating work in this repository. - -**GitHub Copilot:** repository custom instructions live at [`.github/instructions/webfont.instructions.md`](./.github/instructions/webfont.instructions.md) (symlink to this file). Edit **AGENTS.md** only — not the symlink target path in `.github/instructions/`. [CLAUDE.md](./CLAUDE.md) symlinks here for Claude Code. - -## Monorepo layout - -npm workspaces monorepo ([ADR 0013](./docs/adr/0013-npm-workspaces-monorepo.md)): published library in **`packages/webfont`** (`name: "webfont"` on npm); VitePress docs and user-facing markdown at the **repo root**. Run `npm ci` at root; `npm test` / `npm run build` / `npm run test:package` delegate to the `webfont` workspace. - -## Testing (Vitest) - -### Do not mix sync-throwing `fs` calls inside async callbacks - -In `beforeAll`, `beforeEach`, `afterAll`, `afterEach`, or any `new Promise((resolve, reject) => { ... })` callback, avoid synchronous APIs that throw (`fs.mkdirSync`, `fs.symlinkSync`, `fs.unlinkSync`, bare `throw`, etc.). - -If they throw, the Promise is not rejected cleanly. Vitest may report an uncaught exception instead of a failed hook, which is harder to diagnose. - -**Prefer** `async` hooks with `fs/promises`: - -```ts -beforeAll(async () => { - await fsPromise.mkdir("temp/fixture", { recursive: true }); - await fsPromise.symlink(source, link, "dir"); -}); -``` - -**If you must use a callback-style API** (for example `rimraf`), keep follow-up work outside the callback or wrap sync code in `try/catch` and call `reject(error)`. - -### Sync `fs` in test bodies is fine - -Calling `fs.mkdirSync` / `fs.rmSync` directly in an `async` `it(...)` block is acceptable. Vitest attributes synchronous failures to the test. Use `try/finally` for cleanup. - -### Clean up `mkdtempSync` directories in hooks - -When tests create temp trees with `mkdtempSync`, remove them in an **`async` `afterEach`** via `fs/promises` — do not only reset a tracking array. Clearing the array without `rm` leaks directories under the OS temp folder and skips cleanup when a test fails mid-run. - -```ts -import { rm } from "node:fs/promises"; - -const tempDirs: string[] = []; - -afterEach(async () => { - await Promise.all( - tempDirs.splice(0).map((dir) => rm(dir, { recursive: true, force: true })), - ); -}); -``` - -Use sync `mkdtempSync` / `mkdirSync` in the test body if convenient; keep **deletion async** in the hook (same rule as other async hooks — no sync-throwing `fs.rmSync` in `afterEach` callbacks). - -### Promisify callback-only helpers once - -When a dependency only exposes callbacks (`rimraf`, legacy `fs.mkdir`), extract a small `promisify` helper and use it from `async` hooks instead of nesting callbacks. - -### `it` descriptions must use `should` or `should not` - -Every `it("...")` title in this repo must read as a behavior statement with **`should`** or **`should not`**. This keeps Vitest output scannable and consistent across unit, contract, and CLI integration tests. - -```ts -// Good -it("should return default webfont options", () => { ... }); -it("should not emit result.svg when only woff2 is requested", async () => { ... }); -it("should document that is-svg throws TypeError for non-string input", () => { ... }); - -// Avoid -it("returns default webfont options", () => { ... }); -it("documents that is-svg throws TypeError for non-string input", () => { ... }); -it("throws when given binary font buffers", async () => { ... }); -``` - -When adding or renaming tests, follow this rule even in contract-style `describe` blocks that document library behavior. - -### Tests are required for code changes - -Every PR that changes **runtime behavior** (features, fixes, refactors with observable effects, CLI/API/demo wiring) must include **automated tests in the same change**. Do not land production code and defer tests to a follow-up. - -| Change type | Minimum expectation | -|-------------|---------------------| -| New option, flag, or pipeline step | Unit test(s) for the module + integration test when the public entry (CLI, `webfont()`, worker) is affected | -| Bug fix | A test that **fails without the fix** and names the regression | -| Guard or workaround | Focused unit test documenting **why** the guard exists (see table below) | -| Packaging / build (`packages/webfont/vite.config.ts`, `packages/webfont/package.json#exports`, `files`, `main`, `module`, `browser`, `bin`, `types`, or `dist/` layout) | Run `npm run test:package` locally (publint + attw + pack-smoke) and rely on the CI step; extend `packages/webfont/scripts/pack-smoke-test.mjs` when a new consumer entry point ships. See [ADR 0012](docs/adr/0012-published-package-validation.md). | -| Docs-only | No new tests; say so in the PR **Testing** section | - -Run `npm test` before pushing. For packaging or build changes, also run **`npm run test:package`** — a meta script that runs `publint` (package.json lint), `@arethetypeswrong/cli` (types resolution across node10 / node16 CJS / node16 ESM / bundler), and `packages/webfont/scripts/pack-smoke-test.mjs` (pack + install + ESM & CJS consumer smoke tests that generate a real woff2). This is the layered guardrail that catches regressions of `package.json#exports` / `files` / `types` / `dist/*.{js,mjs,d.ts,d.mts}` that Vitest-in-source cannot see (for example [#618](https://github.com/itgalaxy/webfont/issues/618)). See [ADR 0012](docs/adr/0012-published-package-validation.md). - -### Document guards and error paths with explicit unit tests - -When production code works around a library quirk or adds a defensive guard, add **unit tests that name the reason** — not only integration tests through the full pipeline. - -| Goal | How | -|------|-----| -| Explain why a guard exists | Add a focused test (or `describe` block) that reproduces the library behavior the guard works around | -| Cover error paths | Unit-test the module that throws/rejects; do not rely on a distant integration test alone | -| Prove ordering | Assert downstream callbacks (for example `metadataProvider`) are **not** called when an earlier step fails | -| Avoid implicit coverage | If behavior matters, test it directly — happy path passing elsewhere is not enough | - -Example: `glyphsData.test.ts` — `describe("svg xml validation via xml2js")` documents that `xml2js` accepts empty input without error, then unit-tests the empty-file guard and malformed-xml rejection before metadata lookup. - -Example: `isSvgOutput.test.ts` — documents the `is-svg` dev-dependency contract, negative fixtures, and when `result.svg` is absent (`toBeUndefined`) vs validated (`isSvg(result.svg)`). - -Example: `svg2ttfOutput.test.ts` — documents the `svg2ttf` production contract (via `@xmldom/xmldom`), invalid version options, early pipeline rejection before conversion, and when `result.ttf` is absent vs validated (`isTtf(result.ttf)`). - -Example: `toTtf.test.ts` — unit-tests the `toTtf` wrapper with a `svg2ttf` spy and asserts every `formatsOptions.ttf` field is forwarded. - -Prefer `await expect(fn()).rejects.toThrow(...)` for async failures. Use spies on the next pipeline step to prove early exit. - -### Mocking `fs.createReadStream` under ESM - -Production code imports `createReadStream` as a **named** export from `fs` (`glyphsData.ts`). `vi.spyOn(fs, "createReadStream")` does not intercept that binding under Vitest's ESM module graph. Use `vi.hoisted` plus `vi.mock("fs", …)` that wraps `createReadStream` with `vi.fn(actual.createReadStream)` and assert via `vi.mocked(createReadStream)` — see `glyphsData.test.ts`. - -### Dependency error assertions - -When a test documents a **third-party library contract** (for example `is-svg`, `svg2ttf`, `xml2js`), assert the **error type** or a **loose regex** — not the dependency’s full error message string. Patch and minor releases often reword messages; the behavioral contract is usually the type or a stable fragment. - -```ts -// Good — contract is "non-string input throws TypeError" -expect(() => isSvg(null as unknown as string)).toThrow(TypeError); - -// Good — stable fragment from our pipeline or a documented library quirk -await expect(getGlyphsData([malformedXmlFile], options)).rejects.toThrow(/Unclosed root tag/u); - -// Avoid for dependency-owned messages — brittle across releases -expect(() => isSvg(null as unknown as string)).toThrow("Expected a `string`, got `object`"); -``` - -Exact message strings are fine for **errors thrown by this repository** when the message is part of the public CLI or API contract under test. - -### CLI integration tests (`execCLI`) - -Integration tests in `packages/webfont/src/cli/index.test.ts` run the built CLI via `child_process.exec` and capture **stdout**, **stderr**, and the exit code. - -| Stream | Contract under test | -|--------|---------------------| -| **stderr** | Must be empty on every test — success, failure, and `--verbose`. Assert `expect(output.stderr).toBe("")` so regressions from dependencies writing warnings or errors to stderr are caught. | -| **stdout** | Normal output and CLI errors. `startCli` logs error stacks with `console.log` (stdout), not `console.error` (stderr). On failure, assert the message on `output.stdout`, not `stderr`. | -| **exit code** | Assert `output.code` explicitly for success (`0`) and failure (`1`, `2`, etc.). | - -When adding a new `execCLI` test, include `expect(output.stderr).toBe("")` alongside exit-code and stdout/file assertions so the suite stays consistent. - -### CLI unit tests (`createCli` vs `createMeowCli`) - -`program.test.ts` uses **`createCli`** to stub `CliLike` without running meow. **`program.meow.integration.test.ts`** uses **`createMeowCli`** with real argv parsing. - -| Rule | Detail | -|------|--------| -| **Match `CliLike` in stubs** | Every `createCli({ flags: { … } })` value must satisfy `CliLike["flags"]`. If production types a flag as `string`, the fixture uses a **string** (not a number) — even when the runtime option later accepts `string \| number`. | -| **Assert what the layer under test returns** | `buildOptionsBase` forwards meow string flags unchanged (e.g. `round: "1"` → `options.round === "1"`). Coercion for downstream libraries belongs in later pipeline steps — do not “fix” tests by expecting a number unless `buildOptionsBase` actually converts it. | -| **Prefer meow integration for argv** | When verifying how `--round 4` is parsed, extend `program.meow.integration.test.ts` (or `execCLI`), not `createCli` with numeric literals that `CliLike` does not allow. | -| **Change types and fixtures together** | If `CliLike` or `cliOptions.ts` changes a flag type, update **both** production types and all `createCli` / meow tests in the same PR. | - -Example (`round`, [#569](https://github.com/itgalaxy/webfont/issues/569)): `CliLike.flags.round` is `string`; meow `type: "string"`; `OptionsBase.round` is `string \| number`; `normalizeRoundOption` coerces at the SVG font stream boundary. Tests for `buildOptionsBase` keep `round: "1"` and `expect(options.round).toBe("1")`. - -### CLI and async I/O - -- **Parse CLI flags into real runtime types.** Do not cast meow string flags (for example `--formats`) directly to array types. Parse JSON arrays or comma-separated values into typed structures before passing them to `webfont` (see `parseFormatsFlag`). -- **Await filesystem writes in async CLI flows.** Use `fs.promises.writeFile` (or promisified equivalents) inside `async` functions and `await Promise.all(...)`. Do not wrap callback-based `fs.writeFile` in `Promise.all` — the callback form returns `void`, so the CLI can exit before writes finish and write errors are lost. -- **Model optional runtime hooks accurately.** If code supports an optional callback such as `metadataProvider`, type it as `metadataProvider?: MetadataProvider` — not `null` — so callers and `strictNullChecks` stay aligned. - -### Config mapping, CLI bundles, and user input - -Patterns below come from assistant/CLI review on [#797](https://github.com/itgalaxy/webfont/pull/797) and apply to **any** code that loads external config (`.was`, cosmiconfig, MCP tool args, wizard answers). - -- **Do not override `webfont()` defaults when mapping external configs** unless the source file **explicitly** sets the field. Omit optional keys so `defaultWebfontOptions()` and runtime validation apply — forcing values like `fixedWidth: true` or `fontHeight: 1000` on minimal legacy configs changes font output unexpectedly. -- **Normalize untrusted JSON before property access.** Loaded configs are parsed with `JSON.parse` — validate or defensively coerce fields (for example `formats` must be a non-empty array) before reading `.length` or spreading; prefer falling back or `webfont` validation over `TypeError` at map time. Optional `.was` basename fields (`prefix`, legacy `fontName`, `fontId`, `templateFontName`) must be validated as strings before calling string methods — throw `Invalid .was config: "{field}" must be a string` rather than opaque errors like `trim is not a function`. -- **Guard loaded config JSON in a dedicated module** (for example `guardWasConfigLoad.ts`) so parse/validation logic is reusable: wrap `JSON.parse`, require object shape, validate required string fields (`dest`, `files`, `name`, `template`, …), and include `configPath` (and array index when relevant) in every error. -- **Use `clean`, not `sanitize`, in our identifiers and docs.** Helpers like `cleanWasConfigBasename` express intent; reserve “sanitize” for quoting third-party APIs only. -- **Clean user-derived path segments** before building output filenames. Use `path.basename()` (or equivalent) on names that become `{name}.was`, font basenames, or other disk paths; reject empty, `.`, and `..` basenames. Wizard answers and loaded JSON configs are untrusted input. -- **Clean names before font output paths.** When mapping external configs to `InitialOptions`, clean every field that becomes `fontName`, `fontId`, `templateClassName`, or `templateFontName` before `writeResultFiles` — path traversal in `.was` `name` must not escape `dest` via font filenames. -- **Reuse the same cleaned value for disk paths and persisted fields.** When saving config files, build `{name}.was` from the cleaned basename already written into the payload — do not re-derive the path from the raw input. -- **Polish interactive CLI copy.** Wizard and `--help` strings shown to humans must use correct grammar and clear wording (review prompt `message` fields in enquirer/meow catalog entries). Custom-template wizard defaults should follow `../templates/template.{styleType}.njk` so they match bundled templates and `writeResultFiles` output naming (only `.njk` is stripped from custom template basenames). -- **Sequential batch work without `biome-ignore`.** When order matters (for example multiple `.was` configs), prefer promise chaining (`reduce` + `.then()`) over `await` inside `for` loops — satisfies Biome `lint/performance/noAwaitInLoops` without suppressions. -- **CJS dependencies in the ESM CLI bundle.** The CLI ships as `dist/cli.mjs` with dependencies **external** (not bundled). Dynamic `import("enquirer")` and similar must tolerate both default and namespace export shapes: `const lib = module.default ?? module` before destructuring constructors. -- **No `biome-ignore` unless unavoidable.** Prefer a small refactor (see sequential batch note above) over silencing Biome rules; `lint:suppressions` blocks banned suppressions on pre-commit/CI. - -### Codify review feedback in AGENTS.md - -When Copilot, humans, or bots surface a **reusable** pattern (defensive guards, naming, CLI copy, test style), **update AGENTS.md in the same PR** once the fix lands — do not rely on resolved review threads alone. - -| Situation | Action | -|-----------|--------| -| Valid suggestion that could recur on similar code | Add or extend a bullet under the closest heading (Config mapping, Testing, CLI, …) | -| One-off bug with no general rule | Test + review reply only; no AGENTS.md change | -| Deliberately rejected suggestion | Reply citing AGENTS.md, tests, or code; no AGENTS.md change | - -Before resolving a review thread, ask: *if another agent shipped similar code next month, would AGENTS.md tell them the right pattern?* If not, document it here first (or in the same commit that applies the fix). - -## Documentation - -When a task changes **how users interact with webfont** (CLI flags, programmatic `webfont()` options, defaults, exit behavior, or config file semantics), update user-facing docs in the same change: - -1. **Check for user impact** before finishing — compare CLI help (`packages/webfont/src/cli/meow/cliFlagCatalog.ts` + `npm run docs:cli` → [packages/webfont/docs/cli.md](./packages/webfont/docs/cli.md)), [packages/webfont/docs/configuration.md](./packages/webfont/docs/configuration.md), [README.md](./README.md) and [packages/webfont/README.md](./packages/webfont/README.md), [FEATURES.md](./FEATURES.md), and any examples or fixtures that show usage. -2. **Update README.md** when behavior, accepted input formats, or public options change. Keep CLI flag names and short aliases aligned with `meow` (`-f` / `--formats`, `-u` / `--fontName`, etc.). -3. **Update [FEATURES.md](./FEATURES.md)** when capabilities, stability, properties, or test criteria change. Mark features `stable`, `in-progress`, or `planned`; tick test criteria when coverage exists. -4. **Update [packages/webfont/NOTICE.md](./packages/webfont/NOTICE.md)** when legal notices, font licensing guidance, attribution rules, or runtime dependency licenses change. -5. **Update [TROUBLESHOOTING.md](./TROUBLESHOOTING.md)** for operational errors (symptoms and fixes on the **current** release, not version-to-version deltas). -6. **Update migration docs** when a fix or change alters behavior across releases: add **`docs/migration/issue-NNNN-.md`** (one new file per issue — do **not** append to `MIGRATION.md`; see [docs/migration/README.md](./docs/migration/README.md#entry-structure) for naming, workflow, and entry structure). Include *What changed* → *Before* → *After* → **Workaround on older versions** (when users on older npm releases have a practical alternative) → *After upgrading*. Link the GitHub issue; set **minimum fixed version** in that file when the release ships. -7. **Do not rely on CHANGELOG alone** for unreleased work; Release Please updates `CHANGELOG.md` at release time. - -See also [CONTRIBUTING.md](./CONTRIBUTING.md) — “User-facing changes and documentation”. - -## General - -- Follow [CONTRIBUTING.md](./CONTRIBUTING.md) and existing ADRs under `docs/adr/`. -- Run `npm run depcheck` (Knip) when changing imports or `package.json` dependencies; see [ADR 0008](docs/adr/0008-knip-instead-of-depcheck.md). The **pre-push** Lefthook runs `depcheck` before `npm test`. -- Use conventional commits (`feat`, `fix`, `test`, `docs`, `chore`, `refactor`, `ci`, `build`). Prefer **`chore(deps):`** when the PR changes `package.json` / lockfile dependencies (and **`ci(deps):`** for GitHub Actions bumps) — even if the diff is mostly tests or docs (see [Pull requests](#pull-requests)). This matches the prefixes Dependabot generates via [`.github/dependabot.yml`](./.github/dependabot.yml). -- Releases are handled by Release Please on `master`; do not bump `package.json` version in feature PRs (see [ADR 0004](docs/adr/0004-release-please-instead-of-standard-version.md)). Release git tags use **`v{semver}`** (`v12.0.0`); `release-please-config.json` sets `include-component-in-tag: false` — do not use `webfont-v*` tags. -- Keep changes focused; match surrounding code style and tooling (Biome, Vitest, Lefthook). -- Do not commit unless explicitly asked. -- **Never push to `master`.** Use a branch and open a PR (see [Pull requests](#pull-requests) below). -- **Push without asking.** After commits on a feature or PR branch, run `git push` as part of finishing the work. Do not end responses with “want me to push?” or similar — push, then report what was pushed and the PR URL if applicable. - -### CI workflows - -When adding or editing `.github/workflows/*.yml`, follow [CONTRIBUTING.md](./CONTRIBUTING.md#ci-changes) — especially: - -- **Pin third-party CLI versions** on deploy/release paths; do not use `@latest`. Prefer a repository **variable** with a safe default in the workflow expression (e.g. `vars.VERCEL_CLI_VERSION || '54.20.1'`). -- **Bind secrets once** at the job or step `env` block; reference the env var in `run` commands instead of repeating GitHub Actions `secrets.*` expressions inline across steps. Match existing patterns in `npm-publish.yml` (`NODE_AUTH_TOKEN`) and `vercel-deploy.yml` (`VERCEL_TOKEN`). -- **Map deploy jobs to GitHub Environments** (`npm`, `github-packages`, `vercel`) so production runs appear under **Deployments** with a URL. See [CONTRIBUTING.md](./CONTRIBUTING.md#vercel-docs-deployment). -- **Validate the docs site** when editing VitePress-published markdown (`.vitepress/config.mts` rewrites): run `npm run docs:site` locally (`predocs:site` builds `packages/webfont/dist/cli.mjs` when missing); pre-push and PR CI enforce it after `npm test`. -- **VitePress markdown:** published pages compile as Vue templates — no mustache-style double braces outside fenced code blocks (rephrase, or use HTML entities `{{` / `}}` when literals are required). - -### Lint and type hygiene - -- **No `eslint-disable*` comments.** ESLint is not used; Biome is the linter ([ADR 0001](docs/adr/0001-eslint-vs-biome-linting.md)). Delete stale ESLint suppressions; use `biome-ignore` only when a rule cannot be satisfied by a small code change. -- **No `@ts-expect-error` or `@ts-ignore`.** Resolve types properly: - - Config fixtures with extra keys: `ResultConfig & { key: Type }` + cast in tests. - - Mocks: import the `__mocks__` module for assertions, or a small helper type when a cast is unavoidable (`as unknown as MockType`). - - Expected rejections: `await expect(fn()).rejects.toThrow(...)` (not `try/catch` + conditional expects). - - Unused parameters: `_name` prefix on the parameter or property. -- **No non-null assertions (`!`).** The `style/noNonNullAssertion` Biome rule is `error` with **no per-file override** (including tests). Narrow the value instead: - - `assert(value)` from `node:assert` before use — turns `T | undefined` into `T` and fails the test with a clear message if the assumption ever breaks. - - Optional chaining (`value?.prop`) when the branch tolerates `undefined`. - - Typed fixtures/factories (e.g. `makeResultConfig`) so the value is never `undefined` in the first place. -- **No `ignoreDeprecations` in `packages/webfont/tsconfig.json` (or any tsconfig).** On TypeScript upgrades, migrate deprecated compiler options and fix type errors instead of silencing warnings (see [CONTRIBUTING.md](./CONTRIBUTING.md)). -- **Enforced automatically.** `npm run lint:suppressions` (`scripts/check-no-suppressions.mjs`) scans tracked source files for banned suppressions and fails the build. It runs on **Lefthook pre-commit** and in **CI** (`.github/workflows/pr.yml`), so reintroducing an `eslint-disable`, `@ts-ignore`, `@ts-expect-error`, `@ts-nocheck`, or `ignoreDeprecations` blocks the commit/PR. After edits you can run it directly; `biome-ignore` remains allowed only when a rule cannot be satisfied by a small code change. - -## GitHub issues workflow - -Process open issues **oldest to newest** (`gh issue list --state open`, sort by number). For each issue: - -### Triage (every issue) - -1. Read the report and comments. -2. Assign **`jimmyandrade`** (`gh issue edit --add-assignee jimmyandrade`). -3. Set milestone **`next`** (`--milestone next`). -4. Add one type label: `bug`, `enhancement`, `security`, `ci`, or `question` (match the report; do not duplicate `enhancement` + `bug`). - -### Fix PR (when a code or docs change is needed) - -1. Comment on the issue **in English** as soon as you understand the report: - - What you are investigating. - - **What was discovered** (root cause, reproduction, or why it is not a bug). - - **How it will be fixed** (approach) and link the PR when it exists. - - **Release expectation:** fix is in review / will ship in the **next npm release** after merge — it is **not** on npm until published. - - A **workaround** for users on the current npm version when practical. - Do not leave reporters waiting with only a PR link and no explanation. -2. **Tests first:** check coverage for the affected area. Add or extend tests that name the failure **before** changing production code when coverage is missing. -3. Implement the fix; run `npm test`. -4. **Bugs and behavior changes across releases:** add **`docs/migration/issue-NNNN-.md`** using the [entry structure](./docs/migration/README.md#entry-structure) (*Before* → *After* → **Workaround on older versions** → *After upgrading*). Do not edit `MIGRATION.md` body for new entries — only add a file under `docs/migration/` ([workflow](./docs/migration/README.md)). Link the GitHub issue. Use [TROUBLESHOOTING.md](./TROUBLESHOOTING.md) only when the entry is not version-specific. -5. Open a PR (English title/body, Conventional Commits). Link the issue in **Related issue**; do **not** use `Closes #n` if the issue should stay open until npm publish. -6. Wait for CI; wait for maintainer merge. - -### After merge (before release) - -1. Comment on the issue **in English** with a short **post-merge update**: fix is on `master`, planned for the **next** npm release, link to the merged PR, and repeat the workaround until upgrade. -2. **Keep the issue open** until the fix is published on npm. -3. Point reporters to the migration file for their issue under [`docs/migration/`](./docs/migration/) (workarounds on their version) when the fix is not on npm yet. - -### On release (when the version containing the fix ships) - -1. Comment on the issue **in English** with the **released version** (e.g. `12.1.0`), `npm install` command, and **concrete steps** from that issue’s `docs/migration/issue-*.md` file — not only “upgrade”. -2. **Close the issue** with a short note referencing the release tag / CHANGELOG entry. -3. Update that issue’s migration file: set **Minimum version** and trim obsolete workarounds. - -Skip PRs for duplicates, `wontfix`, or issues that only need a comment (already fixed in a recent release — verify with tests or changelog before closing). - -## Downstream: webfont-assistant - -[webfont-assistant](https://github.com/kmorope/webfont-assistant) is a third-party interactive CLI wrapper around `webfont`. When a change in **this** repository can affect that package (CLI/API/options defaults, `.was` config shape, `writeResultFiles` behavior, Node engine, breaking migrations), **open a PR to [kmorope/webfont-assistant](https://github.com/kmorope/webfont-assistant) in the same work session** — do not defer to a follow-up. - -| Trigger | Action | -|---------|--------| -| Breaking or additive CLI/API change | PR updating `webfont` dependency + mapping code; note minimum webfont version in README | -| New built-in assistant flags (`--assistant`, `--assistant-config`) | Ensure parity docs mention migration from `webfont-assistant` | -| `.was` format change | Update both our assistant module (`packages/webfont/src/cli/assistant/`) and webfont-assistant | -| Deprecated `.was` `fontName` (icon prefix) → `prefix` | Downstream PR: read legacy `fontName`, write `prefix` only; link [issue-0797-was-prefix-field.md](./docs/migration/issue-0797-was-prefix-field.md) | - -Fork via `gh repo fork kmorope/webfont-assistant`, branch from `master`, PR upstream with English title/body. Link the itgalaxy/webfont PR in the downstream PR description. - -## Pull requests - -See **[MAINTAINERS.md](./MAINTAINERS.md)** for branch naming, opening PRs, squash merge, Copilot review threads (including **codifying reusable feedback in this file**), merged-branch rules, and template guidance. Agents must push and open PRs without asking when work is review-ready. diff --git a/Aliases/webfonts b/Aliases/webfonts deleted file mode 120000 index aa644085..00000000 --- a/Aliases/webfonts +++ /dev/null @@ -1 +0,0 @@ -../HomebrewFormula/webfont.rb \ No newline at end of file diff --git a/packages/webfont/CHANGELOG.md b/CHANGELOG.md similarity index 53% rename from packages/webfont/CHANGELOG.md rename to CHANGELOG.md index e897bc4e..700b30a7 100644 --- a/packages/webfont/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,189 +1,100 @@ # Changelog -All notable changes to this project will be documented in this file. See [Conventional Commits](https://www.conventionalcommits.org/) and [Release Please](https://github.com/googleapis/release-please) (ADR [0004](docs/adr/0004-release-please-instead-of-standard-version.md)). +All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. -## [12.5.0](https://github.com/itgalaxy/webfont/compare/v12.4.1...v12.5.0) (2026-07-07) +## [11.3.0](https://github.com/itgalaxy/webfont/compare/v11.2.37...v11.3.0) (2021-09-07) ### Features -* add Grunt recipe and export writeResultFiles ([#791](https://github.com/itgalaxy/webfont/issues/791)) ([67e0cca](https://github.com/itgalaxy/webfont/commit/67e0ccaeb5fe2284e3467af410ca81e4b1d8cd0e)) - -## [12.4.1](https://github.com/itgalaxy/webfont/compare/v12.4.0...v12.4.1) (2026-07-04) - - -### Bug Fixes - -* gate VitePress docs build in pre-push and PR CI ([#777](https://github.com/itgalaxy/webfont/issues/777)) ([8134d0e](https://github.com/itgalaxy/webfont/commit/8134d0eec7044a71340f50a25dbe41e4f93c4c82)) - -## [12.4.0](https://github.com/itgalaxy/webfont/compare/v12.3.0...v12.4.0) (2026-07-04) - - -### Features +* adding config option to prevent ligature unicode generation ([642deb9](https://github.com/itgalaxy/webfont/commit/642deb9235ca88c164e7faa9424aa8d895ecb862)), closes [#457](https://github.com/itgalaxy/webfont/issues/457) -* add TTF to SVG font encoder ([#765](https://github.com/itgalaxy/webfont/issues/765)) ([02a7b44](https://github.com/itgalaxy/webfont/commit/02a7b4475e5291b05b833ebb24fab12965380793)) +### [11.2.37](https://github.com/itgalaxy/webfont/compare/v11.2.36...v11.2.37) (2021-09-06) -## [12.3.0](https://github.com/itgalaxy/webfont/compare/v12.2.0...v12.3.0) (2026-07-04) +### [11.2.36](https://github.com/itgalaxy/webfont/compare/v11.2.35...v11.2.36) (2021-09-04) -### Features +### [11.2.35](https://github.com/itgalaxy/webfont/compare/v11.2.34...v11.2.35) (2021-09-04) -* export Result and ResultConfig types from package entry ([#759](https://github.com/itgalaxy/webfont/issues/759)) ([c785797](https://github.com/itgalaxy/webfont/commit/c7857977855d132a2afe99b3f032d80fd8b567cd)), closes [#758](https://github.com/itgalaxy/webfont/issues/758) +### [11.2.34](https://github.com/itgalaxy/webfont/compare/v11.2.33...v11.2.34) (2021-09-04) -## [12.2.0](https://github.com/itgalaxy/webfont/compare/v12.1.1...v12.2.0) (2026-07-03) +### [11.2.33](https://github.com/itgalaxy/webfont/compare/v11.2.32...v11.2.33) (2021-08-28) -### Features +### [11.2.32](https://github.com/itgalaxy/webfont/compare/v11.2.31...v11.2.32) (2021-08-27) -* add ttfPostProcess hook to post-process generated TTF ([#749](https://github.com/itgalaxy/webfont/issues/749)) ([#751](https://github.com/itgalaxy/webfont/issues/751)) ([90cf54f](https://github.com/itgalaxy/webfont/commit/90cf54fa032f57d27d5cda364ef40c0e7cdccc5b)) -* expose centerVertically option to center glyphs vertically ([#576](https://github.com/itgalaxy/webfont/issues/576)) ([#747](https://github.com/itgalaxy/webfont/issues/747)) ([e84f0b1](https://github.com/itgalaxy/webfont/commit/e84f0b17df33692d7a08b131892feb8f80e4713d)), closes [#746](https://github.com/itgalaxy/webfont/issues/746) +### [11.2.31](https://github.com/itgalaxy/webfont/compare/v11.2.30...v11.2.31) (2021-08-24) -## [12.1.1](https://github.com/itgalaxy/webfont/compare/v12.1.0...v12.1.1) (2026-07-03) +### [11.2.30](https://github.com/itgalaxy/webfont/compare/v11.2.29...v11.2.30) (2021-08-24) -### Bug Fixes +### [11.2.29](https://github.com/itgalaxy/webfont/compare/v11.2.28...v11.2.29) (2021-08-17) -* **build:** expose callable default export from ESM build ([#618](https://github.com/itgalaxy/webfont/issues/618)) ([#735](https://github.com/itgalaxy/webfont/issues/735)) ([862247f](https://github.com/itgalaxy/webfont/commit/862247f59ae226fd4443f451be8a8d1486bff8e2)) +### [11.2.28](https://github.com/itgalaxy/webfont/compare/v11.2.27...v11.2.28) (2021-08-17) -## [12.1.0](https://github.com/itgalaxy/webfont/compare/v12.0.1...v12.1.0) (2026-07-03) +### [11.2.27](https://github.com/itgalaxy/webfont/compare/v11.2.26...v11.2.27) (2021-08-10) -### Features +### [11.2.26](https://github.com/itgalaxy/webfont/compare/v11.2.25...v11.2.26) (2021-08-07) -* add glyphContentTransformFn for stroke SVG icons ([#144](https://github.com/itgalaxy/webfont/issues/144)) ([#712](https://github.com/itgalaxy/webfont/issues/712)) ([d673b44](https://github.com/itgalaxy/webfont/commit/d673b44d62d3387ca9a488c544aab5699f2d455c)) -* encode TTF input to WOFF and WOFF2 ([#13](https://github.com/itgalaxy/webfont/issues/13)) ([#706](https://github.com/itgalaxy/webfont/issues/706)) ([9e3a121](https://github.com/itgalaxy/webfont/commit/9e3a121308d0bd0c06aa6b7cdca598a21460e799)) -* support multiple templates per run ([#158](https://github.com/itgalaxy/webfont/issues/158)) ([#713](https://github.com/itgalaxy/webfont/issues/713)) ([22e27cf](https://github.com/itgalaxy/webfont/commit/22e27cf1d3928ce84a9125571e76b2e7443d6503)) -* **svg:** add opt-in SVGO optimization before font generation ([#724](https://github.com/itgalaxy/webfont/issues/724)) ([#725](https://github.com/itgalaxy/webfont/issues/725)) ([df20252](https://github.com/itgalaxy/webfont/commit/df20252f347fe436f0b394e3f505cb831ff4252a)) -* svgTools diagnostics, ADR 0011, and browser entry stub ([#198](https://github.com/itgalaxy/webfont/issues/198)) ([#715](https://github.com/itgalaxy/webfont/issues/715)) ([3e75307](https://github.com/itgalaxy/webfont/commit/3e753070a298a42c31396a3bdf2aab8e201686f6)) -* **template:** enable liga CSS in built-in HTML preview by default ([#726](https://github.com/itgalaxy/webfont/issues/726)) ([0193c4c](https://github.com/itgalaxy/webfont/commit/0193c4cf24d1ef30f1af2600aa26800acf0f2fdf)) -* **templates:** add unicode-range to built-in [@font-face](https://github.com/font-face) ([#322](https://github.com/itgalaxy/webfont/issues/322)) ([#722](https://github.com/itgalaxy/webfont/issues/722)) ([def7010](https://github.com/itgalaxy/webfont/commit/def70101860a9a74f6f3c71e6ffd212ed98c2ae6)) -* validate webfont options after config merge ([#133](https://github.com/itgalaxy/webfont/issues/133)) ([#711](https://github.com/itgalaxy/webfont/issues/711)) ([b498708](https://github.com/itgalaxy/webfont/commit/b4987084325e59c81a0493d7897a1c8da6a4e41d)) +### [11.2.25](https://github.com/itgalaxy/webfont/compare/v11.2.24...v11.2.25) (2021-08-03) +### [11.2.24](https://github.com/itgalaxy/webfont/compare/v11.2.23...v11.2.24) (2021-08-01) -### Bug Fixes +### [11.2.23](https://github.com/itgalaxy/webfont/compare/v11.2.22...v11.2.23) (2021-07-31) -* **cli:** coerce round at SVG pipeline, keep string|number API ([#569](https://github.com/itgalaxy/webfont/issues/569)) ([#701](https://github.com/itgalaxy/webfont/issues/701)) ([f15bdd3](https://github.com/itgalaxy/webfont/commit/f15bdd308795339fae9c13bfaa86d80078cd845f)) -* **ligatures:** disable ligatures by default for performance ([#558](https://github.com/itgalaxy/webfont/issues/558)) ([#731](https://github.com/itgalaxy/webfont/issues/731)) ([1cb0741](https://github.com/itgalaxy/webfont/commit/1cb0741022876d472ab35ed91d30569492b1a2e1)) -* **ligatures:** warn on large fonts; document browser slowdown ([#558](https://github.com/itgalaxy/webfont/issues/558)) ([#730](https://github.com/itgalaxy/webfont/issues/730)) ([372c10a](https://github.com/itgalaxy/webfont/commit/372c10a873a1bce67fbec2bc71ff0b25367af2e3)) -* **svg:** reject empty glyph paths from stroke-only SVGs ([#327](https://github.com/itgalaxy/webfont/issues/327)) ([#723](https://github.com/itgalaxy/webfont/issues/723)) ([40dfc9d](https://github.com/itgalaxy/webfont/commit/40dfc9db141ca2185fdfe49edb4270d2c09236df)) -* **templates:** separate fontFamily from font file basename ([#331](https://github.com/itgalaxy/webfont/issues/331)) ([#727](https://github.com/itgalaxy/webfont/issues/727)) ([9e2ae00](https://github.com/itgalaxy/webfont/commit/9e2ae00e462657566cb9f9f2871b954db107d682)) +### [11.2.21](https://github.com/itgalaxy/webfont/compare/v11.2.20...v11.2.21) (2021-07-31) -## [12.0.1](https://github.com/itgalaxy/webfont/compare/v12.0.0...v12.0.1) (2026-07-02) +### 11.2.20 (2021-07-31) -### Bug Fixes +### [11.2.22](https://github.com/itgalaxy/webfont/compare/v11.2.21...v11.2.22) (2021-07-31) -* **cli:** support files glob from config without CLI input ([#2](https://github.com/itgalaxy/webfont/issues/2)) ([#696](https://github.com/itgalaxy/webfont/issues/696)) ([26d8c3d](https://github.com/itgalaxy/webfont/commit/26d8c3d60000c5032b5426fd37e9628bbb490602)) +### 11.2.20 (2021-07-31) -## [12.0.0](https://github.com/itgalaxy/webfont/compare/v11.5.21...v12.0.0) (2026-07-02) +### [11.2.21](https://github.com/itgalaxy/webfont/compare/v11.2.20...v11.2.21) (2021-07-31) -### ⚠ BREAKING CHANGES +### [11.2.20](https://github.com/itgalaxy/webfont/compare/v11.2.19...v11.2.20) (2021-07-31) -* We removed support for Node.js 11 and Node.js 10 at this version. Please upgrade your environment to Node.js 12 or higher. -* Starting from version 10 stable, you should use webfont via named import, like this: `import { webfont } from "webfont"`. +### [11.2.19](https://github.com/itgalaxy/webfont/compare/v11.2.18...v11.2.19) (2021-07-27) -### Features +### [11.2.18](https://github.com/itgalaxy/webfont/compare/v11.2.17...v11.2.18) (2021-07-27) -* add new transformation function ([6a0c60c](https://github.com/itgalaxy/webfont/commit/6a0c60c794616abd041aa7da6f9fdc4bd5a4ad6a)), closes [#183](https://github.com/itgalaxy/webfont/issues/183) -* add standalone glyphs data getter ([0cfe581](https://github.com/itgalaxy/webfont/commit/0cfe5819d5e3b8efdc7f35e4437d9bcb88c6e8ee)) -* add standalone options getter ([13b8596](https://github.com/itgalaxy/webfont/commit/13b8596587279f57af2adff2428ca9ac05261714)) -* add support to base64 font strings on templates ([2a56338](https://github.com/itgalaxy/webfont/commit/2a56338c0eb74ec7c680ef80e99e5472d69919ab)) -* add support to ligatures and JSON template ([f622c44](https://github.com/itgalaxy/webfont/commit/f622c44561534f1d997d2ebd82a08e00ca2af86c)) -* adding config option to prevent ligature unicode generation ([642deb9](https://github.com/itgalaxy/webfont/commit/642deb9235ca88c164e7faa9424aa8d895ecb862)), closes [#457](https://github.com/itgalaxy/webfont/issues/457) -* batch decompress and URL input for WOFF/WOFF2 ([#691](https://github.com/itgalaxy/webfont/issues/691)) ([4bd4400](https://github.com/itgalaxy/webfont/commit/4bd440002606a3b05fa9f2ff0cfe8b163d88618a)) -* **cli:** add support to `template-cache-string` argument ([ae8b050](https://github.com/itgalaxy/webfont/commit/ae8b0503506be2544cd5b5a5b0f2c420fec588b5)) -* **cli:** create output folder if it's not present. ([#280](https://github.com/itgalaxy/webfont/issues/280)) ([d66a0d4](https://github.com/itgalaxy/webfont/commit/d66a0d457068b97a1bb747fb0f8ccc473721ff4a)) -* convert WOFF/WOFF2 input to TTF or OTF output ([#689](https://github.com/itgalaxy/webfont/issues/689)) ([7edf787](https://github.com/itgalaxy/webfont/commit/7edf787cacbb53baa94c5e8f6a2b7786f49cd4d1)) -* **demo:** update fonts with ligatures support ([64b10d6](https://github.com/itgalaxy/webfont/commit/64b10d645f43c49f0ffe92ca2978739a3abb115c)) -* **deps:** upgrade cosmiconfig to 7.1.0 ([d83a422](https://github.com/itgalaxy/webfont/commit/d83a4227964fa7f6283ef51c2340467e36969989)), closes [#572](https://github.com/itgalaxy/webfont/issues/572) -* migrate all codebase to TypeScript ([0b71779](https://github.com/itgalaxy/webfont/commit/0b71779a2a3b97eb27af65f64e936d6730dc5eb9)) -* **standalone:** add support to JSON template and cacheString ([ad64421](https://github.com/itgalaxy/webfont/commit/ad64421a9da9cadbaba96e423cc00c1c6be76572)) -* strict TypeScript, CLI hardening, expanded tests, and docs ([#670](https://github.com/itgalaxy/webfont/issues/670)) ([cc20bfc](https://github.com/itgalaxy/webfont/commit/cc20bfcf1798c8809d5b0ed9a6e5e0f6960cc415)) -* **templates:** add cacheString support ([f39d2c1](https://github.com/itgalaxy/webfont/commit/f39d2c1753f19474d1fc0defd7de37b5f9706ca5)) -* **templates:** add template for JSON ([3b704b3](https://github.com/itgalaxy/webfont/commit/3b704b391682a99262c8ffd1a6c2c1bb22b5df58)) -* **types:** add `unicode` key to `GlyphMetadata` ([33fa7cb](https://github.com/itgalaxy/webfont/commit/33fa7cbf618463970f5c38ee23c4f3603678aff8)) -* **types:** allow `unicode` key and Promise as `GlyphTransformFn` output ([a3bde0c](https://github.com/itgalaxy/webfont/commit/a3bde0ccc86e4ca25f5e76cbae9e8e5f202abb56)) +### [11.2.17](https://github.com/itgalaxy/webfont/compare/v11.2.16...v11.2.17) (2021-07-27) ### Bug Fixes -* allow CommonJS in fixture config files for Biome ([ef53ada](https://github.com/itgalaxy/webfont/commit/ef53ada7cae595e4feb6be560d7ff7ed0c6b21f1)) -* **cli:** fail clearly when destination directory is missing ([#626](https://github.com/itgalaxy/webfont/issues/626)) ([7cf273c](https://github.com/itgalaxy/webfont/commit/7cf273c1a73ed1a131b6f770bbf6f69c5621aa3f)) -* **deps:** adapt p-limit v7 ESM for Jest and runtime ([77f669f](https://github.com/itgalaxy/webfont/commit/77f669f24be581f05fa27b308d0a9a045869f9f2)) -* **deps:** adapt ttf2eot adapter for v3 Uint8Array API ([fb5316a](https://github.com/itgalaxy/webfont/commit/fb5316aa7dcf3b4549205df7feb2df6099402a5e)) -* **deps:** bump svgicons2svgfont to 16.0.0 ([c52d79c](https://github.com/itgalaxy/webfont/commit/c52d79ce703eaab07e0ea8997ad55ce098a4429a)) -* **deps:** fix insecure dependency ([59a9604](https://github.com/itgalaxy/webfont/commit/59a96045b3ec2fd296ddc0c49d6ff856105617cb)) -* **deps:** fix security issue ([3abc00a](https://github.com/itgalaxy/webfont/commit/3abc00a50d6c1d107046301d77dcc9f92cc33e16)) -* **deps:** fixed 1 package vulnerability ([feda633](https://github.com/itgalaxy/webfont/commit/feda633a7c20731ce5514891adb3c14c4d9a8323)) -* **deps:** pin @types/nunjucks and document [@types](https://github.com/types) pinning ([8f1a39b](https://github.com/itgalaxy/webfont/commit/8f1a39b311ce69ef8f36bb57e00694d2ec9df74c)) -* **deps:** pin `svgicons2svgfont` to `10.0.1` ([87789d3](https://github.com/itgalaxy/webfont/commit/87789d35b02db36537d26cac3ab9e0e0924d7c81)) -* **deps:** remove unsafe `eslint-plugin-markdown` dep ([dfa5251](https://github.com/itgalaxy/webfont/commit/dfa5251c4e2aadf7e95878047c383d511e9dc7ee)) * **deps:** switch out from latest versions in dependencies ([67efe05](https://github.com/itgalaxy/webfont/commit/67efe057f109b6f02efd62dd84f091e1ed138a9f)), closes [#464](https://github.com/itgalaxy/webfont/issues/464) -* **deps:** upgrade `wawoff2` dependency ([69a8dfb](https://github.com/itgalaxy/webfont/commit/69a8dfb3a70456aaa3777a8734ccccc41397a26c)) -* **deps:** upgrade dependencies ([d623b06](https://github.com/itgalaxy/webfont/commit/d623b06dc8bd9afa5c83b27c5df57404c4b1a3f6)) -* **deps:** upgrade nunjucks to 3.2.4 ([090f737](https://github.com/itgalaxy/webfont/commit/090f7375b16596e4cb176eda3d62811fb59752e5)) -* exclude test files from production build output ([#663](https://github.com/itgalaxy/webfont/issues/663)) ([de9954f](https://github.com/itgalaxy/webfont/commit/de9954fa9c51e2070abe121790b7dafffd629e81)) -* model filePath as result-only metadata ([f557233](https://github.com/itgalaxy/webfont/commit/f5572338f249b5deb2a7b9e1a794b81eb1000978)) -* upgrade globby to 16.2.0 with named import ([#664](https://github.com/itgalaxy/webfont/issues/664)) ([ae00488](https://github.com/itgalaxy/webfont/commit/ae0048841ea1007fa0e477c97886a40e8ecf6d8d)) -* upgrade xml2js to 0.6.2 (CVE-2023-0842) with security tests ([#615](https://github.com/itgalaxy/webfont/issues/615)) ([df6ceb4](https://github.com/itgalaxy/webfont/commit/df6ceb4a5dff2e66ccf265aa854662df0aef2e9d)) +### [11.2.16](https://github.com/itgalaxy/webfont/compare/v11.2.15...v11.2.16) (2021-07-27) -### Code Refactoring +### [11.2.15](https://github.com/itgalaxy/webfont/compare/v11.2.14...v11.2.15) (2021-07-26) -* adopt named import/export system ([31adbc7](https://github.com/itgalaxy/webfont/commit/31adbc7faa974c3d5a1ba9ffd4a5944bcab4fae8)) +### [11.2.14](https://github.com/itgalaxy/webfont/compare/v11.2.13...v11.2.14) (2021-07-26) +### [11.2.13](https://github.com/itgalaxy/webfont/compare/v11.2.12...v11.2.13) (2021-07-24) -### Continuous Integration +### [11.2.12](https://github.com/itgalaxy/webfont/compare/v11.2.11...v11.2.12) (2021-07-23) -* remove Node.js 10 and 11 support ([0f0dbf6](https://github.com/itgalaxy/webfont/commit/0f0dbf64a2b7ce15519bb9ada86fdb2941251a08)) +### [11.2.11](https://github.com/itgalaxy/webfont/compare/v11.2.10...v11.2.11) (2021-07-23) -### [11.5.21](https://github.com/itgalaxy/webfont/compare/v11.5.15...v11.5.21) (2026-07-02) +### [11.2.10](https://github.com/itgalaxy/webfont/compare/v11.2.8...v11.2.10) (2021-07-20) -### Bug Fixes +### [11.2.8](https://github.com/itgalaxy/webfont/compare/v11.2.7...v11.2.8) (2021-07-06) -* allow CommonJS in fixture config files for Biome ([ef53ada](https://github.com/itgalaxy/webfont/commit/ef53ada7cae595e4feb6be560d7ff7ed0c6b21f1)) -* model filePath as result-only metadata ([f557233](https://github.com/itgalaxy/webfont/commit/f5572338f249b5deb2a7b9e1a794b81eb1000978)) +### [11.2.7](https://github.com/itgalaxy/webfont/compare/v11.2.6...v11.2.7) (2021-07-01) -### [11.5.15](https://github.com/itgalaxy/webfont/compare/v11.5.11...v11.5.15) (2026-07-02) +### [11.2.6](https://github.com/itgalaxy/webfont/compare/v11.2.5...v11.2.6) (2021-06-29) -### Bug Fixes - -* **deps:** pin @types/nunjucks and document [@types](https://github.com/types) pinning ([8f1a39b](https://github.com/itgalaxy/webfont/commit/8f1a39b311ce69ef8f36bb57e00694d2ec9df74c)) -* **deps:** upgrade nunjucks to 3.2.4 ([090f737](https://github.com/itgalaxy/webfont/commit/090f7375b16596e4cb176eda3d62811fb59752e5)), closes [#651](https://github.com/itgalaxy/webfont/issues/651) - -### [11.5.11](https://github.com/itgalaxy/webfont/compare/v11.5.9...v11.5.11) (2026-07-02) - -### Bug Fixes - -* **deps:** adapt ttf2eot adapter for v3 Uint8Array API ([fb5316a](https://github.com/itgalaxy/webfont/commit/fb5316aa7dcf3b4549205df7feb2df6099402a5e)), closes [#646](https://github.com/itgalaxy/webfont/issues/646) - -### [11.5.9](https://github.com/itgalaxy/webfont/compare/v11.5.5...v11.5.9) (2026-07-02) - -### Bug Fixes - -* **deps:** adapt p-limit v7 ESM for Jest and runtime ([77f669f](https://github.com/itgalaxy/webfont/commit/77f669f24be581f05fa27b308d0a9a045869f9f2)), closes [#640](https://github.com/itgalaxy/webfont/issues/640) - -### [11.5.5](https://github.com/itgalaxy/webfont/compare/v11.5.0...v11.5.5) (2026-07-02) - -### Bug Fixes - -* **deps:** bump svgicons2svgfont to 16.0.0 ([c52d79c](https://github.com/itgalaxy/webfont/commit/c52d79ce703eaab07e0ea8997ad55ce098a4429a)) +### [11.2.5](https://github.com/itgalaxy/webfont/compare/v11.2.4...v11.2.5) (2021-06-29) -## [11.5.0](https://github.com/itgalaxy/webfont/compare/v11.3.0...v11.5.0) (2026-07-01) +### [11.2.4](https://github.com/itgalaxy/webfont/compare/v11.2.3...v11.2.4) (2021-06-23) -### Features +### [11.2.3](https://github.com/itgalaxy/webfont/compare/v11.2.2...v11.2.3) (2021-06-23) -* adding config option to prevent ligature unicode generation ([642deb9](https://github.com/itgalaxy/webfont/commit/642deb9235ca88c164e7faa9424aa8d895ecb862)), closes [#457](https://github.com/itgalaxy/webfont/issues/457) +### [11.2.2](https://github.com/itgalaxy/webfont/compare/v11.2.1...v11.2.2) (2021-06-22) -## [11.3.0](https://github.com/itgalaxy/webfont/compare/v11.2.17...v11.3.0) (2021-09-07) - -### Features - -* adding config option to prevent ligature unicode generation ([642deb9](https://github.com/itgalaxy/webfont/commit/642deb9235ca88c164e7faa9424aa8d895ecb862)), closes [#457](https://github.com/itgalaxy/webfont/issues/457) - -### [11.2.17](https://github.com/itgalaxy/webfont/compare/v11.2.0...v11.2.17) (2021-07-27) - -### Bug Fixes - -* **deps:** switch out from latest versions in dependencies ([67efe05](https://github.com/itgalaxy/webfont/commit/67efe057f109b6f02efd62dd84f091e1ed138a9f)), closes [#464](https://github.com/itgalaxy/webfont/issues/464) +### [11.2.1](https://github.com/itgalaxy/webfont/compare/v11.2.0...v11.2.1) (2021-06-22) ## [11.2.0](https://github.com/itgalaxy/webfont/compare/v11.1.1...v11.2.0) (2021-06-22) + ### Features * add new transformation function ([6a0c60c](https://github.com/itgalaxy/webfont/commit/6a0c60c794616abd041aa7da6f9fdc4bd5a4ad6a)), closes [#183](https://github.com/itgalaxy/webfont/issues/183) @@ -201,18 +112,21 @@ All notable changes to this project will be documented in this file. See [Conven ### [11.1.1](https://github.com/itgalaxy/webfont/compare/v11.1.0...v11.1.1) (2021-05-13) + ### Bug Fixes * **deps:** upgrade `wawoff2` dependency ([69a8dfb](https://github.com/itgalaxy/webfont/commit/69a8dfb3a70456aaa3777a8734ccccc41397a26c)) ## [11.1.0](https://github.com/itgalaxy/webfont/compare/v11.0.0...v11.1.0) (2021-05-12) + ### Features * add support to base64 font strings on templates ([2a56338](https://github.com/itgalaxy/webfont/commit/2a56338c0eb74ec7c680ef80e99e5472d69919ab)), closes [#328](https://github.com/itgalaxy/webfont/issues/328) [#329](https://github.com/itgalaxy/webfont/issues/329) ## [11.0.0](https://github.com/itgalaxy/webfont/compare/v10.1.0...v11.0.0) (2021-05-12) + ### ⚠ BREAKING CHANGES * We removed support for Node.js 11 and Node.js 10 at this version. Please upgrade your environment to Node.js 12 or higher. @@ -221,7 +135,8 @@ All notable changes to this project will be documented in this file. See [Conven * remove Node.js 10 and 11 support ([0f0dbf6](https://github.com/itgalaxy/webfont/commit/0f0dbf64a2b7ce15519bb9ada86fdb2941251a08)) -## [10.1.0](https://github.com/itgalaxy/webfont/compare/v10.0.0...v10.1.0) (2021-05-12) +## [10.1.0](https://github.com/itgalaxy/webfont/compare/v10.0.1...v10.1.0) (2021-05-12) + ### Features @@ -232,6 +147,8 @@ All notable changes to this project will be documented in this file. See [Conven * **deps:** upgrade dependencies ([d623b06](https://github.com/itgalaxy/webfont/commit/d623b06dc8bd9afa5c83b27c5df57404c4b1a3f6)) +### [10.0.1](https://github.com/itgalaxy/webfont/compare/v10.0.0...v10.0.1) (2021-05-12) + ## [10.0.0](https://github.com/itgalaxy/webfont/compare/v10.0.0-alpha.3...v10.0.0) (2021-04-08) ### ⚠ BREAKING CHANGES diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 120000 index 47dc3e3d..00000000 --- a/CLAUDE.md +++ /dev/null @@ -1 +0,0 @@ -AGENTS.md \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ac0b904d..8cbed50d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,19 +6,6 @@ This project has a [code of conduct](https://github.com/itgalaxy/webfont/blob/ma We’re excited that you’re interested in contributing! Take a moment to read the following guidelines. -## Repository layout (monorepo) - -This repository is an **npm workspaces** monorepo ([ADR 0013](./docs/adr/0013-npm-workspaces-monorepo.md)): - -| Path | Role | -|------|------| -| **Root** (`private`) | VitePress docs site, shared Biome/Lefthook, `docs/adr`, migration guides | -| **`packages/webfont`** | Published **`webfont`** npm package — library, CLI, build, tests, `CHANGELOG.md`, `NOTICE.md` | - -Run **`npm ci`** at the **repo root**. Library commands (`npm test`, `npm run build`, `npm run test:package`) delegate to the `webfont` workspace. User-facing markdown (`README.md`, `FEATURES.md`, …) stays at the root for the docs site; VitePress rewrites `packages/webfont/CHANGELOG.md` and `packages/webfont/NOTICE.md`. - -Future workspaces (`webfont-studio`, optional CLI split, Homebrew assets) will live under `packages/*` without changing the public npm package name. - There are several ways to contribute, not just by writing code: ## Improving documentation @@ -29,23 +16,6 @@ As a user of this project you’re perfect for helping us improve our docs: typo Some [issues lack information](https://github.com/itgalaxy/webfont/issues?q=is%3Aopen+is%3Aissue+label%3A%22need+more+info%22), aren’t reproducible, or are just [invalid](https://github.com/itgalaxy/webfont/issues?q=is%3Aopen+is%3Aissue+label%3Ainvalid). Help make them easier to resolve. -**Common errors:** see [TROUBLESHOOTING.md](./TROUBLESHOOTING.md) for symptoms and fixes on the current release. **Upgrading?** see [MIGRATION.md](./MIGRATION.md) for what changed between versions. - -### Maintainer backlog (open issues) - -When working through the issue tracker (see also [AGENTS.md](./AGENTS.md) — “GitHub issues workflow”): - -1. Triage: assignee, milestone `next`, type label (`bug`, `enhancement`, etc.). -2. Fix PR: tests where needed, code change, and for **issue fixes that change behavior across releases** a new file `docs/migration/issue-NNNN-.md` ([workflow and entry structure](./docs/migration/README.md#entry-structure)). -3. **Keep reporters informed on the issue thread (English):** - - When investigation starts: what you are checking; link the PR when it exists. - - **Explain what was discovered** (root cause, not only “we’ll fix it”). - - **Explain how it will be resolved** (PR link, expected behavior after merge). - - **State release status** clearly: fix on `master` / in review / **planned for the next npm release** — not on npm until published. - - Include a **workaround** on the current npm version when one exists. -4. After merge: comment that the fix is on `master` and planned for the next release; **leave the issue open** until npm publish. -5. On release: comment with the **version number** and the exact steps from MIGRATION.md, then **close** the issue. - ## Giving feedback on issues We’re always looking for more opinions on discussions in the issue tracker. @@ -66,232 +36,17 @@ And, if you’re raising an issue, please understand that people involved with t ## Submitting a pull request -- **Never commit or push directly to `master`.** Create a branch, open a pull request, and merge through GitHub — even for documentation-only or test-only changes. Maintainers merge; contributors and automation do not bypass review with `git push origin master`. -- **Use lowercase branch names only.** The full branch name must be lowercase letters, numbers, and slashes (for example `fix/cli-formats`, `test/to-ttf-unit-tests`, `ci/update-node-version`). Do not use camelCase, PascalCase, or uppercase acronyms in branch names. - Non-trivial changes are often best discussed in an issue first, to prevent you from doing unnecessary work; - For ambitious tasks, you should try to get your work in front of the community for feedback as soon as possible; - New features should be accompanied with tests and documentation; -- Bug fixes should include a regression test that fails without the fix; - Please, don’t include unrelated changes; - -**Maintainers and automation** (squash merge, PR titles, Copilot threads, merged-branch rules): see **[MAINTAINERS.md](./MAINTAINERS.md)**. - -### User-facing changes and documentation - -Before opening or updating a pull request, check whether your change affects **how people use webfont** — via the CLI (`webfont` / `packages/webfont/dist/cli.mjs`), the programmatic API (`webfont({ ... })`), or config files (`.webfontrc`, `package.json` `webfont` key, etc.). - -When it does, update documentation in the same PR: - -| What changed | Update | -|--------------|--------| -| CLI flags, aliases, help text, or exit codes | Edit `packages/webfont/src/cli/meow/cliFlagCatalog.ts`, run `npm run docs:cli` → [packages/webfont/docs/cli.md](./packages/webfont/docs/cli.md); update [FEATURES.md](./FEATURES.md) when capability changes | -| Install / setup steps (npm, CLI script, config, verification) | [packages/webfont/install.md](./packages/webfont/install.md) | -| `webfont()` options, defaults, or svgicons2svgfont parameters | [packages/webfont/docs/configuration.md](./packages/webfont/docs/configuration.md) | -| `webfont()` options, defaults, return shape, or supported inputs/outputs | [packages/webfont/docs/configuration.md](./packages/webfont/docs/configuration.md), [README.md](./README.md) Capabilities at a glance, [packages/webfont/README.md](./packages/webfont/README.md), [FEATURES.md](./FEATURES.md) | -| New or removed public options or pipelines | README + [FEATURES.md](./FEATURES.md) + TypeScript types under `packages/webfont/src/types/` | -| Bug fixes or recurring user-facing errors (especially from issues) | New `docs/migration/issue-NNNN-.md` ([workflow](./docs/migration/README.md)); [TROUBLESHOOTING.md](./TROUBLESHOOTING.md) when the fix applies the same on all releases | -| Legal notices, font licensing copy, attribution, or dependency license table | [packages/webfont/NOTICE.md](./packages/webfont/NOTICE.md); link from README as needed | -| Internal-only refactors with no usage change | No README or FEATURES change; say so in the PR **Testing** section | - -Agents and automation should follow the same rule — see [AGENTS.md](./AGENTS.md) (“Documentation”) and [MAINTAINERS.md](./MAINTAINERS.md) for PR workflow. - -### Testing and coverage - -**Tests are required.** Every pull request that changes runtime behavior must add or update automated tests in the **same PR** — not in a follow-up. Docs-only changes are the exception; say so explicitly in the PR **Testing** section. - -New behavior and bug fixes should include tests. Follow [AGENTS.md](./AGENTS.md) (“Testing”) for Vitest patterns in this repo. - -| Expectation | Guidance | -|-------------|----------| -| **Same PR** | Land tests with the code they protect. Reviewers should block merges that add features or fixes without coverage. | -| **Unit + integration** | Error paths and guards should have **unit tests** in the module under test. Add integration tests when the full pipeline matters, but do not use them as the only coverage for a guard. | -| **Explicit, not implicit** | Name tests after the invariant they protect (for example, why a guard exists). If a dependency quirk motivated the code, add a small test that documents the quirk. | -| **Pipeline ordering** | When step B must not run if step A fails, assert B was not called (spy/mock), not only that the final promise rejected. | -| **Fixtures** | Reuse fixtures under `packages/webfont/src/fixtures/` for file-based cases; add a fixture when the scenario is stable and reusable. | -| **Test titles** | Every `it(...)` description must include **`should`** or **`should not`** (for example, `should return default options`, `should not call metadataProvider when parse fails`). Avoid bare verbs (`returns`, `throws`, `accepts`) or prefixes like `documents that` without `should`. | - -Run `npm test` before pushing. Integration-only coverage for a localized guard is incomplete. - -#### Published package validation (`npm run test:package`) - -`npm run test:package` runs three orthogonal layers of validation against the packed tarball (see [ADR 0012](docs/adr/0012-published-package-validation.md)): - -1. **`npm run test:publint`** — [publint](https://publint.dev/) lints `package.json` for publish-surface issues (`exports`, `files`, `main`, `module`, `types`, condition ordering). Prints warnings and suggestions in every CI log; fails only on errors. -2. **`npm run test:attw`** — [`@arethetypeswrong/cli`](https://arethetypeswrong.github.io/) probes types resolution across **node10**, **node16 (from CJS)**, **node16 (from ESM)**, and **bundler** to catch types that would fail to resolve for TypeScript consumers under any module system. -3. **`npm run test:pack`** — `packages/webfont/scripts/pack-smoke-test.mjs` packs with `npm pack`, installs the tarball into throwaway ESM and CJS consumer projects, and asserts each import shape works end-to-end: - - `import webfont from "webfont"` (ESM default) → `typeof === "function"` and generates a real `woff2` from fixtures. - - `import { webfont } from "webfont"` (ESM named) → same. - - `const { webfont } = require("webfont")` (CJS named) and `require("webfont").default` (CJS default) → same. - - Also asserts the tarball ships `dist/index.js`, `dist/index.mjs`, `dist/browser.js`, and `dist/cli.mjs`. - -Together these guard `package.json#exports`, `#files`, `#types`, and the built `dist/*.mjs` / `dist/*.js` / `dist/**/*.d.{ts,mts}` against regressions the in-source Vitest suite cannot see (for example [#618](https://github.com/itgalaxy/webfont/issues/618), where the ESM default import returned the module namespace object and threw `TypeError: webfont is not a function`). - -The meta script runs on every pull request in [`.github/workflows/pr.yml`](.github/workflows/pr.yml), gates the publish job in [`.github/workflows/npm-publish.yml`](.github/workflows/npm-publish.yml), and is wired into `prepublishOnly` so `npm publish` fails locally if the tarball would ship a broken import shape. - -When adding or removing files from `packages/webfont/dist/`, updating `packages/webfont/package.json#exports` / `#files` / `#types`, or touching the Vite build modes, run `npm run test:package` locally before pushing. - - Lint and test before submitting code by running `$ npm test`; -- Run `$ npm run prettify` to apply Biome formatting and safe fixes before pushing; - Write a [convincing description](https://github.com/itgalaxy/webfont/blob/master/.github/pull_request_template.md) of why we should land your pull request: it’s your job to convince us. -### Linting and formatting - -This project uses [Biome](https://biomejs.dev/) for linting and formatting (`biome.json`). Use `npm run lint` to check and `npm run prettify` to auto-fix. - -**Do not add legacy ESLint suppressions.** This repository no longer uses ESLint (see [ADR 0001](docs/adr/0001-eslint-vs-biome-linting.md)). Remove `eslint-disable` / `eslint-enable` comments instead of carrying them forward. When a rule must be suppressed, use a targeted `biome-ignore` comment with a short reason. - -**Do not suppress TypeScript with `@ts-expect-error` or `@ts-ignore`.** Fix the underlying type issue instead: - -| Situation | Prefer | -|-----------|--------| -| Extra keys from a loaded config file in tests | `type LoadedConfig = ResultConfig & { foo: string }` and cast `result.config as LoadedConfig` | -| Untyped or partial mocks (e.g. CLI `meow`) | Import from `__mocks__/` for assertions; if a cast is needed, use `as unknown as MockType` | -| Async code that should reject | `await expect(promise).rejects.toThrow(...)` or `.rejects.toMatchObject(...)` instead of `try/catch` + conditional `expect` | -| Intentionally unused parameters | Prefix with `_` (e.g. `_options`) so Biome and TypeScript accept them | -| Regex style rules | Rewrite the pattern (e.g. `/\s/gu` instead of a capture group only used for whitespace) | - -Only use `biome-ignore` when there is no reasonable code change; never use it to paper over type errors—adjust types or test helpers instead. - -**Do not use `ignoreDeprecations` in TypeScript config.** When upgrading TypeScript or hitting deprecated compiler options, migrate `tsconfig.json` (for example, replace deprecated `moduleResolution` values) and fix resulting type errors. Do not silence deprecations with `ignoreDeprecations`. - -### Git hooks - -Git hooks are managed by [Lefthook](https://github.com/evilmartians/lefthook) (`lefthook.yml`). They install automatically when you run `npm install` (`prepare` → `lefthook install`). - -| Hook | What runs | -|------|-----------| -| `pre-commit` | Biome check (with safe fixes) on staged `*.{ts,js,json}` files; banned-suppression scan | -| `pre-push` | `npm run typecheck` and `npm run depcheck` (parallel), then `npm test`, then `npm run docs:site` (sequential) | - -To simulate hooks without committing or pushing: - -```shell -npx lefthook run pre-commit -npx lefthook run pre-push -``` - -See [ADR 0003](docs/adr/0003-lefthook-instead-of-husky-lint-staged.md) for rationale. - -### Dependencies - -- Pin exact versions in `package.json` (no `^`, `~`, or `latest` ranges), including `@types/*` packages. -- The repository sets `save-exact=true` in `.npmrc`, so `npm install ` records exact versions automatically. -- When upgrading a dependency, pin its `@types/` counterpart in the same pull request when one exists. -- Update both `package.json` and `package-lock.json` in the same pull request. -- [Dependabot](.github/dependabot.yml) opens upgrade PRs for pinned dependencies; do not use open ranges to get updates. -- Run `npm run depcheck` before pushing when you add, remove, or move imports — it runs [Knip](https://knip.dev/) to find unused dependencies, unlisted imports, and dead exports (see [ADR 0008](docs/adr/0008-knip-instead-of-depcheck.md)). CI runs the same check on every pull request. - -### CI changes - -Pull requests that change CI configuration (for example, GitHub Actions workflows) must follow these conventions: - -- **Branch name:** use the `ci/` prefix (e.g. `ci/update-node-version`). -- **Commit message:** use the `ci:` type in [Conventional Commits](https://www.conventionalcommits.org/) format (e.g. `ci: upgrade GitHub Actions to Node 26`). - -Do not use `chore:` or `chore(ci):` for CI-only changes. - -- **Pin tool versions.** Do not install CLIs with `@latest` (or other floating tags) on deploy or release paths — pin a semver in the workflow and optionally allow override via a repository **variable** with a safe default (for example `VERCEL_CLI_VERSION` defaulting to `54.20.1` in [`.github/workflows/vercel-deploy.yml`](.github/workflows/vercel-deploy.yml)). Bump pins in focused `ci(deps):` pull requests. -- **Bind secrets once.** Map repository secrets to `env` at the job or step level and let the tool read them from the environment. Do not repeat GitHub Actions `secrets.*` expressions inline across multiple `run` commands — it is error-prone and harder to audit. See [`npm-publish.yml`](.github/workflows/npm-publish.yml) (`NODE_AUTH_TOKEN`) and [`vercel-deploy.yml`](.github/workflows/vercel-deploy.yml) (`VERCEL_TOKEN`) for the pattern. -- **GitHub Environments for deploy jobs.** Map production deploy jobs to a named [GitHub Environment](https://docs.github.com/en/actions/deployment/targeting-different-environments/using-environments-for-deployment) so runs appear under **Deployments** with a URL (`npm` / `github-packages` in [`npm-publish.yml`](.github/workflows/npm-publish.yml); `vercel` in [`vercel-deploy.yml`](.github/workflows/vercel-deploy.yml)). Optionally scope secrets per environment and add protection rules in **Settings → Environments**. -- **Validate the docs site.** Changes that touch markdown published by VitePress (see `.vitepress/config.mts` rewrites) must pass `npm run docs:site` (runs `docs:demo` + `vitepress build`; builds `packages/webfont/dist/cli.mjs` first when missing). Pre-push and [`.github/workflows/pr.yml`](.github/workflows/pr.yml) run it after `npm test`; Vercel production deploy runs the full `npm run docs:build`. -- **VitePress markdown.** VitePress compiles published pages as Vue templates. Do not put mustache-style double braces (Vue interpolation syntax) in those markdown files outside fenced code blocks — `vitepress build` fails when Vue tries to parse them. Rephrase (for example “Nunjucks `fontName` placeholder”); if you must show literal braces, use HTML entities (`{{` / `}}`) so Vue never sees interpolation delimiters. - -**AppVeyor:** a legacy project may still receive GitHub webhooks. Root `appveyor.yml` disables builds via a non-matching branch filter (`appveyor-disabled`) because maintainers may lack AppVeyor dashboard access. Do not delete it until the AppVeyor project is removed upstream. - -### Releases - -Versioning is automated with [Release Please](https://github.com/googleapis/release-please) (see [ADR 0004](docs/adr/0004-release-please-instead-of-standard-version.md)). - -1. Merge changes to `master` using [Conventional Commits](https://www.conventionalcommits.org/) (`feat:`, `fix:`, `docs:`, `ci:`, etc.). -2. Release Please opens or updates a **Release PR** with the next version, `packages/webfont/CHANGELOG.md`, and `packages/webfont/package.json` updates. -3. Review and merge the Release PR to create the git tag and GitHub Release on GitHub. -4. Merging the Release PR is enough to publish (see **npm publishing** below): the [Release Please](.github/workflows/release-please.yml) workflow cuts the GitHub Release and then **dispatches** [`npm-publish`](.github/workflows/npm-publish.yml) for the new tag. A `release: published` event created with the default `GITHUB_TOKEN` does not start downstream workflows, so the publish is triggered explicitly via `workflow_dispatch` (the documented exception to that rule). - -**Git tags** created by Release Please follow **`v{semver}`** (for example `v12.0.0`). The config sets `include-component-in-tag: false` so tags are not prefixed with the package name (`webfont-v12.0.0`). See [ADR 0004](docs/adr/0004-release-please-instead-of-standard-version.md). - -Do not run local `npm version` or push version tags manually unless coordinating an emergency release with maintainers. - -#### npm publishing - -Publishing from GitHub Actions deploys the same validated build to **two environments** — `npm` (public registry, `webfont`) and `github-packages` (GitHub Packages, `@itgalaxy/webfont`). CI is **non-interactive** — there is no `npm login`. Each deploy job writes `~/.npmrc` with `///:_authToken=${NODE_AUTH_TOKEN}` and sets `NODE_AUTH_TOKEN` from a secret at the `npm publish` step, so npm expands the token at runtime and it never lands on disk or in the logs: - -- **`npm`** → `NODE_AUTH_TOKEN` = **`NODE_AUTH_TOKEN`** repository secret (an npm access token from npmjs.com; a GitHub PAT does **not** authenticate to npmjs.org). -- **`github-packages`** → `NODE_AUTH_TOKEN` = built-in **`GITHUB_TOKEN`** (`packages: write`); no extra secret. Swap for a PAT secret with `write:packages` if you prefer a personal token. - -> `actions/setup-node` has **no** `node-auth-token` input — `registry-url` only wires auth to read from `env.NODE_AUTH_TOKEN`. Passing a token to a non-existent input silently publishes unauthenticated (the `E404` in [#742](https://github.com/itgalaxy/webfont/issues/742)); writing `~/.npmrc` + setting `NODE_AUTH_TOKEN` is the fix. - -**One-time setup** (package maintainer): - -1. Create an npm **Automation** or **Granular** access token for the `webfont` package (npmjs.com → **Access Tokens**) with publish permission (OTP/2FA-for-writes disabled for automation, or use a token type that bypasses it). -2. Add it as a GitHub repository secret named **`NODE_AUTH_TOKEN`** ([Settings → Secrets and variables → Actions](https://github.com/itgalaxy/webfont/settings/secrets/actions)). GitHub Packages needs no secret — it uses `GITHUB_TOKEN`. -3. For automated **homebrew-core** bump PRs, add a classic GitHub PAT as **`HOMEBREW_COMMITTER_TOKEN`** with the **`public_repo`** scope ([token settings](https://github.com/settings/tokens/new?scopes=public_repo)) — enough to fork the public `Homebrew/homebrew-core` repo and open a PR. The [`bump-homebrew-core`](.github/workflows/npm-publish.yml) job uses [mislav/bump-homebrew-formula-action](https://github.com/mislav/bump-homebrew-formula-action) to open a PR on `Homebrew/homebrew-core` after each successful npm publish. Homebrew maintainers still review and merge that PR. - -**After merging a Release PR:** the [Release Please](.github/workflows/release-please.yml) workflow cuts the GitHub Release and then dispatches [`npm-publish`](.github/workflows/npm-publish.yml) with the new tag automatically. (A `release: published` event from the default `GITHUB_TOKEN` does not start downstream workflows, so the dispatch is done explicitly — `workflow_dispatch` and `repository_dispatch` are the exceptions to that rule.) If publish does not start, run it manually: **Actions → npm publish → Run workflow** with the release tag (e.g. `v12.1.0`). - -**Future:** [npm Trusted Publishing](https://docs.npmjs.com/trusted-publishers) (OIDC) can replace the `NODE_AUTH_TOKEN` secret when a maintainer configures it on npmjs.com for workflow `npm-publish.yml`. - -##### Deployment environments and GitHub Packages - -The workflow runs two deploy jobs after `build`, each mapped to a GitHub **Environment** so every release appears under the repo's **Deployments** with a link to the published package: - -| Environment | Registry | Package | Auth | Deploy URL | -|-------------|----------|---------|------|------------| -| `npm` | `registry.npmjs.org` | `webfont` | `NODE_AUTH_TOKEN` secret | `npmjs.com/package/webfont/v/` | -| `github-packages` | `npm.pkg.github.com` | `@itgalaxy/webfont` | `GITHUB_TOKEN` (`packages: write`) | repo **Packages** page | - -GitHub Packages requires a scope matching the repo owner, so the `publish-github-packages` job renames the package to `@itgalaxy/webfont` in the checkout only (via `npm pkg set name=…`, never committed) — the unscoped `webfont` on npmjs.org is unaffected. - -Add protection rules (required reviewers, wait timers) per environment in **Settings → Environments** if you want manual approval to gate a deploy. - -##### Homebrew (monorepo tap + homebrew-core) - -After `publish-npm` succeeds, the release workflow: - -| Job | Target | What it does | -|-----|--------|--------------| -| `update-homebrew-formula` | This repo (`HomebrewFormula/webfont.rb`) | Commits `url`/`sha256` bump to `master` | -| `bump-homebrew-core` | `Homebrew/homebrew-core` | Opens a PR updating `Formula/w/webfont.rb` (skipped when `HOMEBREW_COMMITTER_TOKEN` is unset) | - -The monorepo tap updates immediately; `brew install webfont` from **homebrew-core** picks up the new version after the core PR merges and users run `brew update`. Manual fallback: `npm run render:homebrew-core` and open a PR on homebrew-core yourself. - -##### Vercel docs deployment - -[`.github/workflows/vercel-deploy.yml`](.github/workflows/vercel-deploy.yml) deploys the VitePress site to Vercel on every push to `master` (and via **workflow_dispatch**). The `deploy` job maps to the **`vercel`** GitHub Environment; the deployment URL is captured from `vercel deploy --prebuilt --prod` and shown under **Deployments**. - -| Environment | Host | Auth secrets | Deploy URL | -|-------------|------|--------------|------------| -| `vercel` | Vercel (`webfont` project) | `VERCEL_TOKEN`, `VERCEL_ORG_ID`, `VERCEL_PROJECT_ID` (repository or environment secrets) | output of `vercel deploy` (production alias, e.g. `webfont-js.vercel.app`) | - -**Install from GitHub Packages** (needs a GitHub token with `read:packages`): - -```shell -echo "@itgalaxy:registry=https://npm.pkg.github.com" >> .npmrc -echo "//npm.pkg.github.com/:_authToken=\${GITHUB_TOKEN}" >> .npmrc -npm install @itgalaxy/webfont -``` - -##### Release assets - -The `release-assets` job attaches two archives to each GitHub Release: the npm tarball **`webfont-.tgz`** (the exact published package) and **`webfont-dist-.zip`** (the built `dist/` only). It needs `contents: write` and uploads with `gh release upload "$RELEASE_TAG" --clobber`. - -**Manual publish** from a maintainer machine (browser/web auth or local npm login) is still supported: - -```shell -git fetch origin --tags -git checkout v12.0.1 # tag from Release Please -npm ci -npm login # or ensure a valid token -npm publish --access public -``` - -`prepublishOnly` starts with `npm whoami`, so a local `npm publish` fails fast if you are not logged in — before the build and package validation run, instead of failing on authentication at the very end. In CI the workflow builds and validates `dist/` **once** in the `build` job, uploads it as an artifact, and the `publish-npm` job runs `npm publish --ignore-scripts` against that artifact — so `prepublishOnly` (and its `whoami`) does not run on the publish runner and the build is not repeated (see [#742](https://github.com/itgalaxy/webfont/issues/742)). The `publish-npm` job depends on `build`, so `test:package` still gates every publish. - -Automated publishing does **not** retroactively upload versions that already exist as git tags only (for example `11.5.x` never published to npm). - ## Resources - [How to Contribute to Open Source](https://opensource.guide/how-to-contribute/) - [Using Pull Requests](https://help.github.com/articles/about-pull-requests/) - [GitHub Help](https://docs.github.com) -Thanks for contributing to `webfont`! 👏✨ +Thanks for contributing to `webfont`! 👏👌✨ diff --git a/FEATURES.md b/FEATURES.md deleted file mode 100644 index d625f722..00000000 --- a/FEATURES.md +++ /dev/null @@ -1,259 +0,0 @@ -# Features - -Capabilities webfont provides — stability status, behavior details, and test-backed criteria for each feature. Test criteria use ✅ when coverage exists; ⬜ when not yet covered. - -## SVG icon font generation - -- **Stability**: stable -- **Description**: Build a font from one or more `.svg` icon files (icon font / webfont workflow). -- **Properties**: - - Input: globs resolving to `.svg` files only (every matched file must have a `.svg` extension). - - Uses [svgicons2svgfont](https://github.com/nfroidure/svgicons2svgfont) to merge icons into an SVG font, then derives other formats from that TTF pipeline. - - Does **not** accept `.woff`, `.woff2`, `.ttf`, or `.otf` as input in the same run. - - **Licensing:** you must have rights to the SVG icons you submit; generated fonts remain subject to those rights and any metadata you set. See [NOTICE.md](./NOTICE.md) §3.1. -- **Test Criteria**: - - ✅ SVG glob produces `svg`, `ttf`, `eot`, `woff`, and `woff2` with default `formats` - - ✅ Empty or unsupported globs reject with a clear error - - ✅ Mixed `.svg` + `.woff`/`.woff2` inputs reject - -## SVG pipeline output formats - -- **Stability**: stable -- **Description**: Emit subset of `svg`, `ttf`, `eot`, `woff`, `woff2` from SVG icon input. -- **Properties**: - - Default `formats`: `['svg', 'ttf', 'eot', 'woff', 'woff2']`. - - `otf` is **not** supported for SVG input (the pipeline produces TrueType outlines via `svg2ttf`). - - Requesting `otf` with SVG input fails early with an explicit error (no silent success, no empty `otf` buffer). - - `eot`, `woff`, and `woff2` are generated from the intermediate TTF buffer. -- **Test Criteria**: - - ✅ `--formats` / `formats` option limits written outputs - - ✅ SVG input with `formats: ['otf']` rejects - - ✅ Built-in CSS template works with default SVG formats - -## TTF to webfont encoding - -- **Stability**: in-progress -- **Description**: Encode one or more `.ttf` TrueType files to `svg`, `eot`, `woff`, and/or `woff2` (and optional TTF pass-through). Auto-detected from input extension — no separate flag (see [#13](https://github.com/itgalaxy/webfont/issues/13)). -- **Properties**: - - Input: one or more local `.ttf` paths or globs per run. - - Output: `ttf` (copy), `svg` (SVG font), `eot`, `woff`, and/or `woff2` per input via existing encoders (`fonteditor-core`, `ttf2eot`, `ttf2woff`, `wawoff2`). - - `svg` produces a legacy **SVG font** (glyph outlines + metrics as XML) via [`fonteditor-core`](https://github.com/kekee000/fonteditor-core) — pure JS, no Java/FontForge ([#764](https://github.com/itgalaxy/webfont/issues/764)). Opt-in only; not part of the default output set. - - Batch results on `result.transcodedFonts` (`{ source, svg?, ttf?, eot?, woff?, woff2? }[]`). Single input mirrors buffers on `result` top level (`result.svg` is a string). - - Default `formats` when SVG-pipeline defaults are still configured: `['woff', 'woff2']` (SVG font stays opt-in). - - Does **not** accept `.otf` input (TrueType only). Does **not** merge multiple weights into one file. - - `template` and `glyphTransformFn` are not supported in this mode. - - `glyphContentTransformFn` is not supported in this mode. - - **Licensing:** encoding does not grant rights to the font; users must comply with the font’s license. See [NOTICE.md](./NOTICE.md) §3.3. - - **Architecture:** see [ADR 0009](docs/adr/0009-ttf-webfont-encoding-pipeline.md). -- **Test Criteria**: - - ✅ `.ttf` input with `formats: ['woff', 'woff2']` yields valid WOFF and WOFF2 - - ✅ `.ttf` input with `formats: ['svg']` yields a valid SVG font ([#764](https://github.com/itgalaxy/webfont/issues/764)) - - ✅ Default formats produce `woff` + `woff2` when SVG defaults are configured (no SVG font) - - ✅ Multiple TTF files encode in one run (`transcodedFonts`), including `svg` - - ✅ Mixed `.svg` + `.ttf` or `.ttf` + `.woff2` inputs reject - - ✅ Template option in TTF mode rejects - - ✅ CLI writes encoded outputs (incl. `svg`) for a single TTF input - -## WOFF / WOFF2 container decompression - -- **Stability**: in-progress -- **Description**: Decompress one or more `.woff` / `.woff2` inputs (local paths, globs, or `http(s)` URLs) to the **SFNT payload inside** each file (TTF or OTF), not arbitrary format transcoding or font merging. -- **Properties**: - - Input: one or more `.woff` / `.woff2` sources per run (paths, globs, and/or URLs). - - Output: `ttf` and/or `otf` per input — whichever matches each decompressed SFNT flavor (`0x00010000` / `true` → TTF, `OTTO` → OTF). - - Batch results are exposed on `result.decompressedFonts` (`{ source, ttf?, otf? }[]`). A single input still sets `result.ttf` / `result.otf` at the top level for backward compatibility. - - CLI writes `{basename}.ttf` / `.otf` per input; colliding basenames (e.g. `iconfont.woff` + `iconfont.woff2`) use `-woff` / `-woff2` suffixes. A single input still honors `-u` / `fontName`. - - URLs must end in `.woff` or `.woff2` (query strings allowed). Response must be a valid WOFF/WOFF2 container. - - Does **not** merge multiple weights into one SFNT file (see [NOTICE.md](./NOTICE.md)). - - Does **not** convert TrueType outlines to PostScript/CFF (TTF → OTF) or the reverse; use an external tool (e.g. FontForge) for that. - - Does **not** re-encode to `eot`, `woff`, or `woff2` in this mode. - - Default `formats` when SVG-pipeline defaults are still configured: `['ttf']`. - - `template` and `glyphTransformFn` are not supported in this mode. - - `glyphContentTransformFn` is not supported in this mode. - - **Licensing:** decompression does not grant rights to the font; users must comply with the font’s license for input and extracted output. Copyright/metadata in the SFNT is preserved. See [NOTICE.md](./NOTICE.md) §3.4. - - **Architecture:** see [ADR 0007](docs/adr/0007-woff-woff2-decompression-pipeline.md). -- **Test Criteria**: - - ✅ `.woff2` input with `formats: ['ttf']` yields a valid TTF when the container holds TrueType - - ✅ `.woff` input with `formats: ['ttf']` yields a valid TTF when the container holds TrueType - - ✅ Multiple webfont files decompress in one run (`decompressedFonts`) - - ✅ HTTPS URL input decompresses when fetch returns a valid WOFF2 - - ✅ Requesting `ttf` when the SFNT flavor is OTF rejects with a flavor hint - - ✅ Requesting `otf` when the SFNT flavor is TTF rejects with a flavor hint - - ✅ Template option in webfont conversion mode rejects - -## Supported input file classification - -- **Stability**: in-progress -- **Description**: Classify matched paths into SVG mode, webfont mode, mixed, or unsupported before running a pipeline. -- **Properties**: - - Supported extensions: `.svg`, `.ttf`, `.woff`, `.woff2` only. - - Extension-less paths (e.g. `LICENSE`, `.webfontrc`) are **not** treated as compatible wildcards; globs that match them alongside fonts fail as unsupported. - - Unsupported extensions (e.g. `.txt`, `.json`) cause the run to fail with “did not match any supported files”. -- **Test Criteria**: - - ✅ Extension-less file + `.woff2` classifies as unsupported (error) - - ✅ `.txt`-only input classifies as unsupported (error) - - ✅ Pure `.svg` / pure `.ttf` / pure `.woff`/`.woff2` classify correctly - -## Configuration file discovery - -- **Stability**: stable -- **Description**: Load options from cosmiconfig (`package.json` `webfont` key, `.webfontrc`, `webfont.config.js`, etc.). -- **Properties**: - - Search walks up from cwd when no explicit `configFile` / `--config` is set. - - Discovered path is exposed on `result.config.filePath` (output metadata only). -- **Test Criteria**: - - ✅ Custom config `formats` are respected - - ✅ Discovered `filePath` attached on conversion runs - -## CSS / SCSS / Styl templates - -- **Stability**: stable -- **Description**: Generate `@font-face` (or equivalent) from built-in or custom Nunjucks templates. -- **Properties**: - - Built-in: `css`, `scss`, `styl`. - - Custom template: path to a Nunjucks file. - - SVG pipeline only (not webfont decompression or TTF encoding mode). - - `templateCacheString`: manual query string on font URLs (default `Date.now()`). - - `addHashInFontUrl`: append MD5 `&v=` from SVG font content; **filenames stay** `fontName.*` ([#125](https://github.com/itgalaxy/webfont/issues/125)). - - `unicodeRange`: opt-in `unicode-range` in built-in `@font-face` from glyph code points (default **off**); `unicodeRange: true`, `--unicode-range`, or a CSS string to enable ([#322](https://github.com/itgalaxy/webfont/issues/322)). Enabling may break ligature-by-name usage — see README / TROUBLESHOOTING. -- **Test Criteria**: - - ✅ Built-in `css` template snapshot / integration coverage - - ✅ Subset `formats` with template omits unused format URLs - - ✅ `addHashInFontUrl` on `css` and `scss` templates appends content hash to URLs - - ✅ `unicodeRange: true` / `--unicode-range` adds computed `U+-` to built-in templates; default omits it - - ✅ `templateFontName` sets CSS `font-family` (`fontFamily`); `fontName` stays on output file URLs ([#331](https://github.com/itgalaxy/webfont/issues/331)) - -## Command-line interface (CLI) - -- **Stability**: stable -- **Description**: Run `webfont` from the shell via `dist/cli.mjs` (`npm` bin). -- **Properties**: - - Parses `--formats` as JSON array or comma-separated list. - - Writes font files to `--dest`; optional template output. - - Errors and verbose stacks go to **stdout**; **stderr** must stay empty (see integration tests). - - Exit code `0` on success, `1` on handled errors. -- **Test Criteria**: - - ✅ CLI integration tests cover success, failure, and `--verbose` - - ✅ `parseFormatsFlag` validates format names including `otf` - - ✅ `validateWebfontOptions` rejects unknown `formats` from API and cosmiconfig (#133) - -## Interactive CLI assistant - -- **Stability**: in-progress -- **Description**: Guided wizard and `.was` config rerun (parity with [webfont-assistant](https://github.com/kmorope/webfont-assistant)): `--assistant`, `--assistant-config`. -- **Properties**: - - Prompts for font name, icon prefix, glyph/output paths, formats, and css/scss/custom templates. - - Writes `{name}.was` beside generated fonts; `--assistant-config` reloads webfont-assistant-compatible JSON. - - `.was` icon class prefix: **`prefix`** (canonical). Optional **`fontName` in `.was` only** is deprecated (legacy misname for prefix); still loaded until the next breaking `.was` format change — see [issue-0797-was-prefix-field.md](./docs/migration/issue-0797-was-prefix-field.md). - - Distinct from cosmiconfig `--config`. -- **Test Criteria**: - - ✅ Unit tests for `.was` → `webfont()` option mapping - - ✅ CLI integration test for `--assistant-config` - -## Option validation - -- **Stability**: stable -- **Description**: Reject mis-typed options before running the pipeline. -- **Properties**: - - `formats` must be a non-empty array of known format names (`svg`, `ttf`, `otf`, `eot`, `woff`, `woff2`). - - `files`, `fontName`, `template`, and `templateFontPath` type-checked after cosmiconfig merge. -- **Test Criteria**: - - ✅ Unit tests in `validateWebfontOptions.test.ts` - - ✅ Standalone and CLI integration tests for unknown format names (#133) - -## Multiple templates - -- **Stability**: stable -- **Description**: Generate more than one style/preview template per run. -- **Properties**: - - `template` accepts a string or array of built-in names (`css`, `html`, `scss`, `styl`, `json`) or custom template paths. - - `result.templates` lists each rendered output; `result.template` remains the first entry for backward compatibility. - - Built-in `html` preview: `templateFontLigatures` (default on) adds `font-feature-settings: "liga"` for the Ligature section; if `unicodeRange` is also enabled, HTML omits PUA-only `unicode-range` on `@font-face` so ASCII ligature names use the icon font. - - `ligatures` default **off** (performance on large fonts, [#558](https://github.com/itgalaxy/webfont/issues/558)); opt in with `--ligatures`; runtime warning when >2k glyphs with ligatures enabled. -- **Test Criteria**: - - ✅ Standalone and CLI tests for `template: ['html', 'scss']` (#158) - - ✅ HTML template enables `liga` CSS by default; omits `unicode-range` when both ligature preview and `unicodeRange` are enabled - - ✅ Large-font ligature warning unit tests ([#558](https://github.com/itgalaxy/webfont/issues/558)) - -## Glyph metadata hooks - -- **Stability**: stable -- **Description**: Customize per-glyph metadata in the SVG pipeline. -- **Properties**: - - `metadataProvider`: replace default SVG metadata lookup. - - `glyphTransformFn`: transform metadata after load (SVG mode only). - - `glyphContentTransformFn`: transform SVG glyph contents before font generation (SVG mode only; e.g. stroke-to-fill via `svg-outline-stroke`, #144). - - `optimizeSvg`: optional conservative SVGO pass before `glyphContentTransformFn` (default off; #724). Does not fix stroke-only SVGs alone (#327). - - `svgoConfig`: optional SVGO `Config` when `optimizeSvg` is enabled. -- **Test Criteria**: - - ✅ `glyphTransformFn` applied before font generation - - ✅ `glyphContentTransformFn` applied before font generation (#144) - - ✅ `metadataProvider` error paths unit-tested (`glyphsData`) - - ✅ `optimizeSvg` strips comments/metadata without breaking default fixtures (#724) - - ✅ Empty SVG font glyph paths reject with guidance (#327) - -## TTF output hook (`ttfPostProcess`) - -- **Stability**: stable -- **Description**: Caller-owned post-processing of the generated TTF buffer, before WOFF/WOFF2/EOT are derived from it (SVG pipeline only). Keeps optional/native steps (e.g. autohinting via `ttfautohint`) out of the core — same philosophy as `glyphContentTransformFn` ([ADR 0011](docs/adr/0011-no-svg-outline-stroke-dependency.md)); enabling package for [#749](https://github.com/itgalaxy/webfont/issues/749). See [`ttfPostProcess`](./packages/webfont/docs/configuration.md#ttfpostprocess) in the configuration reference. -- **Properties**: - - Signature `(ttf, { fontName, formats }) => Buffer | Uint8Array | Promise<…>`. - - Runs once, after `toTtf`; all derived formats come from the returned buffer. - - webfont bundles no hinting/native dependency; the hook is opt-in. -- **Test Criteria**: - - ✅ Called with the generated TTF and context; return value used as `result.ttf` - - ✅ Derived `woff2` produced from the post-processed TTF - - ✅ Async hook supported - -## svgicons2svgfont options - -- **Stability**: stable -- **Description**: Pass font metrics and layout options through to svgicons2svgfont (normalize, fixed width, ascent/descent, etc.). -- **Properties**: - - Documented in [Configuration](./packages/webfont/docs/configuration.md#svgicons2svgfont). - - SVG pipeline only. -- **Test Criteria**: - - ✅ Options forwarded via `getFontStreamOptions` / standalone integration tests - -## SVG tools — diagnostics (alpha) - -- **Stability**: alpha -- **Description**: Scan SVG icon sources for icon-font incompatibilities before font generation. Stroke-to-fill and other SVG repairs are **out of scope** — use `glyphContentTransformFn` (see [ADR 0011](docs/adr/0011-no-svg-outline-stroke-dependency.md)). -- **Properties**: - - `svgTools.diagnose`: warn about `fill-rule: evenodd`, stroke-only paths, `` references ([#612](https://github.com/itgalaxy/webfont/issues/612)), and unsupported SVG elements; populate `result.svgDiagnostics`. - - CLI flag: `--svg-diagnose` (alpha). - - `--verbose` still logs evenodd warnings for backward compatibility. - - Programmatic helpers: `diagnoseSvgContents`, `diagnoseGlyphsData` exported from the package entry. -- **Test Criteria**: - - ✅ Unit tests for stroke/evenodd/element detection - - ✅ `glyphContentTransformFn` applied before font generation (#144) - - ✅ CLI integration tests for `--svg-diagnose` - -## Arbitrary format transcoding - -- **Stability**: planned -- **Description**: Convert between outline/container formats beyond the current three pipelines (e.g. TTF ↔ OTF transcoding, OTF input encoding). -- **Properties**: - - **Partially supported:** TTF → `svg` (SVG font) / `eot` / `woff` / `woff2` (see TTF to webfont encoding). WOFF/WOFF2 → TTF/OTF decompression. - - **Out of scope today:** OTF input encoding, TTF ↔ OTF outline conversion. - - External tools (FontForge, fontTools, etc.) are required for TTF → OTF today. -- **Test Criteria**: - - ✅ TTF input encoded to WOFF/WOFF2 - - ⬜ TTF input transcoded to OTF - - ⬜ Documented public API for generic transcoding - -## Grunt integration (recipe) - -- **Stability**: stable -- **Description**: Run `webfont` from Grunt via a documented custom task — maintained replacement for archived [`grunt-webfont`](https://github.com/sapegin/grunt-webfont). -- **Properties**: - - Recipe: [`packages/grunt-webfont-recipe`](./packages/grunt-webfont-recipe/README.md) — calls `webfont()` + `writeResultFiles()` (exported from the package entry). - - Alternative: shell out to the `webfont` CLI from `grunt.util.spawn`. - - No official `grunt-webfont` npm plugin unless demand warrants it ([#771](https://github.com/itgalaxy/webfont/issues/771)). - - Parity gaps vs grunt-webfont (BEM/Bootstrap presets, `embed`, `codepointsFile`, FontForge) documented in the recipe and [MIGRATION.md](./MIGRATION.md#comparison-with-grunt-webfont). -- **Test Criteria**: - - ✅ Grunt recipe smoke test (`scripts/grunt-recipe-smoke.vitest.ts`) - -## Are you a contributor? - -This file is the canonical capability list. **Update it in the same PR** whenever behavior, supported inputs/outputs, or public options change. See [CONTRIBUTING.md](./CONTRIBUTING.md) for the full documentation checklist. diff --git a/HomebrewFormula/webfont.rb b/HomebrewFormula/webfont.rb deleted file mode 100644 index c1e5c3bd..00000000 --- a/HomebrewFormula/webfont.rb +++ /dev/null @@ -1,36 +0,0 @@ -# typed: strict -# frozen_string_literal: true - -# Homebrew formula for the `webfont` Node CLI (monorepo tap). -# -# brew tap itgalaxy/webfont https://github.com/itgalaxy/webfont -# brew install webfont -# -# On each npm release, bump url/sha256 with: -# node scripts/sync-homebrew-formula.mjs -# -# homebrew-core copy: npm run render:homebrew-core (tracking #785) -class Webfont < Formula - desc "Generator of fonts from SVG icons, with TTF encoding and WOFF/WOFF2 decoding" - homepage "https://webfont.js.org/" - url "https://registry.npmjs.org/webfont/-/webfont-12.5.0.tgz" - sha256 "f024d129de480429e81668fa3821859af3784a5aa0f6714ebe236d8520c13ce3" - license "MIT" - - depends_on "node" - - def install - system "npm", "install", *std_npm_args - bin.install_symlink libexec.glob("bin/*") - end - - test do - (testpath/"icon.svg").write <<~SVG - - SVG - - system bin/"webfont", testpath/"icon.svg", "-d", testpath, "-f", "woff2" - assert_path_exists testpath/"webfont.woff2" - assert_match version.to_s, shell_output("#{bin}/webfont --version") - end -end diff --git a/MAINTAINERS.md b/MAINTAINERS.md deleted file mode 100644 index c5284120..00000000 --- a/MAINTAINERS.md +++ /dev/null @@ -1,103 +0,0 @@ -# Maintainer guide - -Workflow for maintainers, release automation, and AI agents opening pull requests in this repository. - -Contributors: see [CONTRIBUTING.md](./CONTRIBUTING.md) for how to report issues, write tests, and propose changes. Agent instructions shared with GitHub Copilot live in [AGENTS.md](./AGENTS.md) (symlinked as [CLAUDE.md](./CLAUDE.md) for Claude Code). - ---- - -## Pull requests - -**Never push commits directly to `master`.** All changes — including docs, tests, and chores — go through a feature branch and a pull request. Only merge to `master` after review (or explicit maintainer approval on the PR). Do not use `git push origin master` for routine work. - -When a task produces branch changes intended for review (features, fixes, CI, docs, refactors): - -1. **Check whether the current branch is already merged** (see [Merged branches](#merged-branches) below). If it is, create a **new branch from `master`** — do not push follow-up commits to a merged PR branch. -2. **Create a branch** from `master` using a **lowercase** name (for example `docs/pr-workflow`, `test/xml2js-guards`, `fix/cli-formats`). The entire branch name must stay lowercase — no camelCase or uppercase segments (avoid names like `test/toTtf-unit-tests`). -3. **Read** [`.github/pull_request_template.md`](./.github/pull_request_template.md) and use it as the PR body structure (do not substitute a shorter custom format). -4. **Push** the branch to `origin` (`git push -u origin HEAD`) without asking first. -5. **Open a PR** with `gh pr create` (title + body in English, base `master`) without asking first. Pass the body via HEREDOC so headings and checklists match the template. **PR title must follow [Conventional Commits](https://www.conventionalcommits.org/)** (`type: description`, optional scope). Strip bot prefixes (`[Snyk]`, `[Dependabot]`) and rewrite to the correct type — use **`chore(deps):`** when dependencies change (or **`ci(deps):`** for GitHub Actions) (see **Dependency bumps** under [Scope, title, and description](#scope-title-and-description)). -6. **Return the PR URL** in the final response. - -**Squash merge only.** Routine merges to `master` use **Squash and merge** so the PR title is the single commit on `master` (Release Please depends on this). Do not use merge commits or rebase-merge unless a maintainer explicitly requests it. - -**Fix PR titles proactively.** When working on an open PR, check the title with `gh pr view --json title`. If it does not match Conventional Commits (wrong type, vendor prefix, or scope drift after new commits), run `gh pr edit --title "type(scope): description"` **without asking** — same as push. Re-read the title after every push that changes PR scope. - -**Do not ask the user for permission** to push or open a PR when the task produces reviewable branch changes. Push, `gh pr create`, and returning the PR URL are part of finishing the task — not optional follow-ups to confirm. - -### Pull request title and description - -- **Use [Conventional Commits](https://www.conventionalcommits.org/) for the PR title** — the same format as commit messages (`feat:`, `fix:`, `chore(deps):`, `docs:`, `test:`, `ci:`, etc.). The title should describe the **overall** change in the PR, not bot prefixes like `[Snyk]` or `[Dependabot]`. -- **Dependency updates drive the PR type.** If the PR changes **`package.json` or `package-lock.json` dependencies**, use **`chore(deps):`** in the title (or **`ci(deps):`** for GitHub Actions) — not `test:` or `docs:` even when the diff is mostly new tests or migration notes. Example: `chore(deps): bump wawoff2 to 2.0.1; add ttfEncode tests`. This matches the prefixes Dependabot generates via [`.github/dependabot.yml`](./.github/dependabot.yml). Release Please reads the squash-merge title on `master`. -- **Merge pull requests with squash.** The PR title becomes the commit message on `master` (Release Please reads it). Do not merge with merge commits or rebase-merge for routine work. -- **Write pull request titles, descriptions, and review comments in English** (commits and code comments in English as well). -- **Keep the PR title and body in sync with the actual diff.** When new commits change what the PR does (extra fixes, tests, docs, refactors), update the title and description before asking for review. -- **Rename non-conforming PR titles** before review when the title uses vendor labels (`[Snyk]`, `[Dependabot]`), plain prose, the wrong type, or **`test:` / `docs:` on a dependency bump**. -- **Prefer focused PRs.** If the scope keeps growing (unrelated fixes, large test refactors, docs, and feature work in one branch), stop stacking and **split follow-up work into separate PRs** instead. - -### Closing pull requests - -When you close a pull request (as author or maintainer), **leave a comment explaining why** — do not close silently. Helpful reasons include: superseded by another PR (link it), obsolete after dependency or codebase changes, out of scope, duplicate, or rejected after review. Write the comment in English. - -### Copilot and review comments - -Before finishing work on an open PR, **check for unresolved review threads** (Copilot, humans, bots). Do not leave Copilot feedback unanswered. - -| Step | Action | -|------|--------| -| **List threads** | `gh api graphql` → `pullRequest(number: N) { reviewThreads { nodes { id isResolved comments { nodes { body author { login } } } } } } }` or the PR **Files changed** tab | -| **Evaluate** | If the suggestion is valid for the **current** branch state, apply it (code, tests, or docs) in the same PR. If it is wrong or obsolete, explain why in a **reply in English** — cite code, tests, or AGENTS.md | -| **Codify** | If the fix encodes a **reusable** pattern, add or extend a bullet in [AGENTS.md](./AGENTS.md) in the same PR (see [Codify review feedback in AGENTS.md](./AGENTS.md#codify-review-feedback-in-agentsmd)). Skip for one-off bugs or rejected suggestions. | -| **Reply** | `gh api repos/{owner}/{repo}/pulls/{number}/comments` with `in_reply_to` set to the review comment `databaseId` | -| **Resolve** | When addressed (fix merged in the branch **or** reply documents why not), resolve the thread: GraphQL `resolveReviewThread(input: { threadId: "PRRT_…" })` | - -Resolve only after the thread is truly handled — not when ignoring feedback. If a follow-up commit applies Copilot’s fix, reply briefly (“Fixed in \”) then resolve. - -### Merged branches - -**Before every push**, confirm the target branch is still the right vehicle for the work: - -| Check | Command / action | -|-------|------------------| -| PR state | `gh pr view --head --json state,mergedAt,url` (or `gh pr list --head `) | -| Branch contained in `master` | `git fetch origin master && git log --oneline origin/master..origin/` — if empty after your last merge, or PR `state` is `MERGED`, stop using that branch | - -**If the PR is merged (or the branch is obsolete):** - -1. **Do not** push new commits to that branch expecting them to land via the old PR. -2. **Do** `git fetch origin master`, branch from `origin/master`, cherry-pick or re-apply only the commits not yet on `master`, then push and **`gh pr create`** a **new** PR. -3. **Prefer one focused PR per follow-up** after merge — tests, docs, and unrelated fixes on top of merged work belong on a new branch. - -### Template sections (be selective) - -Keep [`.github/pull_request_template.md`](./.github/pull_request_template.md) **headings and order**, but write each section critically — only include content that applies to the PR: - -| Section | Guidance | -|---------|----------| -| **Proposed changes** | Bullet the real changes; remove placeholder text. | -| **Related issue** | Link the issue, or write `N/A` / `None` when there is none. | -| **Dependencies** | List adds/updates/removes, or `N/A` when `package.json` is untouched. | -| **Testing** | Mark only test types you actually ran or added. Omit sub-items that do not apply. | -| **How to test** | Steps a reviewer can follow. | -| **Test configuration** | Node/npm versions only when version-sensitive; otherwise `N/A`. | -| **Checklist** | Mark `[x]` only for items you completed. Leave maintainer-only items unchecked. | - -### Scope, title, and description - -- **PR title = Conventional Commits.** Squash merge puts the title on `master`; Release Please reads it. -- **Dependency bumps set the type.** `chore(deps):` or `ci(deps):` when `package.json` / lockfile dependencies change. -- **Re-read the PR title and body whenever the branch scope changes.** -- **Split when it grows too much.** Prefer separate PRs for follow-up work. -- **Explain why when closing a PR.** See [Closing pull requests](#closing-pull-requests). - ---- - -## GitHub issues workflow - -Process open issues **oldest to newest** (`gh issue list --state open`, sort by number). See [AGENTS.md](./AGENTS.md) for triage, fix PR, post-merge, and release comment expectations. - ---- - -## Releases and publishing - -See [CONTRIBUTING.md](./CONTRIBUTING.md) → **Releases**, **npm publishing**, **Vercel docs deployment**, and [ADR 0004](./docs/adr/0004-release-please-instead-of-standard-version.md). diff --git a/MIGRATION.md b/MIGRATION.md deleted file mode 100644 index a7efe979..00000000 --- a/MIGRATION.md +++ /dev/null @@ -1,72 +0,0 @@ -# Migration guide - -What changed between webfont releases and how to update your setup. - -See also [packages/webfont/CHANGELOG.md](./packages/webfont/CHANGELOG.md) for the full release history. - -## Where entries live - -**Each change has its own file** under [`docs/migration/`](./docs/migration/) — not a growing section in this document. That keeps parallel PRs from conflicting on the same markdown file. Browse that folder (files are named `issue-0569-cli-round.md`) for the change that affects you. - -**Adding or updating an entry?** See [docs/migration/README.md](./docs/migration/README.md) for naming, the merge-conflict-safe PR workflow, and the required **entry structure**. - -## Migrating from other tools - -Comparisons with older or adjacent projects live here so [README.md](./README.md) stays focused on installing and using `webfont`. - -### Comparison with `webfonts` - -`webfont` (this project) is sometimes confused with the older, **unmaintained** [`webfonts`](https://github.com/uipoet/webfonts) package (note the trailing `s`). `webfonts` last shipped around 2015 and requires a **Java** runtime (it bundles `batik-ttf2svg`, `sfnt2woff`, and `ttf2eot`). `webfont` is **pure JavaScript**, actively maintained, and does everything the *useful* parts of `webfonts` did — plus SVG-icon fonts, WOFF2, decompression, templates, and a Node.js API. - -| Capability | `webfont` (this project) | `webfonts` ([uipoet/webfonts](https://github.com/uipoet/webfonts)) | -|------------|:------------------------:|:-----------------------------------------------------------------:| -| Maintained | ✅ | ❌ (last release ~2015) | -| Runtime | Pure JS (Node.js) | Node.js **+ Java** | -| SVG icons → font | ✅ (default pipeline) | ❌ | -| TTF input → web formats | ✅ | ✅ | -| Output: `woff2` (Brotli) | ✅ | ❌ | -| Output: `woff` / `eot` | ✅ | ✅ | -| Output: `svg` font | ✅ (`-f svg`, opt-in) | ✅ | -| Choose which formats to emit | ✅ (`-f` / `formats`) | ❌ (always `woff` + `eot` + `svg`) | -| WOFF/WOFF2 → TTF/OTF decompression | ✅ | ❌ | -| Node.js / programmatic API | ✅ (`webfont()`) | ❌ (CLI only) | -| CSS / SCSS / Styl templates | ✅ | ❌ (manual `@font-face` snippet) | -| Config files (cosmiconfig) | ✅ | ❌ | -| `.otf` as a **source** | ❌ ([tracking #767](https://github.com/itgalaxy/webfont/issues/767)) | ❌ ([requested](https://github.com/uipoet/webfonts/issues/4)) | - -#### Command-line equivalents - -```bash -# webfonts (unmaintained): converts a directory of TTFs, always emits woff + eot + svg -webfonts fonts/ -o dist/ - -# webfont: pick your formats explicitly (woff2 recommended for the web) -webfont "fonts/*.ttf" -f woff2,woff,eot,svg -d dist --dest-create -``` - -`webfont` adds `woff2` (much smaller than the legacy formats), lets you emit only what you ship, and needs no Java toolchain. - -### Comparison with `grunt-webfont` - -[`grunt-webfont`](https://github.com/sapegin/grunt-webfont) is the classic "SVG → webfont" **Grunt plugin** (~1.1k★, MIT). It is **archived** (read-only since 2021, last release `v1.2.0`), and its best-fidelity output relies on a native **FontForge** binary (its pure-`node` engine can't do ligatures). `webfont` is a framework-agnostic, actively maintained, pure-JS library **and** CLI: it does everything grunt-webfont *generated* — plus TTF encoding, WOFF/WOFF2 decompression, more templates, and programmatic hooks. For Grunt, use the documented [custom task recipe](../../packages/grunt-webfont-recipe/README.md) ([#771](https://github.com/itgalaxy/webfont/issues/771)). - -| Capability | `webfont` (this project) | `grunt-webfont` ([sapegin/grunt-webfont](https://github.com/sapegin/grunt-webfont)) | -|------------|:------------------------:|:----------------------------------------------------------------------------------:| -| Maintained | ✅ | ❌ (archived 2021, `v1.2.0`) | -| Runtime | Node API **+ CLI** (any build tool) | **Grunt task only** | -| Engine | Pure JS (`svg2ttf`) | `node` **or** FontForge binary | -| SVG icons → font | ✅ | ✅ | -| Output formats | `svg, ttf, eot, woff, woff2` | `eot, woff2, woff, ttf, svg` | -| TTF input → web formats | ✅ | ❌ | -| WOFF/WOFF2 → TTF/OTF decompression | ✅ | ❌ | -| Stylesheets | `css, scss, styl, html, json` + custom Nunjucks, multiple per run | `css, sass, scss, less, stylus` + custom | -| CSS syntax presets (BEM / Bootstrap) | ❌ (use a custom template) | ✅ | -| `data:uri` embedding in CSS | ❌ | ✅ (`embed`) | -| Autohinting (`ttfautohint`) | via `ttfPostProcess` hook (external, opt-in) | built-in (`autoHint`) | -| Ligatures | ✅ (opt-in) | ✅ (FontForge engine only) | -| Codepoint map persistence | ❌ | ✅ (`codepointsFile`) | -| Programmatic API | ✅ (`webfont()`) | ❌ (Grunt only) | -| SVG diagnostics | ✅ (alpha) | ❌ | -| Grunt integration | ✅ ([recipe](../../packages/grunt-webfont-recipe/README.md)) | ✅ (native) | - -If you only need the generation that grunt-webfont did, `webfont` is a maintained, FontForge-free replacement. If you specifically need BEM/Bootstrap CSS presets or `data:uri` embedding today, use a [custom template](../../packages/webfont/docs/configuration.md#template) in the configuration guide. diff --git a/README.md b/README.md index 1a1bf87e..59e21167 100755 --- a/README.md +++ b/README.md @@ -1,93 +1,493 @@ # webfont [![NPM version](https://img.shields.io/npm/v/webfont.svg)](https://www.npmjs.org/package/webfont) -[![Node.js CI](https://github.com/itgalaxy/webfont/actions/workflows/pr.yml/badge.svg)](https://github.com/itgalaxy/webfont/actions/workflows/pr.yml) +[![Travis Build Status](https://img.shields.io/travis/itgalaxy/webfont/master.svg?label=build)](https://travis-ci.org/itgalaxy/webfont) +[![Build status](https://ci.appveyor.com/api/projects/status/a8absovr2r44w1oc?svg=true)](https://ci.appveyor.com/project/evilebottnawi/webfont) + +Generator of fonts from SVG icons. + +## Features + +- Supported font formats: `WOFF2`, `WOFF`, `EOT`, `TTF` and `SVG`; +- Support config files: use a `JavaScript`, `JSON` or `YAML` file to specify configuration information for an entire directory and all of its subdirectories; +- Support all popular browsers, including IE8+; +- Allows using custom templates (example `css`, `scss`, [`styl`](https://github.com/itgalaxy/webfont/pull/164/) etc); +- No extra dependencies as `gulp`, `grunt` or other big tools; +- Tested on all platforms (`linux`, `windows` and `osx`); +- CLI; +- [Webpack plugin](https://github.com/itgalaxy/webfont-webpack-plugin). + +## Table Of Contents + +- [Webfont](#webfont) + - [Installation](#installation) + - [Usage](#usage) + - [Options](#options) + - [svgicons2svgfont](#svgicons2svgfont) +- [Command Line Interface (CLI)](#command-line-interface) + - [Installation](#cli-installation) + - [Usage](#cli-usage) + - [Exit Codes](#cli-exit-codes) +- [Related](#related) +- [Roadmap](#roadmap) +- [Contribution](#contribution) +- [Changelog](#changelog) +- [License](#license) + +--- + +## Installation -Generator of fonts from SVG icons, with separate modes to **encode** TTF to web formats and **decompress** WOFF/WOFF2 containers to the TTF or OTF inside. +```shell +npm install --save-dev webfont +``` -**Documentation site:** [webfont.js.org](https://webfont.js.org) — install, configuration, CLI, demos, and guides. +## Usage -| Topic | Where | -|-------|--------| -| **Features** (stable / in-progress / planned) | [FEATURES.md](./FEATURES.md) | -| **Install & first run** | [packages/webfont/install.md](./packages/webfont/install.md) · [webfont.js.org/introduction/install](https://webfont.js.org/introduction/install) | -| **API & options** | [packages/webfont/docs/configuration.md](./packages/webfont/docs/configuration.md) · [webfont.js.org/introduction/configuration](https://webfont.js.org/introduction/configuration) | -| **CLI reference** | [packages/webfont/docs/cli.md](./packages/webfont/docs/cli.md) · [webfont.js.org/introduction/cli](https://webfont.js.org/introduction/cli) | -| **Troubleshooting** | [TROUBLESHOOTING.md](./TROUBLESHOOTING.md) | -| **Migration** | [MIGRATION.md](./MIGRATION.md) | -| **Legal / licensing** | [packages/webfont/NOTICE.md](./packages/webfont/NOTICE.md) | +```js +import webfont from "webfont"; -## Capabilities at a glance +webfont({ + files: "src/svg-icons/**/*.svg", + fontName: "my-font-name", +}) + .then((result) => { + // Do something with result + Function.prototype(result); + // Or return it + return result; + }) + .catch((error) => { + throw error; + }); +``` -Quick summary of the three pipelines webfont supports. Each run picks **one** mode from matched inputs — SVG icons, TTF encoding, or WOFF/WOFF2 decompression (they cannot be mixed). +or + +```js +const webfont = require("webfont").default; -| Mode | Input | Outputs | Notes | -|------|--------|---------|--------| -| **SVG icons** | One or more `.svg` files | `svg`, `ttf`, `eot`, `woff`, `woff2` | Default. Builds TrueType via `svg2ttf`. **`otf` is rejected** — use `ttf`. | -| **TTF encoding** | One or more `.ttf` files | `ttf`, `svg` (SVG font), `eot`, `woff`, and/or `woff2` per input | Auto-detected. Default when SVG-pipeline `formats` are still configured: `woff` + `woff2` (`svg` is opt-in). No templates. | -| **Webfont decompress** | One or more `.woff` / `.woff2` paths, globs, or `http(s)` URLs | `ttf` and/or `otf` per input | One output file per source (basename from filename; collisions get `-woff`/`-woff2`). Not a single merged font. | +webfont({ + files: "src/svg-icons/**/*.svg", + fontName: "my-font-name", +}) + .then((result) => { + // Do something with result + Function.prototype(result); + // Or return it + return result; + }) + .catch((error) => { + throw error; + }); +``` -**Not supported today** +### Options -- Renaming or re-wrapping without matching the real outline format (e.g. requesting `otf` when the WOFF2 holds TrueType). -- Converting TTF to OTF (or OTF to TTF) — use [FontForge](https://fontforge.org/) or similar. -- `.otf` as input for webfont encoding (TrueType `.ttf` only today). -- Templates, `glyphTransformFn`, `glyphContentTransformFn`, or merged multi-weight SFNT output in TTF encoding or webfont decompress mode. -- Globs that match extension-less or unsupported files together with fonts (the run fails instead of silently ignoring extras). +#### `files` -Every matched path must end in `.svg`, `.ttf`, `.woff`, or `.woff2`. +- Type: `string` | `array` +- Description: A file glob, or array of file globs. Ultimately passed to [fast-glob](https://github.com/mrmlnc/fast-glob) to figure out what files you want to get. +- Note: `node_modules` and `bower_components` are always ignored. -**Full capability list** — stability, behavior details, and test-backed criteria: **[FEATURES.md](./FEATURES.md)**. +#### `configFile` -### Font licensing +- Type: `string` +- Description: Path to a specific configuration file `(JSON, YAML, or CommonJS)` or the name of a module in `node_modules` that points to one. +- Note: If you do not provide `configFile`, webfont will search up the directory tree for configuration file in the following places, in this order: + 1. a `webfont` property in `package.json` + 2. a `.webfontrc` file (with or without filename extension: `.json`, `.yaml`, and `.js` are available) + 3. a `webfont.config.js` file exporting a JS `object`. + The search will begin in the working directory and move up the directory tree until it finds a configuration file. -webfont is a technical tool. **Decompressing or generating fonts does not grant you any rights to those fonts.** You must have permission to use, convert, and redistribute every input file and every output file under the applicable license. The MIT license applies to **this software only**, not to fonts you pass through it. See **[NOTICE.md](./packages/webfont/NOTICE.md)**. +#### `fontName` -**Migrating from another tool?** See [MIGRATION.md](./MIGRATION.md#migrating-from-other-tools). +- Type: `string` +- Default: `webfont` +- Description: The font family name you want. -## Quick start +#### `formats` -Requires **Node.js** >= 24.14.0. Install as a dev dependency and run at **build time** (not from browser or React client bundles): +- Type: `array`, +- Default: `['svg', 'ttf', 'eot', 'woff', 'woff2']`, +- Possible values: `svg, ttf, eot, woff, woff2`, +- Description: Font file types to generate. -```shell -npm install --save-dev webfont -``` +#### `template` -On macOS or Linux you can also install the CLI with [Homebrew](https://brew.sh): `brew install webfont` ([homebrew-core](https://github.com/Homebrew/homebrew-core/pull/291610)). See [install guide](./packages/webfont/install.md#homebrew-macos--linux-cli). +- Type: `string` +- Default: `null` +- Possible values: `css`, `scss`, [`styl`](https://github.com/itgalaxy/webfont/pull/164/) (feel free to contribute more). +- Note: If you want to use a custom template use this option pass in a path `string` like this: -```js -import { webfont } from "webfont"; + ```js + webfont({ + template: "./path/to/my-template.css", + }); + ``` -const result = await webfont({ - files: "src/svg-icons/**/*.svg", - fontName: "my-font-name", -}); + Or + + ```js + webfont({ + template: path.resolve(__dirname, "./my-template.css"), + }); + ``` + + Or + + ```js + webfont({ + template: path.resolve(__dirname, "./my-template.styl"), + }); + ``` + +#### `templateClassName` + +- Type: `string` +- Default: `null` +- Description: Default font class name. + +#### `templateFontPath` + +- Type: `string` +- Default: `./` +- Description: Path to generated fonts in the `CSS` file. + +#### `templateFontName` + +- Type: `string` +- Default: Gets is from `fontName` if not set, but you can specify any value. +- Description: Template font family name you want. + +#### `ligatures` + +- Type: `boolean` +- Default: `true` +- Description: Turn on/off adding ligature unicode + +#### `glyphTransformFn` + +- Type: `function` +- Default: `null` +- Description: If you want to transform glyph metadata (e.g. titles of CSS classes or unicode) before transferring it in your style template for your icons, you can use this option with glyphs metadata object. +- Example: + + ```js + import webfont from "webfont"; + + webfont({ + files: "src/svg-icons/**/*.svg", + glyphTransformFn: (obj) => { + obj.name += "_transform"; + something(); + + return obj; + }, + }) + .then((result) => { + // Do something with result + Function.prototype(result); + // Or return it + return result; + }) + .catch((error) => { + throw error; + }); + ``` + +#### `sort` + +- Type: `bool` +- Default: `true` +- Description: Whether you want to sort the icons sorted by name. + +--- + +## svgicons2svgfont + +### svgicons2svgfont options + +These can be appended to [webfont options](#options). These are passed directly to [svgicons2svgfont](https://github.com/nfroidure/svgicons2svgfont). + +#### `svgicons2svgfont.fontName` + +- Type: `string` +- Default: Taken from the [webfont fontName option](#fontname) +- Description: The font family name you want. + +#### `svgicons2svgfont.fontId` + +- Type: `string` +- Default: The `fontName` value +- Description: The font id you want. + +#### `svgicons2svgfont.fontStyle` + +- Type: `string` +- Default: `''` +- Description: The font style you want. + +#### `svgicons2svgfont.fontWeight` + +- Type: `string` +- Default: `''` +- Description: The font weight you want. + +#### `svgicons2svgfont.fixedWidth` + +- Type: `boolean` +- Default: `false` +- Description: Creates a monospace font of the width of the largest input icon. + +#### `svgicons2svgfont.centerHorizontally` + +- Type: `boolean` +- Default: `false` +- Description: Calculate the bounds of a glyph and center it horizontally. + +#### `svgicons2svgfont.normalize` + +- Type: `boolean` +- Default: `false` +- Description: Normalize icons by scaling them to the height of the highest icon. + +#### `svgicons2svgfont.fontHeight` + +- Type: `number` +- Default: `MAX(icons.height)` +- Description: The outputted font height (defaults to the height of the highest input icon). + +#### `svgicons2svgfont.round` + +- Type: `number` +- Default: `10e12` Setup SVG path rounding. + +#### `svgicons2svgfont.descent` + +- Type: `number` +- Default: `0` +- Description: The font descent. It is useful to fix the font baseline yourself. +- Warning: The descent is a positive value!. + +#### `svgicons2svgfont.ascent` + +- Type: `number` +- Default: `fontHeight - descent` +- Description: The font ascent. Use this options only if you know what you're doing. A suitable value for this is computed for you. + +#### `svgicons2svgfont.metadata` + +- Type: `string` +- Default: `undefined` +- Description: The font [metadata](http://www.w3.org/TR/SVG/metadata.html). + You can set any character data in, but this is the recommended place for a copyright mention. + +#### `svgicons2svgfont.log` + +- Type: `function` +- Default: `console.log` +- Description: Allows you to provide your own logging function. Set to `function(){}` to disable logging. + +--- + +## Command Line Interface + +The interface for command-line usage is fairly simplistic at this stage, as seen in the following usage section. + +### CLI Installation + +Add the `cli` script to your `package.json` file's `scripts` object: + +```json +{ + "scripts": { + "webfont": "node node_modules/webfont/dist/cli.js" + } +} +``` + +If you're using cross-env: + +```json +{ + "scripts": { + "webfont": "cross-env node_modules/webfont/dist/cli.js" + } +} ``` -**Next steps:** [Install guide](./packages/webfont/install.md) (CLI script, cosmiconfig, verification) · [Configuration reference](./packages/webfont/docs/configuration.md) · [npm package README](./packages/webfont/README.md) (what ships on npm). +### CLI Usage + +```shell + Usage: webfont [input] [options] + + Input: File(s) or glob(s). + + If an input argument is wrapped in quotation marks, it will be passed to "fast-glob" + for cross-platform glob support. + + Options: + + --config + + Path to a specific configuration file (JSON, YAML, or CommonJS) + or the name of a module in \`node_modules\` that points to one. + If no \`--config\` argument is provided, webfont will search for + configuration files in the following places, in this order: + - a \`webfont\` property in \`package.json\` + - a \`.webfontrc\` file (with or without filename extension: + \`.json\`, \`.yaml\`, and \`.js\` are available) + - a \`webfont.config.js\` file exporting a JS object + The search will begin in the working directory and move up the + directory tree until a configuration file is found. + + -f, --font-name + + The font family name you want, default: "webfont". + + -h, --help + + Output usage information. + + -v, --version + + Output the version number. + + -r, --formats + + Only this formats generate. + + -d, --dest + + Destination for generated fonts. + + -m, --dest-create + Create destination directory if it does not exist. + + -t, --template + + Type of template (\`css\`, \`scss\`, \`styl\`) or path to custom template. +' + -s, --dest-template + + Destination for generated template. If not passed used \`dest\` argument value. + + -c, --template-class-name + + Class name in css template. + + -p, --template-font-path + + Font path in css template. + + -n, --template-font-name + + Font name in css template. + + --no-sort + + Keeps the files in the same order of entry + + --verbose -Node.js only — do not import from client-side app code ([#198](https://github.com/itgalaxy/webfont/issues/198)). + Tell me everything!. -## Repository layout + For "svgicons2svgfont": -This is an **npm workspaces** monorepo. The published package lives in **`packages/webfont`** (`name: "webfont"` on npm). User-facing markdown for the docs site stays at the repo root; package-specific guides ship inside the tarball (`install.md`, `docs/configuration.md`, `docs/cli.md`, `NOTICE.md`, `LICENSE`). + --font-id -**Homebrew:** `brew install webfont` from [homebrew-core](https://github.com/Homebrew/homebrew-core/pull/291610). The monorepo tap (`HomebrewFormula/webfont.rb`, `Aliases/webfonts`) is bumped automatically on release; a PR to homebrew-core is opened by CI when `HOMEBREW_COMMITTER_TOKEN` is configured (see [CONTRIBUTING.md](./CONTRIBUTING.md#homebrew-monorepo-tap--homebrew-core)). + The font id you want, default as "--font-name". -## Contributing + --font-style -See [CONTRIBUTING.md](./CONTRIBUTING.md), [CODE_OF_CONDUCT.md](./CODE_OF_CONDUCT.md), and [open issues](https://github.com/itgalaxy/webfont/issues). Pull requests use the [PR template](https://github.com/itgalaxy/webfont/blob/master/.github/pull_request_template.md). + The font style you want. + + --font-weight + + The font weight you want. + + --fixed-width + + Creates a monospace font of the width of the largest input icon. + + --center-horizontally + + Calculate the bounds of a glyph and center it horizontally. + + --normalize + + Normalize icons by scaling them to the height of the highest icon. + + --font-height + + The outputted font height [MAX(icons.height)]. + + --round + + Setup the SVG path rounding [10e12]. + + --descent + + The font descent [0]. + + --ascent + + The font ascent [height - descent]. + + --start-unicode + + The start unicode codepoint for files without prefix [0xEA01]. + + --prepend-unicode + + Prefix files with their automatically allocated unicode codepoint. + + --metadata + + Content of the metadata tag. + + --add-hash-in-font-url + + Generated font url will be : [webfont].[ext]?v=[hash] + +``` + +### CLI Exit Codes + +The CLI can exit the process with the following exit codes: + +- 0: All ok. +- 1: Something unknown went wrong. +- Other: related to using packages. + +--- ## Related -- [Webpack plugin](https://github.com/itgalaxy/webfont-webpack-plugin) -- [svgicons2svgfont](https://github.com/nfroidure/svgicons2svgfont) · [svg2ttf](https://github.com/fontello/svg2ttf) · [ttf2eot](https://github.com/fontello/ttf2eot) · [ttf2woff](https://github.com/fontello/ttf2woff) · [wawoff2](https://github.com/fontello/wawoff2) -- [fontTools](https://github.com/fonttools/fonttools) — complementary Python toolkit for subsetting, variable fonts, and table editing after webfont generates the font. +- [Webpack plugin](https://github.com/itgalaxy/webfont-webpack-plugin) - `webpack` plugin. +- [svgicons2svgfont](https://github.com/nfroidure/svgicons2svgfont) - Simple tool to merge multiple icons to an SVG font. +- [svg2ttf](https://github.com/fontello/svg2ttf) - Converts SVG fonts to TTF format. +- [ttf2eot](https://github.com/fontello/ttf2eot) - Converts TTF fonts to EOT format. +- [ttf2woff](https://github.com/fontello/ttf2woff) - Converts TTF fonts to WOFF format. +- [wawoff2](https://github.com/fontello/wawoff2) - Converts TTF fonts to WOFF2 and versa vice. + +## Roadmap + +- The ability to generate from any type to any type; +- More tests, include CLI test; +- Improved docs; +- Reduce package size (maybe implement `ttf2woff2` with native js library); +- Improve performance (maybe use cache for this). + +## Contribution + +Feel free to push your code if you agree with publishing under the MIT license. ## Changelog -[packages/webfont/CHANGELOG.md](./packages/webfont/CHANGELOG.md) +Check our [Changelog](CHANGELOG.md) ## License -The **webfont software** is licensed under the [MIT License](./LICENSE). That license does **not** apply to fonts or icons you process with the tool — see [NOTICE.md](./packages/webfont/NOTICE.md). A copy also ships at [packages/webfont/LICENSE](./packages/webfont/LICENSE) inside the npm package. +Check our [License](LICENSE) diff --git a/TROUBLESHOOTING.md b/TROUBLESHOOTING.md deleted file mode 100644 index 3b831f88..00000000 --- a/TROUBLESHOOTING.md +++ /dev/null @@ -1,562 +0,0 @@ -# Troubleshooting - -Common CLI issues and how to fix them. Each entry follows the same structure: the error you see, why it happens, and steps to resolve it. - ---- - -## Destination directory does not exist - -### What error appeared - -The CLI exits with code **1** and prints a message similar to: - -```text -Error: Destination directory "path/to/your/fonts" does not exist. Use --dest-create (-m) to create it. -``` - -You may also see progress output before the error when `--verbose` is enabled, for example: - -```text -Generating SVG font... -Error: Destination directory "path/to/your/fonts" does not exist. Use --dest-create (-m) to create it. -``` - -On older versions, the same situation could surface as a raw filesystem error instead: - -```text -Error: ENOENT: no such file or directory, open 'path/to/your/fonts/webfont.woff2' -``` - -In those cases the process could still exit with code **0** even though no font files were written. - -### Why it usually happens - -- **`--dest` / `-d` points to a folder that was never created.** Webfont does not create the output directory unless you ask it to. -- **The path is relative to your current working directory.** A path that looks correct in your editor may not exist from the shell directory where you run the command. -- **A build script or CI job runs before `mkdir`.** Scripts often assume `dist/fonts` or `public/icons` already exist. -- **A typo in the path** (extra segment, wrong casing on case-sensitive filesystems, or a missing parent directory). - -Font generation can finish before files are written. If the destination folder is missing, the write step fails even though earlier steps (and verbose logs) may have already run. - -### Steps to try to resolve - -1. **Confirm the path exists from the same directory where you run webfont.** - - ```shell - ls -la path/to/your/fonts - ``` - - If the directory is missing, either create it yourself or use step 2. - -2. **Ask webfont to create the destination directory.** - - ```shell - webfont "src/icons/*.svg" -d path/to/your/fonts --dest-create - ``` - - Short form: - - ```shell - webfont "src/icons/*.svg" -d path/to/your/fonts -m - ``` - -3. **Create the directory manually** (useful in CI or when you want explicit control): - - ```shell - mkdir -p path/to/your/fonts - webfont "src/icons/*.svg" -d path/to/your/fonts - ``` - -4. **Use an absolute path for `--dest`** if your script changes working directories: - - ```shell - webfont "src/icons/*.svg" -d "$(pwd)/dist/fonts" - ``` - -5. **Check write permissions** on the parent directory if creation still fails: - - ```shell - mkdir -p path/to/your/fonts - touch path/to/your/fonts/.write-test && rm path/to/your/fonts/.write-test - ``` - -6. **When using the programmatic API**, set `destCreate: true` if the folder may not exist yet: - - ```js - import { webfont } from "webfont"; - - await webfont({ - files: "src/icons/*.svg", - dest: "dist/fonts", - destCreate: true, - }); - ``` - -7. **Upgrade webfont** if you see exit code **0** with no output files and only an `ENOENT` message. Current releases fail with exit code **1** and the clearer destination error above. - -If the problem persists, open an issue with the full command, your working directory, and the complete terminal output. - ---- - -## `npm warn Unknown env config "devdir"` - -### What error appeared - -Every `npm` command prints a warning similar to: - -```text -npm warn Unknown env config "devdir". This will stop working in the next major version of npm. See `npm help npmrc` for supported config options. -``` - -The command still succeeds; only the warning is noisy. - -### Why it usually happens - -- **Cursor (or some IDE sandboxes) inject `npm_config_devdir`** into the shell environment so node-gyp uses a sandbox cache directory. -- **npm 11.2+ warns** because `devdir` is not an official npm config key — it is a legacy node-gyp convention. -- **This repository does not set `devdir`.** The project `.npmrc` only contains `save-exact=true`. - -Confirm the source in your terminal: - -```shell -echo "$npm_config_devdir" -``` - -If the path contains `cursor-sandbox-cache` (or similar), the IDE injected it — not webfont. - -### Steps to try to resolve - -1. **Clear the variable for one command:** - - ```shell - npm_config_devdir= npm test - ``` - -2. **Clear it for the current shell session:** - - ```shell - unset npm_config_devdir - ``` - -3. **Cursor / VS Code integrated terminal** — this repo ships `.vscode/settings.json` with `npm_config_devdir` cleared. Open a **new** terminal or reload the window (*Developer: Reload Window*) so the setting applies. Existing terminals keep the old environment. - -4. **CI and plain shells** outside Cursor are unaffected; no change is required there. - -This warning does not indicate a broken install or a webfont bug. - ---- - -## Config `files` ignored when using `--config` - -### What error appeared - -You pass `--config webfont.config.json` with a `files` array in the config, but webfont only processes SVG paths from the command line — or shows help when you omit positional arguments. - -Example config: - -```json -{ - "files": ["src/icons/a.svg", "src/icons/b.svg"], - "dest": "dist/icons", - "fontName": "my-icons" -} -``` - -**Older releases (before the fix in [#696](https://github.com/itgalaxy/webfont/pull/696)):** - -```shell -webfont --config webfont.config.json -d dist/icons -# Shows help or does not pick up both files from config -``` - -If you also pass SVG paths on the CLI while `files` is set in the config, older releases may silently prefer CLI input only. - -**After the fix ships** (upgrade required), combining both causes a clear error: - -```text -Error: Cannot specify input files on the command line when `files` is set in the config file -``` - -### Why it usually happens - -- **The CLI treated positional arguments as the only input source.** Config `files` was merged inside `webfont()`, but the CLI required at least one path on the command line before running. -- **`files` in config and CLI input are mutually exclusive by design** — use one or the other to avoid ambiguity about which globs win. - -### Steps to try to resolve - -1. **Upgrade webfont** to a version that includes the fix for [#2](https://github.com/itgalaxy/webfont/issues/2) (see release notes / [#696](https://github.com/itgalaxy/webfont/pull/696)). Then run **without** positional SVG arguments: - - ```shell - webfont --config webfont.config.json -d dist/icons - ``` - -2. **Until you upgrade**, pass all globs on the command line and use the config only for other options (`fontName`, `dest`, `formats`, etc.): - - ```shell - webfont "src/icons/a.svg" "src/icons/b.svg" --config webfont.config.json -d dist/icons - ``` - - Ensure the config file does **not** contain a `files` key in this mode. - -3. **Programmatic API** — pass `files` directly (config discovery still merges other keys): - - ```js - import { webfont } from "webfont"; - - await webfont({ - files: ["src/icons/a.svg", "src/icons/b.svg"], - configFile: "webfont.config.json", - }); - ``` - -4. **Do not mix** CLI positional paths with `files` in the config after upgrading — pick one source of truth. - -If the problem persists after upgrading, open an issue with your config file, full command, and webfont version (`webfont --version` or `npm ls webfont`). - ---- - -## Icon details missing after export - -### What error appeared - -There is often **no error**. The font builds successfully, but part of the icon is missing in the browser — for example the dot on a letter in a LinkedIn-style logo ([#175](https://github.com/itgalaxy/webfont/issues/175)). - -The same SVG looks correct in Inkscape, Illustrator, or Affinity Designer. - -### Why it usually happens - -- **`fill-rule: evenodd` on compound paths.** Many design tools export icons as one path with multiple subpaths and `fill-rule: evenodd` (often via an inline `style` on the root ``). Browsers still draw that SVG correctly. -- **Icon fonts use the nonzero fill rule.** When the SVG is converted to a font glyph, `fill-rule` is not preserved. Counter-shapes and holes can disappear or invert — the geometry is often still in the glyph path, but it renders wrong. -- **`--normalize` does not fix fill-rule.** Normalization adjusts metrics and path coordinates; it does not change evenodd semantics ([#80](https://github.com/itgalaxy/webfont/issues/80)). -- **Small viewBoxes can make detail loss worse** for complex paths. Try a larger artboard (for example 512×512) and `fontHeight: 600` with `normalize: true` when paths are very small ([#80](https://github.com/itgalaxy/webfont/issues/80#issuecomment-435621410)). - -Run with **`--verbose`** to log a warning when webfont detects `fill-rule: evenodd` in a source SVG. - -**Alpha — broader diagnostics:** use **`--svg-diagnose`** (CLI) or `svgTools: { diagnose: true }` (API) to also flag stroke-only SVGs, `` symbol references ([#612](https://github.com/itgalaxy/webfont/issues/612)), and unsupported elements (``, ``, ``). webfont does not auto-fix these — preprocess with [`glyphContentTransformFn`](./packages/webfont/docs/configuration.md#glyphcontenttransformfn) when needed (see [ADR 0011](docs/adr/0011-no-svg-outline-stroke-dependency.md)). - -### Steps to try to resolve - -1. **Inspect the SVG with nonzero fill rule.** Temporarily change `fill-rule:evenodd` to `fill-rule:nonzero` in the file and reopen it in a vector editor. Missing pieces usually indicate path direction or compound-path issues, not a silent webfont failure. - -2. **Fix the source in your design tool (recommended).** - - Merge shapes with **Unite** / **Union**, then **Object → Compound Path → Make** (Illustrator: Ctrl/Cmd+8) so holes use correct winding ([#175](https://github.com/itgalaxy/webfont/issues/175#issuecomment-966653174)). - - Avoid leaving `fill-rule: evenodd` on icons destined for icon fonts. - - Export at a **larger size** (for example 512×512) when the tool produces fragile small paths. - -3. **Tune font metrics for fine detail:** - - ```js - await webfont({ - files: "src/icons/**/*.svg", - normalize: true, - fontHeight: 600, - }); - ``` - -4. **Preprocess difficult SVGs** with [`glyphContentTransformFn`](./packages/webfont/docs/configuration.md#glyphcontenttransformfn) (for example retrace or flatten strokes with [`svg-outline-stroke`](https://github.com/elrumordelaluz/outline-stroke) or [svg-fixer](https://github.com/oslllo/svg-fixer), installed in your project) before generating the font. - -5. **Remove percentage `width` / `height`** on the root `` if a preprocessor errors; keep a numeric `viewBox` instead. - -See also [MDN: fill-rule](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/fill-rule). - ---- - -## Stroke-only SVGs produce blank icons - -### What error appeared - -On releases **after** the [#327](https://github.com/itgalaxy/webfont/issues/327) fix, webfont **fails the run** with a message similar to: - -```text -Empty glyph path(s) in SVG font output for: wave (icons/wave.svg). Stroke-only SVGs (fill="none" with stroke) often produce empty glyphs because svgicons2svgfont does not convert strokes. ... -``` - -On **older releases**, the command may exit successfully but the icon is **invisible** in the browser — the font file exists, yet the glyph path is empty (`d=""`). - -### Why it usually happens - -- The SVG uses **strokes** instead of **filled paths** (`fill="none"` with `stroke`, or `` / `` elements). -- **svgicons2svgfont** (the library that merges SVGs into a font) does **not** convert strokes to outlines. Stroke geometry is dropped, so the exported glyph has no path data. -- Design tools and browsers still preview the SVG correctly; only the font export is affected. - -### Steps to try to resolve - -1. **Convert strokes to fills** in your design tool (Outline Stroke / Expand / Object to Path) before export. - -2. **Preprocess in your build** with [`glyphContentTransformFn`](./packages/webfont/docs/configuration.md#glyphcontenttransformfn). webfont **does not ship** stroke converters — install a tool in **your** project (for example [`svg-outline-stroke`](https://github.com/elrumordelaluz/outline-stroke) or [svg-fixer](https://github.com/oslllo/svg-fixer)) and call it from the hook (see [ADR 0011](docs/adr/0011-no-svg-outline-stroke-dependency.md)). - -3. **Scan sources before converting:** `webfont icons/*.svg --svg-diagnose` (or `svgTools: { diagnose: true }` in the API) logs stroke-only and unsupported-element warnings without changing files. - -4. **Optional SVGO cleanup:** `webfont icons/*.svg --optimize-svg` (or `optimizeSvg: true`) removes comments and editor metadata before conversion — it does **not** convert strokes. Use **before** `glyphContentTransformFn` when you need both cleanup and stroke outlining ([#724](https://github.com/itgalaxy/webfont/issues/724)). - -5. **Optimize with SVGO** only after strokes are outlines — aggressive SVGO presets alone do not fix stroke-only artwork for icon fonts. - ---- - -## SVG transform and `` references - -### What error appeared - -There is often **no build error**. The font generates, but a glyph is **empty**, **wrong**, or **missing a flip/offset** that looks correct in the browser. Source SVGs may look like: - -```xml - -``` - -See [#612](https://github.com/itgalaxy/webfont/issues/612). - -### Why it usually happens - -- **svgicons2svgfont** (the library that merges SVGs into a font) converts **filled paths** on each icon file. It does **not** resolve **`` / ``** references or bake **`transform`** on those instances into standalone path data. -- **`transform` on paths/groups** is experimental upstream; **``** is a separate limitation — the referenced geometry is never inlined. -- Design tools and browsers render `` + `transform` correctly; the font pipeline does not. - -### Steps to try to resolve - -1. **Flatten before webfont** — in Illustrator, Inkscape, or Figma export: **Expand / Flatten / Outline stroke**, or export **plain SVG** without symbols/instances. - -2. **SVGO** (in your build): plugins such as **`convertShapeToPath`** and **`cleanupIds`** help; use a preset that inlines or removes `` where possible. webfont’s **`--optimize-svg`** does **not** inline `` — run SVGO in `glyphContentTransformFn` if you need that step. - -3. **Scan sources:** `webfont icons/*.svg --svg-diagnose` warns when `` is detected (**12.1.0+**). - -4. **Preprocess in code:** - - ```js - import { webfont } from "webfont"; - import { optimize } from "svgo"; - - await webfont({ - files: "src/icons/**/*.svg", - glyphContentTransformFn: async (glyph) => - optimize(glyph.contents, { plugins: ["preset-default"] }).data, - }); - ``` - - Adjust SVGO plugins to your icons; test output glyphs in the HTML preview. - -See also [`docs/migration/issue-0612-svg-use-transform.md`](./docs/migration/issue-0612-svg-use-transform.md). - ---- - -## `unicode-range` enabled but ligatures stopped working - -### What error appeared - -There is often **no error**. Icons via **class + codepoint** (`.icon-phone::before`) still work. Typing **ligature names** (`phone_call`) shows fallback text or blank glyphs after you turned on [`unicodeRange`](./packages/webfont/docs/configuration.md#unicoderange) ([#322](https://github.com/itgalaxy/webfont/issues/322)). - -### Why it usually happens - -- **`unicode-range` is opt-in** (default off). When enabled, webfont emits a range from **private-use code points only** (for example `U+EA01-EA1D`). Ligature identifier strings are ASCII and are **not** included in that range. -- The browser applies the icon font only for code points inside `unicode-range`. For `phone_call`, letters `p`, `h`, `o`, … use a system font, so OpenType **`liga` cannot substitute** the icon glyph. -- This is expected CSS behavior — `unicode-range` optimizes multi-font pages; ligature-by-name needs the icon font (or a second `@font-face` without range) for ASCII input. - -### Steps to try to resolve - -1. **Use class + codepoint icons** in production when `unicode-range` is enabled (recommended with multiple icon fonts on one page). - -2. **Disable `unicode-range`** if you rely on ligature names: omit `--unicode-range` / `unicodeRange: true` (default), or set `unicodeRange: false` in config. - -3. **HTML preview:** built-in `html` omits `unicode-range` when both `templateFontLigatures` and `unicodeRange` are enabled so the Ligature section can still preview names. Generated `css` / `scss` templates do not — enable `unicodeRange` only when you accept the ligature trade-off. - -4. See also [Ligature names show text but no icon](#ligature-names-show-text-but-no-icon-html-preview). - ---- - -## Ligature names show text but no icon (HTML preview) - -### What error appeared - -There is often **no error**. The built-in **`html`** preview lists icon names under **Ligature**, but the large icon above each name is **blank** or shows **fallback serif text** (for example `bleach`, `drip_dry`) while the **Class** section (`.font-icon-name::before`) shows the glyph. - -### Why it usually happens - -- **Ligature mode** types the icon name (for example `phone_call`) as normal text. The browser must apply OpenType **`liga`** so that character sequence maps to the icon glyph in the font. -- Icon fonts typically **do not** include regular Latin letters — without `liga`, the browser looks up `p`, `h`, `o`, … in the icon font, finds no glyphs, and renders nothing. -- From webfont **12.x** onward, the built-in `html` template adds `font-feature-settings: "liga" 1` on `#icon-ligatures` by default (`templateFontLigatures`, on by default). `unicode-range` is **off by default**; if you enable it, ligature preview may break unless the HTML template strips the rule (see above). -- **`unicode-range` on `@font-face` limits which characters use the icon font.** When enabled, the computed range covers only private-use code points. Ligature names are ASCII, so the browser keeps a fallback font for those letters and **`liga` never runs**. - -### Steps to try to resolve - -1. **Regenerate** with a current webfont version (`liga` preview CSS on by default; `unicode-range` off unless you opt in). - -2. **If you enabled `unicodeRange`**, see [`unicode-range` enabled but ligatures stopped working](#unicode-range-enabled-but-ligatures-stopped-working). -3. **In your own CSS or template**, enable ligatures where you type icon names: - - ```css - .my-icon-font { - font-family: "my-icon-font"; - font-feature-settings: "liga" 1; - font-variant-ligatures: common-ligatures; - } - ``` - -4. **Prefer class + codepoint** for production (works without `liga` and with `unicode-range`): - - ```html - - ``` - -5. **Disable preview CSS** if you manage ligatures yourself: `templateFontLigatures: false` or `--no-template-font-ligatures`. - -6. Ensure [`ligatures`](./packages/webfont/docs/configuration.md#ligatures) is enabled when using ligature names (`--ligatures` adds ligature glyphs to the font). - ---- - -## Browser hangs or extreme slowdown (large icon webfont, Firefox on Windows) - -### What error appeared - -There is often **no build error**. After upgrading `webfont` (for example v9 → v11+) and shipping a **large** icon font (thousands of glyphs — Material Design Icons, Tabler, etc.), users report: - -- Firefox on **Windows** freezing for seconds when opening a tab or switching tabs -- High CPU in **DirectWrite** / `LigatureSubstitution` during layout reflow -- Chrome slower than before; macOS/Linux often less affected - -See [#558](https://github.com/itgalaxy/webfont/issues/558), [MaterialDesign#6519](https://github.com/Templarian/MaterialDesign/issues/6519), and [tabler-icons#1327](https://github.com/tabler/tabler-icons/issues/1327). - -### Why it usually happens - -- From webfont **12.x**, **`ligatures` default to `false`** (performance on large fonts). **webfont 10.x–11.x** enabled ligatures by default — upgrading from those versions without regenerating fonts is a common trigger for this issue. -- When **`ligatures: true`** (or `--ligatures`), each icon name is also encoded as an OpenType ligature (for example `phone_call` → glyph). -- **Thousands of ligatures** produce a very large GSUB table. Windows Firefox uses DirectWrite to process ligature lookups during layout — reflow can take seconds per tab switch. -- **WOFF2 is not the root cause** — the same ligature-heavy TTF/WOFF triggers the behavior. Fonts built without ligatures perform normally. - -### Steps to try to resolve - -1. **Keep ligatures disabled** (default on webfont 12.x). On older releases use `--no-ligatures` / `ligatures: false`: - - ```shell - webfont "icons/*.svg" -d dist/fonts - ``` - - ```js - await webfont({ files: "icons/**/*.svg" }); - ``` - - Only enable ligatures if you need ligature-by-name text and accept the performance cost: - - ```shell - webfont "icons/*.svg" -d dist/fonts --ligatures - ``` - -2. **Use class + codepoint CSS** in the app (`.mdi-phone::before { content: "\\f001"; }`) — not ligature-by-name text. - -3. **In CSS**, if you cannot regenerate the font yet, try `font-variant-ligatures: none` on icon classes — this helps only when the page does not rely on `liga` for icons; regenerating without ligatures is more reliable. - -4. **webfont warns** when glyph count exceeds **2000** with ligatures enabled (stdout). Do not pass `--ligatures` on MDI-scale sets. - -5. Prefer **`@mdi/svg` / SVG or JS icon packages** for web apps when the upstream project documents webfont alternatives. - ---- - -## Homebrew: formula not found or wrong source - -### What error appeared - -`brew install webfont` fails with: - -```text -Warning: No available formula with the name "webfont". Did you mean webfs? -``` - -Or `brew info webfont` shows `Tap: itgalaxy/webfont` when you expected homebrew-core. - -### Why it usually happens - -- **Stale Homebrew index** — especially right after a new formula lands in homebrew-core. Run `brew update` before installing. -- **Monorepo tap still tapped** — if you ran `brew tap itgalaxy/webfont`, Homebrew installs from the tap first. That still works, but it is not the same as the core formula. -- **Tap removed but index not refreshed** — after `brew untap itgalaxy/webfont`, some setups need `brew update` before `brew install webfont` resolves homebrew-core. - -### Steps to try to resolve - -1. **Refresh and install from core:** - - ```shell - brew update - brew install webfont - ``` - -2. **Confirm which formula is installed:** - - ```shell - brew info webfont - webfont --version - ``` - - Core shows `From: https://github.com/Homebrew/homebrew-core/...`. The tap shows `Tap: itgalaxy/webfont`. - -3. **Switch from tap to core:** - - ```shell - brew uninstall webfont - brew untap itgalaxy/webfont - brew update - brew install webfont - ``` - -4. **Smoke-test the CLI** (same as the Homebrew formula test): - - ```shell - webfont path/to/icon.svg -d /tmp/webfont-test -f woff2 --dest-create - ls /tmp/webfont-test/webfont.woff2 - ``` - -5. **Optional tap** — for the `webfonts` alias or pre-core formula bumps, see [Install — Homebrew](./packages/webfont/install.md#homebrew-macos--linux-cli). - -### Related - -- [homebrew-core PR #291610](https://github.com/Homebrew/homebrew-core/pull/291610) — merged formula -- [#785](https://github.com/itgalaxy/webfont/issues/785) — tracking issue - ---- - -## Can't resolve `fs` (webpack / React / Vite client bundle) - -### What error appeared - -Bundlers fail while building client code with errors such as: - -```text -Module not found: Error: Can't resolve 'fs' -``` - -Or at **runtime** in the browser (often with older `webfont` versions bundled into the app): - -```text -TypeError: Cannot read property 'dirname' of undefined - at .../node_modules/glob-parent/index.js -``` - -The stack trace often includes `globby`, `fast-glob`, `glob-parent`, `cosmiconfig`, or `webfont/dist/standalone.js` ([#198](https://github.com/itgalaxy/webfont/issues/198), [#496](https://github.com/itgalaxy/webfont/issues/496)). - -### Why it usually happens - -- **`webfont` is Node.js-only.** It reads SVG files from disk, runs `globby`, and uses other Node built-ins. It is meant for **build time**, not inside browser/React component bundles. -- **The package was imported from client code** (for example `import webfont from "webfont"` in `App.js`). Webpack/Vite tries to bundle the full Node implementation. Without Node’s `path` module, dependencies such as `glob-parent` throw **`Cannot read property 'dirname' of undefined`** ([#496](https://github.com/itgalaxy/webfont/issues/496)). -- **From webfont 12.x**, the package `browser` / `exports` default entry resolves to a small stub that rejects with a clear message instead of pulling in `globby` — but you must still **not** call `webfont()` from client code; generate fonts in Node and ship the output files. - -### Steps to try to resolve - -1. **Do not import `webfont` from client-side code.** Generate fonts in an npm script, a Node build step, or CI: - - ```shell - webfont "src/icons/*.svg" -d public/fonts -t css - ``` - -2. **Use the [webfont-webpack-plugin](https://github.com/itgalaxy/webfont-webpack-plugin)** (or an equivalent build hook) so generation runs in Node during compilation — not in the browser bundle. - -3. **Programmatic API — Node only:** - - ```js - import { webfont } from "webfont"; - - await webfont({ files: "src/icons/*.svg", dest: "public/fonts" }); - ``` - - Run this from a `.mjs` script, `vite.config.ts`, or webpack config — never from React components loaded in the browser. - -4. **If a dependency still pulls `webfont` into the client bundle**, mark it external or move the import to a Node-only file. With **webfont 12.x** and webpack 5+ / modern Vite, the package `browser` field and `exports` default resolve to `dist/browser.js`, which throws a clear error instead of bundling `fs` / `glob-parent`. On **11.x** or webpack 4 without `browser` resolution, you may see `dirname of undefined` until you stop importing `webfont` from client code. - -5. **Browser-based generation** is not supported on the current release; see [#708](https://github.com/itgalaxy/webfont/issues/708) for a possible future Web Worker spike. - - diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index 3d58dfba..00000000 --- a/appveyor.yml +++ /dev/null @@ -1,9 +0,0 @@ -# Legacy AppVeyor project is still linked to this repository (no dashboard access). -# Branch filter: no real branch matches, so push/PR webhooks do not start builds. -# build/test off: if a build is forced from the UI, skip MSBuild auto-discovery. -branches: - only: - - appveyor-disabled - -build: off -test: off diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 00000000..1f86f72c --- /dev/null +++ b/babel.config.js @@ -0,0 +1,13 @@ +module.exports = { + presets: [ + [ + "@babel/preset-env", + { + targets: { + node: "current", + }, + }, + ], + "@babel/preset-typescript", + ], +}; diff --git a/biome.json b/biome.json deleted file mode 100644 index a27a8c4d..00000000 --- a/biome.json +++ /dev/null @@ -1,215 +0,0 @@ -{ - "$schema": "https://biomejs.dev/schemas/2.5.2/schema.json", - "vcs": { - "enabled": true, - "clientKind": "git", - "useIgnoreFile": true - }, - "files": { - "includes": [ - "**/*.ts", - "**/*.js", - "**/*.json", - "!!**/*.svg", - "!!**/dist", - "!!**/coverage", - "!!**/demo", - "!!**/node_modules", - "!!**/temp", - "!!**/templates", - "!!**/__snapshots__" - ] - }, - "formatter": { - "enabled": true, - "indentStyle": "space", - "indentWidth": 2, - "lineWidth": 115 - }, - "linter": { - "enabled": true, - "rules": { - "complexity": { - "noArguments": "error", - "noBannedTypes": "error", - "noCommaOperator": "error", - "noDivRegex": "error", - "noImplicitCoercions": "error", - "noUselessConstructor": "error", - "noUselessLabel": "error", - "noUselessLoneBlockStatements": "error", - "noUselessRename": "error", - "noUselessStringConcat": "error", - "noUselessTernary": "error", - "noUselessTypeConstraint": "error", - "noUselessUndefinedInitialization": "error", - "noVoid": "error", - "useLiteralKeys": "error", - "useMaxParams": "error", - "useNumericLiterals": "error", - "useRegexLiterals": "error" - }, - "correctness": { - "noConstructorReturn": "error", - "noInvalidUseBeforeDeclaration": "error", - "noNonoctalDecimalEscape": "error", - "noPrecisionLoss": "error", - "noUndeclaredVariables": "error", - "noUnsafeOptionalChaining": "error", - "noUnusedInstantiation": "error", - "noUnusedVariables": "error", - "useParseIntRadix": "error" - }, - "performance": { - "noAwaitInLoops": "error" - }, - "security": { - "noGlobalEval": "error", - "noScriptUrl": "error" - }, - "style": { - "noCommonJs": "error", - "noContinue": "error", - "noExcessiveClassesPerFile": "error", - "noIncrementDecrement": "error", - "noInferrableTypes": "error", - "noMultilineString": "error", - "noNamespace": "error", - "noNegationElse": "error", - "noNestedTernary": "error", - "noNonNullAssertion": "error", - "noParameterAssign": "error", - "noRestrictedGlobals": "error", - "noRestrictedImports": "error", - "noTernary": "error", - "noYodaExpression": "error", - "useArrayLiterals": "error", - "useAsConstAssertion": "error", - "useBlockStatements": "error", - "useCollapsedElseIf": "error", - "useConsistentArrowReturn": "error", - "useConsistentBuiltinInstantiation": "error", - "useConst": "error", - "useDefaultParameterLast": "error", - "useDefaultSwitchClause": "error", - "useExponentiationOperator": "error", - "useGroupedAccessorPairs": "error", - "useObjectSpread": "error", - "useShorthandAssign": "error", - "useSingleVarDeclarator": "off", - "useSpreadOverApply": "error", - "useSymbolDescription": "error", - "useTemplate": "error", - "useNodejsImportProtocol": "off", - "useImportType": "off" - }, - "suspicious": { - "noAlert": "error", - "noBitwiseOperators": "error", - "noConsole": "error", - "noDoubleEquals": "error", - "noEmptyBlockStatements": "error", - "noEqualsToNull": "error", - "noExplicitAny": "warn", - "noExtraNonNullAssertion": "error", - "noLabelVar": "error", - "noMisleadingInstantiator": "error", - "noNonNullAssertedOptionalChain": "error", - "noOctalEscape": "error", - "noProto": "error", - "noReturnAssign": "error", - "noSelfCompare": "error", - "noShadow": "error", - "noTemplateCurlyInString": "error", - "noUnusedExpressions": "error", - "noUselessRegexBackrefs": "error", - "noVar": "error", - "useAdjacentOverloadSignatures": "error", - "useAwait": "error", - "useDefaultSwitchClauseLast": "error", - "useGuardForIn": "error", - "useIterableCallbackReturn": "error", - "useNamespaceKeyword": "error" - } - } - }, - "javascript": { - "formatter": { - "quoteStyle": "double", - "semicolons": "always" - } - }, - "overrides": [ - { - "includes": ["**/*.test.ts"], - "javascript": { - "globals": ["afterAll", "afterEach", "beforeAll", "beforeEach", "describe", "expect", "it", "test", "vi"] - }, - "linter": { - "rules": { - "complexity": { - "noExcessiveLinesPerFunction": "off" - } - } - } - }, - { - "includes": ["*.js", "**/*.config.js", "packages/webfont/src/fixtures/**/*.js"], - "linter": { - "rules": { - "correctness": { - "noUnusedVariables": "off" - }, - "style": { - "noCommonJs": "off" - } - } - } - }, - { - "includes": ["src/cli/index.ts", "src/standalone/index.ts"], - "linter": { - "rules": { - "suspicious": { - "noConsole": "off" - } - } - } - }, - { - "includes": ["**/*.ts", "**/*.tsx"], - "linter": { - "rules": { - "correctness": { - "noConstAssign": "off", - "noGlobalObjectCalls": "off", - "noInvalidConstructorSuper": "off", - "noSetterReturn": "off", - "noUndeclaredVariables": "off", - "noUnreachable": "off", - "noUnreachableSuper": "off", - "useValidTypeof": "off" - }, - "suspicious": { - "noDuplicateClassMembers": "off", - "noDuplicateObjectKeys": "off", - "noDuplicateParameters": "off", - "noFunctionAssign": "off", - "noImportAssign": "off", - "noRedeclare": "off", - "noUnsafeNegation": "off", - "useGetterReturn": "off" - } - } - } - } - ], - "assist": { - "enabled": true, - "actions": { - "source": { - "organizeImports": "on" - } - } - } -} diff --git a/demo.md b/demo.md deleted file mode 100644 index 8035bc1b..00000000 --- a/demo.md +++ /dev/null @@ -1,21 +0,0 @@ -# Demo - -A live font generated by `webfont` from the SVG fixtures in this repository -(`packages/webfont/src/fixtures/svg-icons/*.svg`). The preview below is produced at build time by -the `html` template and served as a static asset — the same output you get from: - -```shell -webfont "src/svg-icons/*.svg" -t html -d dist --dest-create -``` - - - -> If the preview is blank in local `docs:dev`, run `npm run build && npm run docs:demo` -> once to generate `public/font-demo/` — production builds do this automatically. - -[Open the demo in a new tab →](/font-demo/webfont.html) diff --git a/packages/webfont/demo/.gitkeep b/demo/.gitkeep similarity index 100% rename from packages/webfont/demo/.gitkeep rename to demo/.gitkeep diff --git a/packages/webfont/demo/webfont.eot b/demo/webfont.eot similarity index 100% rename from packages/webfont/demo/webfont.eot rename to demo/webfont.eot diff --git a/packages/webfont/demo/webfont.html b/demo/webfont.html similarity index 100% rename from packages/webfont/demo/webfont.html rename to demo/webfont.html diff --git a/packages/webfont/demo/webfont.svg b/demo/webfont.svg similarity index 100% rename from packages/webfont/demo/webfont.svg rename to demo/webfont.svg diff --git a/packages/webfont/demo/webfont.ttf b/demo/webfont.ttf similarity index 100% rename from packages/webfont/demo/webfont.ttf rename to demo/webfont.ttf diff --git a/packages/webfont/demo/webfont.woff b/demo/webfont.woff similarity index 100% rename from packages/webfont/demo/webfont.woff rename to demo/webfont.woff diff --git a/packages/webfont/demo/webfont.woff2 b/demo/webfont.woff2 similarity index 100% rename from packages/webfont/demo/webfont.woff2 rename to demo/webfont.woff2 diff --git a/docs/adr/0001-eslint-vs-biome-linting.md b/docs/adr/0001-eslint-vs-biome-linting.md deleted file mode 100644 index 12c45ef8..00000000 --- a/docs/adr/0001-eslint-vs-biome-linting.md +++ /dev/null @@ -1,67 +0,0 @@ -# ADR 0001: Migrate from ESLint to Biome for linting and formatting - -- **Status:** Accepted -- **Date:** 2026-07-02 -- **Supersedes:** Initial ADR draft that recommended keeping ESLint - -## Context - -The project used ESLint 7 with `@typescript-eslint` and six additional plugins (`.eslintrc.js` defined 200+ rules). Lint runs on every `npm test` via `prebuild` and on staged files through `lint-staged` / Husky. - -[Dependabot PR #551](https://github.com/itgalaxy/webfont/pull/551) proposed upgrading `@typescript-eslint/eslint-plugin` but was already stale (`master` had 5.38.0). We benchmarked [Biome](https://biomejs.dev/) as an alternative. - -## Benchmark results (2026-07-02, v11.5.11) - -Repository size: ~28 TypeScript/JavaScript files, ~2,600 LOC. - -| Command | Median (installed binaries) | -|---------|----------------------------| -| `eslint .` | 910 ms | -| `biome check .` | 140 ms (**6.5× faster**) | -| `biome lint src` | 110 ms (**8.3× faster**) | - -Absolute savings: **~0.8 s per lint run**. Relative speedup is significant; on this small codebase lint was not the CI bottleneck, but faster feedback in local development and pre-commit hooks is worthwhile—especially as the project grows. - -## Decision drivers - -- **Performance:** Biome is 6–8× faster with installed binaries. -- **Tooling consolidation:** Biome provides linting, formatting, and import organization in one tool (replacing ESLint and implicit formatting concerns). -- **Maintenance:** Fewer devDependencies (no ESLint plugin matrix); pinned `@biomejs/biome` version. -- **Rule parity:** ESLint rules were migrated with `biome migrate eslint`; unsupported plugin rules (import, node, jest, unicorn) were dropped or replaced by Biome equivalents. - -## Decision - -**Migrate to Biome** as the sole linter and formatter for TypeScript, JavaScript, and JSON project files. - -- `npm run lint` → `biome check .` -- `npm run prettify` → `biome check --write .` -- `lint-staged` → `biome check --write` on staged `*.{ts,js,json}` -- Remove ESLint configuration and dependencies -- Configuration lives in `biome.json` (migrated from `.eslintrc.js` via `biome migrate eslint`, then adjusted) - -## Consequences - -### Positive - -- Faster lint/format in CI, `prebuild`, and pre-commit hooks. -- Single configuration file (`biome.json`) instead of ESLint + multiple plugins. -- Import sorting and formatting applied consistently by Biome. - -### Negative / trade-offs - -- Not every ESLint rule has a Biome equivalent (`import/extensions`, `node/no-unpublished-require`, etc.). -- Contributors familiar with ESLint disable comments must use `biome-ignore` where needed. -- Stale Dependabot PRs for ESLint (#551 and related) should be closed. - -### Follow-up - -- Close obsolete ESLint Dependabot PRs. -- Revisit `biome.json` rule strictness if new false positives appear. -- Consider enabling additional Biome rules incrementally rather than restoring the full ESLint surface area. -- Git hooks: see [ADR 0003](./0003-lefthook-instead-of-husky-lint-staged.md) (Lefthook replaced Husky / lint-staged). - -## References - -- [Biome documentation](https://biomejs.dev/) -- [Dependabot PR #551](https://github.com/itgalaxy/webfont/pull/551) -- Benchmark environment: macOS, Node.js 26.x, 2026-07-02 diff --git a/docs/adr/0002-jest-vs-vitest-testing.md b/docs/adr/0002-jest-vs-vitest-testing.md deleted file mode 100644 index 0f5803f4..00000000 --- a/docs/adr/0002-jest-vs-vitest-testing.md +++ /dev/null @@ -1,92 +0,0 @@ -# ADR 0002: Keep Jest instead of migrating to Vitest - -- **Status:** Superseded (Vitest adopted, 2026-07-02) -- **Date:** 2026-07-02 - -## Context - -The project uses **Jest 27.1.0** with `babel-jest` and Babel presets to run TypeScript tests. Tests run on every `npm test` via `pretest` → `npm run build` (clean, lint, Vite library build, declaration emit) and then `jest src`. - -Test surface today: - -- **5** test files, **48** tests, **13** snapshots (~870 LOC of test code) -- Jest-specific APIs in use: `jest.mock` (manual `__mocks__` for CLI `meow`), `jest.spyOn` on `fs.createReadStream`, `jest.setTimeout` -- Coverage collection is enabled by default in `jest.config.ts` - -We benchmarked [Vitest](https://vitest.dev/) 3.2.4 as a potential replacement, following the same approach used in [ADR 0001](./0001-eslint-vs-biome-linting.md). - -## Benchmark results (2026-07-02, v11.5.12) - -Environment: macOS, Node.js 26.x, warm cache, 5 runs per command, **median wall time**. - -| Command | Median | -|---------|--------| -| `jest src` (coverage on, project default) | **4.4 s** | -| `jest src --coverage=false` | **4.5 s** | -| `vitest run src` | **3.5 s** (~1.3× faster) | -| `npm test` (build + lint + jest + coverage) | **6.8 s** | - -Vitest reports faster transform/collect phases (esbuild vs Babel), but absolute savings on this suite are **~0.9 s per test run**. In the full `npm test` pipeline, build and font-generation integration tests dominate; the runner itself is not the bottleneck. - -## Compatibility spike - -Vitest was configured with a minimal `vitest.config.ts`, ESM `deps.inline` for the same packages listed in `jest.config.ts` `transformIgnorePatterns`, and a `jest` → `vi` shim in a setup file. - -**Result: 41/48 tests passed without editing test files; 7 failed.** - -| Area | Failure | Root cause | -|------|---------|------------| -| CLI (5 tests) | `process.exit` thrown; `cli.error` / `cli.verbose` not functions | `jest.mock("./meow")` is not hoisted by Vitest; manual mock in `src/cli/meow/__mocks__/` was not applied | -| `glyphsData` (2 tests) | `maxObservedConcurrency` stayed 0 | `jest.spyOn(fs, "createReadStream")` does not intercept the **named** `createReadStream` import used in production code under Vitest's ESM module graph | - -Additional migration friction observed: - -- Vitest added Vite types that conflicted with the project's `tsconfig.json` (`moduleResolution: Node`) during `postbuild` `tsc` -- Snapshot format/path differences (13 existing snapshots would need review) -- Would allow removing `babel-jest` and Babel presets from the test path, but Rollup/build would still need the current toolchain - -## Decision drivers - -- **Performance:** Vitest is ~20–30% faster on test execution alone; savings are modest (~1 s) and small relative to the ~7 s full `npm test` pipeline. -- **Migration cost:** Non-trivial for this codebase despite a small number of `jest.*` call sites — mock hoisting, ESM spy semantics, snapshots, and TypeScript config boundaries all need work. -- **Risk:** CLI and concurrency tests exercise subtle module-loading behavior; a migration PR would need careful review with little user-facing benefit. -- **Ecosystem fit:** Jest 27 is dated but stable; the project already documents pinned versions and conservative upgrades ([CONTRIBUTING.md](../../CONTRIBUTING.md)). - -## Decision (original) - -**Keep Jest** as the test runner. Do not migrate to Vitest at this time. - -## Supersession (2026-07-02) - -The test suite grew to **17** files, **206** tests, and **21** snapshots. Jest was upgraded to **30.4.2** with `@swc/jest` ([ADR 0005](./0005-babel-jest-vs-swc-jest.md)), CLI integration moved to `createMeowCli()` (no manual `meow` mock), and Vitest **4.1.9** compatibility issues from the original spike were addressed: - -- `vi.hoisted` / explicit `vi.mock` for CLI entry and `child_process` -- `vi.mock("fs")` wrapping `createReadStream` for `glyphsData` concurrency tests -- `vitest.config.ts` with `server.deps.inline`, `globby` stub alias, and v8 coverage - -**Vitest 4.1.9** is now the test runner; `jest`, `@swc/jest`, and `@types/jest` were removed. - -## Consequences - -### Positive - -- No churn in test files, snapshots, mocks, or CI scripts. -- Avoids introducing Vitest into a Node CLI library where the build pipeline uses Vite library mode ([ADR 0006](./0006-vite-instead-of-rollup.md)). -- Benchmark and compatibility findings are documented for a future revisit. - -### Negative / trade-offs - -- Test startup/transpile remains on Babel + Jest 27, which is slower than Vitest's esbuild pipeline. -- Jest 27 is several major versions behind; security and maintenance updates require a Jest upgrade path eventually. - -### Follow-up - -- Consider **upgrading Jest to 29.x** (and replacing `babel-jest` with `@swc/jest` or native TS support) as a lower-risk performance improvement before revisiting Vitest. -- Revisit this ADR if the test suite grows significantly (e.g. 3× more integration tests) or if Vitest improves Jest mock/snapshot compatibility with zero-change migrations. -- When closing stale Jest-related Dependabot PRs, prefer a focused Jest 29 upgrade PR over a Vitest rewrite. - -## References - -- [Vitest documentation](https://vitest.dev/) -- [Vitest migration guide (from Jest)](https://vitest.dev/guide/migration.html) -- [ADR 0001: ESLint vs Biome](./0001-eslint-vs-biome-linting.md) diff --git a/docs/adr/0003-lefthook-instead-of-husky-lint-staged.md b/docs/adr/0003-lefthook-instead-of-husky-lint-staged.md deleted file mode 100644 index fc03bfd6..00000000 --- a/docs/adr/0003-lefthook-instead-of-husky-lint-staged.md +++ /dev/null @@ -1,84 +0,0 @@ -# ADR 0003: Replace Husky and lint-staged with Lefthook - -- **Status:** Accepted -- **Date:** 2026-07-02 -- **Supersedes:** Git hook setup described in [ADR 0001](./0001-eslint-vs-biome-linting.md) (`lint-staged` / Husky) - -## Context - -[ADR 0001](./0001-eslint-vs-biome-linting.md) moved lint/format to Biome and intended pre-commit checks via **Husky** + **lint-staged** on staged `*.{ts,js,json}` files. - -In practice the hook stack was **not active**: - -- `husky.config.js` used the **Husky v4** API (`hooks: { "pre-commit": ... }`). -- `package-lock.json` resolved **Husky 7.x**, which expects a `.husky/` directory and a `prepare` script. -- There was **no** `lint-staged` configuration in `package.json`. -- Fresh clones had only default `.sample` files under `.git/hooks/` — no `pre-commit` or `pre-push` ran locally. - -The intended behavior was: - -| Hook | Command | -|------|---------| -| `pre-commit` | Biome check (with safe fixes) on **staged** files only | -| `pre-push` | `npm test` (full build + lint + Jest) | - -## Decision drivers - -- **Single tool:** [Lefthook](https://github.com/evilmartians/lefthook) manages hooks and staged-file filtering (`{staged_files}`, `glob`, `stage_fixed`) without a separate lint-staged dependency. -- **Official Biome guidance:** Biome documents Lefthook as a first-class Git hooks option. -- **Fewer Node devDependencies:** Remove `husky` (pinned as `latest` in `package.json` but outdated config) and `lint-staged` 11.x. -- **Explicit local testing:** `lefthook run pre-commit` and `lefthook run pre-push` simulate hooks without committing or pushing. -- **Repository size:** ~28 TS/JS files — no need for lint-staged’s dynamic JS configuration. - -## Decision - -**Replace Husky and lint-staged with Lefthook.** - -- Add `lefthook.yml` at the repository root. -- Add `prepare`: `lefthook install` in `package.json` (runs on `npm ci` / `npm install`). -- Pin `lefthook` to an exact version in `devDependencies`. -- Remove `husky`, `lint-staged`, and `husky.config.js`. - -### Hook configuration - -```yaml -pre-commit: - commands: - biome: - glob: "*.{ts,js,json}" - run: npx @biomejs/biome check --write --no-errors-on-unmatched --files-ignore-unknown=true {staged_files} - stage_fixed: true - -pre-push: - commands: - test: - run: npm test -``` - -`stage_fixed: true` re-stages files after Biome applies safe fixes, matching the previous lint-staged intent. - -## Consequences - -### Positive - -- Git hooks work on fresh clones after `npm install`. -- One configuration file (`lefthook.yml`) instead of Husky + lint-staged + dead `husky.config.js`. -- Contributors can dry-run hooks with `lefthook run pre-commit` / `lefthook run pre-push`. -- Optional personal overrides via `lefthook-local.yml` (gitignored by Lefthook defaults). - -### Negative / trade-offs - -- New dependency and YAML config to learn (small surface). -- `pre-push` runs full `npm test` (~8–10 s); plan for that before pushing. -- ADR 0001 still mentions lint-staged historically; hook behavior is defined by this ADR. - -### Follow-up - -- Document hook usage in `CONTRIBUTING.md`. -- Remove `.husky` from `vitest.config.ts` exclude patterns if no longer present. - -## References - -- [Lefthook](https://github.com/evilmartians/lefthook) -- [Biome — Git hooks](https://biomejs.dev/recipes/git-hooks/) -- [ADR 0001](./0001-eslint-vs-biome-linting.md) diff --git a/docs/adr/0004-release-please-instead-of-standard-version.md b/docs/adr/0004-release-please-instead-of-standard-version.md deleted file mode 100644 index b2737c95..00000000 --- a/docs/adr/0004-release-please-instead-of-standard-version.md +++ /dev/null @@ -1,106 +0,0 @@ -# ADR 0004: Replace standard-version with Release Please - -- **Status:** Accepted -- **Date:** 2026-07-02 -- **Supersedes:** Automated release flow in `.github/workflows/version-bump.yml` and `standard-version` in `package.json` - -## Context - -Releases were automated with **`standard-version@9.5.0`** via the `version-bump` GitHub Actions workflow: - -- On every push to `master` (except `chore(release)` commits), CI synced `package.json` from the latest git tag, ran `npm run release`, and pushed version commits and tags back to `master`. -- `CHANGELOG.md`, `package.json`, and `package-lock.json` were updated in-place on the default branch. - -Problems with this approach: - -| Issue | Detail | -|-------|--------| -| **Unmaintained tooling** | `standard-version` has no active releases; it pulls deprecated `conventional-changelog` v3 presets (`npm warn deprecated conventional-changelog-*`). | -| **No release PR** | Version bumps landed directly on `master`, bypassing review. | -| **Fragile sync step** | The workflow manually reconciled tags vs `package.json` before calling `standard-version`. | -| **Legacy references** | Comments mentioned “Lerna semantic release” though the repo is a single package. | - -The project already uses [Conventional Commits](https://www.conventionalcommits.org/) and documents them in `CONTRIBUTING.md` and GitLab workflow rules. - -## Decision drivers - -- **Maintained upstream:** [Release Please](https://github.com/googleapis/release-please) is actively maintained by Google. -- **Release PR workflow:** Proposed version, changelog, and manifest updates are reviewed in a PR before merge. -- **No local release dependency:** Versioning runs in GitHub Actions; removes `standard-version` and its transitive deprecated packages from `npm ci` output. -- **Node support:** Built-in `node` release type updates `package.json`, lockfile, and `CHANGELOG.md`. -- **GitHub Releases:** Merging the Release PR creates a tag and GitHub Release, which continues to trigger `.github/workflows/npm-publish.yml`. - -## Decision - -**Replace `standard-version` and `version-bump.yml` with Release Please.** - -1. Add `release-please-config.json` and `.release-please-manifest.json` (manifest bootstrapped at the current package version). -2. Add `.github/workflows/release-please.yml` using `googleapis/release-please-action@v4` on pushes to `master`. -3. Remove `.github/workflows/version-bump.yml`. -4. Remove from `package.json`: `standard-version`, `release`, `release-alpha`, `prerelease`, `preversion`, and `push-tags` scripts. -5. Update `CHANGELOG.md` header to reference Conventional Commits and Release Please. -6. Document the release process in `CONTRIBUTING.md`. - -### Configuration - -```json -// release-please-config.json -{ - "include-component-in-tag": false, - "packages": { - ".": { - "release-type": "node", - "package-name": "webfont" - } - } -} -``` - -### Git tag format - -Release tags use the **`v{semver}`** pattern (for example `v12.0.0`), matching tags created before Release Please (`v11.5.21`, `v11.2.26`, …). - -Release Please defaults to prefixing the package name in tags (`webfont-v12.0.0`) when `package-name` is set. For this single-package repo, **`include-component-in-tag: false`** in `release-please-config.json` (and the same flag on `release-please-action`) keeps tags and GitHub Releases aligned with the historical `v*` convention. - -Do not rename release tags casually: npm publish, `npm-publish.yml`, and changelog compare links all reference the tag name. - -```json -// .release-please-manifest.json -{ - ".": "11.5.21" -} -``` - -### Contributor workflow (after merge) - -1. Land features/fixes on `master` with Conventional Commit messages (`feat:`, `fix:`, `docs:`, etc.). -2. Release Please opens or updates a **Release PR** (title like `chore(master): release 11.6.0`). -3. Maintainers review the Release PR (version, changelog). -4. Merge the Release PR → Release Please creates the git tag and GitHub Release. -5. `npm-publish.yml` runs on `release: created` (existing behavior). - -## Consequences - -### Positive - -- Removes deprecated `conventional-changelog-*` warnings from `npm install`. -- Release changes are visible in a PR before they ship. -- Single maintained tool instead of custom tag-sync + `standard-version` push loop. -- Aligns with Conventional Commits already used in the repo. - -### Negative / trade-offs - -- **Release PR cadence:** Version bumps no longer land instantly on every `master` push; they accumulate in a Release PR until merged. -- **`GITHUB_TOKEN` limitation:** Releases created with the default token do **not** trigger other workflows (including `npm-publish.yml`). Publish manually from the release tag, or configure a PAT for Release Please later if fully automated publish is required (see [Release Please Action docs](https://github.com/googleapis/release-please-action#github-credentials)). -- **Prereleases:** The old `npm run release-alpha` script is removed; use Conventional Commit prerelease notation or Release Please `release-as` / manifest options when needed. - -### Follow-up - -- ~~If npm registry publish should run automatically, extend `npm-publish.yml` with `npm publish` and `NPM_TOKEN` (today it only runs `npm test` on `release: created`).~~ Done in PR [#639](https://github.com/itgalaxy/webfont/pull/639): publish on `release: published`. CI uses [npm Trusted Publishing](https://docs.npmjs.com/trusted-publishers) (OIDC), not long-lived publish tokens — see `CONTRIBUTING.md`. - -## References - -- [Release Please](https://github.com/googleapis/release-please) -- [Release Please Action](https://github.com/googleapis/release-please-action) -- [Manifest releaser](https://github.com/googleapis/release-please/blob/main/docs/manifest-releaser.md) -- [Conventional Commits](https://www.conventionalcommits.org/) diff --git a/docs/adr/0005-babel-jest-vs-swc-jest.md b/docs/adr/0005-babel-jest-vs-swc-jest.md deleted file mode 100644 index 04d8ee93..00000000 --- a/docs/adr/0005-babel-jest-vs-swc-jest.md +++ /dev/null @@ -1,109 +0,0 @@ -# ADR 0005: Replace babel-jest with @swc/jest for test transforms - -- **Status:** Superseded (Vitest adopted; `@swc/jest` removed, 2026-07-02) -- **Date:** 2026-07-02 -- **Related:** [ADR 0002](./0002-jest-vs-vitest-testing.md) (follow-up: “consider `@swc/jest` as a lower-risk performance improvement”) - -## Context - -The project uses **Jest 30** with **`@swc/jest`** to run TypeScript tests. Tests run on every `npm test` via `pretest` → `npm run build` (clean, lint, Vite library build, declaration emit) and then `jest src`. Production code is built with Vite library mode and `tsc` declarations ([ADR 0006](./0006-vite-instead-of-rollup.md)). - -Test surface today (v11.5.21): - -- **6** test files, **67** tests, **20** snapshots (~1,090 LOC of test code) -- Jest-specific APIs: `jest.mock` (manual `__mocks__` for CLI `meow`), `jest.spyOn` on `fs.createReadStream`, `jest.setTimeout`, `moduleNameMapper` for `globby` ([`jest/globby-stub.ts`](../../jest/globby-stub.ts)) -- Coverage collection enabled by default in [`jest.config.ts`](../../jest.config.ts) - -[SWC](https://swc.rs/) via [`@swc/jest`](https://swc.rs/docs/usage/jest) is a common drop-in replacement for `babel-jest` on TypeScript projects, with less tooling surface than a full Vitest migration. - -## Benchmark results (2026-07-02, v11.5.21) - -Environment: macOS, Node.js 26.x, warm cache, **5 runs per command, median wall time** (Jest-reported `Time:`). - -| Command | Median | -|---------|--------| -| `jest src` (babel-jest, coverage on) | **3.98 s** | -| `jest src --coverage=false` (babel-jest) | **4.12 s** | -| `jest src` (@swc/jest, coverage on) | **3.93 s** (~1.3% faster) | -| `jest src --coverage=false` (@swc/jest) | **3.86 s** (~6% faster vs babel coverage-off median) | - -Cold cache (single run after `jest --clearCache`, coverage off): - -| Transformer | Wall time | -|-------------|-----------| -| babel-jest | **6.07 s** | -| @swc/jest | **5.44 s** (~10% faster) | - -Benchmark packages (temporary install, not merged): `@swc/core@1.15.11`, `@swc/jest@0.2.39`. - -**Interpretation:** SWC is faster at transpilation, but this suite is dominated by font-generation and CLI integration work. Absolute savings are **~50–260 ms per warm `jest src` run** and **~0.6 s on a cold cache**. In the full `npm test` pipeline (`pretest` → build + lint + jest), build and integration tests remain the bottleneck — same conclusion as [ADR 0002](./0002-jest-vs-vitest-testing.md) for Vitest. - -## Compatibility spike - -A spike `jest.config.swc.ts` (since removed) used this explicit `transform` block: - -```ts -transform: { - "^.+\\.(t|j)sx?$": [ - "@swc/jest", - { - jsc: { - parser: { syntax: "typescript" }, - target: "es2020", - }, - module: { type: "commonjs" }, - }, - ], -}, -``` - -**Result: 67/67 tests passed, 20/20 snapshots unchanged, zero test file edits.** - -Unlike the Vitest spike in ADR 0002, mock hoisting, spies, and snapshot paths behaved the same because Jest remains the runner. - -## Decision drivers - -- **Performance:** Modest but consistent speedup on warm and cold Jest runs; largest gain on first run after cache clear. -- **Migration cost:** Low — update `jest.config.ts`, add pinned `@swc/core` + `@swc/jest`, remove `babel-jest` and Babel presets/`babel.config.js`. No test rewrites. -- **Tooling consolidation:** Removes a second compile toolchain (Babel) used only for tests; aligns with replacing ESLint with Biome on the lint path ([ADR 0001](./0001-eslint-vs-biome-linting.md)). -- **Risk:** Lower than Vitest migration ([ADR 0002](./0002-jest-vs-vitest-testing.md)); keeps Jest 27 mocks, coverage, and Lefthook `pre-push` behaviour intact. -- **Ecosystem fit:** `@swc/jest` is widely used with Jest; pairs naturally with a future Jest 29 upgrade without switching runners. - -## Decision - -**Adopt `@swc/jest`** as the Jest transformer and **remove Babel from the test path** (`babel-jest`, `@babel/preset-env`, `@babel/preset-typescript`, `babel.config.js`). - -Keep **Jest 27** as the test runner ([ADR 0002](./0002-jest-vs-vitest-testing.md)); do not migrate to Vitest for this performance gain alone. - -## Consequences - -### Positive - -- Faster test transpilation, especially on cold cache (~10% in this benchmark). -- Fewer devDependencies and one less config file (`babel.config.js`). -- Documented, low-risk path toward faster tests without revisiting Vitest. - -### Negative / trade-offs - -- Absolute time saved per `npm test` is small while build + integration tests dominate. -- Adds `@swc/core` native binaries (platform-specific); CI must continue to use supported Node/OS images ([`engines`](../../package.json) `>=24.14.0`). -- SWC TypeScript support can lag rare syntax edge cases; pin versions and run the full suite on upgrade. - -### Implementation checklist - -1. Pin `@swc/core` and `@swc/jest` (exact versions) in `package.json`. -2. Move the `transform` block from the spike config into `jest.config.ts`. -3. Remove `babel-jest`, `@babel/preset-env`, `@babel/preset-typescript`, and `babel.config.js`. -4. Run `npm test` locally and in CI. - -### Follow-up - -- Revisit **Jest 29.x** upgrade separately; `@swc/jest` should carry forward. *(Done: Jest upgraded to **30.4.2** in `chore/jest-30.4.2`.)* -- Re-benchmark if the test suite grows substantially (e.g. 3× more integration tests) or if transform time becomes a measurable fraction of CI. - -## References - -- [@swc/jest documentation](https://swc.rs/docs/usage/jest) -- [ADR 0001: ESLint vs Biome](./0001-eslint-vs-biome-linting.md) -- [ADR 0002: Jest vs Vitest](./0002-jest-vs-vitest-testing.md) -- Benchmark environment: macOS, Node.js 26.x, `@swc/core@1.15.11`, `@swc/jest@0.2.39` (temporary dev install) diff --git a/docs/adr/0006-vite-instead-of-rollup.md b/docs/adr/0006-vite-instead-of-rollup.md deleted file mode 100644 index 21e29306..00000000 --- a/docs/adr/0006-vite-instead-of-rollup.md +++ /dev/null @@ -1,90 +0,0 @@ -# ADR 0006: Replace Rollup with Vite library mode - -- **Status:** Accepted -- **Date:** 2026-07-02 -- **Supersedes:** `rollup.config.js`, Rollup 2.x, `@rollup/plugin-typescript`, and `@rollup/plugin-commonjs` in `package.json` - -## Context - -Production bundles are built with **Rollup 2.56.3** and plugins pinned to `"latest"` in `package.json`: - -| Output | Entry | Format | -|--------|-------|--------| -| CLI (`dist/cli.mjs`, `bin`) | `src/cli/index.ts` | ESM + `#!/usr/bin/env node` banner (`meow` 14 is ESM-only) | -| Library (`dist/index.js`, `main`) | `src/index.ts` | CJS, named exports | - -`postbuild` runs `tsc --declaration --emitDeclarationOnly` for `dist/src/index.d.ts` (unchanged). - -### Problems with Rollup in this repo - -| Issue | Detail | -|-------|--------| -| **Fragile glob filtering** | `@rollup/plugin-typescript` defaults to include `**/*.ts+(|x)` via `@rollup/pluginutils` → `picomatch`. A transitive bump to `picomatch@2.3.2` (e.g. Dependabot `micromatch` PR #680) made the pattern match **no** `.ts` files; Rollup then parsed TypeScript as JavaScript and failed on `type` keywords. | -| **`"latest"` plugins** | `@rollup/plugin-commonjs` and `@rollup/plugin-typescript` resolve to whatever npm serves; peer ranges span Rollup 1–2 while the project pins Rollup 2.56.3. | -| **Rollup 2 is legacy** | No path to Rollup 4 / modern defaults without a larger migration; Vite already targets library builds and Node-oriented bundling. | -| **Two-tool overlap** | Rollup bundles; `tsc` emits declarations. Vite library mode keeps that split but replaces the bundler with maintained defaults and esbuild-powered transforms. | - -[Vite library mode](https://vite.dev/config/build-options#build-lib) supports multiple `entry` points, CJS output, and `rolldownOptions.external` — matching our CLI + programmatic API layout. - -## Decision drivers - -- **Stable include/exclude:** Vite/esbuild transpile TypeScript entry graphs without `picomatch` extglob on the default plugin include list. -- **Explicit bundler:** Pin `vite` to an exact version (`save-exact=true`); remove Rollup and `"latest"` Rollup plugins. -- **Same publish surface:** Keep `dist/cli.mjs`, `dist/index.js`, `package.json` `bin` / `main` / `types`, and declaration emit under `dist/src/index.d.ts` (via `vite-plugin-dts` after follow-up). -- **Tests unchanged:** Vitest is the test runner ([ADR 0002](./0002-jest-vs-vitest-testing.md)); only the `npm run build` implementation changes. - -## Decision - -**Replace Rollup with Vite 8 library mode.** - -1. Add `vite.config.ts` with `build.lib.entry` for `cli` and `index`, `formats: ['cjs']`, dependency + Node builtin `external`, and a CLI shebang `banner`. -2. Change `package.json` `build` script to **two passes** — `vite build --mode library` then `vite build --mode cli` — so each artifact is self-contained (no shared hashed chunks between `dist/index.js` and `dist/cli.mjs`, matching the old dual Rollup outputs). -3. Remove `rollup.config.js`, `rollup`, `@rollup/plugin-commonjs`, and `@rollup/plugin-typescript`. -4. Keep `prebuild` (clean + lint). A follow-up adds `vite-plugin-dts` and `vite-plugin-checker` on the library pass and removes `postbuild` `tsc`. - -### Configuration sketch - -```ts -// vite.config.ts — mode selects library vs CLI entry -// package.json: "build": "vite build --mode library && vite build --mode cli" -build: { - lib: { - entry: resolve(__dirname, mode === 'cli' ? 'src/cli/index.ts' : 'src/index.ts'), - formats: [mode === 'cli' ? 'es' : 'cjs'], - fileName: () => (mode === 'cli' ? 'cli.mjs' : 'index.js'), - }, - rolldownOptions: { - external: [...dependencies, ...nodeBuiltins], - output: { - banner: mode === 'cli' ? '#!/usr/bin/env node\n' : undefined, - exports: 'named', - }, - }, -} -``` - -## Consequences - -### Positive - -- Removes dependence on `picomatch` extglob behaviour inside `@rollup/plugin-typescript`. -- One pinned devDependency (`vite`) instead of Rollup + two `"latest"` plugins. -- Library mode documents both artifacts in one config file. -- Aligns with Vite’s maintained [build.lib](https://vite.dev/config/build-options#build-lib) path for dual-entry packages. - -### Negative / trade-offs - -- **New devDependency:** `vite` adds install size; acceptable for a build-only tool. -- **Rolldown under the hood:** Vite 8 uses Rolldown; `build.rollupOptions` is an alias — prefer `rolldownOptions` in config. -- **Declarations still via `tsc`:** Addressed in follow-up — `vite-plugin-dts` emits declarations during the library Vite pass; `vite-plugin-checker` runs full `tsc` diagnostics on build. - -### Follow-up - -- ~~If declaration emit moves under Vite, evaluate `vite-plugin-dts` and simplify `postbuild`.~~ Done: `vite-plugin-dts@5.0.3` + `vite-plugin-checker@0.14.4` on `--mode library`; `postbuild` `tsc` removed. -- Re-run Dependabot `micromatch` / `picomatch` upgrades after merge to confirm CI stays green. - -## References - -- [Vite — Build options: `build.lib`](https://vite.dev/config/build-options#build-lib) -- [Vite — Library mode](https://vite.dev/guide/build#library-mode) -- PR #680 — `picomatch@2.3.2` breaking Rollup TypeScript include globs diff --git a/docs/adr/0007-woff-woff2-decompression-pipeline.md b/docs/adr/0007-woff-woff2-decompression-pipeline.md deleted file mode 100644 index ac26ffe8..00000000 --- a/docs/adr/0007-woff-woff2-decompression-pipeline.md +++ /dev/null @@ -1,85 +0,0 @@ -# ADR 0007: WOFF / WOFF2 decompression pipeline - -- **Status:** Accepted -- **Date:** 2026-07-02 -- **Related:** [FEATURES.md](../../FEATURES.md) (WOFF / WOFF2 container decompression), [NOTICE.md](../../NOTICE.md) §3.2, PR [#689](https://github.com/itgalaxy/webfont/pull/689), PR [#691](https://github.com/itgalaxy/webfont/pull/691) - -## Context - -webfont historically generated icon fonts from SVG inputs. Users also need to **extract the SFNT payload** inside `.woff` and `.woff2` webfont containers (TrueType or OpenType outlines) without re-encoding to other web formats. - -This is **decompression**, not arbitrary font transcoding: - -| Operation | Supported? | -|-----------|------------| -| WOFF/WOFF2 → TTF or OTF (matching inner SFNT flavor) | Yes | -| TTF ↔ OTF outline conversion | No — use FontForge or similar | -| Merge multiple weights into one SFNT | No — one output per input | -| SVG icon pipeline with `otf` output | No — `otf` is webfont-decompress only | - -Initial implementation (PR #689) accepted **one** local `.woff` / `.woff2` per run. Follow-up (PR #691) added **batch** inputs (paths, globs) and **`http(s)` URLs**. - -## Decision drivers - -- **Correct semantics:** Detect SFNT flavor after decompression (`0x00010000` / `true` → TTF, `OTTO` → OTF) and reject mismatched `formats` requests with actionable errors. -- **Reuse maintained tooling:** [fontverter](https://github.com/papandreou/fontverter) handles WOFF/WOFF2 → SFNT; pin `wawoff2` and `woff2sfnt-sfnt2woff` for reproducible installs (see `package.json` `overrides`). -- **Clear public API:** Batch results live on `result.decompressedFonts` (`{ source, ttf?, otf? }[]`). A single input still mirrors `ttf` / `otf` on `result` for backward compatibility. -- **Remote inputs:** Node `fetch()` with `is-woff` / `is-woff2` validation; extension derived from URL pathname (query strings allowed). -- **Licensing:** Decompression does not grant font rights; document in [NOTICE.md](../../NOTICE.md). - -## Decision - -**Add a dedicated webfont decompression pipeline** alongside the existing SVG icon pipeline. - -### Input classification - -`classifyInputFiles()` in `src/standalone/inputMode.ts` routes runs: - -- **SVG mode** — one or more `.svg` files (default pipeline). -- **Webfont mode** — one or more `.woff` / `.woff2` paths, globs, or `http(s)` URLs. -- **Mixed / unsupported** — reject (e.g. `.svg` + `.woff2`, extension-less paths matched by globs). - -`resolveInputSources()` (`src/lib/inputSource.ts`) expands globs via `globby` and passes through URL patterns unchanged. - -### Decompression flow - -1. Read bytes from disk (`fs/promises`) or URL (`fetchWebfontFromUrl`). -2. `fontverter.convert(buffer, "sfnt")` → decompressed SFNT `Buffer`. -3. `getSfntFlavor()` (`src/lib/sfnt/flavor.ts`) reads the first four bytes. -4. For each requested `ttf` / `otf` format, assign the buffer only when flavor matches; otherwise throw. - -### Batch and naming - -- `convertWebfontInput()` decompresses all sources in parallel (`Promise.all`). -- CLI writes `{basename}.ttf` / `.otf` per entry in `decompressedFonts`. -- Colliding basenames (e.g. `iconfont.woff` + `iconfont.woff2`) use `-woff` / `-woff2` suffixes (`resolveDecompressedFontBasenames`). -- Single-input CLI runs still honor `-u` / `fontName`. - -### Excluded options in webfont mode - -`template` and `glyphTransformFn` reject with explicit errors — they apply only to the SVG pipeline. - -## Consequences - -### Positive - -- Users can decompress local fonts, globs, and CDN URLs in one API/CLI call. -- SFNT flavor guards prevent silent mislabeling (TTF bytes named `.otf`). -- `FEATURES.md` and `NOTICE.md` document limits and licensing expectations. - -### Negative / trade-offs - -- **No merge:** Multiple Inter weights yield multiple TTF files, not one variable font. -- **URL policy:** Callers must have rights to fetch remote bytes; no authentication headers in v1. -- **Network dependency:** URL inputs require Node 18+ `fetch` and fail on non-200 responses. - -### Follow-up - -- Optional request headers / redirect limits for authenticated font URLs. -- Production-mode knip coverage for new modules (see [ADR 0008](./0008-knip-instead-of-depcheck.md)). - -## References - -- [fontverter](https://github.com/papandreou/fontverter) -- [FEATURES.md](../../FEATURES.md) — WOFF / WOFF2 container decompression -- [NOTICE.md](../../NOTICE.md) §3.2 — WOFF / WOFF2 decompression licensing diff --git a/docs/adr/0008-knip-instead-of-depcheck.md b/docs/adr/0008-knip-instead-of-depcheck.md deleted file mode 100644 index f10ced21..00000000 --- a/docs/adr/0008-knip-instead-of-depcheck.md +++ /dev/null @@ -1,85 +0,0 @@ -# ADR 0008: Adopt Knip instead of depcheck for dependency and dead-code analysis - -- **Status:** Accepted -- **Date:** 2026-07-02 -- **Related:** [ADR 0003](./0003-lefthook-instead-of-husky-lint-staged.md) (removed `lint-staged.config.js` leftover) - -## Context - -The repository had **no** automated unused-dependency checker in CI. [depcheck](https://github.com/depcheck/depcheck) is a common choice but only reports **unused or missing dependencies** in `package.json`. - -[Knip](https://knip.dev/) analyzes the module graph from entry files and tooling plugins (Vite, Vitest) and additionally reports: - -- unused **exports** and **types** -- unused **files** -- **unlisted** dependencies (imported but not declared) -- duplicate export patterns - -The project is a small Node library + CLI with Vitest tests, Vite builds, cosmiconfig fixtures, and a Vitest `globby` stub — a graph depcheck cannot see completely. - -### First Knip run (2026-07-02, before cleanup) - -| Finding | Action | -|---------|--------| -| `parse-json` unused direct dependency | Removed — not imported; cosmiconfig does not require it at top level | -| `ts-node`, `tslib` unused devDependencies | Removed — legacy; Vite + Vitest handle transpilation | -| `lint-staged.config.js` unused file | Deleted — obsolete after [ADR 0003](./0003-lefthook-instead-of-husky-lint-staged.md) | -| `fast-glob` unlisted in `vitest/globby-stub.ts` | Added as pinned devDependency (matches `overrides`) | -| Intentional barrel / test exports | Documented in `knip.json` `ignoreIssues` | - -## Decision drivers - -- **Broader coverage:** One tool for dependencies, exports, and orphan files instead of depcheck alone. -- **Plugin ecosystem:** Knip reads `vite.config.ts` and `vitest.config.ts` automatically when `vite` and `vitest` are devDependencies. -- **CI signal:** Fail PRs on drift in `package.json` vs actual imports. -- **Familiar script name:** Keep `npm run depcheck` as an alias for `knip` so contributors searching for “depcheck” find the right command. - -## Decision - -**Adopt Knip 6.x** as the dependency and dead-code analyzer. - -1. Add `knip` (pinned) to `devDependencies`. -2. Add root `knip.json` with: - - explicit `entry` for CLI, public types, templates, Vitest stub, and cosmiconfig fixtures; - - `project` globs for `src/`, `templates/`, and `vitest/`; - - `exclude: ["duplicates"]` for intentional `export default` + named re-export patterns; - - targeted `ignoreIssues` for test-only and barrel exports. -3. Add `"depcheck": "knip"` script in `package.json`. -4. Run `npm run depcheck` in [`.github/workflows/pr.yml`](../../.github/workflows/pr.yml) before `npm test`. -5. Document in [CONTRIBUTING.md](../../CONTRIBUTING.md) Dependencies section. - -### Configuration sketch - -```json -{ - "$schema": "https://unpkg.com/knip@6/schema.json", - "entry": ["src/cli/index.ts", "src/types/index.ts", "templates/index.ts", "..."], - "project": ["src/**/*.{ts,js}", "templates/**/*.{ts,js}", "vitest/**/*.ts"], - "exclude": ["duplicates"] -} -``` - -## Consequences - -### Positive - -- CI catches unused dependencies and unlisted imports early. -- Removes dead `lint-staged.config.js` and three stale packages. -- `knip.json` documents intentional public-export barrels and fixture entry points. - -### Negative / trade-offs - -- **Configuration maintenance:** New fixture directories or entry points may need `knip.json` updates. -- **`ignoreIssues` scope:** Some exports are suppressed where tests import subpaths directly; prefer adding entry files over growing ignores. -- **Not a license auditor:** Knip does not replace `license-checker` in [NOTICE.md](../../NOTICE.md). - -### Follow-up - -- Revisit `ignoreIssues` when CLI modules stop re-exporting test-only symbols. -- Consider `knip --production` in a separate job if we want stricter publish-surface analysis. - -## References - -- [Knip documentation](https://knip.dev/) -- [depcheck](https://github.com/depcheck/depcheck) — prior art, narrower scope -- [ADR 0003: Lefthook instead of Husky / lint-staged](./0003-lefthook-instead-of-husky-lint-staged.md) diff --git a/docs/adr/0009-ttf-webfont-encoding-pipeline.md b/docs/adr/0009-ttf-webfont-encoding-pipeline.md deleted file mode 100644 index 939be5b6..00000000 --- a/docs/adr/0009-ttf-webfont-encoding-pipeline.md +++ /dev/null @@ -1,63 +0,0 @@ -# ADR 0009: TTF to webfont encoding pipeline - -- **Status:** Accepted -- **Date:** 2026-07-02 -- **Related:** [FEATURES.md](../../FEATURES.md) (TTF to webfont encoding), [NOTICE.md](../../NOTICE.md) §3.3, Issue [#13](https://github.com/itgalaxy/webfont/issues/13) - -## Context - -Users need to convert existing **TrueType (`.ttf`)** fonts to web formats (`woff`, `woff2`, legacy `eot`) without rebuilding from SVG icons. webfont already ships `ttf2woff`, `wawoff2`, and `ttf2eot` for the SVG pipeline; issue [#13](https://github.com/itgalaxy/webfont/issues/13) requested exposing that path for TTF input. - -An abandoned PR ([#185](https://github.com/itgalaxy/webfont/pull/185)) used a `ttfMode` boolean. Maintainers and reporters preferred **auto-detection** from file extension (same pattern as WOFF/WOFF2 decompression in [ADR 0007](./0007-woff-woff2-decompression-pipeline.md)). - -## Decision drivers - -- **No new public flag:** Extend `classifyInputFiles()` with a `ttf` mode when all matched paths end in `.ttf`. -- **Reuse encoders:** Share `encodeTtfToEot` / `encodeTtfToWoff` / `encodeTtfToWoff2` (`src/lib/ttfEncode.ts`) with the SVG pipeline. -- **Batch API:** `result.transcodedFonts` mirrors `decompressedFonts` for multi-file runs; single input keeps top-level `result.woff` / `result.woff2` for backward compatibility with CLI naming. -- **Clear limits:** TrueType input only (`is-ttf` + SFNT flavor guard). No templates or `glyphTransformFn`. No merge of multiple weights. - -## Decision - -**Add a dedicated TTF encoding pipeline** alongside SVG and WOFF/WOFF2 decompression. - -### Input classification - -`classifyInputFiles()` routes: - -- **SVG mode** — `.svg` only. -- **TTF mode** — `.ttf` only. -- **Webfont mode** — `.woff` / `.woff2` (and URLs). -- **Mixed** — any combination of the above → reject. - -### Encoding flow - -1. Read TTF bytes from disk (`fs/promises`). -2. Validate with `is-ttf` and `getSfntFlavor()` (reject OTF/CFF masquerading as `.ttf`). -3. For each requested format in `resolveTtfConversionFormats()`: - - `ttf` — pass-through buffer; - - `eot` / `woff` / `woff2` — existing encoders. -4. Default output when SVG-pipeline `formats` are unchanged: `['woff', 'woff2']`. - -### CLI batch naming - -Reuse `resolveDecompressedFontBasenames()` (strip extension; suffix on basename collisions). `writeTranscodedFontFiles()` writes per-format files under `--dest`. - -## Consequences - -### Positive - -- Fulfills long-standing [#13](https://github.com/itgalaxy/webfont/issues/13) without a breaking API flag. -- Round-trip compatible with WOFF/WOFF2 decompression (encode → decompress → valid TTF). - -### Negative / trade-offs - -- **No OTF input** — PostScript/CFF fonts must be converted externally first. -- **No remote TTF URLs** in v1 (local paths/globs only). -- **No CSS templates** in TTF mode (fonts already exist; `@font-face` is user-owned). - -## References - -- Issue [#13](https://github.com/itgalaxy/webfont/issues/13) -- PR [#185](https://github.com/itgalaxy/webfont/pull/185) (historical `ttfMode` approach) -- [ADR 0007](./0007-woff-woff2-decompression-pipeline.md) diff --git a/docs/adr/0010-one-migration-file-per-issue.md b/docs/adr/0010-one-migration-file-per-issue.md deleted file mode 100644 index f9e1a988..00000000 --- a/docs/adr/0010-one-migration-file-per-issue.md +++ /dev/null @@ -1,28 +0,0 @@ -# ADR 0010: One migration file per issue - -- **Status:** Accepted -- **Date:** 2026-07-02 -- **Related:** [MIGRATION.md](../../MIGRATION.md), [docs/migration/README.md](../migration/README.md) - -## Context - -[MIGRATION.md](../../MIGRATION.md) accumulated **all** upgrade guides in one file. Parallel PRs (e.g. #706 TTF encoding + #707 round guards) edited the same document near the top → frequent Git merge conflicts. - -## Decision - -- **Template** lives in [`docs/migration/README.md`](../migration/README.md) (naming, workflow, entry structure); `MIGRATION.md` stays a reader-facing overview. -- **Each behavior change** gets its own file: `docs/migration/issue-NNNN-.md` (issue number zero-padded to four digits). -- PRs **add a new file**; they do not append sections to `MIGRATION.md`. -- On release, maintainers edit **only** that issue’s file (set minimum version, trim workarounds). - -## Consequences - -### Positive - -- Parallel migration docs merge without conflicts (unique paths). -- Issues and PRs link directly to one file. - -### Negative - -- No single scrollable changelog-style page; use `ls docs/migration/issue-*.md` or GitHub search. -- Discoverability relies on issue links and README conventions. diff --git a/docs/adr/0011-no-svg-outline-stroke-dependency.md b/docs/adr/0011-no-svg-outline-stroke-dependency.md deleted file mode 100644 index 3a00753a..00000000 --- a/docs/adr/0011-no-svg-outline-stroke-dependency.md +++ /dev/null @@ -1,68 +0,0 @@ -# ADR 0011: Do not bundle svg-outline-stroke or stroke-to-fill fixes - -- **Status:** Accepted -- **Date:** 2026-07-03 -- **Related:** [#144](https://github.com/itgalaxy/webfont/issues/144) (`glyphContentTransformFn`), svgTools diagnostics (alpha) - -## Context - -Stroke-based SVG icons (`fill="none"` + `stroke`) and some primitive elements (``, ``) do not map cleanly to icon fonts: **svgicons2svgfont** traces filled paths and ignores stroke attributes. - -[`svg-outline-stroke`](https://github.com/elrumordelaluz/outline-stroke) is a popular preprocessor that rasterizes strokes and retraces them as filled paths (via **sharp** and **potrace**). It is a reasonable choice for authors who need stroke-to-fill conversion before font generation. - -Problems with making it a **direct dependency** of webfont: - -| Issue | Detail | -|-------|--------| -| **Native toolchain** | `svg-outline-stroke` pulls **sharp** (native bindings) and **potrace**; install size, platform support, and CI complexity increase for every consumer of webfont. | -| **Licensing surface** | Potrace is **GPL-2.0**. Bundling or invoking it from webfont blurs responsibility and may affect downstream products. | -| **Scope creep** | webfont’s job is SVG → font formats (and related encode/decompress pipelines), not general-purpose SVG cleanup or tracing. | -| **User choice** | Authors may prefer [svg-fixer](https://github.com/oslllo/svg-fixer), manual edits in a design tool, or a different tracing stack. A built-in fix picks one stack for everyone. | - -Issue **#144** already added **`glyphContentTransformFn`**: a hook that runs **before** font generation so callers can preprocess glyph SVG strings with any tool they install themselves. - -## Decision drivers - -- **Minimal dependencies:** Keep the published package lean and avoid native optional deps unless core to all pipelines. -- **Clear boundaries:** Diagnose incompatibilities; do not own stroke retracing or third-party tracing licenses. -- **Composable API:** Hooks (`glyphContentTransformFn`) let integrators wire their own preprocessor without webfont taking a stance on which library to use. -- **Documentation over bundling:** README examples can show `svg-outline-stroke` without listing it in `package.json`. - -## Decision - -**webfont must never declare `svg-outline-stroke` (or equivalent stroke-to-fill tracers) as a runtime or dev dependency.** - -1. **No built-in stroke-to-fill fix** in `svgTools.fix`, CLI `--svg-fix`, or any other first-party code path that imports a tracing library. -2. **`svgTools` is diagnostics-only** (alpha): detect `fill-rule: evenodd`, stroke-only SVGs, and poorly supported elements; surface warnings and `result.svgDiagnostics`. -3. **Stroke preprocessing is caller responsibility** via `glyphContentTransformFn` (or external editing). The README documents an optional `svg-outline-stroke` example; users add that package to **their** project when they need it. -4. **Do not reintroduce** `svg-outline-stroke` through transitive bundling in the main library build. Future ADRs or features that need SVG mutation must use hooks or stay out of scope. - -## Consequences - -### Positive - -- Smaller install footprint; no sharp/potrace in webfont’s dependency tree. -- GPL and native-binding concerns stay with the application that chooses a tracer. -- `svgTools.diagnose` remains useful without implying webfont can auto-repair every flagged issue. - -### Negative - -- One extra step for stroke icons: install a preprocessor and pass `glyphContentTransformFn` (documented in README). -- No single CLI flag for automatic stroke conversion; users script the hook or use config that sets `glyphContentTransformFn`. - -### Neutral - -- `glyphContentTransformFn` (#144) is the supported integration point; examples may reference `svg-outline-stroke` as one option among many. - -## Compliance - -- `package.json` must not list `svg-outline-stroke`. -- `npm run depcheck` (Knip) should not require exceptions for tracing libraries used only in docs. -- User-facing docs: keep the README `glyphContentTransformFn` example; point stroke issues from `svgTools.diagnose` and TROUBLESHOOTING to that hook, not to a bundled fixer. - -## References - -- [Configuration — `glyphContentTransformFn`](../../packages/webfont/docs/configuration.md#glyphcontenttransformfn) -- [Configuration — `svgTools` (alpha)](../../packages/webfont/docs/configuration.md#svgtools-alpha) -- [svg-outline-stroke](https://github.com/elrumordelaluz/outline-stroke) -- Issue [#144](https://github.com/itgalaxy/webfont/issues/144) diff --git a/docs/adr/0012-published-package-validation.md b/docs/adr/0012-published-package-validation.md deleted file mode 100644 index 24b14688..00000000 --- a/docs/adr/0012-published-package-validation.md +++ /dev/null @@ -1,133 +0,0 @@ -# ADR 0012: Layered validation of the published package surface - -- **Status:** Accepted -- **Date:** 2026-07-03 -- **Related:** PR [#735](https://github.com/itgalaxy/webfont/pull/735) (ESM default import fix), PR [#737](https://github.com/itgalaxy/webfont/pull/737) (publint + attw + pack-smoke + build changes), issue [#618](https://github.com/itgalaxy/webfont/issues/618) - -## Context - -Issue [#618](https://github.com/itgalaxy/webfont/issues/618) shipped to npm because `import webfont from "webfont"` returned the CJS `module.exports` object (not the function) under `"type": "module"`. The unit tests in `src/` all passed — they exercise TypeScript source through Vitest, never the built `dist/` files, and never the `package.json#exports` resolution that Node applies at `import` time. The regression went undetected until users installed webfont from npm and hit `TypeError: webfont is not a function`. - -The root cause was structural: `package.json#exports["."].node.import` pointed at `./dist/index.js` (CJS), so ESM consumers received the interop object. Fixing it (PR [#735](https://github.com/itgalaxy/webfont/pull/735)) required a real ESM build (`dist/index.mjs`) and split routing in `exports`. Preventing recurrence required something else: a check that mirrors what an npm consumer sees. - -## Decision drivers - -- **Catch what Vitest cannot:** in-source unit tests do not exercise `package.json#exports`, `files`, `dist/*.mjs` / `dist/*.js`, or Node's CJS↔ESM interop. -- **Fail before publish:** a broken tarball must never reach npm. Guard runs in every PR and gates `npm publish` via `prepublishOnly`. -- **Layered, not monolithic:** each tool catches a different class of issue. Running all three together is fast (~10s combined) and gives orthogonal signals. -- **Zero flake:** every guard runs against the actual build artifacts (`npm pack` output), not source or a mock. -- **Zero ignore rules.** Each layer runs with its default rule set. Where a check surfaced a real defect (types not resolving under node16-from-ESM, missing `sideEffects`), we fixed the underlying issue instead of adding an allowlist. - -## Decision - -Adopt a **three-layer package validation** wired into `npm run test:package`, CI, and `prepublishOnly`. - -### Why three layers, not one - -The layers detect **different classes** of failure. They do not overlap in a way that would let us drop any of them: - -| Failure class | Detected by | Why the others miss it | -|---------------|-------------|------------------------| -| `package.json#exports` routes `import` to a CJS file (`false-esm`, `cjs-resolves-to-esm`) | **attw** (static) — flags the module-system mismatch | pack-smoke sees the runtime symptom but not the structural cause; publint does not model TS module resolution. | -| `import webfont from "webfont"` returns an object instead of a function (`#618`) | **pack-smoke** (runtime) — actually calls `typeof webfont === "function"` and generates a woff2 | attw checks *types*, not runtime interop; a package with correct types can still have broken runtime default exports because of CJS ↔ ESM interop. | -| `dist/index.mjs` missing from the tarball because `files` shrank | **pack-smoke** (tarball manifest check + runtime import) | publint validates static shape but does not open the tarball; attw errors would surface but as an obscure `no-resolution`. | -| Types resolve under `bundler` but not `node16 (from ESM)` | **attw** — separate columns per module system | pack-smoke doesn't run TypeScript against types; publint doesn't simulate `moduleResolution`. | -| `exports` condition ordering wrong (`default` before `node`) | **publint** | attw's happy-path resolution might still succeed for the tested module systems; pack-smoke doesn't audit `exports` structure. | -| `types` extension mismatches runtime extension (`.d.ts` for `.mjs`) | **publint** (warning) and **attw** (error under `node16 from ESM`) | pack-smoke doesn't touch types. | -| `main`, `module`, `bin`, `files` pointing at paths that were never built | **publint** and **pack-smoke** (tarball manifest check) | attw only inspects entry points that `exports` mentions. | -| `sideEffects` missing so bundlers can't tree-shake | **publint** (suggestion) | Nothing else surfaces packaging metadata quality. | - -The rule of thumb: **publint = static package-metadata invariants**; **attw = static types resolution across module systems**; **pack-smoke = runtime interop from an actual consumer install**. Each is fast enough (<10s each) that running all three every PR is trivial. - -### Layer 1: `publint` — `package.json` publish lint - -- `test:publint` runs [`publint`](https://publint.dev/) against the packed tarball. -- Checks `main`, `module`, `browser`, `types`, `exports`, `files`, engine consistency, condition ordering, and other publish-surface invariants. -- Ran at `--level=warning` so CI output stays actionable — informational suggestions are still visible on-demand via `npx publint` locally. - -### Layer 2: `@arethetypeswrong/cli` (attw) — types resolution across module systems - -- `test:attw` runs [`attw --pack .`](https://arethetypeswrong.github.io/) which packs, extracts, and probes types resolution under **node10**, **node16 (from CJS)**, **node16 (from ESM)**, and **bundler**. -- **Zero ignore rules.** Every default rule is enforced — including `no-resolution`, `untyped-resolution`, `false-cjs`, `false-esm`, `cjs-resolves-to-esm`, `cjs-only-exports-default`, `named-exports`, `false-export-default`, `missing-export-equals`, `internal-resolution-error`. - -### Layer 3: `scripts/pack-smoke-test.mjs` — consumer smoke test - -- `test:pack` packs the current build, installs the tarball into throwaway ESM and CJS consumer projects in a temp directory, and asserts every documented import shape works end-to-end by **generating a real `woff2`** from the repo fixtures: - - `import webfont from "webfont"` (ESM default) — regressed in [#618](https://github.com/itgalaxy/webfont/issues/618) - - `import { webfont } from "webfont"` (ESM named) - - `const { webfont } = require("webfont")` (CJS named) - - `require("webfont").default` (CJS default) -- Also asserts the tarball actually ships `dist/index.js`, `dist/index.mjs`, `dist/browser.js`, and `dist/cli.mjs` — catches broken `package.json#files` or missing chunks. -- Uses only Node built-ins (`node:child_process`, `node:fs`, `node:os`, `node:path`, `node:url`). - -### Meta script and wiring - -```json -{ - "scripts": { - "test:attw": "attw --pack .", - "test:pack": "node scripts/pack-smoke-test.mjs", - "test:package": "npm run test:publint && npm run test:attw && npm run test:pack", - "test:publint": "publint --level=warning", - "prepublishOnly": "npm run build && npm run test:package" - } -} -``` - -Wired into `.github/workflows/pr.yml` (matrix Node 24.x + 26.x) and the `build` job of `.github/workflows/npm-publish.yml` before `publish-npm` runs. - -### Supporting build changes - -- New `"type": "commonjs"` in `package.json` — tells Node the default module system without extension-based sniffing. -- New `"sideEffects": false` — the library entry (`dist/index.js` / `dist/index.mjs`) has no top-level side effects that survive tree-shaking; declaring purity lets downstream bundlers drop unused imports. -- New `"exports"` routing with `types` per condition: - - `browser` → `dist/src/index.d.ts` + `dist/browser.js` - - `node.import` → `dist/src/index.d.mts` (types) + `dist/index.mjs` (runtime) - - `node.require` → `dist/src/index.d.ts` (types) + `dist/index.js` (runtime) - - `default` → `dist/src/index.d.ts` (types) + `dist/browser.js` (runtime) -- Legacy top-level `pkg.browser: "dist/browser.js"` is **kept intentionally** for webpack 4 / older bundlers that do not resolve `exports["."].browser`. publint prints a suggestion to migrate; we accept the suggestion (filtered out by `--level=warning`) because removing the top-level field is a real breaking change for those consumers and the modern `exports["."].browser` already covers new bundlers. -- New `scripts/emit-mts-types.mjs` runs after the Vite builds: - 1. Duplicates every `dist/**/*.d.ts` to a matching `.d.mts` so `package.json#exports["."].node.import.types` can point at `.d.mts` types with matching extension. - 2. Rewrites every relative import specifier inside the emitted `.d.mts` files to end in `.mjs` (`from "./standalone"` → `from "./standalone/index.mjs"`), so TypeScript's `nodenext` / `node16` module resolution accepts them. Fails with a non-zero exit if any relative import cannot be resolved to a matching `.d.mts` — the same signal attw would produce. -- The rewrite step in `emit-mts-types.mjs` is the reason attw runs with **zero ignore rules**. Before it existed, `internal-resolution-error` had to be silenced under node16-from-ESM. - -## Consequences - -### Positive - -- **#618-class regressions cannot ship.** Every PR runs the same tarball an npm consumer would install. -- **Types resolve on every module system** used by TypeScript today (`node10`, `node16 CJS`, `node16 ESM`, `bundler`) — was ❌ for three of four before. -- **Orthogonal signals.** publint catches `package.json` invariants; attw catches types-resolution mismatches; pack-smoke catches runtime interop bugs. Each covers a distinct failure class the others cannot see (see the table above). -- **Zero ignore rules and zero silenced warnings.** attw runs with defaults; publint runs at `--level=warning` (which is filtering, not silencing — the `pkg.browser` legacy-shim suggestion is still visible via `npx publint`). -- **Fast.** All three run in under ~10 seconds against a fresh build. -- **Progressive quality bar.** New warnings from publint or new failures from attw block the merge; new suggestions surface on request. - -### Negative / trade-offs - -- **Adds two devDependencies** (`publint`, `@arethetypeswrong/cli`) — mitigated by the alternative being another #618-scale outage. -- **`emit-mts-types.mjs` duplicates every `.d.ts` as `.d.mts` and rewrites specifiers.** The tarball roughly doubled in file count (81 → 141), though total size grew marginally because declaration files are small. The rewrite step is regex-based on relative specifiers only — it fails loud if any specifier cannot be resolved. -- **Kept `pkg.browser` string as a legacy shim.** publint suggests migrating fully to `exports["."].browser`; we filter suggestions (`--level=warning`) and document the decision so webpack 4 users are not broken. The modern `exports["."].browser` condition is already in place for new bundlers. - -## Alternatives considered - -| Option | Why not | -|--------|---------| -| **Trust unit tests + reviewer diligence** | Failed for #618 despite full green CI. Structural issue in `exports` was invisible to Vitest. | -| **Only add pack-smoke** (proposed initially) | Catches runtime interop, but does not catch types-resolution regressions or `package.json` invariants. Two additional tools give orthogonal signals for negligible cost. | -| **Only add publint** | Static analysis of `package.json`; misses the runtime interop that caused #618. | -| **Only add attw** | Types-focused; misses runtime interop and general `package.json` hygiene. | -| **Ship a single shared `.d.ts` for both `import` and `require` (delete `emit-mts-types.mjs`)** | Rejected — **verified empirically 2026-07-03**. Pointing `exports["."].node.import.types` at the same `dist/src/index.d.ts` as the `require` condition makes attw report `🎭 FalseCJS` ("Import resolved to a CommonJS type declaration file, but an ESM JavaScript file") under **node16 (from ESM)**. With `"type": "commonjs"`, a `.d.ts` is a **CJS** declaration file; the `import` condition resolves to the ESM runtime (`dist/index.mjs`), so the types masquerade as the wrong format. A format-tagged `.d.mts` (or a nested `package.json` with `"type": "module"`) is required. Emitting both `.d.ts` and `.d.mts` is standard for dual packages (tsup, tshy, unbuild all do it). | -| **Use `@microsoft/api-extractor` (`rollupTypes: true`) to bundle all types into one file** | Would remove the need for the specifier-rewrite step (a single bundled declaration has no relative imports), but drags in a ~10 MB peer dependency, requires an `api-extractor.json` config, and re-tests failed to collapse cross-file references on this codebase's `vite-plugin-dts@5.0.3`. The regex-based rewrite in `emit-mts-types.mjs` is self-contained with **zero dependencies** and fails loud on any unresolvable specifier. | -| **Publish ESM-only (drop the CJS build and dual declarations entirely)** | The cleanest long-term simplification — one `.d.ts` interpreted as ESM, no `emit-mts-types.mjs`, and Node 24.14+ (our floor) supports `require(esm)`. Deferred to issue [#738](https://github.com/itgalaxy/webfont/issues/738): it is a breaking change for consumers on older bundlers relying on the CJS `main`, and is out of scope for a PR focused on validation guardrails. | -| **Silence attw `internal-resolution-error` with `--ignore-rules`** | Was the initial approach in draft #737 for ~15 minutes. Rejected — silencing hides real type-resolution bugs from future changes. | -| **Publish preview package to npm alpha channel per PR** | Slow feedback loop, requires an npm write on every PR, and still needs the same three checks locally. | - -## References - -- Issue [#618: `TypeError: webfont is not a function`](https://github.com/itgalaxy/webfont/issues/618) -- PR [#735: `fix(build): expose callable default export from ESM build`](https://github.com/itgalaxy/webfont/pull/735) -- PR [#737: `build(deps): guard published package with publint + attw + pack-smoke`](https://github.com/itgalaxy/webfont/pull/737) -- [publint](https://publint.dev/) -- [Are the Types Wrong?](https://arethetypeswrong.github.io/) -- [Node.js `package.json` exports](https://nodejs.org/api/packages.html#exports) -- [TypeScript module resolution: `node16` / `nodenext`](https://www.typescriptlang.org/docs/handbook/modules/reference.html#node16-nodenext) diff --git a/docs/adr/0013-npm-workspaces-monorepo.md b/docs/adr/0013-npm-workspaces-monorepo.md deleted file mode 100644 index 5a214563..00000000 --- a/docs/adr/0013-npm-workspaces-monorepo.md +++ /dev/null @@ -1,65 +0,0 @@ -# ADR 0013: npm workspaces monorepo - -- **Status:** Accepted -- **Date:** 2026-07-04 -- **Related:** [#721](https://github.com/itgalaxy/webfont/issues/721), [ADR 0004](./0004-release-please-instead-of-standard-version.md) - -## Context - -The repository ships a Node library and CLI (`webfont` on npm) and a VitePress documentation site at the repo root. Planned follow-ups include a browser **studio** app, optional **CLI** package split, and a **Homebrew** formula — each with different dependencies and release cadence. - -A single flat package layout couples build tooling, publish surface, and future apps. The browser studio in particular should not reach into `src/` via relative imports or pull GPL WASM dependencies into the published library. - -## Decision drivers - -- **One public npm package:** Consumers keep installing `webfont`; version and changelog stay with the library. -- **Room to grow:** `packages/*` can host `webfont-studio`, a future `webfont-cli`, and other private workspaces without another repository split. -- **Minimal docs churn:** VitePress and user-facing markdown (`README.md`, `FEATURES.md`, …) remain at the **repo root**; only library source moves under `packages/webfont`. -- **Existing tooling:** npm workspaces (no Turborepo/Nx initially), Release Please, Knip, Vitest, and Lefthook continue with path updates. - -## Decision - -**Adopt an npm workspaces monorepo.** - -| Location | Role | -|----------|------| -| **Root** (`private: true`) | Workspaces orchestration, VitePress site, shared Biome/Lefthook, `docs/adr`, migration guides | -| **`packages/webfont`** | Published `webfont` package — `src/`, `templates/`, build (`vite.config.ts`), tests, `CHANGELOG.md`, `NOTICE.md` | -| **`packages/*` (future)** | `webfont-studio` (private), optional CLI split, Homebrew-related assets | - -### Release & publish - -- Release Please manifest targets **`packages/webfont`** only. -- `npm publish -w webfont` (or equivalent `working-directory`) publishes the library; root stays private. -- GitHub Packages scope rename (`@itgalaxy/webfont`) applies to the workspace package at publish time. - -### Root scripts - -Aggregate scripts (`npm test`, `npm run build`, `npm run test:package`, `npm run docs:site`) delegate to `webfont` where appropriate. Docs scripts build `packages/webfont/dist/cli.mjs` for the font demo. - -## Consequences - -### Positive - -- Clear boundary between published library and future browser/tooling packages. -- GPL or browser-only dependencies can live in `webfont-studio` without polluting `webfont` `package.json`. -- Homebrew formula can reference a stable `packages/webfont` path for the CLI binary. - -### Negative / trade-offs - -- Contributors learn workspace paths (`packages/webfont/src/`, …). -- `npm ci` must run at the **repo root**; publishing and pack-smoke tests target `packages/webfont`. -- VitePress rewrites point at `packages/webfont/CHANGELOG.md` and `packages/webfont/NOTICE.md` while other markdown stays at root. - -## Out of scope (follow-ups) - -- Moving VitePress into `packages/docs` -- Publishing `webfont-studio` to npm -- Extracting `webfont-cli` as a separate workspace -- Homebrew tap repository or formula (#769) - -## Acceptance - -- `npm ci` at root installs workspaces. -- `npm test` and `npm run test:package` pass from root. -- Release Please and `npm-publish.yml` version/publish **only** `packages/webfont` as `webfont` on npm. diff --git a/docs/migration/README.md b/docs/migration/README.md deleted file mode 100644 index f0f05665..00000000 --- a/docs/migration/README.md +++ /dev/null @@ -1,53 +0,0 @@ -# Migration entries - -How to **write and maintain migration docs**. One file per behavior change lives under `docs/migration/`; the reader-facing overview is [MIGRATION.md](../../MIGRATION.md). This page is the single source of truth for naming, workflow, and entry structure — **do not append long entries to `MIGRATION.md`**. - -## Naming - -``` -docs/migration/issue--.md -``` - -Examples: `issue-0002-config-files.md`, `issue-0569-cli-round.md`. - -Zero-pad the issue number to **four digits** so filenames sort in issue order. - -## PR workflow (merge-conflict safe) - -| Do | Don't | -|----|--------| -| Add **one new** `issue-NNNN-*.md` per PR | Append sections to `MIGRATION.md` | -| Edit **only** your issue’s file when updating wording | Edit another issue’s migration file | -| On release, set **Minimum version** in that file | Rename files unless the issue number was wrong | - -Parallel PRs touch **different paths** → Git merges cleanly. - -## Entry structure - -Every file in `docs/migration/` **must** use these headings in order (omit only when a section truly does not apply): - -| Section | Required? | Content | -|---------|-----------|---------| -| **Minimum version** | Yes | Semver when shipped; *pending* before release | -| **What changed** | Yes | One short summary | -| **Before** | Yes | Behavior on older releases | -| **After** | Yes | Behavior on the fixed release | -| **Workaround on older versions** | **Yes when applicable** | Concrete steps users on an older npm version can take **without upgrading** (config shape, CLI flags, external tools, pinned version). **Do not skip** for bug fixes — if the bug is CLI-only, document a config/API path that still works. | -| **After upgrading** | Yes | `npm install webfont@…` and the new recommended command or config | - -When no practical workaround exists (rare), keep the heading and write **None** with one sentence explaining why (for example the old release cannot perform the operation at all). - -**Example workaround patterns** - -- Bug on CLI flag → use cosmiconfig with a **typed** value (number in JSON/JS config instead of a string from argv). -- Missing feature → external tool or script until upgrade. -- Config vs CLI conflict → pass input only on the command line on older releases. - -**On release:** edit only that issue’s file — set **Minimum version** and trim workarounds that only applied to pre-release builds. - -## Find an entry - -- GitHub: search `issue-0569` in `docs/migration/` -- Local: `ls docs/migration/issue-*.md` - -Link the file from the GitHub issue and PR (**Related issue** / comments). diff --git a/docs/migration/issue-0002-config-files.md b/docs/migration/issue-0002-config-files.md deleted file mode 100644 index 6be0096e..00000000 --- a/docs/migration/issue-0002-config-files.md +++ /dev/null @@ -1,42 +0,0 @@ -# CLI `files` from config ([#2](https://github.com/itgalaxy/webfont/issues/2)) - -**Minimum version:** `12.0.1` - -## What changed - -The CLI can load input globs from a config file without positional SVG paths. CLI paths and config `files` are mutually exclusive. - -## Before (12.0.0 and earlier) - -- The CLI required at least one SVG path as a **positional argument**, even when `files` was set in a config file loaded via `--config`. -- Config-only runs ignored or failed to use config `files`: - - ```shell - webfont --config webfont.config.json -d dist/icons - ``` - -- Passing **both** CLI paths and config `files` was ambiguous; older releases could prefer CLI input only. - -## After (12.0.1+) - -- **Config-only input:** `webfont --config webfont.config.json -d dist/icons` uses `files` from the config when no positional SVG paths are passed. -- **Mutual exclusion:** CLI positional paths and config `files` cannot be combined — webfont exits with: - - ```text - Error: Cannot specify input files on the command line when `files` is set in the config file - ``` - -## Workaround on older versions - -On **12.0.0 and earlier**, pass globs on the command line; omit `files` from the config: - -```shell -webfont "src/icons/a.svg" "src/icons/b.svg" --config webfont.config.json -d dist/icons -``` - -## After upgrading - -```shell -npm install webfont@12.0.1 -webfont --config webfont.config.json -d dist/icons -``` diff --git a/docs/migration/issue-0013-ttf-encoding.md b/docs/migration/issue-0013-ttf-encoding.md deleted file mode 100644 index 21dc8300..00000000 --- a/docs/migration/issue-0013-ttf-encoding.md +++ /dev/null @@ -1,47 +0,0 @@ -# TTF to WOFF/WOFF2 encoding ([#13](https://github.com/itgalaxy/webfont/issues/13)) - -**Minimum version:** *pending* - -## What changed - -webfont auto-detects **`.ttf` input** (no new flag). One or more TrueType files can be encoded to `eot`, `woff`, and/or `woff2`. Default output when SVG-pipeline `formats` are still configured: `woff` + `woff2`. - -## Before - -TTF files were rejected (`did not match any supported files`). Users relied on external tools or manual `ttf2woff` / `wawoff2` scripts. - -## After - -```shell -webfont path/to/font.ttf -d dist/fonts -f woff,woff2 -``` - -Programmatic: - -```js -const result = await webfont({ - files: "fonts/MyFont.ttf", - formats: ["woff", "woff2"], -}); -// result.woff, result.woff2 -``` - -Batch runs expose `result.transcodedFonts` (`{ source, ttf?, eot?, woff?, woff2? }[]`). - -## Workaround on older versions - -Use external encoders until upgrade: - -```shell -# Example with npx (adjust paths) -npx ttf2woff path/to/font.ttf > path/to/font.woff -``` - -Or decompress an existing `.woff2` if you only need the SFNT inside (see WOFF/WOFF2 decompression in README). - -## After upgrading - -```shell -npm install webfont@ -webfont "fonts/*.ttf" -d dist/webfonts -f woff,woff2 --dest-create -``` diff --git a/docs/migration/issue-0327-stroke-only-empty-glyphs.md b/docs/migration/issue-0327-stroke-only-empty-glyphs.md deleted file mode 100644 index 59f1d566..00000000 --- a/docs/migration/issue-0327-stroke-only-empty-glyphs.md +++ /dev/null @@ -1,50 +0,0 @@ -# Empty glyph paths for stroke-only SVGs ([#327](https://github.com/itgalaxy/webfont/issues/327)) - -**Minimum version:** *pending* - -## What changed - -After SVG font generation, webfont checks that each `` in the SVG font output has non-empty path data (`d`). **Stroke-only** sources that previously produced a font file with **blank** glyphs now **fail** with an explicit error and TROUBLESHOOTING guidance. - -## Before - -`webfont icons/wave.svg` could exit `0` while the WOFF/WOFF2 glyph path was empty (`d=""`). Icons did not render in the browser with no clear error. - -## After - -The run fails before writing outputs: - -```text -Empty glyph path(s) in SVG font output for: wave (icons/wave.svg). Stroke-only SVGs (fill="none" with stroke) often produce empty glyphs ... -``` - -Use `--svg-diagnose` or `svgTools: { diagnose: true }` for compatibility warnings; preprocess strokes with `glyphContentTransformFn` or convert to fills in your design tool. - -## Workaround on older versions - -On releases before the fix: - -1. **Inspect the SVG font** (enable `formats: ["svg"]`) and search for `d=""` on `` elements. -2. **Convert strokes to filled paths** before running webfont (design tool or `glyphContentTransformFn` with svg-outline-stroke / svg-fixer). -3. Run with **`--svg-diagnose`** to flag stroke-only sources early (does not fix them). - -## After upgrading - -```shell -npm install webfont@ -webfont "icons/*.svg" --svg-diagnose -d dist/icons -``` - -Fix stroke-only sources, then regenerate: - -```js -import { webfont } from "webfont"; -import outlineStroke from "svg-outline-stroke"; - -await webfont({ - files: "icons/**/*.svg", - glyphContentTransformFn: async (glyph) => outlineStroke(glyph.contents), -}); -``` - -See [TROUBLESHOOTING.md](../../TROUBLESHOOTING.md) — “Stroke-only SVGs produce blank icons”. diff --git a/docs/migration/issue-0558-large-font-ligatures.md b/docs/migration/issue-0558-large-font-ligatures.md deleted file mode 100644 index 8ec167f6..00000000 --- a/docs/migration/issue-0558-large-font-ligatures.md +++ /dev/null @@ -1,46 +0,0 @@ -# Large icon fonts and browser performance (#558) - -**Minimum version:** warning from *pending* 12.x release; **ligatures off by default** from same release — see [issue-0558-ligatures-default-off.md](./issue-0558-ligatures-default-off.md) - -## What changed - -webfont can warn when glyph count exceeds **2000** with ligatures **explicitly enabled**. From the next **12.x** release, **ligatures default to `false`** so large icon fonts no longer need `--no-ligatures`. - -## Before - -- **webfont 10.x–11.x:** ligatures **on by default** for every icon name. -- **Thousands of ligatures** inflate the GSUB table. Windows Firefox uses DirectWrite to process ligature lookups — reflow can take seconds per tab ([#558](https://github.com/itgalaxy/webfont/issues/558), [MaterialDesign#6519](https://github.com/Templarian/MaterialDesign/issues/6519)). -- Material Design Icons on **webfont 9.x** (no ligatures) loaded quickly; **11.x** with default ligatures did not. - -## After - -- **webfont 12.x:** ligatures **off by default**; opt in with `--ligatures` / `ligatures: true` only when needed. -- Stdout **warning** when `glyphCount > 2000` and ligatures are enabled. - -## Workaround on older versions - -On **any** webfont version that supports `--no-ligatures` / `ligatures: false`: - -```bash -webfont "svg/**/*.svg" -d dist --no-ligatures -f woff2 -``` - -```js -await webfont({ - files: "svg/**/*.svg", - ligatures: false, - formats: ["woff2"], -}); -``` - -Keep `ligatures: false` in `webfont.config.js` / CI for MDI-scale fonts. - -## After upgrading - -```bash -npm install webfont@latest -``` - -No flag needed for the safe default. If you still enable ligatures on a large set, heed the runtime warning and prefer class + codepoint CSS. - -See [TROUBLESHOOTING.md](../../TROUBLESHOOTING.md) — “Browser hangs or extreme slowdown”. diff --git a/docs/migration/issue-0558-ligatures-default-off.md b/docs/migration/issue-0558-ligatures-default-off.md deleted file mode 100644 index 8b8ed1aa..00000000 --- a/docs/migration/issue-0558-ligatures-default-off.md +++ /dev/null @@ -1,48 +0,0 @@ -# Ligatures off by default (performance) - -**Minimum version:** *pending* (next 12.x release after 12.0.1) - -## What changed - -OpenType **ligature glyphs are no longer generated by default**. Ligatures remain available as an opt-in (`ligatures: true` / `--ligatures`). - -## Before - -- **webfont 10.x–11.x:** `ligatures: true` by default — each icon name is also encoded as a ligature (for example `phone-call` → `phone_call`). -- Large icon sets (Material Design Icons scale, thousands of glyphs) produced huge GSUB tables. **Firefox on Windows** (DirectWrite) could hang or slow dramatically during layout ([#558](https://github.com/itgalaxy/webfont/issues/558)). - -## After - -- **webfont 12.x (this change):** `ligatures: false` by default — fonts use private-use code points only; class + `::before` CSS is the recommended pattern. -- CLI: `--ligatures` to enable ligature glyphs (replaces `--no-ligatures` from older releases). -- Runtime **warning** when glyph count exceeds **2000** with ligatures explicitly enabled. - -## Workaround on older versions - -On **webfont 10+** without upgrading: - -```bash -webfont "icons/*.svg" -d dist --no-ligatures -``` - -```js -await webfont({ files: "icons/**/*.svg", ligatures: false }); -``` - -## After upgrading - -```bash -npm install webfont@latest -``` - -Default builds no longer need `--no-ligatures`. Enable ligatures only when you rely on typing icon names with `font-feature-settings: "liga"`: - -```bash -webfont "icons/*.svg" -d dist --ligatures -``` - -```js -await webfont({ files: "icons/**/*.svg", ligatures: true }); -``` - -For large icon fonts, keep ligatures disabled even on 12.x — see [TROUBLESHOOTING.md](../../TROUBLESHOOTING.md) and [issue-0558-large-font-ligatures.md](./issue-0558-large-font-ligatures.md). diff --git a/docs/migration/issue-0569-cli-round.md b/docs/migration/issue-0569-cli-round.md deleted file mode 100644 index 1863f657..00000000 --- a/docs/migration/issue-0569-cli-round.md +++ /dev/null @@ -1,60 +0,0 @@ -# CLI `--round` numeric strings ([#569](https://github.com/itgalaxy/webfont/issues/569)) - -**Minimum version:** *pending* - -## What changed - -`--round` and `round` in config/API still accept **number or string** (no breaking change). Numeric strings (for example `"4"` from the CLI) are coerced to **finite** numbers before `svgicons2svgfont` runs. Empty, whitespace-only, non-numeric, and non-finite values are ignored (library default rounding applies). - -## Before (bug) - -`webfont icons/*.svg --round 4` could throw: - -```text -Error: assertNumbers arguments[0] is not a number. string == typeof 4 -``` - -Misconfigured values such as `""` could also coerce to `0` and silently change rounding. - -## After (fix) - -Same CLI and config shapes work; coercion happens at the SVG pipeline boundary only. Invalid `round` values are treated as unset. - -## Workaround on older versions - -On releases before the fix, **avoid passing `--round` from the CLI** (meow supplies a string). Use one of: - -**Programmatic API** — pass a number: - -```js -await webfont({ files: "icons/*.svg", round: 4 }); -``` - -**Config file** — set `round` as a JSON number (not a string): - -```json -{ - "files": "icons/**/*.svg", - "round": 4 -} -``` - -```shell -webfont --config webfont.config.json -d dist/icons -``` - -Or omit `round` if the default meets your needs. - -## After upgrading - -```shell -npm install webfont@ -webfont "icons/*.svg" --round 4 -d dist/icons -``` - -Programmatic usage unchanged: - -```js -await webfont({ files: "icons/*.svg", round: 4 }); -await webfont({ files: "icons/*.svg", round: "4" }); -``` diff --git a/docs/migration/issue-0612-svg-use-transform.md b/docs/migration/issue-0612-svg-use-transform.md deleted file mode 100644 index 5463da82..00000000 --- a/docs/migration/issue-0612-svg-use-transform.md +++ /dev/null @@ -1,44 +0,0 @@ -# SVG `` and `transform` attributes (#612) - -**Minimum version:** 12.1.0 (diagnostic warning); flattening workaround on all versions - -## What changed - -webfont **does not convert** `` references or apply **`transform`** on those instances when building icon fonts. **12.1.0+** adds an **`use-reference`** entry in `--svg-diagnose` / `svgTools.diagnose` output. - -## Before - -Icons that rely on `` + `` render correctly in browsers but may produce **empty or wrong glyphs** in the generated font ([#612](https://github.com/itgalaxy/webfont/issues/612)). - -## After - -- **`--svg-diagnose`** / `svgTools: { diagnose: true }` logs a warning when `` is present. -- [TROUBLESHOOTING.md](../../TROUBLESHOOTING.md) — “SVG transform and `` references”. - -## Workaround on older versions - -Flatten icons before webfont: - -- Design tool: Expand / Flatten / export without symbol instances. -- Build: run [SVGO](https://github.com/svg/svgo) (or similar) in `glyphContentTransformFn` to inline paths. - -```js -import { webfont } from "webfont"; - -await webfont({ - files: "src/icons/**/*.svg", - glyphContentTransformFn: async (glyph) => { - // Your SVGO or flatten step here - return glyph.contents; - }, -}); -``` - -## After upgrading - -```shell -npm install webfont@latest -webfont "icons/*.svg" --svg-diagnose -``` - -No automatic fix — diagnostics help you find `` before shipping a broken font. diff --git a/docs/migration/issue-0618-esm-default-import.md b/docs/migration/issue-0618-esm-default-import.md deleted file mode 100644 index 984c4cfe..00000000 --- a/docs/migration/issue-0618-esm-default-import.md +++ /dev/null @@ -1,65 +0,0 @@ -# ESM default import `import webfont from "webfont"` (#618) - -**Minimum version:** *pending* — ships with the next 12.x release that adds the ESM build. - -## What changed - -webfont now ships a real **ESM build** (`dist/index.mjs`) alongside the existing CommonJS build (`dist/index.js`). The `exports` field routes `import` to the ESM file and `require` to the CJS file, so `import webfont from "webfont"` returns the callable function instead of the module namespace object. - -## Before - -On 12.1.0 and earlier, both the `import` and `require` conditions of `package.json#exports` pointed at the same CJS file (`./dist/index.js`). Node's CJS→ESM interop handed ESM callers the whole `module.exports` object as the default import, so a default import was **not callable**: - -```js -import webfont from "webfont"; - -await webfont({ files: "icons/*.svg" }); -// TypeError: webfont is not a function -// (https://github.com/itgalaxy/webfont/issues/618) -``` - -## After - -- `import webfont from "webfont"` → the `webfont` function (callable). -- `import { webfont } from "webfont"` → still works (named export). -- `const { webfont } = require("webfont")` → still works (CJS named export). - -Both interops are now guarded on every PR and on release by `npm run test:package`, a three-layer validation of the built tarball (see [ADR 0012](../adr/0012-published-package-validation.md)): - -1. `publint` — lints `package.json#exports`, `files`, `main`, `module`, `types`, and condition ordering. -2. `@arethetypeswrong/cli` (attw) — probes types resolution under node10, node16 (from CJS), node16 (from ESM), and bundler. -3. `scripts/pack-smoke-test.mjs` — packs, installs the tarball into throwaway ESM and CJS consumer projects, and asserts each import shape can generate a real `woff2` from fixtures. - -This prevents future regressions of `package.json#exports`, `files`, `types`, or the ESM/CJS build outputs from shipping to npm. - -## Workaround on older versions - -Use the **named import** instead of the default import — no upgrade required: - -```js -import { webfont } from "webfont"; - -await webfont({ files: "icons/*.svg" }); -``` - -With `require`: - -```js -const { webfont } = require("webfont"); - -await webfont({ files: "icons/*.svg" }); -``` - -## After upgrading - -```shell -npm install webfont@latest -``` - -Both default and named imports now work: - -```js -import webfont from "webfont"; - -await webfont({ files: "icons/*.svg" }); -``` diff --git a/docs/migration/issue-0764-ttf-svg-font.md b/docs/migration/issue-0764-ttf-svg-font.md deleted file mode 100644 index 305a46ca..00000000 --- a/docs/migration/issue-0764-ttf-svg-font.md +++ /dev/null @@ -1,65 +0,0 @@ -# TTF to SVG font encoding ([#764](https://github.com/itgalaxy/webfont/issues/764)) - -**Minimum version:** *pending* - -## What changed - -In **TTF encoding mode**, `svg` is now a valid **output format**: a `.ttf` file can be -converted to a legacy **SVG font** (glyph outlines + metrics as XML). It is produced in -pure JavaScript via [`fonteditor-core`](https://github.com/kekee000/fonteditor-core) — no -Java or FontForge. - -`svg` is **opt-in**: the default TTF output stays `woff` + `woff2` when SVG-pipeline -`formats` are still configured. - -## Before - -TTF input rejected `formats: ["svg"]`: - -``` -formats must include at least one of "ttf", "eot", "woff", or "woff2" when converting TTF input -``` - -To get an SVG font from a TTF you needed an external tool (FontForge, `uipoet/webfonts`, etc.). - -## After - -```shell -webfont path/to/font.ttf -d dist/fonts -f svg -``` - -Programmatic: - -```js -const result = await webfont({ - files: "fonts/MyFont.ttf", - formats: ["svg"], -}); -// result.svg → SVG font as a string -``` - -Batch runs expose the SVG font per input on `result.transcodedFonts` -(`{ source, svg?, ttf?, eot?, woff?, woff2? }[]`). The CLI writes `.svg`. - -A run whose `formats` contains **no** encoder output (for example `["otf"]`) still rejects, -now with `svg` listed: - -``` -formats must include at least one of "svg", "ttf", "eot", "woff", or "woff2" when converting TTF input -``` - -## Workaround on older versions - -Use an external converter until upgrade (both require a Java/native toolchain): - -```shell -# FontForge -fontforge -lang=ff -c 'Open($1); Generate($2)' font.ttf font.svg -``` - -## After upgrading - -```shell -npm install webfont@ -webfont "fonts/*.ttf" -d dist/webfonts -f svg --dest-create -``` diff --git a/docs/migration/issue-0797-was-prefix-field.md b/docs/migration/issue-0797-was-prefix-field.md deleted file mode 100644 index 0f8e22d3..00000000 --- a/docs/migration/issue-0797-was-prefix-field.md +++ /dev/null @@ -1,51 +0,0 @@ -# `.was` icon prefix: use `prefix` instead of `fontName` ([#797](https://github.com/itgalaxy/webfont/pull/797)) - -**Minimum version:** *pending* - -## What changed - -In webfont-assistant-compatible `.was` JSON, the icon class prefix belongs in **`prefix`**. The optional **`fontName`** field in `.was` files historically stored that prefix under the wrong name. New configs written by `--assistant` persist **`prefix` only**; **`fontName` in `.was` is deprecated** and will be removed in a future major release. Loading still accepts legacy `.was` files that only set `fontName` for the prefix. - -This does **not** change `webfont()`'s own `fontName` option (output font basename), nor `.was` **`name`** (font display name saved in the config). - -## Before - -Legacy `.was` files (and older webfont-assistant exports) could store the icon class prefix only in `fontName`: - -```json -{ - "name": "MyAwesomeFont", - "fontName": "my-icon", - "dest": "dist/fonts", - "files": "icons/*.svg", - "template": "css", - "formats": ["woff2"] -} -``` - -## After - -Prefer `prefix`; new wizard output omits deprecated `.was` `fontName`: - -```json -{ - "name": "MyAwesomeFont", - "prefix": "my-icon", - "dest": "dist/fonts", - "files": "icons/*.svg", - "template": "css", - "formats": ["woff2"] -} -``` - -## Workaround on older versions - -On npm releases **before** built-in `--assistant` / `--assistant-config`, use [webfont-assistant](https://github.com/kmorope/webfont-assistant) or hand-edit `.was` JSON. Either `prefix` or legacy `fontName` can carry the icon class prefix until the breaking removal ships. - -## After upgrading - -Install the release that includes built-in assistant support, then: - -1. Replace deprecated `.was` `fontName` (when it meant icon prefix) with **`prefix`**. -2. Keep **`name`** as the font display name and **`templateFontName`** when set. -3. Rerun with `webfont --assistant-config path/to/config.was`. diff --git a/husky.config.js b/husky.config.js new file mode 100644 index 00000000..92925675 --- /dev/null +++ b/husky.config.js @@ -0,0 +1,6 @@ +module.exports = { + hooks: { + "pre-commit": "lint-staged", + "pre-push": "npm run test", + }, +}; diff --git a/index.md b/index.md deleted file mode 100644 index dff051bb..00000000 --- a/index.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -layout: home - -hero: - name: webfont - text: Fonts from SVG icons - tagline: Generate icon fonts (EOT, TTF, WOFF, WOFF2, SVG) from SVGs — plus TTF encoding and WOFF/WOFF2 decoding. Pure JavaScript, no native toolchain. - actions: - - theme: brand - text: Get Started - link: /introduction/install - - theme: alt - text: Demo - link: /demo - - theme: alt - text: View on GitHub - link: https://github.com/itgalaxy/webfont - -features: - - title: SVG → icon fonts - details: Turn a folder of SVG icons into svg, ttf, eot, woff and woff2 fonts, with CSS / SCSS / Styl / HTML templates. - - title: TTF encoding - details: Encode an existing TTF into eot, woff, woff2 and SVG-font formats — auto-detected, no extra flag. - - title: WOFF/WOFF2 decoding - details: Decompress WOFF/WOFF2 back to the embedded TTF or OTF (decompress only, not TTF ↔ OTF transcoding). - - title: CLI & Node API - details: Use the webfont CLI or the programmatic webfont() API at build time. Config via cosmiconfig. ---- diff --git a/jest.config.ts b/jest.config.ts new file mode 100644 index 00000000..b700be6b --- /dev/null +++ b/jest.config.ts @@ -0,0 +1,25 @@ +import type {Config} from "@jest/types"; + +const config: Config.InitialOptions = { + collectCoverage: true, + coverageDirectory: "coverage", + coverageReporters: ["json"], + displayName: "Webfont", + modulePathIgnorePatterns: [ + "/.github", + "/.husky", + "/coverage", + "/dist", + "/node_modules", + "/temp", + ], + name: "webfont", + + /** + * If test environment is not set to "node", you may receive an error message when testing `wawoff2` module. + */ + testEnvironment: "node", + verbose: true, +}; + +export default config; diff --git a/lefthook.yml b/lefthook.yml deleted file mode 100644 index 01b67c37..00000000 --- a/lefthook.yml +++ /dev/null @@ -1,22 +0,0 @@ -pre-commit: - commands: - biome: - glob: "*.{ts,js,json}" - run: npx @biomejs/biome check --write --no-errors-on-unmatched --files-ignore-unknown=true {staged_files} - stage_fixed: true - suppressions: - run: npm run lint:suppressions - -pre-push: - jobs: - - group: - parallel: true - jobs: - - run: npm run typecheck - - run: npm run depcheck - - run: npm run audit - - group: - piped: true - jobs: - - run: npm test - - run: npm run docs:site diff --git a/lint-staged.config.js b/lint-staged.config.js new file mode 100644 index 00000000..2a5e48b7 --- /dev/null +++ b/lint-staged.config.js @@ -0,0 +1,6 @@ +module.exports = { + "*.{ts}": [ + "eslint --report-unused-disable-directives", + "git add", + ], +}; diff --git a/package-lock.json b/package-lock.json index 8a30c2ff..ac8d5e41 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,2566 +1,2331 @@ { - "name": "webfont-workspace", - "version": "12.4.1", + "name": "webfont", + "version": "11.3.0", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "webfont-workspace", + "name": "webfont", + "version": "11.3.0", "license": "MIT", - "workspaces": [ - "packages/*" - ], + "dependencies": { + "cosmiconfig": "^5.2.0", + "deepmerge": "^4.2.2", + "globby": "^11.0.0", + "meow": "^9.0.0", + "nunjucks": "^3.2.3", + "p-limit": "^3.1.0", + "parse-json": "^5.2.0", + "resolve-from": "^5.0.0", + "svg2ttf": "^6.0.2", + "svgicons2svgfont": "^10.0.3", + "ttf2eot": "^2.0.0", + "ttf2woff": "^3.0.0", + "wawoff2": "^2.0.0", + "xml2js": "^0.4.23" + }, + "bin": { + "webfont": "dist/cli.js" + }, "devDependencies": { - "@biomejs/biome": "2.5.2", - "lefthook": "2.1.9", - "vitepress": "2.0.0-alpha.18" + "@babel/eslint-plugin": "latest", + "@babel/preset-env": "latest", + "@babel/preset-typescript": "latest", + "@rollup/plugin-commonjs": "latest", + "@rollup/plugin-typescript": "latest", + "@types/jest": "26.0.24", + "@types/node": "15.14.9", + "@types/nunjucks": "latest", + "@types/rimraf": "latest", + "@typescript-eslint/eslint-plugin": "latest", + "@typescript-eslint/parser": "latest", + "babel-jest": "27.1.0", + "eslint": "latest", + "eslint-plugin-import": "latest", + "eslint-plugin-jest": "latest", + "eslint-plugin-node": "latest", + "eslint-plugin-promise": "latest", + "eslint-plugin-unicorn": "latest", + "husky": "latest", + "is-eot": "latest", + "is-svg": "latest", + "is-ttf": "latest", + "is-woff": "latest", + "is-woff2": "latest", + "jest": "27.1.0", + "lint-staged": "11.1.2", + "rimraf": "latest", + "rollup": "2.56.3", + "standard-version": "latest", + "ts-node": "latest", + "tslib": "latest", + "typescript": "latest" }, "engines": { - "node": ">=24.14.0" + "node": ">= 12.0.0" } }, - "node_modules/@andrewbranch/untar.js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@andrewbranch/untar.js/-/untar.js-1.0.3.tgz", - "integrity": "sha512-Jh15/qVmrLGhkKJBdXlK1+9tY4lZruYjsgkDFj08ZmDiWVBLJcqkok7Z0/R0In+i1rScBpJlSvrTS2Lm41Pbnw==", - "dev": true - }, - "node_modules/@arethetypeswrong/cli": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@arethetypeswrong/cli/-/cli-0.18.4.tgz", - "integrity": "sha512-kNWo6LTzGAuLYPpJ7Sgo63whSUeeSuKMlYx6IBgzs4ONEG807gW4hSSENvpeCHzO2H2wIzG5EFl0OKBbqGBAyA==", - "dev": true, - "license": "MIT", + "node_modules/@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", "dependencies": { - "@arethetypeswrong/core": "0.18.4", - "chalk": "^4.1.2", - "cli-table3": "^0.6.3", - "commander": "^10.0.1", - "marked": "^9.1.2", - "marked-terminal": "^7.1.0", - "semver": "^7.5.4" - }, - "bin": { - "attw": "dist/index.js" + "@babel/highlight": "^7.14.5" }, "engines": { - "node": ">=20" + "node": ">=6.9.0" } }, - "node_modules/@arethetypeswrong/cli/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "node_modules/@babel/compat-data": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", + "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", "dev": true, - "license": "MIT", "engines": { - "node": ">=14" + "node": ">=6.9.0" } }, - "node_modules/@arethetypeswrong/core": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@arethetypeswrong/core/-/core-0.18.4.tgz", - "integrity": "sha512-M5F0ePyN6h2Z6XxRiyIPqjGbltotXLjR0CKA0uKspsDu0QmgTNYvRb4RSQPMUs2ZXZHCCYpbaZbFbYOXLxCjUA==", + "node_modules/@babel/core": { + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.8.tgz", + "integrity": "sha512-/AtaeEhT6ErpDhInbXmjHcUQXH0L0TEgscfcxk1qbOvLuKCa5aZT0SOOtDKFY96/CLROwbLSKyFor6idgNaU4Q==", "dev": true, - "license": "MIT", "dependencies": { - "@andrewbranch/untar.js": "^1.0.3", - "@loaderkit/resolve": "^1.0.2", - "cjs-module-lexer": "^1.2.3", - "fflate": "^0.8.3", - "lru-cache": "^11.0.1", - "semver": "^7.5.4", - "typescript": "5.6.1-rc", - "validate-npm-package-name": "^5.0.0" + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.8", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-module-transforms": "^7.14.8", + "@babel/helpers": "^7.14.8", + "@babel/parser": "^7.14.8", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.8", + "@babel/types": "^7.14.8", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" }, "engines": { - "node": ">=20" + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@arethetypeswrong/core/node_modules/typescript": { - "version": "5.6.1-rc", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.1-rc.tgz", - "integrity": "sha512-E3b2+1zEFu84jB0YQi9BORDjz9+jGbwwy1Zi3G0LUNw7a7cePUrHMRNy8aPh53nXpkFGVHSxIZo5vKTfYaFiBQ==", + "node_modules/@babel/eslint-parser": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.14.7.tgz", + "integrity": "sha512-6WPwZqO5priAGIwV6msJcdc9TsEPzYeYdS/Xuoap+/ihkgN6dzHp2bcAAwyWZ5bLzk0vvjDmKvRwkqNaiJ8BiQ==", "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "dependencies": { + "eslint-scope": "^5.1.1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.0" }, "engines": { - "node": ">=14.17" + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.11.0", + "eslint": ">=7.5.0" } }, - "node_modules/@babel/code-frame": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", - "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", - "license": "MIT", + "node_modules/@babel/eslint-plugin": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/eslint-plugin/-/eslint-plugin-7.14.5.tgz", + "integrity": "sha512-nzt/YMnOOIRikvSn2hk9+W2omgJBy6U8TN0R+WTTmqapA+HnZTuviZaketdTE9W7/k/+E/DfZlt1ey1NSE39pg==", + "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.29.7", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" + "eslint-rule-composer": "^0.3.0" }, "engines": { - "node": ">=6.9.0" + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/eslint-parser": ">=7.11.0", + "eslint": ">=7.5.0" } }, - "node_modules/@babel/helper-string-parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", - "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "node_modules/@babel/generator": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.4.tgz", + "integrity": "sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw==", "dev": true, - "license": "MIT", + "dependencies": { + "@babel/types": "^7.15.4", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", - "license": "MIT", + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz", + "integrity": "sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.15.4" + }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", - "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz", + "integrity": "sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.29.7" - }, - "bin": { - "parser": "bin/babel-parser.js" + "@babel/helper-explode-assignable-expression": "^7.14.5", + "@babel/types": "^7.14.5" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" } }, - "node_modules/@babel/types": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", - "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", + "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7" + "@babel/compat-data": "^7.15.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@biomejs/biome": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.5.2.tgz", - "integrity": "sha512-VQ3RCqr7JmDIX+w6stWYl+g/3bYofN3q2wDBHUKKc/c7i5QWrFKFBZYCYPWTE6agsUPMIZZe6/CMmVUfUAhkKA==", + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz", + "integrity": "sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw==", "dev": true, - "license": "MIT OR Apache-2.0", - "bin": { - "biome": "bin/biome" + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4" }, "engines": { - "node": ">=14.21.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/biome" + "node": ">=6.9.0" }, - "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "2.5.2", - "@biomejs/cli-darwin-x64": "2.5.2", - "@biomejs/cli-linux-arm64": "2.5.2", - "@biomejs/cli-linux-arm64-musl": "2.5.2", - "@biomejs/cli-linux-x64": "2.5.2", - "@biomejs/cli-linux-x64-musl": "2.5.2", - "@biomejs/cli-win32-arm64": "2.5.2", - "@biomejs/cli-win32-x64": "2.5.2" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@biomejs/cli-darwin-arm64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.5.2.tgz", - "integrity": "sha512-e7P3P7EkwFc/KiX2AHw4YDLIBOMfG9CPCAwy52k5Bp0dfhkozx9hf6wCmIr2QeXy2XeccJ3V/Sg+hDmzYEqxSg==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", + "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "regexpu-core": "^4.7.1" + }, "engines": { - "node": ">=14.21.3" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@biomejs/cli-darwin-x64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.5.2.tgz", - "integrity": "sha512-ymzMvjC1Jg0b9K0D26ZdARqFQXs7MocfLC5FOCGfkC0Ss+ACUJkX5364ZM5nT4NLZanHRZNVrZEy+Ibwcvux/g==", - "cpu": [ - "x64" - ], + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz", + "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.21.3" + "dependencies": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" } }, - "node_modules/@biomejs/cli-linux-arm64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.5.2.tgz", - "integrity": "sha512-t7sseOmqND57uUWTwlawU6BYj+J06T/9EkydzBhkrgw/FK3QVhjU2wsJR0frljrKZ0/I8A/rYw7284QgqjQfIQ==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz", + "integrity": "sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ==", "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/types": "^7.14.5" + }, "engines": { - "node": ">=14.21.3" + "node": ">=6.9.0" } }, - "node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.5.2.tgz", - "integrity": "sha512-w+ANG0ZvTu9IeEg9QnstoOnk6L0fpwJifW6aHR18+cb5Z39bkANItYjAfMrnvce5tmMK+IQ6nPX7/kQFdam5iw==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/helper-function-name": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", + "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-get-function-arity": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/types": "^7.15.4" + }, "engines": { - "node": ">=14.21.3" + "node": ">=6.9.0" } }, - "node_modules/@biomejs/cli-linux-x64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.5.2.tgz", - "integrity": "sha512-M/lOZrewzTCRDINbjhQ1gYYru37KlD3kJBQwwKCG0ckz5E9IZwIoJ3X0wBwRXA+yBDIwWUuPBHS67HzJY4dTfA==", - "cpu": [ - "x64" - ], + "node_modules/@babel/helper-get-function-arity": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", + "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/types": "^7.15.4" + }, "engines": { - "node": ">=14.21.3" + "node": ">=6.9.0" } }, - "node_modules/@biomejs/cli-linux-x64-musl": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.5.2.tgz", - "integrity": "sha512-VArNLAzND063tF+XY0yPyM+DyahpzOMzOAvb7qs259nhjJWRjvjZdssuA+Rfl+l07+NOesKZ0Xu2yFrXyBMtzw==", - "cpu": [ - "x64" - ], + "node_modules/@babel/helper-hoist-variables": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", + "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/types": "^7.15.4" + }, "engines": { - "node": ">=14.21.3" + "node": ">=6.9.0" } }, - "node_modules/@biomejs/cli-win32-arm64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.5.2.tgz", - "integrity": "sha512-kbjFFKyZlzYnAuw7sRy5qDoFG6zrP40UK08oPQsWK0ct3NMnGSt+Bs1iviEEyEIP57N5MrykGXdO/wRiaR4lww==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", + "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@babel/types": "^7.15.4" + }, "engines": { - "node": ">=14.21.3" + "node": ">=6.9.0" } }, - "node_modules/@biomejs/cli-win32-x64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.5.2.tgz", - "integrity": "sha512-4InchVpdVmdkkkgjQqKpgvyu+VPnoF/7RPSw5YATgEVpt2j72wcCAeV5TwaE9ZGJUZWZn7v2CwSAj6CrMJEx8A==", - "cpu": [ - "x64" - ], + "node_modules/@babel/helper-module-imports": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", + "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@babel/types": "^7.15.4" + }, "engines": { - "node": ">=14.21.3" + "node": ">=6.9.0" } }, - "node_modules/@braidai/lang": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@braidai/lang/-/lang-1.1.2.tgz", - "integrity": "sha512-qBcknbBufNHlui137Hft8xauQMTZDKdophmLFv05r2eNmdIv/MlPuP4TdUknHG68UdWLgVZwgxVe735HzJNIwA==", - "dev": true, - "license": "ISC" - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "node_modules/@babel/helper-module-transforms": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.4.tgz", + "integrity": "sha512-9fHHSGE9zTC++KuXLZcB5FKgvlV83Ox+NLUmQTawovwlJ85+QMhk1CnVk406CQVj97LaWod6KVjl2Sfgw9Aktw==", "dev": true, - "license": "MIT", - "optional": true, + "dependencies": { + "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-simple-access": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/helper-validator-identifier": "^7.14.9", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + }, "engines": { - "node": ">=0.1.90" + "node": ">=6.9.0" } }, - "node_modules/@docsearch/css": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.6.3.tgz", - "integrity": "sha512-nlOwcXcsNAptQl4vlL4MA78qNJKO0Qlds5GuBjCoePgkebTXLSf8Qt1oyZ3YBshYupKXG9VRGEsk1zr23d+bzQ==", + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", + "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", "dev": true, - "license": "MIT" - }, - "node_modules/@docsearch/js": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-4.6.3.tgz", - "integrity": "sha512-qUIX2b4Apew3tv4F0qhmgShsl/Lfw4m6mqv/5/5dWNxwTcDdLMp2s3YwZ+NMGh3IKCg0pBaXm7Q5VdyU5Rj+cQ==", - "dev": true, - "license": "MIT" + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/@docsearch/sidepanel-js": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/@docsearch/sidepanel-js/-/sidepanel-js-4.6.3.tgz", - "integrity": "sha512-grGSmvXzG0if+mrzdIKykvpIAuEQ9u0sEJ2eLRRCaQfJvsWqh2C2/aY04bIzWvDh7myi5rvl8D+tUNsVrjYQ3A==", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", "dev": true, - "license": "MIT" + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/@emnapi/core": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", - "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz", + "integrity": "sha512-v53MxgvMK/HCwckJ1bZrq6dNKlmwlyRNYM6ypaRTdXWGOE2c1/SCa6dL/HimhPulGhZKw9W0QhREM583F/t0vQ==", "dev": true, - "license": "MIT", - "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.2.2", - "tslib": "^2.4.0" + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-wrap-function": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@emnapi/runtime": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", - "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "node_modules/@babel/helper-replace-supers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", + "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", "dev": true, - "license": "MIT", - "optional": true, "dependencies": { - "tslib": "^2.4.0" + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", - "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", + "node_modules/@babel/helper-simple-access": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", + "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", "dev": true, - "license": "MIT", - "optional": true, "dependencies": { - "tslib": "^2.4.0" + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@file-type/xml": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@file-type/xml/-/xml-0.4.4.tgz", - "integrity": "sha512-NhCyXoHlVZ8TqM476hyzwGJ24+D5IPSaZhmrPj7qXnEVb3q6jrFzA3mM9TBpknKSI9EuQeGTKRg2DXGUwvBBoQ==", + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz", + "integrity": "sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A==", "dev": true, - "license": "MIT", "dependencies": { - "sax": "^1.4.1", - "strtok3": "^10.3.4" + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@iconify-json/simple-icons": { - "version": "1.2.88", - "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.88.tgz", - "integrity": "sha512-+cvi1qCuvReL29ehi6t62L4fb7GDXe+UlGHFcsJcV7I2l9wtqn9XE2IBKcDr3CI5iGUGS5ISnXv699pSGpyx1Q==", + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", + "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", "dev": true, - "license": "CC0-1.0", "dependencies": { - "@iconify/types": "*" + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@iconify/types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", - "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", "dev": true, - "license": "MIT" + "engines": { + "node": ">=6.9.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==", + "node_modules/@babel/helper-wrap-function": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz", + "integrity": "sha512-Y2o+H/hRV5W8QhIfTpRIBwl57y8PrZt6JM3V8FOo5qarjshHItyH5lXlpMfBfmBefOqSCpKZs/6Dxqp0E/U+uw==", "dev": true, - "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" + "@babel/helper-function-name": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" } }, - "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==", + "node_modules/@babel/helpers": { + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.8.tgz", + "integrity": "sha512-ZRDmI56pnV+p1dH6d+UN6GINGz7Krps3+270qqI9UJ4wxYThfAIcI5i7j5vXC4FJ3Wap+S9qcebxeYiqn87DZw==", "dev": true, - "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.8", + "@babel/types": "^7.14.8" + }, + "engines": { + "node": ">=6.9.0" } }, - "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==", + "node_modules/@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.4.tgz", + "integrity": "sha512-xmzz+7fRpjrvDUj+GV7zfz/R3gSK2cOxGlazaXooxspCr539cbTXJKvBJzSVI2pPhcRGquoOtaIkKCsHQUiO3w==", "dev": true, - "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, "engines": { "node": ">=6.0.0" } }, - "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==", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz", + "integrity": "sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog==", "dev": true, - "license": "MIT" + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.15.4", + "@babel/plugin-proposal-optional-chaining": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } }, - "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==", + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.15.4.tgz", + "integrity": "sha512-2zt2g5vTXpMC3OmK6uyjvdXptbhBXfA77XGrd3gh93zwG8lZYBLOBImiGBEG0RANu3JqKEACCz5CGk73OJROBw==", "dev": true, - "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.15.4", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@loaderkit/resolve": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@loaderkit/resolve/-/resolve-1.0.6.tgz", - "integrity": "sha512-G8FdIoF5CypfwmD9rl8BXod5HDn8JqB0CCNBXDTaRZ+yRYhARrrSToX1zg1zy9jX3zLqigsELwhT4gNtkdQAUg==", + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", + "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", "dev": true, - "license": "ISC", "dependencies": { - "@braidai/lang": "^1.0.0" + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", - "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.15.4.tgz", + "integrity": "sha512-M682XWrrLNk3chXCjoPUQWOyYsB93B9z3mRyjtqqYJWDf2mfCdIYgDrA11cgNVhAQieaq6F2fn2f3wI0U4aTjA==", "dev": true, - "license": "MIT", - "optional": true, "dependencies": { - "@tybys/wasm-util": "^0.10.3" + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1" + "@babel/core": "^7.12.0" } }, - "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==", + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", + "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", + "dev": true, "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", + "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz", + "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", + "dev": true, "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@oxc-parser/binding-android-arm-eabi": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm-eabi/-/binding-android-arm-eabi-0.137.0.tgz", - "integrity": "sha512-KDs+0VPdEmasOkpuJHW9V5WCF+cvYdMQv2Jd+aJXt+cxIx12NToRQRbXaRwUEDsZw+/jMk81Ve8ZFbjUkJTOwA==", - "cpu": [ - "arm" - ], + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", + "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@oxc-parser/binding-android-arm64": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.137.0.tgz", - "integrity": "sha512-WhALNzfy3x/RfC6bsqX+csavuUY0yHHE7XfgPE5M542uhoBZUUoGTPG+nkMbGoG4+gcfss5s7urMyn5QBHu0sw==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", + "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@oxc-parser/binding-darwin-arm64": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.137.0.tgz", - "integrity": "sha512-bFPr5hgmNMOMoyPTGtdsK4Ug21RovIPojRMgDDhSp1LtCnc/DkLwGONKjgRjszg677RlGnkYSviQ8hHaUPOVYA==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", + "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@oxc-parser/binding-darwin-x64": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.137.0.tgz", - "integrity": "sha512-CL5dMm1asqXIDZHg14FLxj3Mc36w8PI7xCWh1uA4is6z8g2XrIILoTcQYOxDbwzuk34RDPX5IAGUxZr6LA9KAg==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz", + "integrity": "sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@babel/compat-data": "^7.14.7", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.14.5" + }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@oxc-parser/binding-freebsd-x64": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.137.0.tgz", - "integrity": "sha512-79h8rYGnSlKPGWo7mHr2ixO6ea7aW8B0CT965SZ8SLbNnCOH5aOYBTeVXUY6eMvEaiLyWr8Skuiugr5pDYgLGw==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz", + "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@oxc-parser/binding-linux-arm-gnueabihf": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.137.0.tgz", - "integrity": "sha512-ASgmlSimhGyr0lksgVIo6hibz1obnDq4qJbiMX/AzltfgPnanRrzG1Q+23g8ljOHOjv6dsznkUuCYL3gg0sY1Q==", - "cpu": [ - "arm" - ], + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@oxc-parser/binding-linux-arm-musleabihf": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.137.0.tgz", - "integrity": "sha512-AU2J9aa22Sx32wRGnDjybOU9TQXXQUud5sdUi+ZB0XxwM8aToWLweV+yA0wlQm0yIUVqljquqoHCYEq9II8gJQ==", - "cpu": [ - "arm" - ], + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", + "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@oxc-parser/binding-linux-arm64-gnu": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.137.0.tgz", - "integrity": "sha512-GdEtiG89yMr7XkUGxifgodXEEm2f+xW2f9CpDjlgAnBOwhTmrpQMvhOGobLVKUyzf/qHBXW16smk5zbF3nZU6w==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.15.4.tgz", + "integrity": "sha512-X0UTixkLf0PCCffxgu5/1RQyGGbgZuKoI+vXP4iSbJSYwPb7hu06omsFGBvQ9lJEvwgrxHdS8B5nbfcd8GyUNA==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@oxc-parser/binding-linux-arm64-musl": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.137.0.tgz", - "integrity": "sha512-EGJ+Bs8iXx8KBH8DQ5BLoEm5lnHaYjlh4/8j8vFhrr/6z4tqONy5BZDzLpKmmNWlN6Hlc5r8YOuBVHqZ9vRFEQ==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz", + "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@oxc-parser/binding-linux-ppc64-gnu": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.137.0.tgz", - "integrity": "sha512-vzFUQENy/fnbSe5DZWovq6tIBc1uhuMztanSW6rz1e9WdQE4gHwYuD7ZII6JnrJifd1R3RSoqiZbgRFlVL2tYQ==", - "cpu": [ - "ppc64" - ], + "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==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@oxc-parser/binding-linux-riscv64-gnu": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.137.0.tgz", - "integrity": "sha512-SfVI14HBQs9gtLcUD5hTt5hsNbdrqSUNg9S8muN+LhVQ5nf1WwH3hAoK6B9NKgdYgWAQSXFXGiiBedQ4r/BKuw==", - "cpu": [ - "riscv64" - ], + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@oxc-parser/binding-linux-riscv64-musl": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.137.0.tgz", - "integrity": "sha512-e7Ppy4FCIFNQxT/ikSeIWFoQ0l+N9vgtRBtLcyZXeolTzApyVoPqEXsYPrcdM/9i0Bwk8knvYd37vaEMxHyi6g==", - "cpu": [ - "riscv64" - ], + "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==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@oxc-parser/binding-linux-s390x-gnu": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.137.0.tgz", - "integrity": "sha512-Bho5qFwdhqsIFR7gipYEUlqvi3SRrY8sugxXig380MIaakBB1PyU9+7dBiBVScfImTNWhijUxdBwqrprGdq5WA==", - "cpu": [ - "s390x" - ], + "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==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@oxc-parser/binding-linux-x64-gnu": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.137.0.tgz", - "integrity": "sha512-36mGWtg7PyFzjJwGDkH6/F4o2nIDEoKXLPr/X/lwqklkomQwJJt1I5GJVmGhovUEmgPK5WAeAZMqlFCehwiy9Q==", - "cpu": [ - "x64" - ], + "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==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@oxc-parser/binding-linux-x64-musl": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.137.0.tgz", - "integrity": "sha512-/Jqx6+N7A44n2BdvUr7pXhVr2vFjs6WGH3unZRczwrfiH0H1zY0QwKQMG/dtRiTlKGDKGukznPT8lx84/oEsZg==", - "cpu": [ - "x64" - ], + "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==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@oxc-parser/binding-openharmony-arm64": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-openharmony-arm64/-/binding-openharmony-arm64-0.137.0.tgz", - "integrity": "sha512-9Uj0qHNNl+OgT1UTGwF7ixIXU6T1u2SbMidmgPy/h1h/fl2gRS6YpAxxY1gwHofcWjoTwkoMFd8xs5Vuj6GOFA==", - "cpu": [ - "arm64" - ], + "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==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@oxc-parser/binding-wasm32-wasi": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.137.0.tgz", - "integrity": "sha512-gW2vfkytNGgMVADiuzdvOfw0mWG9za20F/1fCJsif5aBMAvWJTSbpIXbIe0XkOe0VENk+PadpQ7cZgUy2sUJcA==", - "cpu": [ - "wasm32" - ], + "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==", "dev": true, - "license": "MIT", - "optional": true, "dependencies": { - "@emnapi/core": "1.11.1", - "@emnapi/runtime": "1.11.1", - "@napi-rs/wasm-runtime": "^1.1.5" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": "^20.19.0 || >=22.12.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@oxc-parser/binding-win32-arm64-msvc": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.137.0.tgz", - "integrity": "sha512-x+pFANF0yL5uK/6T7lu6SlR5qid6sp//eZXKLq5iNsIE+EQg6EaS8/wsW7E91nXXjpnPhSoMOHXShSVhGRdn8w==", - "cpu": [ - "arm64" - ], + "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==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@oxc-parser/binding-win32-ia32-msvc": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.137.0.tgz", - "integrity": "sha512-sQUqym80PFi6McRsIqfJrSu2JrSClEZIXXD+/FjAFoULEKzOPsldIdFBG96xdX8aVMzCNQ9792FPx3MfkEIrFA==", - "cpu": [ - "ia32" - ], + "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==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@oxc-parser/binding-win32-x64-msvc": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.137.0.tgz", - "integrity": "sha512-2AsevxlvNN4WKxpEn3RtqD5zbqMaXF+T7JXblsP4gVuY+vC9dXS4ED/PwfRCliFqoeisYS3Iro4DHzxr0TEvVA==", - "cpu": [ - "x64" - ], + "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==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@oxc-project/types": { - "version": "0.138.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.138.0.tgz", - "integrity": "sha512-1a7ZKmrRTCoN1XMZ4L0PyyqrMnrNlLyPuOkdSX2MZg7IiIGRUyurNhAm73ptDOraoBcIordsIGKNPKUzy3ZmfA==", + "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==", "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@oxc-resolver/binding-android-arm-eabi": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm-eabi/-/binding-android-arm-eabi-11.21.3.tgz", - "integrity": "sha512-eNU11A2WNizh04v3uyaJCootrHIaS0B9aHYXvAvVnPNk4xYSjMUjHnhQ6dewPN2MRYDskV85d1N0Aw0WNWhcyg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@oxc-resolver/binding-android-arm64": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm64/-/binding-android-arm64-11.21.3.tgz", - "integrity": "sha512-8Q+ZjTLvn2dIcWsrmhdrEihm7q+ag/k+mkry7Z+t0QbbHaVxXQfvH9AewyVMh/WrpEKhQ3DDgx9fYbqeCpeOEw==", - "cpu": [ - "arm64" - ], + "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==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@oxc-resolver/binding-darwin-arm64": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-arm64/-/binding-darwin-arm64-11.21.3.tgz", - "integrity": "sha512-wkh0qKZGHXVUDxFw3oA1TXnU2BDYY/r775oJflGeIr8uDPPoN2pk8gijQIzYRT6hoql/lg3+Tx/SaTn9e2/aGg==", - "cpu": [ - "arm64" - ], + "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==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@oxc-resolver/binding-darwin-x64": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-x64/-/binding-darwin-x64-11.21.3.tgz", - "integrity": "sha512-HbNc23FAQYbuyDV2vBWMez4u4mrsm5RAkniGZAWqr6lYZ3N4beeqIb776jzwRl8qL2zRhHVXpUj97X0QgogVzg==", - "cpu": [ - "x64" - ], + "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==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@oxc-resolver/binding-freebsd-x64": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-freebsd-x64/-/binding-freebsd-x64-11.21.3.tgz", - "integrity": "sha512-K6xNsTUPEUdfrn0+kbMq5nOUB5w1C5pavPQngt4TM2FpN91lP0PBe2srSpamb4d69O7h86oAi/qWX/kZNRSjkw==", - "cpu": [ - "x64" - ], + "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==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@oxc-resolver/binding-linux-arm-gnueabihf": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-11.21.3.tgz", - "integrity": "sha512-VcFmOpcpWX1zoEy8M58tR2M9YxM+Z9RuQhqAx5q0CTmrruaP7Gveejg75hzd/5sg5nk9G3aLALEa3hE2FsmmTQ==", - "cpu": [ - "arm" - ], + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", + "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@oxc-resolver/binding-linux-arm-musleabihf": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-11.21.3.tgz", - "integrity": "sha512-quVoxFLBy43hWaQbbDtQNRwAX5vX76mv7n64icAtQcJ3eNgVeblqmkupF/hAneNthdqSlnd1sTjb3aQSaDPaCQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@oxc-resolver/binding-linux-arm64-gnu": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-11.21.3.tgz", - "integrity": "sha512-X0AqNZgcD07Q4V3RDK18/vYOj/HQT/FnmEFGYS2jTWqY7JO13ryE3TEs3eAIgUJhBnNkpEaiXqz3VK8M7qQhWQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@oxc-resolver/binding-linux-arm64-musl": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-musl/-/binding-linux-arm64-musl-11.21.3.tgz", - "integrity": "sha512-YkaQnaKYdbuaXvRt5Qd0GpbihzVnyfR6z1SpYfIUC6RTu4NF7lDKPjVkYb+jRI2gedVO2rVpN35Y6akG6ud4Lw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@oxc-resolver/binding-linux-ppc64-gnu": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-11.21.3.tgz", - "integrity": "sha512-gB9HwhrPiFqUzDeEq+y/CgAijz1YdI6BnXz5GaH2Pa9cWdutchlkGFAiAuGb/PjVQpiK6NFKzFuztxrweoit7A==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@oxc-resolver/binding-linux-riscv64-gnu": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-11.21.3.tgz", - "integrity": "sha512-zjDWBlYk8QGv0H8dsPUWqkfjYIIjG2TvspGkzXL0eImbgxtZorA/klKeHyolevoT3Kvbi+1iMr9Lhrh7jf54Og==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@oxc-resolver/binding-linux-riscv64-musl": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-11.21.3.tgz", - "integrity": "sha512-4UfsQvacV388y1zpXL7C1x1FNYaV52JtuNRiuzrfQA2z1z6ElVrsidkGsrvQ5EgeSq1Pj7kaKqrgGkvFuxJ/tw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@oxc-resolver/binding-linux-s390x-gnu": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-11.21.3.tgz", - "integrity": "sha512-b5uH+HKH0MP5mNBYaK75SKsJbw52URqrx2LavYdq6wb0l3ExAG5niYRP9DWUNHdKilpaBVM2bXk9HNWrH3ew7Q==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@oxc-resolver/binding-linux-x64-gnu": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-gnu/-/binding-linux-x64-gnu-11.21.3.tgz", - "integrity": "sha512-PjYlmilBpNRh2ntXNYAK3Am5w/nPfEpnU/96iNx7CI8EzAn12J4JRiec63wHJTH31nLoCNxBg/829pN+3CfG3Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@oxc-resolver/binding-linux-x64-musl": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-musl/-/binding-linux-x64-musl-11.21.3.tgz", - "integrity": "sha512-QTBAb7JuHlZ7JUEyM8UiQi2f7m/L4swBhP2TNpYIDc9Wp/wRw1G/8sl6i13aIzQAXH7LKIm294LeOHd0lQR8zA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@oxc-resolver/binding-openharmony-arm64": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-openharmony-arm64/-/binding-openharmony-arm64-11.21.3.tgz", - "integrity": "sha512-4j1DFwjwv36ec9kds0jU/ucQ5Ha4ERO/H95BxR5JFf0kqUUAJ1kwII7XhTc1vZrkdJkvLGC9Q2MbpObpum8RBg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@oxc-resolver/binding-wasm32-wasi": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-wasm32-wasi/-/binding-wasm32-wasi-11.21.3.tgz", - "integrity": "sha512-i8oluoel5kru/j1WNrjmQSiA3GQ7wvIYVR1IwIoZtKogAhya2iub+ZKIeSIkcJOrnzQ18Tzl/F+kL3fYOxZLvA==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, "dependencies": { - "@emnapi/core": "1.11.0", - "@emnapi/runtime": "1.11.0", - "@napi-rs/wasm-runtime": "^1.1.5" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">=14.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@oxc-resolver/binding-wasm32-wasi/node_modules/@emnapi/core": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.0.tgz", - "integrity": "sha512-l9Oo58x0HOP5znGzVhYW9U3e5wVuA4LAZU2AGezTmkhO1CgQRFDhDg4nneHsu/t3WniXg9QrG2nIXL/ZS8ln8Q==", + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz", + "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", "dev": true, - "license": "MIT", - "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.2.2", - "tslib": "^2.4.0" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@oxc-resolver/binding-wasm32-wasi/node_modules/@emnapi/runtime": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.0.tgz", - "integrity": "sha512-55coeOFKHv1ywEcUXJtWU5f+Jr/W5tZDvZig8DLKSwUN1JpROQ4rk/SNOQiFWmaR/VKF4zuFyW1B8JduOSv6Pg==", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", + "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", "dev": true, - "license": "MIT", - "optional": true, "dependencies": { - "tslib": "^2.4.0" + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@oxc-resolver/binding-win32-arm64-msvc": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-11.21.3.tgz", - "integrity": "sha512-M/8dw8dD6aOs+NlPJax401CZB9I7Aut84isQLgALGGwke4Afvw+/7yYhZb94yXf6t2sPLhQLmSmtSV+2FhsOWg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@oxc-resolver/binding-win32-x64-msvc": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-x64-msvc/-/binding-win32-x64-msvc-11.21.3.tgz", - "integrity": "sha512-H7BCt/VnS9hnmMp42eGhZ99izSCRvlnWwy/N71K1/J8QoExwY4262Z8QiEkMDtduRJrztayDxETTckmUuAVL9Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@publint/pack": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@publint/pack/-/pack-0.1.5.tgz", - "integrity": "sha512-edgyN2pP07uXiP4tJs0s8KVmU8M8i60YPbbI0/WDeok1mIJHRXz+CgD8I0nelwDkoCh3EWL/G5kGfbuHjsdbvw==", + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz", + "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", "dev": true, - "license": "MIT", "dependencies": { - "tinyexec": "^1.2.4" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">=18" + "node": ">=6.9.0" }, - "funding": { - "url": "https://bjornlu.com/sponsor" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.4.tgz", - "integrity": "sha512-EZLpf/8y7GXkkra90ML47kzik/GMP3EMcE9bPyHmRfxLC6z9+aW5A8poCsoxjrT5GfEcNAAvWwUHjvP1pUQkfw==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz", + "integrity": "sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.4.tgz", - "integrity": "sha512-aUi+HBvmYb7j8krl1+qJgkG8C17fO79gk3c+jPw4S8glRFc1DTija9S3EyaTSQUm5GJXYKDAsugBEhFHH2vYiQ==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/plugin-transform-classes": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.15.4.tgz", + "integrity": "sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "globals": "^11.1.0" + }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.4.tgz", - "integrity": "sha512-F7hHC3gwY11+vByKPRWqwGbeXWVgKmL+pTGCinaEhdihzBV2aQ0fvZOch9cXYUOKuKKq429HeYXOqQLc7wFCEg==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz", + "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.4.tgz", - "integrity": "sha512-sI5yw+7s92SK6odiEhD5lKCBlWcpjHS5qyqpVQbZAJ0fIzEUXrmbl3DH2ybR3PZogulNJF+COLtmA8hUfvkCCQ==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", + "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.4.tgz", - "integrity": "sha512-mCi0OKgEieFircrtVYmQAFGszRtMnZ6fpZAXrxanXAu7lqZcsK1E1RAaZNG0uKAnxox3B1f4EyQNnoyMfN1vAA==", - "cpu": [ - "arm" - ], + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz", + "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.4.tgz", - "integrity": "sha512-B9Ial3Kv5sh0SHnB1g/QWcUQCEvCF6QKGAl4zXypYj65mVI+B4AhFBwPtSN7pDrJeIx8Z7zdy4ntx+wQABom7w==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz", + "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.4.tgz", - "integrity": "sha512-lZVym0PuHE1KZ22gmFTC15lAkrg9iTszR617oYRB/iPY1A56ywoJzVKOJBKaot5RiikCObmur6pogpse3gRcng==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz", + "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.4.tgz", - "integrity": "sha512-t2DNiLJWNTbnEHyUzTumldML6ET4/g16467LZoDDJ3tSxGvguL5/NyC2lCsNKuyRycg9XeDQF5SSv+TNOhQEXg==", - "cpu": [ - "ppc64" - ], + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz", + "integrity": "sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.4.tgz", - "integrity": "sha512-0WIRnL1Uw4BvTZRLQt+PVgo6ZKTJadlC2btP+/EOXv2f/DWbY0rEgl+y834mIVwP1FkTlWVTrGGJXf12lru7EQ==", - "cpu": [ - "s390x" - ], + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz", + "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.4.tgz", - "integrity": "sha512-JWtGshGfX+oENAKonoNkqEJX+7hC8yfhi9GUyPX1VX4mdh1y5r+ZiJLR5XzAB0aoP6s/PcILsGjKq8O0mm24bw==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-transform-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz", + "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.4.tgz", - "integrity": "sha512-rT6yQcxUuXs4CnbofqwHRRV0iem349rLMYpTjkgQGLjrY4ado/eDzwPZPTCgTOlF6Nkp8NEv70yLMTn6qkWxsQ==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz", + "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.4.tgz", - "integrity": "sha512-KXMGoboq5cyaCQjDA4GLuRiOwBQ0EyFnJoVViLeZ45/3rFItRODEr+NdsBcVpll40hhNArlm/speWGRvj08LzA==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz", + "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], + "dependencies": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.4.tgz", - "integrity": "sha512-5K83rb36oJiY7BCyE9zLZtGcPV4g5wvq+xwdO0XPIwDVZI8cyB/AUjkNXGb92/rnmezEkjMOpgY61rtwjQtFwg==", - "cpu": [ - "wasm32" - ], + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.4.tgz", + "integrity": "sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA==", "dev": true, - "license": "MIT", - "optional": true, "dependencies": { - "@emnapi/core": "1.11.1", - "@emnapi/runtime": "1.11.1", - "@napi-rs/wasm-runtime": "^1.1.6" + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.15.4", + "babel-plugin-dynamic-import-node": "^2.3.3" }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.4.tgz", - "integrity": "sha512-PnWBtw3TV5KOg69HQQDR0mnQuyCmSGR2pAB4DC1rPF808fgKeTUMj2EOEyKATpgiuxuR5APQmiDO7PDgEjTFSA==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.15.4.tgz", + "integrity": "sha512-fJUnlQrl/mezMneR72CKCgtOoahqGJNVKpompKwzv3BrEXdlPspTcyxrZ1XmDTIr9PpULrgEQo3qNKp6dW7ssw==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.4.tgz", - "integrity": "sha512-M1lpniBePobTfsa7Ks9a199e1akxsXn+GYBUKsEzv3YFzOm1HJAMNwKI3qr0Zq+mxwx9gOZoTdP1yXRYsZUocQ==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz", + "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/pluginutils": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz", - "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==", + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz", + "integrity": "sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA==", "dev": true, - "license": "MIT", "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^4.0.2" + "@babel/helper-create-regexp-features-plugin": "^7.14.5" }, "engines": { - "node": ">=14.0.0" + "node": ">=6.9.0" }, "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "@babel/core": "^7.0.0" } }, - "node_modules/@rollup/pluginutils/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz", + "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", "dev": true, - "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@shikijs/core": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.3.1.tgz", - "integrity": "sha512-ANMDxuaPsNMdDC1m4vfvhlDmJweMwkE5XitTwrq2rWHx5jM+dlm4MmHt2PP6t0uejfR77SuhrhJ0zEijIF/uhA==", + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz", + "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", "dev": true, - "license": "MIT", "dependencies": { - "@shikijs/primitive": "4.3.1", - "@shikijs/types": "4.3.1", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4", - "hast-util-to-html": "^9.0.5" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5" }, "engines": { - "node": ">=20" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@shikijs/engine-javascript": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.3.1.tgz", - "integrity": "sha512-JBItcnPuYq7jVJdZo/vMj94r+szT7XEjHFX+mvFDGSEIbVAXAGyHAHzhbWzpGOwYidCZrErJLLgn2PVeiokHnQ==", + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.15.4.tgz", + "integrity": "sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ==", "dev": true, - "license": "MIT", "dependencies": { - "@shikijs/types": "4.3.1", - "@shikijs/vscode-textmate": "^10.0.2", - "oniguruma-to-es": "^4.3.6" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">=20" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@shikijs/engine-oniguruma": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.3.1.tgz", - "integrity": "sha512-OXyNMzg0pews+msMj4cHeqT4xiYKKvbnn6VbdAXxfoFl3SSx4fJTc8FadECuc5/H9p3BzhNAoAUXKwAu9rWYhg==", + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz", + "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", "dev": true, - "license": "MIT", "dependencies": { - "@shikijs/types": "4.3.1", - "@shikijs/vscode-textmate": "^10.0.2" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">=20" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@shikijs/langs": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.3.1.tgz", - "integrity": "sha512-m0l9nsDqgBHvbZbk7A0/kXz/impK3uB/c6rAn6Gpg/uPtdZRQ+alsN/17MU5thb68XTj/4DxkZAotrM0GGSpDQ==", + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz", + "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", "dev": true, - "license": "MIT", "dependencies": { - "@shikijs/types": "4.3.1" + "regenerator-transform": "^0.14.2" }, "engines": { - "node": ">=20" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@shikijs/primitive": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.3.1.tgz", - "integrity": "sha512-CXQRQOYy1leqQ8ceTeJdmXv/bsUY++6QyLpXJ94LZAAYj5X2SKRdc5ipguv4NPyGVKItB2PPwUpRNe0Sjh5S1A==", + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz", + "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", "dev": true, - "license": "MIT", "dependencies": { - "@shikijs/types": "4.3.1", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">=20" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@shikijs/themes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.3.1.tgz", - "integrity": "sha512-dgpoJ4WqNi2yTmizQHBJ5zcX6j2lE6icN/0yt4l1kkf16jrY/pwPLoTb1ETsWMz0OBLf9ZNvwmxft+cH+N9qSA==", + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz", + "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", "dev": true, - "license": "MIT", "dependencies": { - "@shikijs/types": "4.3.1" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">=20" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@shikijs/transformers": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-4.3.1.tgz", - "integrity": "sha512-z6ir0bGDgWcF2FduktEfPgIsdOtIlDiLAjFBgBzE42Q9xHbkkIXZtORHzlLVB71iZP9elEcqKg6keajvOUwE2A==", + "node_modules/@babel/plugin-transform-spread": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz", + "integrity": "sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==", "dev": true, - "license": "MIT", "dependencies": { - "@shikijs/core": "4.3.1", - "@shikijs/types": "4.3.1" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5" }, "engines": { - "node": ">=20" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@shikijs/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.3.1.tgz", - "integrity": "sha512-CHFxE0jztBIZRHH6gxXE7DXUCFXjReEGxZ/j0rfSLGKZuwp2xBYycEP14875DSa9KLL/6700oxIq6oO6ef9K2g==", + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz", + "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", "dev": true, - "license": "MIT", "dependencies": { - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">=20" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@shikijs/vscode-textmate": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", - "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", - "dev": true, - "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==", + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz", + "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", "dev": true, - "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@sindresorhus/merge-streams": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", - "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", - "license": "MIT", + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz", + "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@standard-schema/spec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tokenizer/token": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", - "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.15.4.tgz", + "integrity": "sha512-sM1/FEjwYjXvMwu1PJStH11kJ154zd/lpY56NQJ5qH2D0mabMv1CAy/kdvS9RP4Xgfj9fBBA3JiSLdDHgXdzOA==", "dev": true, - "license": "MIT", - "optional": true, "dependencies": { - "tslib": "^2.4.0" + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-typescript": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/chai": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", + "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", "dev": true, - "license": "MIT", "dependencies": { - "@types/deep-eql": "*", - "assertion-error": "^2.0.1" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - "dev": true, - "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==", + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz", + "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", "dev": true, - "license": "MIT", "dependencies": { - "@types/unist": "*" + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.4.tgz", + "integrity": "sha512-4f2nLw+q6ht8gl3sHCmNhmA5W6b1ItLzbH3UrKuJxACHr2eCpk96jwjrAfCAaXaaVwTQGnyUYHY2EWXJGt7TUQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.15.4", + "@babel/plugin-proposal-async-generator-functions": "^7.15.4", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.15.4", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.14.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.15.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", + "@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-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-transform-arrow-functions": "^7.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.15.3", + "@babel/plugin-transform-classes": "^7.15.4", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.7", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.15.4", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.15.4", + "@babel/plugin-transform-modules-systemjs": "^7.15.4", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.9", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.15.4", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.14.6", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.15.4", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.16.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/markdown-it": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", - "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "node_modules/@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", "dev": true, - "license": "MIT", "dependencies": { - "@types/linkify-it": "^5", - "@types/mdurl": "^2" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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==", + "node_modules/@babel/preset-typescript": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.15.0.tgz", + "integrity": "sha512-lt0Y/8V3y06Wq/8H/u0WakrqciZ7Fz7mwPDHWUJAXlABL5hiUG42BNlRXiELNjeWjO5rWmnNKlx+yzJvxezHow==", "dev": true, - "license": "MIT", "dependencies": { - "@types/unist": "*" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-typescript": "^7.15.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "node_modules/@babel/runtime": { + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz", + "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==", "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.0.tgz", - "integrity": "sha512-O0A1G3xPGy4w7AgQdAQYUlQ+BKk2Oovw8eRpofyp5KdBZULnbe+WqaOVNrm705SHphCiG4XHsACrSmPu1f+Kgw==", "dependencies": { - "undici-types": "~8.3.0" + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@types/nunjucks": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@types/nunjucks/-/nunjucks-3.2.6.tgz", - "integrity": "sha512-pHiGtf83na1nCzliuAdq8GowYiXvH5l931xZ0YEHaLMNFgynpEqx+IPStlu7UaDkehfvl01e4x/9Tpwhy7Ue3w==", + "node_modules/@babel/template": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", + "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", "dev": true, - "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": "*" + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@types/svg2ttf": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@types/svg2ttf/-/svg2ttf-5.0.3.tgz", - "integrity": "sha512-hL+/A4qMISvDbDTtdY73R0zuvsdc7YRYnV5FyAfKVGk8OsluXu/tCFxop7IB5Sgr+ZCS0hHtFxylD0REmm+abA==", + "node_modules/@babel/traverse": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", + "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", "dev": true, - "license": "MIT" - }, - "node_modules/@types/ttf2eot": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/ttf2eot/-/ttf2eot-2.0.2.tgz", - "integrity": "sha512-KynDvCZEd1UuMkvGo/4TcrBlFj3K0HIrSlachIUrTHzqsGmxCL3I6QG6k83JPdxgbXSFGS+BILq0yZeLHgpkww==", - "dev": true, - "license": "MIT", "dependencies": { - "@types/node": "*" + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@types/ttf2woff": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/ttf2woff/-/ttf2woff-2.0.4.tgz", - "integrity": "sha512-pD66iwSkU5lIMWWTz5sxIMjwM7/qs/EYgE01vqu5C3S1izONHiF1GRy2dWvlKMlC39TfZszP7+OVXgVk3BccOg==", + "node_modules/@babel/types": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.4.tgz", + "integrity": "sha512-0f1HJFuGmmbrKTCZtbm3cU+b/AqdEYk5toj5iQur58xkVMlS0JWaKxTBSmCXd47uiN7vbcozAupm6Mvs80GNhw==", "dev": true, - "license": "MIT", "dependencies": { - "@types/node": "*" + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "dev": true, - "license": "MIT" + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true }, - "node_modules/@types/wawoff2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/wawoff2/-/wawoff2-1.0.2.tgz", - "integrity": "sha512-UVq4NxMuBywz5gklafg1HcENrK02trh/q+ifyvO6xktflGXRtf11GYsia3/l5nxg2edFQRlnUT6ivnk898WDiw==", + "node_modules/@cspotcode/source-map-consumer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", + "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" + "engines": { + "node": ">= 12" } }, - "node_modules/@types/web-bluetooth": { - "version": "0.0.21", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", - "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", + "node_modules/@cspotcode/source-map-support": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.6.1.tgz", + "integrity": "sha512-DX3Z+T5dt1ockmPdobJS/FAsQPW4V4SrWEhD2iYQT2Cb2tQsiMnYxrcUH9By/Z3B+v0S5LMBkQtV/XOBbpLEOg==", "dev": true, - "license": "MIT" - }, - "node_modules/@types/xml2js": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.14.tgz", - "integrity": "sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==", - "dev": true, - "license": "MIT", "dependencies": { - "@types/node": "*" + "@cspotcode/source-map-consumer": "0.8.0" + }, + "engines": { + "node": ">=12" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.2.tgz", - "integrity": "sha512-5jsZFwgR5rTdKwidH9Qmat75RKwqfpKlWWB1frDkljN127mwqBu8K0PYo7/hFpF03IEJpfVPpCQDY/eDx3iHvA==", + "node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", "dev": true, - "license": "ISC" + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } }, - "node_modules/@vitejs/plugin-vue": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.7.tgz", - "integrity": "sha512-km+p+XdSz9Sxm5rqUbqcSfZYaAniKxWBj1KURl+Jr7UaPvvX7BmaWMdP69I5rrFDeQGyxAG7NXdc57vz+snhWg==", + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", + "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", "dev": true, - "license": "MIT", "dependencies": { - "@rolldown/pluginutils": "^1.0.1" + "type-fest": "^0.20.2" }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=8" }, - "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", - "vue": "^3.2.25" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@vitest/coverage-v8": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.9.tgz", - "integrity": "sha512-G9/lgqibheLVBDRuya45EbsEXTYcWoSG+TLg7i2axuzx0Eq62eXn+aWXyaVdV5vKvFSWd6ywcX8hA7la9Pvu8g==", + "node_modules/@eslint/eslintrc/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==", "dev": true, - "license": "MIT", "dependencies": { - "@bcoe/v8-coverage": "^1.0.2", - "@vitest/utils": "4.1.9", - "ast-v8-to-istanbul": "^1.0.0", - "istanbul-lib-coverage": "^3.2.2", - "istanbul-lib-report": "^3.0.1", - "istanbul-reports": "^3.2.0", - "magicast": "^0.5.2", - "obug": "^2.1.1", - "std-env": "^4.0.0-rc.1", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, - "peerDependencies": { - "@vitest/browser": "4.1.9", - "vitest": "4.1.9" + "engines": { + "node": ">=6" }, - "peerDependenciesMeta": { - "@vitest/browser": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@vitest/coverage-v8/node_modules/@bcoe/v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", - "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", + "node_modules/@eslint/eslintrc/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==", "dev": true, - "license": "MIT", "engines": { - "node": ">=18" + "node": ">=4" } }, - "node_modules/@vitest/expect": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.9.tgz", - "integrity": "sha512-vl/rYsUKcBr3SnQn166+XR5ZQcgMx3DQhFWdfli/cWpLnLUmbxZvyrJZotLFUryib+LtArYMSTJ5RbQ57ZqrlA==", + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.1.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.9", - "@vitest/utils": "4.1.9", - "chai": "^6.2.2", - "tinyrainbow": "^3.1.0" + "engines": { + "node": ">=10" }, "funding": { - "url": "https://opencollective.com/vitest" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@vitest/mocker": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.9.tgz", - "integrity": "sha512-EVkXzBjrPGM+cK8/ANWgBrkUCfJfb38/EfTSO8h7pWvKkyPkpWxvR7BkD2MyItMF62C97zAEoqdpUixwR/e+Rw==", + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", "dev": true, - "license": "MIT", "dependencies": { - "@vitest/spy": "4.1.9", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } + "engines": { + "node": ">=10.10.0" } }, - "node_modules/@vitest/mocker/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true + }, + "node_modules/@hutson/parse-repository-url": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", + "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@vitest/pretty-format": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.9.tgz", - "integrity": "sha512-s0iufns3iIFitdgm+YR7g1whCAaGtXz459VS9/PqyKDEEFgYIhsHOQmXgIgDuYCt7DeQmiZT0Qe2OA2p4ZPu5A==", + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, - "license": "MIT", "dependencies": { - "tinyrainbow": "^3.1.0" + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" }, - "funding": { - "url": "https://opencollective.com/vitest" + "engines": { + "node": ">=8" } }, - "node_modules/@vitest/runner": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.9.tgz", - "integrity": "sha512-KXLMDtc7oe70+3mJfGrPUWPesswH+3sTxAMAMl8DG7I8IUQT4XW718dY5ID3vPUcmlu27CcKfY4P3h3I29SLJg==", + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.1.9", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "engines": { + "node": ">=8" } }, - "node_modules/@vitest/snapshot": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.9.tgz", - "integrity": "sha512-Jc7RKGNBo8Z28WYIm0Niej4xdSPByRf6mU58VpHQkd6Zh05rlnA+twjbK5HyeIGHxrzsc3mJgS43uM0CZKzaIA==", + "node_modules/@jest/console": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.1.0.tgz", + "integrity": "sha512-+Vl+xmLwAXLNlqT61gmHEixeRbS4L8MUzAjtpBCOPWH+izNI/dR16IeXjkXJdRtIVWVSf9DO1gdp67B1XorZhQ==", "dev": true, - "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.9", - "@vitest/utils": "4.1.9", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" + "@jest/types": "^27.1.0", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.1.0", + "jest-util": "^27.1.0", + "slash": "^3.0.0" }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.9.tgz", - "integrity": "sha512-fHpsS6mIi+PiEW+vcRVOMkX1oSaPKne3VOclSFICPcGOmfKgXPU5iAah+wcNcj2xPrCCmfq99IDGf+EojhhvhA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@vitest/utils": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.9.tgz", - "integrity": "sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==", + "node_modules/@jest/console/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.9", - "convert-source-map": "^2.0.0", - "tinyrainbow": "^3.1.0" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" }, "funding": { - "url": "https://opencollective.com/vitest" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@volar/language-core": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz", - "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==", + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { - "@volar/source-map": "2.4.28" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@volar/source-map": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz", - "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@volar/typescript": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz", - "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==", + "node_modules/@jest/console/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { - "@volar/language-core": "2.4.28", - "path-browserify": "^1.0.1", - "vscode-uri": "^3.0.8" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/@vue/compiler-core": { - "version": "3.5.39", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.39.tgz", - "integrity": "sha512-16KBTEXAJCpDr0mwlw+AZyhu8iyC7R3S2vBwsI7QnWJU6X3WKc9VKeNEZpiMdZ569qWhz9574L3vV55qRL0Vtw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.7", - "@vue/shared": "3.5.39", - "entities": "^7.0.1", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.1" - } + "node_modules/@jest/console/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==", + "dev": true }, - "node_modules/@vue/compiler-core/node_modules/entities": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", - "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "node_modules/@jest/console/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==", "dev": true, - "license": "BSD-2-Clause", "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "node": ">=8" } }, - "node_modules/@vue/compiler-dom": { - "version": "3.5.39", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.39.tgz", - "integrity": "sha512-oQPigALqYbNxTNPvNgSOe+czwVExfbVF02lz8jP0S3AXJiu3jxYDygNUiqSep4ezzW8XgnubqH63My2A7JR/vg==", + "node_modules/@jest/console/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.39", - "@vue/shared": "3.5.39" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@vue/compiler-sfc": { - "version": "3.5.39", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.39.tgz", - "integrity": "sha512-d0ki86iOyN8LoZPBmk5SJWNwHP19CnDDCfuo//+2WJa2g5Ke0Jay983PIBIcSSzldC68I8DrD5GrHV3OSDfodg==", + "node_modules/@jest/core": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.1.0.tgz", + "integrity": "sha512-3l9qmoknrlCFKfGdrmiQiPne+pUR4ALhKwFTYyOeKw6egfDwJkO21RJ1xf41rN8ZNFLg5W+w6+P4fUqq4EMRWA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.7", - "@vue/compiler-core": "3.5.39", - "@vue/compiler-dom": "3.5.39", - "@vue/compiler-ssr": "3.5.39", - "@vue/shared": "3.5.39", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.21", - "postcss": "^8.5.15", - "source-map-js": "^1.2.1" + "@jest/console": "^27.1.0", + "@jest/reporters": "^27.1.0", + "@jest/test-result": "^27.1.0", + "@jest/transform": "^27.1.0", + "@jest/types": "^27.1.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^27.1.0", + "jest-config": "^27.1.0", + "jest-haste-map": "^27.1.0", + "jest-message-util": "^27.1.0", + "jest-regex-util": "^27.0.6", + "jest-resolve": "^27.1.0", + "jest-resolve-dependencies": "^27.1.0", + "jest-runner": "^27.1.0", + "jest-runtime": "^27.1.0", + "jest-snapshot": "^27.1.0", + "jest-util": "^27.1.0", + "jest-validate": "^27.1.0", + "jest-watcher": "^27.1.0", + "micromatch": "^4.0.4", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/@vue/compiler-ssr": { - "version": "3.5.39", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.39.tgz", - "integrity": "sha512-Ce7/wvwMHai74bdszfXExdazFigYnlF9zgCmEQUcM1j0fOymlouZ7XilTYNo8oUjhlnjYOZbGrcYKuqjz89Ucw==", + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.39", - "@vue/shared": "3.5.39" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@vue/devtools-api": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-8.1.5.tgz", - "integrity": "sha512-YJipMVAKe5wT5CWf5kTYCaNV7NMNjFVxJkIkJaJ4W/nCxEBzlZzrOsYKeCymdCrFZmBS/+wTWFoUs3Jf/Q6XSQ==", + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { - "@vue/devtools-kit": "^8.1.5" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@vue/devtools-kit": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-8.1.5.tgz", - "integrity": "sha512-FcSAxsi4eWuXLCB7Rv9lj0aIVHHPNVQ2BazGf4RJTc2JCqb4BQg0hk87ZFhminCfl+mD5OUI0rX2cgyu4kJOGA==", + "node_modules/@jest/core/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { - "@vue/devtools-shared": "^8.1.5", - "birpc": "^2.6.1", - "hookable": "^5.5.3", - "perfect-debounce": "^2.0.0" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/@vue/devtools-shared": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-8.1.5.tgz", - "integrity": "sha512-mhT4zcPFhF+Xk1O4BfhhrbXzpmfqY03fS6xGpcllbQG7lDjhQf8pQHcTIhqQIYx1hfwtHmk/6jM96ele0UxPqQ==", - "dev": true, - "license": "MIT" + "node_modules/@jest/core/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==", + "dev": true }, - "node_modules/@vue/reactivity": { - "version": "3.5.39", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.39.tgz", - "integrity": "sha512-TpsuBJ9gGlZa5d23XcM2y8EXanz9dZeVDQBXRwzy46ItgvM+rWpzs+UVM0wcRLxGvcav0HE5jz2gNL53xlRAog==", + "node_modules/@jest/core/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==", "dev": true, - "license": "MIT", - "dependencies": { - "@vue/shared": "3.5.39" + "engines": { + "node": ">=8" } }, - "node_modules/@vue/runtime-core": { - "version": "3.5.39", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.39.tgz", - "integrity": "sha512-9GLtNyRvPAUMbX+7ono0RC2j0guo2LXVi8LvcmAooImACUKm0oFf0jjwbX8/H0AE/t1nxhAkn8RSl9PMCzzxZw==", + "node_modules/@jest/core/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.39", - "@vue/shared": "3.5.39" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@vue/runtime-dom": { - "version": "3.5.39", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.39.tgz", - "integrity": "sha512-7Y6aAGboKcXAZ3ECuUy7RrS5yy2r47dhTp2SKaJmYxjopImaVFaNa5Ne66NwGovsrxVAl5S5rwc7m22UG7Lmww==", + "node_modules/@jest/environment": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.1.0.tgz", + "integrity": "sha512-wRp50aAMY2w1U2jP1G32d6FUVBNYqmk8WaGkiIEisU48qyDV0WPtw3IBLnl7orBeggveommAkuijY+RzVnNDOQ==", "dev": true, - "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.39", - "@vue/runtime-core": "3.5.39", - "@vue/shared": "3.5.39", - "csstype": "^3.2.3" + "@jest/fake-timers": "^27.1.0", + "@jest/types": "^27.1.0", + "@types/node": "*", + "jest-mock": "^27.1.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@vue/server-renderer": { - "version": "3.5.39", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.39.tgz", - "integrity": "sha512-yZSakiAGw85rZfG7UM8akMnIF+FmeiNk47uvHf2nVBBSe+dIKUhZuZq9+XgJhbV3nS5Z4ALH23/MpXofW+mbcw==", + "node_modules/@jest/fake-timers": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.1.0.tgz", + "integrity": "sha512-22Zyn8il8DzpS+30jJNVbTlm7vAtnfy1aYvNeOEHloMlGy1PCYLHa4PWlSws0hvNsMM5bON6GISjkLoQUV3oMA==", "dev": true, - "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.5.39", - "@vue/shared": "3.5.39" + "@jest/types": "^27.1.0", + "@sinonjs/fake-timers": "^7.0.2", + "@types/node": "*", + "jest-message-util": "^27.1.0", + "jest-mock": "^27.1.0", + "jest-util": "^27.1.0" }, - "peerDependencies": { - "vue": "3.5.39" + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@vue/shared": { - "version": "3.5.39", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.39.tgz", - "integrity": "sha512-l1rrBtBfTnmxvtsvdQDXltUUy8S1Y+ZaqdfUzmAnJkTd8Z8rv5v/ytW+TKiqEOWyHPoqtPlNFSs0lhRmYVSHVA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vueuse/core": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-14.3.0.tgz", - "integrity": "sha512-aHfz47g0ZhMtTVHmIzMVpJy8ePhhOy68GY5bv110+5DVtZ+W7BsOx+m61UNQqfrWyPztIHIanWa3E2tib3NFIw==", + "node_modules/@jest/globals": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.1.0.tgz", + "integrity": "sha512-73vLV4aNHAlAgjk0/QcSIzzCZSqVIPbmFROJJv9D3QUR7BI4f517gVdJpSrCHxuRH3VZFhe0yGG/tmttlMll9g==", "dev": true, - "license": "MIT", "dependencies": { - "@types/web-bluetooth": "^0.0.21", - "@vueuse/metadata": "14.3.0", - "@vueuse/shared": "14.3.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" + "@jest/environment": "^27.1.0", + "@jest/types": "^27.1.0", + "expect": "^27.1.0" }, - "peerDependencies": { - "vue": "^3.5.0" + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@vueuse/integrations": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-14.3.0.tgz", - "integrity": "sha512-76I5FT2ESvCmCaSwapI+a/u/CFtNXmzl9f9lNp1hRtx8vKB8hfiokJr8IvQqcQG5ckGXElyXK516b54ozV3MvA==", + "node_modules/@jest/reporters": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.1.0.tgz", + "integrity": "sha512-5T/zlPkN2HnK3Sboeg64L5eC8iiaZueLpttdktWTJsvALEtP2YMkC5BQxwjRWQACG9SwDmz+XjjkoxXUDMDgdw==", "dev": true, - "license": "MIT", "dependencies": { - "@vueuse/core": "14.3.0", - "@vueuse/shared": "14.3.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.1.0", + "@jest/test-result": "^27.1.0", + "@jest/transform": "^27.1.0", + "@jest/types": "^27.1.0", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^27.1.0", + "jest-resolve": "^27.1.0", + "jest-util": "^27.1.0", + "jest-worker": "^27.1.0", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" }, "peerDependencies": { - "async-validator": "^4", - "axios": "^1", - "change-case": "^5", - "drauu": "^0.4", - "focus-trap": "^7 || ^8", - "fuse.js": "^7", - "idb-keyval": "^6", - "jwt-decode": "^4", - "nprogress": "^0.2", - "qrcode": "^1.5", - "sortablejs": "^1", - "universal-cookie": "^7 || ^8", - "vue": "^3.5.0" + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "peerDependenciesMeta": { - "async-validator": { - "optional": true - }, - "axios": { - "optional": true - }, - "change-case": { - "optional": true - }, - "drauu": { - "optional": true - }, - "focus-trap": { - "optional": true - }, - "fuse.js": { - "optional": true - }, - "idb-keyval": { - "optional": true - }, - "jwt-decode": { - "optional": true - }, - "nprogress": { - "optional": true - }, - "qrcode": { - "optional": true - }, - "sortablejs": { - "optional": true - }, - "universal-cookie": { + "node-notifier": { "optional": true } } }, - "node_modules/@vueuse/metadata": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-14.3.0.tgz", - "integrity": "sha512-BwxmbAzwAVF50+MW57GXOUEV61nFBGnlBvrTqj49PqWJu3uw7hdu72ztXeZ33RdZtDY6kO+bfCAE1PCn88Tktw==", + "node_modules/@jest/reporters/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, "funding": { - "url": "https://github.com/sponsors/antfu" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@vueuse/shared": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-14.3.0.tgz", - "integrity": "sha512-bZpge9eSXwa4ToSiqJ7j6KRwhAsneMFoSz3LMWKQDkqimm3D/tbFlrklrs/IOqC8tEcYmXQZJ6N0UrjhBirVCg==", + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, - "peerDependencies": { - "vue": "^3.5.0" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@xmldom/xmldom": { - "version": "0.9.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.9.10.tgz", - "integrity": "sha512-A9gOqLdi6cV4ibazAjcQufGj0B1y/vDqYrcuP6d/6x8P27gRS8643Dj9o1dEKtB6O7fwxb2FgBmJS2mX7gpvdw==", - "license": "MIT", + "node_modules/@jest/reporters/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=14.6" + "node": ">=7.0.0" } }, - "node_modules/a-sync-waterfall": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", - "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==" - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "license": "ISC" + "node_modules/@jest/reporters/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==", + "dev": true }, - "node_modules/acorn": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", - "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", + "node_modules/@jest/reporters/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==", "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, "engines": { - "node": ">=0.4.0" + "node": ">=8" } }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "license": "MIT", + "node_modules/@jest/reporters/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/ansi-escapes": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", - "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", + "node_modules/@jest/reporters/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { - "environment": "^1.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "node_modules/@jest/source-map": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.0.6.tgz", + "integrity": "sha512-Fek4mi5KQrqmlY07T23JRi0e7Z9bXTOOD86V/uS0EIW4PClvPDqZOyFlLpNJheS6QI0FNX1CgmPjtJ4EA/2M+g==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true, - "license": "MIT" - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", + "node_modules/@jest/source-map/node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "node_modules/@jest/source-map/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/ast-v8-to-istanbul": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.4.tgz", - "integrity": "sha512-0bC0/4bTSrnwdhU3IsZDwEdojvuPrSg59OYZfKsLRtJZ0u8VBx9DebfqqG8bRdCC0I7vjgxmPi41P0lpkhJHtA==", + "node_modules/@jest/test-result": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.1.0.tgz", + "integrity": "sha512-Aoz00gpDL528ODLghat3QSy6UBTD5EmmpjrhZZMK/v1Q2/rRRqTGnFxHuEkrD4z/Py96ZdOHxIWkkCKRpmnE1A==", "dev": true, - "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.31", - "estree-walker": "^3.0.3", - "js-tokens": "^10.0.0" + "@jest/console": "^27.1.0", + "@jest/types": "^27.1.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/ast-v8-to-istanbul/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "node_modules/@jest/test-sequencer": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.1.0.tgz", + "integrity": "sha512-lnCWawDr6Z1DAAK9l25o3AjmKGgcutq1iIbp+hC10s/HxnB8ZkUsYq1FzjOoxxZ5hW+1+AthBtvS4x9yno3V1A==", "dev": true, - "license": "MIT", "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", - "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true, - "license": "MIT" - }, - "node_modules/b3b": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/b3b/-/b3b-0.0.1.tgz", - "integrity": "sha1-/2n4pY2JGscysgF15HVGeZdU75s=", - "dev": true - }, - "node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "license": "MIT", + "@jest/test-result": "^27.1.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.1.0", + "jest-runtime": "^27.1.0" + }, "engines": { - "node": "18 || 20 || >=22" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/birpc": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", - "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "node_modules/@jest/transform": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.1.0.tgz", + "integrity": "sha512-ZRGCA2ZEVJ00ubrhkTG87kyLbN6n55g1Ilq0X9nJb5bX3MhMp3O6M7KG+LvYu+nZRqG5cXsQnJEdZbdpTAV8pQ==", "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "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==", - "license": "ISC" - }, - "node_modules/brace-expansion": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", - "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", - "license": "MIT", "dependencies": { - "balanced-match": "^4.0.2" + "@babel/core": "^7.1.0", + "@jest/types": "^27.1.0", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.1.0", + "jest-regex-util": "^27.0.6", + "jest-util": "^27.1.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" }, "engines": { - "node": "18 || 20 || >=22" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/@jest/transform/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { - "fill-range": "^7.1.1" + "color-convert": "^2.0.1" }, "engines": { "node": ">=8" - } - }, - "node_modules/callsites": { - "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" - } - }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "dev": true, - "license": "MIT", + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2572,101 +2337,106 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "node_modules/@jest/transform/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=10" + "node": ">=7.0.0" } }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "node_modules/@jest/transform/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==", + "dev": true + }, + "node_modules/@jest/transform/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==", "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "engines": { + "node": ">=8" } }, - "node_modules/character-entities-legacy": { - "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==", + "node_modules/@jest/transform/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/cjs-module-lexer": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", - "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "node_modules/@jest/transform/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT" + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/cli-highlight": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", - "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "node_modules/@jest/types": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.1.0.tgz", + "integrity": "sha512-pRP5cLIzN7I7Vp6mHKRSaZD7YpBTK7hawx5si8trMKqk4+WOdK8NEKOTO2G8PKWD1HbKMVckVB6/XHh/olhf2g==", "dev": true, - "license": "ISC", "dependencies": { - "chalk": "^4.0.0", - "highlight.js": "^10.7.1", - "mz": "^2.4.0", - "parse5": "^5.1.1", - "parse5-htmlparser2-tree-adapter": "^6.0.0", - "yargs": "^16.0.0" - }, - "bin": { - "highlight": "bin/highlight" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" }, "engines": { - "node": ">=8.0.0", - "npm": ">=5.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/cli-table3": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "node_modules/@jest/types/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { - "string-width": "^4.2.0" + "color-convert": "^2.0.1" }, "engines": { - "node": "10.* || >= 12.*" + "node": ">=8" }, - "optionalDependencies": { - "@colors/colors": "1.5.0" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, - "license": "ISC", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/color-convert": { + "node_modules/@jest/types/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -2674,7889 +2444,18820 @@ "node": ">=7.0.0" } }, - "node_modules/color-name": { + "node_modules/@jest/types/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==", - "dev": true, - "license": "MIT" + "dev": true }, - "node_modules/colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w==", + "node_modules/@jest/types/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==", "dev": true, - "license": "MIT", "engines": { - "node": ">=0.1.90" + "node": ">=8" } }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "node_modules/@jest/types/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", - "license": "MIT", + "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==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, "engines": { - "node": ">=16" + "node": ">= 8" } }, - "node_modules/compare-versions": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", - "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", - "dev": true, - "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==", - "dev": true, - "license": "MIT" + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } }, - "node_modules/confbox": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", - "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", - "dev": true, - "license": "MIT" + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } }, - "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==", + "node_modules/@rollup/plugin-commonjs": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-20.0.0.tgz", + "integrity": "sha512-5K0g5W2Ol8hAcTHqcTBHiA7M58tfmYi1o9KxeJuuRNpGaTa5iLjcyemBitCBcKXaHamOBBEH2dGom6v6Unmqjg==", "dev": true, - "license": "MIT" - }, - "node_modules/cosmiconfig": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.2.tgz", - "integrity": "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==", - "license": "MIT", "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" + "@rollup/pluginutils": "^3.1.0", + "commondir": "^1.0.1", + "estree-walker": "^2.0.1", + "glob": "^7.1.6", + "is-reference": "^1.2.1", + "magic-string": "^0.25.7", + "resolve": "^1.17.0" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" + "node": ">= 8.0.0" }, "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "rollup": "^2.38.3" } }, - "node_modules/cosmiconfig/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==", - "license": "Python-2.0" - }, - "node_modules/cosmiconfig/node_modules/js-yaml": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", - "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/puzrin" - }, - { - "type": "github", - "url": "https://github.com/sponsors/nodeca" - } - ], - "license": "MIT", + "node_modules/@rollup/plugin-typescript": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-8.2.5.tgz", + "integrity": "sha512-QL/LvDol/PAGB2O0S7/+q2HpSUNodpw7z6nGn9BfoVCPOZ0r4EALrojFU29Bkoi2Hr2jgTocTejJ5GGWZfOxbQ==", + "dev": true, "dependencies": { - "argparse": "^2.0.1" + "@rollup/pluginutils": "^3.1.0", + "resolve": "^1.17.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "rollup": "^2.14.0", + "tslib": "*", + "typescript": ">=3.7.0" } }, - "node_modules/css-select": { - "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", + "node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" } }, - "node_modules/css-tree": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", - "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", - "license": "MIT", + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, "dependencies": { - "mdn-data": "2.27.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + "type-detect": "4.0.8" } }, - "node_modules/css-what": { - "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", + "node_modules/@sinonjs/fake-timers": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", + "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, "engines": { "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" } }, - "node_modules/csso": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", - "license": "MIT", + "node_modules/@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", + "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.1.15", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.15.tgz", + "integrity": "sha512-bxlMKPDbY8x5h6HBwVzEOk2C8fb6SLfYQ5Jw3uBYuYF1lfWk/kbLd81la82vrIkBb0l+JdmrZaDikPrNxpS/Ew==", + "dev": true, "dependencies": { - "css-tree": "~2.2.0" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "node_modules/csso/node_modules/css-tree": { - "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", + "node_modules/@types/babel__generator": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.3.tgz", + "integrity": "sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==", + "dev": true, "dependencies": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" + "@babel/types": "^7.0.0" } }, - "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==", - "license": "CC0-1.0" - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", "dev": true, - "license": "MIT" - }, - "node_modules/cubic2quad": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/cubic2quad/-/cubic2quad-1.2.1.tgz", - "integrity": "sha512-wT5Y7mO8abrV16gnssKdmIhIbA9wSkeMzhh27jAguKrV82i24wER0vL5TGhUJ9dbJNDcigoRZ0IAHFEEEI4THQ==" + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } }, - "node_modules/dateformat": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", - "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", + "node_modules/@types/babel__traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", + "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", "dev": true, - "license": "MIT", - "engines": { - "node": "*" + "dependencies": { + "@babel/types": "^7.3.0" } }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", + "node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "node_modules/@types/glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", + "dev": true, "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "@types/minimatch": "*", + "@types/node": "*" } }, - "node_modules/deepmerge": { - "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/@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dev": true, + "dependencies": { + "@types/node": "*" } }, - "node_modules/dequal": { + "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "@types/istanbul-lib-coverage": "*" } }, - "node_modules/detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "@types/istanbul-lib-report": "*" } }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "node_modules/@types/jest": { + "version": "26.0.24", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.24.tgz", + "integrity": "sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" + "dependencies": { + "jest-diff": "^26.0.0", + "pretty-format": "^26.0.0" } }, - "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==", + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, + "node_modules/@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==" + }, + "node_modules/@types/node": { + "version": "15.14.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.14.9.tgz", + "integrity": "sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==", + "dev": true + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==" + }, + "node_modules/@types/nunjucks": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@types/nunjucks/-/nunjucks-3.1.5.tgz", + "integrity": "sha512-0zEdmQNNvQ+xyV9kqQvAV93UVroTwhE78toVUDT0GBnGcW2jQBZnB4al9qq2LqI5qHOqROy/DvvAY/UwrbvV1A==", + "dev": true + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "node_modules/@types/prettier": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.2.tgz", + "integrity": "sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog==", + "dev": true + }, + "node_modules/@types/rimraf": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-3.0.1.tgz", + "integrity": "sha512-CAoSlbco40aKZ0CkelBF2g3JeN6aioRaTVnqSX5pWsn/WApm6IDxI4e4tD9D0dY/meCkyyleP1IQDVN13F4maA==", "dev": true, - "license": "MIT", "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "@types/glob": "*", + "@types/node": "*" } }, - "node_modules/dom-serializer": { - "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", + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "@types/yargs-parser": "*" } }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" + "node_modules/@types/yargs-parser": { + "version": "20.2.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", + "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", + "dev": true }, - "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", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.38.0.tgz", + "integrity": "sha512-GgHi/GNuUbTOeoJiEANi0oI6fF3gBQc3bGFYj40nnAPCbhrtEDf2rjBmefFadweBmO1Du1YovHeDP2h5JLhtTQ==", + "dev": true, "dependencies": { - "domelementtype": "^2.3.0" + "@typescript-eslint/scope-manager": "5.38.0", + "@typescript-eslint/type-utils": "5.38.0", + "@typescript-eslint/utils": "5.38.0", + "debug": "^4.3.4", + "ignore": "^5.2.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "engines": { - "node": ">= 4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "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", - "domhandler": "^5.0.3" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "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==", - "dev": true, - "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==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.0.tgz", + "integrity": "sha512-ByhHIuNyKD9giwkkLqzezZ9y5bALW8VNY6xXcP+VxoH4JBDKjU5WNnsiD4HJdglHECdV+lyaxhvQjTUbRboiTA==", "dev": true, - "license": "MIT" - }, - "node_modules/enquirer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", - "license": "MIT", "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/visitor-keys": "5.38.0" }, "engines": { - "node": ">=8.6" - } - }, - "node_modules/entities": { - "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" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "license": "MIT", - "engines": { - "node": ">=6" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/environment": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.0.tgz", + "integrity": "sha512-HHu4yMjJ7i3Cb+8NUuRCdOGu2VMkfmKyIJsOr9PfkBVYLYrtMCK/Ap50Rpov+iKpxDTfnqvDbuPLgBE5FwUNfA==", "dev": true, - "license": "MIT", "engines": { - "node": ">=18" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "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==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.0.tgz", + "integrity": "sha512-MxnrdIyArnTi+XyFLR+kt/uNAcdOnmT+879os7qDRI+EYySR4crXJq9BXPfRzzLGq0wgxkwidrCJ9WCAoacm1w==", + "dev": true, "dependencies": { - "is-arrayish": "^0.2.1" + "@typescript-eslint/types": "5.38.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true, - "license": "MIT", "engines": { - "node": ">= 0.4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/es-module-lexer": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.0.tgz", - "integrity": "sha512-KLdwQm2NvGLDkQDCGvmiQrhkd0JbMzXthwQAUgWjQuQdBLFa3eiBP5arXZyA+f8x+x7OXgud6bq2rxjGtHV2tw==", - "dev": true, - "license": "MIT" - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true, - "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 4" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, - "license": "BSD-2-Clause", + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "semver": "bin/semver.js" }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "node_modules/@typescript-eslint/experimental-utils": { + "version": "4.28.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.5.tgz", + "integrity": "sha512-bGPLCOJAa+j49hsynTaAtQIWg6uZd8VLiPcyDe4QPULsvQwLHGLSGKKcBN8/lBxIX14F74UEMK2zNDI8r0okwA==", "dev": true, - "license": "MIT" + "dependencies": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.28.5", + "@typescript-eslint/types": "4.28.5", + "@typescript-eslint/typescript-estree": "4.28.5", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + } }, - "node_modules/eventemitter2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", - "integrity": "sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==", + "node_modules/@typescript-eslint/parser": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.38.0.tgz", + "integrity": "sha512-/F63giJGLDr0ms1Cr8utDAxP2SPiglaD6V+pCOcG35P2jCqdfR7uuEhz1GIC3oy4hkUF8xA1XSXmd9hOh/a5EA==", "dev": true, - "license": "MIT" - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/exit-x": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz", - "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==", - "dev": true, - "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "5.38.0", + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/typescript-estree": "5.38.0", + "debug": "^4.3.4" + }, "engines": { - "node": ">= 0.8.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.0.tgz", + "integrity": "sha512-ByhHIuNyKD9giwkkLqzezZ9y5bALW8VNY6xXcP+VxoH4JBDKjU5WNnsiD4HJdglHECdV+lyaxhvQjTUbRboiTA==", "dev": true, - "license": "MIT", "dependencies": { - "homedir-polyfill": "^1.0.1" + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/visitor-keys": "5.38.0" }, "engines": { - "node": ">=0.10.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/expect-type": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", - "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==", + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.0.tgz", + "integrity": "sha512-HHu4yMjJ7i3Cb+8NUuRCdOGu2VMkfmKyIJsOr9PfkBVYLYrtMCK/Ap50Rpov+iKpxDTfnqvDbuPLgBE5FwUNfA==", "dev": true, - "license": "Apache-2.0", "engines": { - "node": ">=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/exsolve": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.0.tgz", - "integrity": "sha512-D+42+T12DdIlJM3uepa55qGiL3sYdLBOxIl2ifQCzCHz4c7eiolaHsi3BIqEr7JxBzxv2pYZQX9kw16ziMcEmw==", - "dev": true, - "license": "MIT" - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.0.tgz", + "integrity": "sha512-6P0RuphkR+UuV7Avv7MU3hFoWaGcrgOdi8eTe1NwhMp2/GjUJoODBTRWzlHpZh6lFOaPmSvgxGlROa0Sg5Zbyg==", "dev": true, - "license": "MIT" - }, - "node_modules/fast-glob": { - "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.8" + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/visitor-keys": "5.38.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "engines": { - "node": ">=8.6.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.0.tgz", + "integrity": "sha512-MxnrdIyArnTi+XyFLR+kt/uNAcdOnmT+879os7qDRI+EYySR4crXJq9BXPfRzzLGq0wgxkwidrCJ9WCAoacm1w==", + "dev": true, "dependencies": { - "reusify": "^1.0.4" + "@typescript-eslint/types": "5.38.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/fd-package-json": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fd-package-json/-/fd-package-json-2.0.0.tgz", - "integrity": "sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==", + "node_modules/@typescript-eslint/parser/node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true, - "license": "MIT", - "dependencies": { - "walk-up-path": "^4.0.0" + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/fflate": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.3.tgz", - "integrity": "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==", + "node_modules/@typescript-eslint/parser/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, - "license": "MIT" - }, - "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==", "dependencies": { - "to-regex-range": "^5.0.1" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/findup-sync": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", - "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "4.28.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.5.tgz", + "integrity": "sha512-PHLq6n9nTMrLYcVcIZ7v0VY1X7dK309NM8ya9oL/yG8syFINIMHxyr2GzGoBYUdv3NUfCOqtuqps0ZmcgnZTfQ==", "dev": true, - "license": "MIT", "dependencies": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.3", - "micromatch": "^4.0.4", - "resolve-dir": "^1.0.1" + "@typescript-eslint/types": "4.28.5", + "@typescript-eslint/visitor-keys": "4.28.5" }, "engines": { - "node": ">= 10.13.0" + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "node_modules/@typescript-eslint/type-utils": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.38.0.tgz", + "integrity": "sha512-iZq5USgybUcj/lfnbuelJ0j3K9dbs1I3RICAJY9NZZpDgBYXmuUlYQGzftpQA9wC8cKgtS6DASTvF3HrXwwozA==", "dev": true, - "license": "MIT", "dependencies": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" + "@typescript-eslint/typescript-estree": "5.38.0", + "@typescript-eslint/utils": "5.38.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" }, "engines": { - "node": ">= 0.10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.0.tgz", + "integrity": "sha512-HHu4yMjJ7i3Cb+8NUuRCdOGu2VMkfmKyIJsOr9PfkBVYLYrtMCK/Ap50Rpov+iKpxDTfnqvDbuPLgBE5FwUNfA==", "dev": true, - "license": "MIT", "engines": { - "node": ">= 0.10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/focus-trap": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-8.2.2.tgz", - "integrity": "sha512-qV0g8hRYBqgACcFOH3f9wXc4zPKhr/0z9RI2a6ZijZ72EeBi4g8oBy8zAWuUR1TsMpOzwpUMFvjdasrC41Joug==", + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.0.tgz", + "integrity": "sha512-6P0RuphkR+UuV7Avv7MU3hFoWaGcrgOdi8eTe1NwhMp2/GjUJoODBTRWzlHpZh6lFOaPmSvgxGlROa0Sg5Zbyg==", "dev": true, - "license": "MIT", "dependencies": { - "tabbable": "^6.5.0" + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/visitor-keys": "5.38.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/fonteditor-core": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/fonteditor-core/-/fonteditor-core-2.6.3.tgz", - "integrity": "sha512-YUryIKjkenjZ41E7JvM3V+02Ak4mTHDDTwBWgs9KBzypzHqLZHuua1UDRevZNTKawmnq1dbBAa70Jddl2+F4FQ==", + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.0.tgz", + "integrity": "sha512-MxnrdIyArnTi+XyFLR+kt/uNAcdOnmT+879os7qDRI+EYySR4crXJq9BXPfRzzLGq0wgxkwidrCJ9WCAoacm1w==", + "dev": true, "dependencies": { - "@xmldom/xmldom": "^0.8.3" + "@typescript-eslint/types": "5.38.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/fonteditor-core/node_modules/@xmldom/xmldom": { - "version": "0.8.13", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.13.tgz", - "integrity": "sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==", - "license": "MIT", + "node_modules/@typescript-eslint/type-utils/node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, "engines": { - "node": ">=10.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/fontverter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fontverter/-/fontverter-2.0.0.tgz", - "integrity": "sha512-DFVX5hvXuhi1Jven1tbpebYTCT9XYnvx6/Z+HFUPb7ZRMCW+pj2clU9VMhoTPgWKPhAs7JJDSk3CW1jNUvKCZQ==", - "license": "BSD-3-Clause", + "node_modules/@typescript-eslint/type-utils/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, "dependencies": { - "wawoff2": "^2.0.0", - "woff2sfnt-sfnt2woff": "^1.0.0" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "node_modules/@typescript-eslint/types": { + "version": "4.28.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.5.tgz", + "integrity": "sha512-MruOu4ZaDOLOhw4f/6iudyks/obuvvZUAHBDSW80Trnc5+ovmViLT2ZMDXhUV66ozcl6z0LJfKs1Usldgi/WCA==", "dev": true, - "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "4.28.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.5.tgz", + "integrity": "sha512-FzJUKsBX8poCCdve7iV7ShirP8V+ys2t1fvamVeD1rWpiAnIm550a+BX/fmTHrjEpQJ7ZAn+Z7ZZwJjytk9rZw==", "dev": true, - "license": "MIT", "dependencies": { - "for-in": "^1.0.1" + "@typescript-eslint/types": "4.28.5", + "@typescript-eslint/visitor-keys": "4.28.5", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "engines": { - "node": ">=0.10.0" + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/formatly": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/formatly/-/formatly-0.3.0.tgz", - "integrity": "sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, - "license": "MIT", "dependencies": { - "fd-package-json": "^2.0.0" + "lru-cache": "^6.0.0" }, "bin": { - "formatly": "bin/index.mjs" + "semver": "bin/semver.js" }, "engines": { - "node": ">=18.3.0" + "node": ">=10" } }, - "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==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "node_modules/@typescript-eslint/utils": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.38.0.tgz", + "integrity": "sha512-6sdeYaBgk9Fh7N2unEXGz+D+som2QCQGPAf1SxrkEr+Z32gMreQ0rparXTNGRRfYUWk/JzbGdcM8NSSd6oqnTA==", "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.38.0", + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/typescript-estree": "5.38.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/get-tsconfig": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz", - "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==", + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.0.tgz", + "integrity": "sha512-ByhHIuNyKD9giwkkLqzezZ9y5bALW8VNY6xXcP+VxoH4JBDKjU5WNnsiD4HJdglHECdV+lyaxhvQjTUbRboiTA==", "dev": true, - "license": "MIT", "dependencies": { - "resolve-pkg-maps": "^1.0.0" + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/visitor-keys": "5.38.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/getobject": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz", - "integrity": "sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==", + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.0.tgz", + "integrity": "sha512-HHu4yMjJ7i3Cb+8NUuRCdOGu2VMkfmKyIJsOr9PfkBVYLYrtMCK/Ap50Rpov+iKpxDTfnqvDbuPLgBE5FwUNfA==", "dev": true, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "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", + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.0.tgz", + "integrity": "sha512-6P0RuphkR+UuV7Avv7MU3hFoWaGcrgOdi8eTe1NwhMp2/GjUJoODBTRWzlHpZh6lFOaPmSvgxGlROa0Sg5Zbyg==", "dev": true, - "license": "ISC", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/visitor-keys": "5.38.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "engines": { - "node": "*" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "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==", + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.0.tgz", + "integrity": "sha512-MxnrdIyArnTi+XyFLR+kt/uNAcdOnmT+879os7qDRI+EYySR4crXJq9BXPfRzzLGq0wgxkwidrCJ9WCAoacm1w==", + "dev": true, "dependencies": { - "is-glob": "^4.0.1" + "@typescript-eslint/types": "5.38.0", + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": ">= 6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/glob/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==", - "dev": true, - "license": "MIT" - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "node_modules/@typescript-eslint/utils/node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/glob/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, - "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": "*" + "node": ">=10" } }, - "node_modules/global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "4.28.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.5.tgz", + "integrity": "sha512-dva/7Rr+EkxNWdJWau26xU/0slnFlkh88v3TsyTgRS/IIYFi5iIfpCFM4ikw0vQTFUR9FYSSyqgK4w64gsgxhg==", "dev": true, - "license": "MIT", "dependencies": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" + "@typescript-eslint/types": "4.28.5", + "eslint-visitor-keys": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, + "node_modules/@xmldom/xmldom": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.6.tgz", + "integrity": "sha512-HHXP9hskkFQHy8QxxUXkS7946FFIhYVfGqsk0WLwllmexN9x/+R4UBLvurHEuyXRfVEObVR8APuQehykLviwSQ==", "engines": { - "node": ">=0.10.0" + "node": ">=10.0.0" } }, - "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==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } + "node_modules/a-sync-waterfall": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", + "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==" }, - "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==", - "dev": true, - "license": "ISC" + "node_modules/abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true }, - "node_modules/grunt": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.6.2.tgz", - "integrity": "sha512-bUzh5nA/P5L66ihXTDP6J5BGnMB/8lXJXejYWSbH4Y4TvWM9t2S39sggQDYYQlx06cYcCsmu63HMYHGCIzUVfg==", + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, - "license": "MIT", - "dependencies": { - "dateformat": "~4.6.2", - "eventemitter2": "~0.4.13", - "exit": "~0.1.2", - "findup-sync": "~5.0.0", - "glob": "~7.1.6", - "grunt-cli": "^1.4.3", - "grunt-known-options": "~2.0.0", - "grunt-legacy-log": "~3.0.0", - "grunt-legacy-util": "~2.0.1", - "iconv-lite": "~0.6.3", - "js-yaml": "~3.14.0", - "minimatch": "^3.1.5", - "nopt": "^5.0.0" - }, "bin": { - "grunt": "bin/grunt" + "acorn": "bin/acorn" }, "engines": { - "node": ">=16" + "node": ">=0.4.0" } }, - "node_modules/grunt-cli": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.5.0.tgz", - "integrity": "sha512-rILKAFoU0dzlf22SUfDtq2R1fosChXXlJM5j7wI6uoW8gwmXDXzbUvirlKZSYCdXl3LXFbR+8xyS+WFo+b6vlA==", + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", "dev": true, - "license": "MIT", "dependencies": { - "grunt-known-options": "~2.0.0", - "interpret": "~1.1.0", - "liftup": "~3.0.1", - "nopt": "~5.0.0", - "v8flags": "^4.0.1" - }, - "bin": { - "grunt": "bin/grunt" - }, - "engines": { - "node": ">=10" + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" } }, - "node_modules/grunt-known-options": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz", - "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==", + "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==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/grunt-legacy-log": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.1.tgz", - "integrity": "sha512-vytI3IUC8qUK9TcvvpHpGJzDojua/sfJV4TdLB4FtCFzospqduzBuL3+dEfpvO+tGECv7/273+33hjjMXSa92g==", + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", "dev": true, - "license": "MIT", - "dependencies": { - "colors": "~1.1.2", - "grunt-legacy-log-utils": "^2.1.3", - "hooker": "~0.2.3", - "lodash": "^4.18.0" - }, "engines": { - "node": ">= 0.10.0" + "node": ">=0.4.0" } }, - "node_modules/grunt-legacy-log-utils": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.3.tgz", - "integrity": "sha512-sgG+QvKmdb44wZyzJP+ejDsy3jYxG2wzohpol+JTMlXqMUBDoZb01JPQ5jKAedtZBFwhmABAc88T9hEBLy3U+Q==", + "node_modules/add-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", + "integrity": "sha1-anmQQ3ynNtXhKI25K9MmbV9csqo=", + "dev": true + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, - "license": "MIT", "dependencies": { - "chalk": "^4.1.0" + "debug": "4" }, "engines": { - "node": ">=10" + "node": ">= 6.0.0" } }, - "node_modules/grunt-legacy-util": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.2.tgz", - "integrity": "sha512-0xoDILyR4BVJel5uJwnhjdWN9evOQ8A0uXbQUIJ0hgVthIA6kloXHSoqATQPj6BRrHrHkcQtCeGVb0ixFoHyEQ==", + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, - "license": "MIT", "dependencies": { - "async": "~3.2.0", - "exit-x": "~0.2.2", - "getobject": "~1.0.0", - "hooker": "~0.2.3", - "lodash": "^4.18.0", - "underscore.string": "~3.3.5", - "which": "~2.0.2" + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/grunt-webfont-recipe": { - "resolved": "packages/grunt-webfont-recipe", - "link": true - }, - "node_modules/grunt/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==", + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "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/grunt/node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "engines": { + "node": ">=6" } }, - "node_modules/grunt/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, - "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "type-fest": "^0.21.3" }, "engines": { - "node": "*" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/hasown": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", - "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", - "dev": true, - "license": "MIT", + "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": { - "function-bind": "^1.1.2" + "color-convert": "^1.9.0" }, "engines": { - "node": ">= 0.4" + "node": ">=4" } }, - "node_modules/hast-util-to-html": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", - "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, - "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-whitespace": "^3.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "stringify-entities": "^4.0.0", - "zwitch": "^2.0.4" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 8" } }, - "node_modules/hast-util-whitespace": { - "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==", + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", + "dev": true + }, + "node_modules/array-includes": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", "dev": true, - "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/highlight.js": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", - "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", - "dev": true, - "license": "BSD-3-Clause", + "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==", "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "node_modules/array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", "dev": true, - "license": "MIT", "dependencies": { - "parse-passwd": "^1.0.0" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + }, + "engines": { + "node": ">= 0.4" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "engines": { "node": ">=0.10.0" } }, - "node_modules/hookable": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", - "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", - "dev": true, - "license": "MIT" + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, - "node_modules/hooker": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", - "integrity": "sha512-t+UerCsQviSymAInD01Pw+Dn/usmz1sRO+3Zk1+lx8eg+WKpD2ulcwWqHHL0+aseRBr+3+vIhiG1K1JTwaIcTA==", + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, "engines": { - "node": "*" + "node": ">=8" } }, - "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==", - "dev": true, - "license": "MIT" + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true }, - "node_modules/html-void-elements": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", - "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "node_modules/b3b": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/b3b/-/b3b-0.0.1.tgz", + "integrity": "sha1-/2n4pY2JGscysgF15HVGeZdU75s=", + "dev": true }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "node_modules/babel-jest": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.1.0.tgz", + "integrity": "sha512-6NrdqzaYemALGCuR97QkC/FkFIEBWP5pw5TMJoUHZTVXyOgocujp6A0JE2V6gE0HtqAAv6VKU/nI+OCR1Z4gHA==", "dev": true, - "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "@jest/transform": "^27.1.0", + "@jest/types": "^27.1.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^27.0.6", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "license": "MIT", - "engines": { - "node": ">= 4" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" } }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "license": "MIT", + "node_modules/babel-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/import-fresh/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", + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "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==", - "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.", + "node_modules/babel-jest/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "ISC", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "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==", - "dev": true, - "license": "ISC" + "node_modules/babel-jest/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==", + "dev": true }, - "node_modules/interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha512-CLM8SNMDu7C5psFCn6Wg/tgpj/bKAg7hc2gWqcuR9OD5Ft9PhBpIu8PLicPeis+xDd6YX2ncI8MCA64I9tftIA==", + "node_modules/babel-jest/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==", "dev": true, - "license": "MIT" + "engines": { + "node": ">=8" + } }, - "node_modules/is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "node_modules/babel-jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + "node_modules/babel-plugin-dynamic-import-node": { + "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==", + "dev": true, + "dependencies": { + "object.assign": "^4.1.0" + } }, - "node_modules/is-core-module": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", - "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "node_modules/babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", "dev": true, - "license": "MIT", "dependencies": { - "hasown": "^2.0.3" + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/is-eot": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-eot/-/is-eot-1.0.0.tgz", - "integrity": "sha1-6EnEDw4YpoU8DWtrrCTvHyxznms=", + "node_modules/babel-plugin-jest-hoist": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.0.6.tgz", + "integrity": "sha512-CewFeM9Vv2gM7Yr9n5eyyLVPRSiBnk6lKZRjgwYnGKSl9M14TMn2vkN02wTF04OGuSDLEzlWiMzvjXuW9mB6Gw==", "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "engines": { - "node": ">=0.10.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/is-fullwidth-code-point": { - "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==", + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", + "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.2", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.3.tgz", + "integrity": "sha512-rCOFzEIJpJEAU14XCcV/erIf/wZQMmMT5l5vXOpL5uoznyOGfDIjPj6FVytMvtzaKSTSVKouOCTPJ5OMUZH30g==", + "dev": true, "dependencies": { - "is-extglob": "^2.1.1" + "@babel/helper-define-polyfill-provider": "^0.2.2", + "core-js-compat": "^3.14.0" }, - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz", + "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.2.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/is-path-inside": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", - "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", - "license": "MIT", - "engines": { - "node": ">=12" + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@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-top-level-await": "^7.8.3" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "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==", + "node_modules/babel-preset-jest": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.0.6.tgz", + "integrity": "sha512-WObA0/Biw2LrVVwZkF/2GqbOdzhKD6Fkdwhoy9ASIrOWr/zodcSpQh72JOkEn6NWyjmnPDjNSqaGN4KnpKzhXw==", "dev": true, - "license": "MIT", "dependencies": { - "isobject": "^3.0.1" + "babel-plugin-jest-hoist": "^27.0.6", + "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "license": "MIT", + "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==" + }, + "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==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dependencies": { - "is-unc-path": "^1.0.0" + "fill-range": "^7.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/is-svg": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-6.1.0.tgz", - "integrity": "sha512-i7YPdvYuSCYcaLQrKwt8cvKTlwHcdA6Hp8N9SO3Q5jIzo8x6kH3N47W0BvPP7NdxVBmIHx7X9DK36czYYW7lHg==", + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.16.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.8.tgz", + "integrity": "sha512-sc2m9ohR/49sWEbPj14ZSSZqp+kbi16aLao42Hmn3Z8FpjuMaq2xCA2l4zl9ITfyzvnvyE0hcg62YkIGKxgaNQ==", "dev": true, - "license": "MIT", "dependencies": { - "@file-type/xml": "^0.4.3" + "caniuse-lite": "^1.0.30001251", + "colorette": "^1.3.0", + "electron-to-chromium": "^1.3.811", + "escalade": "^3.1.1", + "node-releases": "^1.1.75" + }, + "bin": { + "browserslist": "cli.js" }, "engines": { - "node": ">=20" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/browserslist" } }, - "node_modules/is-ttf": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/is-ttf/-/is-ttf-0.2.2.tgz", - "integrity": "sha1-cVWCSjOGfuT6iceeYV49RxbrGzo=", + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "dependencies": { - "b3b": "0.0.1" - }, - "engines": { - "node": ">=0.10.0" + "node-int64": "^0.4.0" } }, - "node_modules/is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "node_modules/builtin-modules": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", + "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", "dev": true, - "license": "MIT", - "dependencies": { - "unc-path-regex": "^0.1.2" - }, "engines": { - "node": ">=0.10.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-windows": { + "node_modules/call-bind": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-woff": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-woff/-/is-woff-1.0.3.tgz", - "integrity": "sha1-SVHeYEqSGPRYwsGMZMg1gC4C+ms=", - "dev": true, + "node_modules/caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dependencies": { + "callsites": "^2.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/is-woff2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-woff2/-/is-woff2-1.0.0.tgz", - "integrity": "sha1-XrnK2W2cPR04TyZ5L5UyThWC7dg=", - "dev": true, + "node_modules/caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dependencies": { + "caller-callsite": "^2.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/isexe": { + "node_modules/callsites": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "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==", - "dev": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" }, "engines": { - "node": ">=10" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/istanbul-reports": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "node_modules/caniuse-lite": { + "version": "1.0.30001252", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001252.tgz", + "integrity": "sha512-I56jhWDGMtdILQORdusxBOH+Nl/KgQSdDmpJezYddnAkVOmnoU8zwjTV9xAjMIYxr0iPreEAVylCGcmHCjfaOw==", "dev": true, - "license": "BSD-3-Clause", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "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==", "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/jiti": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", - "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" + "engines": { + "node": ">=10" } }, - "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==", - "license": "MIT" + "node_modules/ci-info": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", + "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", + "dev": true }, - "node_modules/js-yaml": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.0.tgz", - "integrity": "sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog==", + "node_modules/cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true + }, + "node_modules/clean-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", + "integrity": "sha1-jffHquUf02h06PjQW5GAvBGj/tc=", "dev": true, - "license": "MIT", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "escape-string-regexp": "^1.0.5" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=4" } }, - "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==" - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, - "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/knip": { - "version": "6.24.0", - "resolved": "https://registry.npmjs.org/knip/-/knip-6.24.0.tgz", - "integrity": "sha512-PokLlgeEjLh1rAsB7ts+52wZ37HBr1nDhE6NNONwEaXdeZGCJOkP7ZlIAI2Gtu8xohquzTWy75bc/1diI9shQw==", + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/webpro" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/knip" - } - ], - "license": "ISC", - "dependencies": { - "fdir": "^6.5.0", - "formatly": "^0.3.0", - "get-tsconfig": "4.14.0", - "jiti": "^2.7.0", - "oxc-parser": "^0.137.0", - "oxc-resolver": "11.21.3", - "picomatch": "^4.0.4", - "smol-toml": "^1.6.1", - "strip-json-comments": "5.0.3", - "tinyglobby": "^0.2.17", - "unbash": "^4.0.1", - "yaml": "^2.9.0", - "zod": "^4.1.11" - }, - "bin": { - "knip": "bin/knip.js", - "knip-bun": "bin/knip-bun.js" + "dependencies": { + "restore-cursor": "^3.1.0" }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=8" } }, - "node_modules/knip/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/knip/node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", - "dev": true, - "license": "MIT", "engines": { - "node": ">=12" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/kolorist": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", - "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lefthook": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/lefthook/-/lefthook-2.1.9.tgz", - "integrity": "sha512-bwDaIOViTktE8kJLf9jP0p+H2/RDTlFFlc43Am2YgUsX22hI6Sq4RbzsrecwzY5y+MHTipOH7WsmWSEniePHWQ==", + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "lefthook": "bin/index.js" - }, - "optionalDependencies": { - "lefthook-darwin-arm64": "2.1.9", - "lefthook-darwin-x64": "2.1.9", - "lefthook-freebsd-arm64": "2.1.9", - "lefthook-freebsd-x64": "2.1.9", - "lefthook-linux-arm64": "2.1.9", - "lefthook-linux-x64": "2.1.9", - "lefthook-openbsd-arm64": "2.1.9", - "lefthook-openbsd-x64": "2.1.9", - "lefthook-windows-arm64": "2.1.9", - "lefthook-windows-x64": "2.1.9" - } - }, - "node_modules/lefthook-darwin-arm64": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/lefthook-darwin-arm64/-/lefthook-darwin-arm64-2.1.9.tgz", - "integrity": "sha512-119HryNcvr4nqn0wUIrNPgpMEPn9yMQzEcW/lezRsnb56PCJriJB92+MCySPVcWDxJnZef7o0T3jdnPNiSH7Qg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } }, - "node_modules/lefthook-darwin-x64": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/lefthook-darwin-x64/-/lefthook-darwin-x64-2.1.9.tgz", - "integrity": "sha512-dwo5Tke2XcQCM56DGHgFKBfRbJIL6xs2wZ0zG1TUVZgl4t4mQUt6LiZ4V/ZQfYHTZF9qywvXoIlR5N35qOaiVQ==", - "cpu": [ - "x64" - ], + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } }, - "node_modules/lefthook-freebsd-arm64": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/lefthook-freebsd-arm64/-/lefthook-freebsd-arm64-2.1.9.tgz", - "integrity": "sha512-+09PVap6nl6xsaHch5JLtq7WvIR++U1Q2MzA2ai0M4uB/VP3AqrvKqHw6+9hjyKnIH+HHL83uqi77EAY+LaxLA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true }, - "node_modules/lefthook-freebsd-x64": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/lefthook-freebsd-x64/-/lefthook-freebsd-x64-2.1.9.tgz", - "integrity": "sha512-8XresjKIYpkE9ARgCtBEZgJZxAU3T4MIqzj4zNy15XRT59I1Us+QdqXTNm+pkZ41Yd2X/nxs2Pkvbq3NWWlIGw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] + "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/lefthook-linux-arm64": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/lefthook-linux-arm64/-/lefthook-linux-arm64-2.1.9.tgz", - "integrity": "sha512-1oNIQfwrPe6rgU2KcDM3aF6+hpZDCKx1TmawQKpXUY5gVsbZ7MqX0Sk/1lnnWxqPm+kQQ5f6J2dpFWd+4xH8jg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, - "node_modules/lefthook-linux-x64": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/lefthook-linux-x64/-/lefthook-linux-x64-2.1.9.tgz", - "integrity": "sha512-fT+7Q+BJyGp+CslFQkNXmdFRgyVXsPHPi9NAsDX0a6QOyNnoORByAsvx6zeAKuF5rL3BBgNfho1/v2RuGxGy9w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "node_modules/colorette": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.3.0.tgz", + "integrity": "sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==", + "dev": true }, - "node_modules/lefthook-openbsd-arm64": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/lefthook-openbsd-arm64/-/lefthook-openbsd-arm64-2.1.9.tgz", - "integrity": "sha512-4bVuafBk3dddVNo0+3hMbjcJs4mqYAstxpPMmX2ufkudSTYFNIhWoqwuGVQV/SS/xdcOKJAldW4qayAzed2ysw==", - "cpu": [ - "arm64" - ], + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } }, - "node_modules/lefthook-openbsd-x64": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/lefthook-openbsd-x64/-/lefthook-openbsd-x64-2.1.9.tgz", - "integrity": "sha512-PmPoMmLP/wQQWcQ9u2YH86bTZ3UCfBsxuEmVTEyPU2U8R1qSTp5r/Gs3G8cN5Mxo91XB9oBERtF1n+xD3W6aVA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } }, - "node_modules/lefthook-windows-arm64": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/lefthook-windows-arm64/-/lefthook-windows-arm64-2.1.9.tgz", - "integrity": "sha512-KphfkBKmwBnmolyrdhIl3lrBaOyTcCgXBT2AB/9OHnEXhOLvv5uTCUkrD4YRAxXPtFKq6UvnapIeoL3GZq0bdA==", - "cpu": [ - "arm64" - ], + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } }, - "node_modules/lefthook-windows-x64": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/lefthook-windows-x64/-/lefthook-windows-x64-2.1.9.tgz", - "integrity": "sha512-2qlUtkJHZ3MyUxgV5XTEmcrIoNZA07iwaquoswAcqv/1MeBFXlD+O+koFRfrzWng2O5WYEbpJnd8tvaYnV8fTA==", - "cpu": [ - "x64" - ], + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "engines": [ + "node >= 6.0" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } }, - "node_modules/liftup": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", - "integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==", + "node_modules/conventional-changelog": { + "version": "3.1.24", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.24.tgz", + "integrity": "sha512-ed6k8PO00UVvhExYohroVPXcOJ/K1N0/drJHx/faTH37OIZthlecuLIRX/T6uOp682CAoVoFpu+sSEaeuH6Asg==", "dev": true, - "license": "MIT", "dependencies": { - "extend": "^3.0.2", - "findup-sync": "^4.0.0", - "fined": "^1.2.0", - "flagged-respawn": "^1.0.1", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.1", - "rechoir": "^0.7.0", - "resolve": "^1.19.0" + "conventional-changelog-angular": "^5.0.12", + "conventional-changelog-atom": "^2.0.8", + "conventional-changelog-codemirror": "^2.0.8", + "conventional-changelog-conventionalcommits": "^4.5.0", + "conventional-changelog-core": "^4.2.1", + "conventional-changelog-ember": "^2.0.9", + "conventional-changelog-eslint": "^3.0.9", + "conventional-changelog-express": "^2.0.6", + "conventional-changelog-jquery": "^3.0.11", + "conventional-changelog-jshint": "^2.0.9", + "conventional-changelog-preset-loader": "^2.3.4" }, "engines": { "node": ">=10" } }, - "node_modules/liftup/node_modules/findup-sync": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", - "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", + "node_modules/conventional-changelog-angular": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.12.tgz", + "integrity": "sha512-5GLsbnkR/7A89RyHLvvoExbiGbd9xKdKqDTrArnPbOqBqG/2wIosu0fHwpeIRI8Tl94MhVNBXcLJZl92ZQ5USw==", "dev": true, - "license": "MIT", "dependencies": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^4.0.2", - "resolve-dir": "^1.0.1" + "compare-func": "^2.0.0", + "q": "^1.5.1" }, "engines": { - "node": ">= 8" + "node": ">=10" } }, - "node_modules/lightningcss": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "node_modules/conventional-changelog-atom": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz", + "integrity": "sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==", "dev": true, - "license": "MPL-2.0", "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" + "q": "^1.5.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.32.0", - "lightningcss-darwin-arm64": "1.32.0", - "lightningcss-darwin-x64": "1.32.0", - "lightningcss-freebsd-x64": "1.32.0", - "lightningcss-linux-arm-gnueabihf": "1.32.0", - "lightningcss-linux-arm64-gnu": "1.32.0", - "lightningcss-linux-arm64-musl": "1.32.0", - "lightningcss-linux-x64-gnu": "1.32.0", - "lightningcss-linux-x64-musl": "1.32.0", - "lightningcss-win32-arm64-msvc": "1.32.0", - "lightningcss-win32-x64-msvc": "1.32.0" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=10" } }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", - "cpu": [ - "arm64" - ], + "node_modules/conventional-changelog-codemirror": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz", + "integrity": "sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" + "dependencies": { + "q": "^1.5.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "engines": { + "node": ">=10" } }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", - "cpu": [ - "x64" - ], + "node_modules/conventional-changelog-config-spec": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-config-spec/-/conventional-changelog-config-spec-2.1.0.tgz", + "integrity": "sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==", + "dev": true + }, + "node_modules/conventional-changelog-conventionalcommits": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.5.0.tgz", + "integrity": "sha512-buge9xDvjjOxJlyxUnar/+6i/aVEVGA7EEh4OafBCXPlLUQPGbRUBhBUveWRxzvR8TEjhKEP4BdepnpG2FSZXw==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" + "dependencies": { + "compare-func": "^2.0.0", + "lodash": "^4.17.15", + "q": "^1.5.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "engines": { + "node": ">=10" } }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" + "node_modules/conventional-changelog-core": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.3.tgz", + "integrity": "sha512-MwnZjIoMRL3jtPH5GywVNqetGILC7g6RQFvdb8LRU/fA/338JbeWAku3PZ8yQ+mtVRViiISqJlb0sOz0htBZig==", + "dev": true, + "dependencies": { + "add-stream": "^1.0.0", + "conventional-changelog-writer": "^5.0.0", + "conventional-commits-parser": "^3.2.0", + "dateformat": "^3.0.0", + "get-pkg-repo": "^4.0.0", + "git-raw-commits": "^2.0.8", + "git-remote-origin-url": "^2.0.0", + "git-semver-tags": "^4.1.1", + "lodash": "^4.17.15", + "normalize-package-data": "^3.0.0", + "q": "^1.5.1", + "read-pkg": "^3.0.0", + "read-pkg-up": "^3.0.0", + "through2": "^4.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "engines": { + "node": ">=10" } }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", - "cpu": [ - "arm" - ], + "node_modules/conventional-changelog-ember": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz", + "integrity": "sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" + "dependencies": { + "q": "^1.5.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "engines": { + "node": ">=10" } }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", - "cpu": [ - "arm64" - ], + "node_modules/conventional-changelog-eslint": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz", + "integrity": "sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" + "dependencies": { + "q": "^1.5.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "engines": { + "node": ">=10" } }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", - "cpu": [ - "arm64" - ], + "node_modules/conventional-changelog-express": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz", + "integrity": "sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" + "dependencies": { + "q": "^1.5.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "engines": { + "node": ">=10" } }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", - "cpu": [ - "x64" - ], + "node_modules/conventional-changelog-jquery": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz", + "integrity": "sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" + "dependencies": { + "q": "^1.5.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "engines": { + "node": ">=10" } }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", - "cpu": [ - "x64" - ], + "node_modules/conventional-changelog-jshint": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz", + "integrity": "sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" + "dependencies": { + "compare-func": "^2.0.0", + "q": "^1.5.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "engines": { + "node": ">=10" } }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", - "cpu": [ - "arm64" - ], + "node_modules/conventional-changelog-preset-loader": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", + "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=10" } }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", - "cpu": [ - "x64" - ], + "node_modules/conventional-changelog-writer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.0.tgz", + "integrity": "sha512-HnDh9QHLNWfL6E1uHz6krZEQOgm8hN7z/m7tT16xwd802fwgMN0Wqd7AQYVkhpsjDUx/99oo+nGgvKF657XP5g==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" + "dependencies": { + "conventional-commits-filter": "^2.0.7", + "dateformat": "^3.0.0", + "handlebars": "^4.7.6", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "semver": "^6.0.0", + "split": "^1.0.0", + "through2": "^4.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "bin": { + "conventional-changelog-writer": "cli.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + "node_modules/conventional-changelog-writer/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true }, - "node_modules/local-pkg": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.2.1.tgz", - "integrity": "sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==", + "node_modules/conventional-changelog-writer/node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", "dev": true, - "license": "MIT", "dependencies": { - "mlly": "^1.7.4", - "pkg-types": "^2.3.0", - "quansync": "^0.2.11" + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" }, "engines": { - "node": ">=14" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/antfu" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", - "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==" - }, - "node_modules/lru-cache": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", - "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/magicast": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.3.tgz", - "integrity": "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==", + "node_modules/conventional-changelog-writer/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.3", - "@babel/types": "^7.29.0", - "source-map-js": "^1.2.1" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "node_modules/conventional-changelog-writer/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, - "license": "MIT", "dependencies": { - "semver": "^7.5.3" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "node_modules/conventional-changelog-writer/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, - "license": "MIT", - "dependencies": { - "kind-of": "^6.0.2" - }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "node_modules/conventional-changelog-writer/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/conventional-changelog-writer/node_modules/read-pkg/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/conventional-changelog-writer/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true, - "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/mark.js": { - "version": "8.11.1", - "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", - "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "node_modules/conventional-changelog-writer/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true, - "license": "MIT" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/marked": { - "version": "9.1.6", - "resolved": "https://registry.npmjs.org/marked/-/marked-9.1.6.tgz", - "integrity": "sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q==", + "node_modules/conventional-commits-filter": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", + "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", "dev": true, - "license": "MIT", - "bin": { - "marked": "bin/marked.js" + "dependencies": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" }, "engines": { - "node": ">= 16" + "node": ">=10" } }, - "node_modules/marked-terminal": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-7.3.0.tgz", - "integrity": "sha512-t4rBvPsHc57uE/2nJOLmMbZCQ4tgAccAED3ngXQqW6g+TxA488JzJ+FK3lQkzBQOI1mRV/r/Kq+1ZlJ4D0owQw==", + "node_modules/conventional-commits-parser": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.1.tgz", + "integrity": "sha512-OG9kQtmMZBJD/32NEw5IhN5+HnBqVjy03eC+I71I0oQRFA5rOgA4OtPOYG7mz1GkCfCNxn3gKIX8EiHJYuf1cA==", "dev": true, - "license": "MIT", "dependencies": { - "ansi-escapes": "^7.0.0", - "ansi-regex": "^6.1.0", - "chalk": "^5.4.1", - "cli-highlight": "^2.1.11", - "cli-table3": "^0.6.5", - "node-emoji": "^2.2.0", - "supports-hyperlinks": "^3.1.0" + "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0", + "trim-off-newlines": "^1.0.0" }, - "engines": { - "node": ">=16.0.0" + "bin": { + "conventional-commits-parser": "cli.js" }, - "peerDependencies": { - "marked": ">=1 <16" + "engines": { + "node": ">=10" } }, - "node_modules/marked-terminal/node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "node_modules/conventional-commits-parser/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/conventional-commits-parser/node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", "dev": true, - "license": "MIT", + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mdast-util-to-hast": { - "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==", + "node_modules/conventional-commits-parser/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, - "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=8" } }, - "node_modules/mdn-data": { - "version": "2.27.1", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", - "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", - "license": "CC0-1.0" - }, - "node_modules/meow": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-14.1.0.tgz", - "integrity": "sha512-EDYo6VlmtnumlcBCbh1gLJ//9jvM/ndXHfVXIFrZVr6fGcwTUyCTFNTLCKuY3ffbK8L/+3Mzqnd58RojiZqHVw==", - "license": "MIT", + "node_modules/conventional-commits-parser/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, "engines": { - "node": ">=20" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "node_modules/conventional-commits-parser/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, "engines": { - "node": ">= 8" + "node": ">=8" } }, - "node_modules/microbuffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/microbuffer/-/microbuffer-1.0.0.tgz", - "integrity": "sha1-izgy7UDIfVH0e7I0kTppinVtGdI=" - }, - "node_modules/micromark-util-character": { - "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==", + "node_modules/conventional-commits-parser/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "node_modules/micromark-util-encode": { - "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==", + "node_modules/conventional-commits-parser/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" + "engines": { + "node": ">=8" + } }, - "node_modules/micromark-util-sanitize-uri": { - "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==", + "node_modules/conventional-commits-parser/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, - "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-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" + "bin": { + "semver": "bin/semver" } }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "node_modules/conventional-commits-parser/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "node_modules/conventional-recommended-bump": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz", + "integrity": "sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" + "concat-stream": "^2.0.0", + "conventional-changelog-preset-loader": "^2.3.4", + "conventional-commits-filter": "^2.0.7", + "conventional-commits-parser": "^3.2.0", + "git-raw-commits": "^2.0.8", + "git-semver-tags": "^4.1.1", + "meow": "^8.0.0", + "q": "^1.5.1" + }, + "bin": { + "conventional-recommended-bump": "cli.js" }, "engines": { - "node": ">=8.6" + "node": ">=10" } }, - "node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "license": "BlueOak-1.0.0", + "node_modules/conventional-recommended-bump/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/conventional-recommended-bump/node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, "dependencies": { - "brace-expansion": "^5.0.5" + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" }, "engines": { - "node": "18 || 20 || >=22" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/minipass": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", - "license": "BlueOak-1.0.0", + "node_modules/conventional-recommended-bump/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=8" } }, - "node_modules/minisearch": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.2.0.tgz", - "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==", - "dev": true, - "license": "MIT" - }, - "node_modules/mlly": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", - "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", + "node_modules/conventional-recommended-bump/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, - "license": "MIT", "dependencies": { - "acorn": "^8.16.0", - "pathe": "^2.0.3", - "pkg-types": "^1.3.1", - "ufo": "^1.6.3" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mlly/node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "node_modules/conventional-recommended-bump/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, - "license": "MIT" + "engines": { + "node": ">=8" + } }, - "node_modules/mlly/node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "node_modules/conventional-recommended-bump/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, - "license": "MIT", "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "node_modules/conventional-recommended-bump/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true, - "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, - "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==", - "license": "MIT" - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "node_modules/conventional-recommended-bump/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" + "bin": { + "semver": "bin/semver" } }, - "node_modules/nanoid": { - "version": "3.3.15", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", - "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", + "node_modules/conventional-recommended-bump/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/node-emoji": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", - "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", "dev": true, - "license": "MIT", "dependencies": { - "@sindresorhus/is": "^4.6.0", - "char-regex": "^1.0.2", - "emojilib": "^2.4.0", - "skin-tone": "^2.0.0" - }, - "engines": { - "node": ">=18" + "safe-buffer": "~5.1.1" } }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "node_modules/core-js-compat": { + "version": "3.17.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.17.2.tgz", + "integrity": "sha512-lHnt7A1Oqplebl5i0MrQyFv/yyEzr9p29OjlkcsFRDDgHwwQyVckfRGJ790qzXhkwM8ba4SFHHa2sO+T5f1zGg==", "dev": true, - "license": "ISC", "dependencies": { - "abbrev": "1" + "browserslist": "^4.16.8", + "semver": "7.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" + "semver": "bin/semver.js" } }, - "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", + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dependencies": { - "boolbase": "^1.0.0" + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" + "engines": { + "node": ">=4" } }, - "node_modules/nunjucks": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.4.tgz", - "integrity": "sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==", - "license": "BSD-2-Clause", + "node_modules/cosmiconfig/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dependencies": { - "a-sync-waterfall": "^1.0.0", - "asap": "^2.0.3", - "commander": "^5.1.0" - }, - "bin": { - "nunjucks-precompile": "bin/precompile" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" }, "engines": { - "node": ">= 6.9.0" - }, - "peerDependencies": { - "chokidar": "^3.3.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } + "node": ">=4" } }, - "node_modules/nunjucks/node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "engines": { - "node": ">= 6" - } + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true }, - "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==", + "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==", "dev": true, - "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, - "node_modules/object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", "dev": true, - "license": "MIT", "dependencies": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" + "cssom": "~0.3.6" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/cubic2quad": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cubic2quad/-/cubic2quad-1.2.1.tgz", + "integrity": "sha512-wT5Y7mO8abrV16gnssKdmIhIbA9wSkeMzhh27jAguKrV82i24wER0vL5TGhUJ9dbJNDcigoRZ0IAHFEEEI4THQ==" + }, + "node_modules/dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", "dev": true, - "license": "MIT", - "dependencies": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", "dev": true, - "license": "MIT", "dependencies": { - "isobject": "^3.0.1" + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/obug": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.3.tgz", - "integrity": "sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==", + "node_modules/dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", "dev": true, - "funding": [ - "https://github.com/sponsors/sxzz", - "https://opencollective.com/debug" - ], - "license": "MIT", "engines": { - "node": ">=12.20.0" + "node": "*" } }, - "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==", + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, - "license": "ISC", "dependencies": { - "wrappy": "1" + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/oniguruma-parser": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz", - "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==", - "dev": true, - "license": "MIT" + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/oniguruma-to-es": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz", - "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==", - "dev": true, - "license": "MIT", + "node_modules/decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", "dependencies": { - "oniguruma-parser": "^0.12.2", - "regex": "^6.1.0", - "regex-recursion": "^6.0.2" + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", + "dev": true + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/oxc-parser": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.137.0.tgz", - "integrity": "sha512-yFImD+WLElJpLKy8llG1qe4DCmMsL18peRp8XP1JKfig/gISbJkglnpDtX2aTmAn10kZF7164HbN2H8QPsXxGg==", + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, - "license": "MIT", "dependencies": { - "@oxc-project/types": "^0.137.0" + "object-keys": "^1.0.12" }, "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/sponsors/Boshen" - }, - "optionalDependencies": { - "@oxc-parser/binding-android-arm-eabi": "0.137.0", - "@oxc-parser/binding-android-arm64": "0.137.0", - "@oxc-parser/binding-darwin-arm64": "0.137.0", - "@oxc-parser/binding-darwin-x64": "0.137.0", - "@oxc-parser/binding-freebsd-x64": "0.137.0", - "@oxc-parser/binding-linux-arm-gnueabihf": "0.137.0", - "@oxc-parser/binding-linux-arm-musleabihf": "0.137.0", - "@oxc-parser/binding-linux-arm64-gnu": "0.137.0", - "@oxc-parser/binding-linux-arm64-musl": "0.137.0", - "@oxc-parser/binding-linux-ppc64-gnu": "0.137.0", - "@oxc-parser/binding-linux-riscv64-gnu": "0.137.0", - "@oxc-parser/binding-linux-riscv64-musl": "0.137.0", - "@oxc-parser/binding-linux-s390x-gnu": "0.137.0", - "@oxc-parser/binding-linux-x64-gnu": "0.137.0", - "@oxc-parser/binding-linux-x64-musl": "0.137.0", - "@oxc-parser/binding-openharmony-arm64": "0.137.0", - "@oxc-parser/binding-wasm32-wasi": "0.137.0", - "@oxc-parser/binding-win32-arm64-msvc": "0.137.0", - "@oxc-parser/binding-win32-ia32-msvc": "0.137.0", - "@oxc-parser/binding-win32-x64-msvc": "0.137.0" - } - }, - "node_modules/oxc-parser/node_modules/@oxc-project/types": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.137.0.tgz", - "integrity": "sha512-WT+Gb24i8hmvo85AIv2oEYouEXkRlKAlT9WaCa3TfLgNCN+GhrJOGZuIlMouAh38Qe4QOx26eUOVsq70qXrywA==", + "node": ">= 0.4" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" + "engines": { + "node": ">=0.4.0" } }, - "node_modules/oxc-resolver": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/oxc-resolver/-/oxc-resolver-11.21.3.tgz", - "integrity": "sha512-2Mx3fKQz7+xgrBONjsxOgCGtMHOn38/HxMzW1I5efwXB5a4lRN0Vp40gYUJFBWJslcrvwoofTrqoTnLbwTd3pA==", + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - }, - "optionalDependencies": { - "@oxc-resolver/binding-android-arm-eabi": "11.21.3", - "@oxc-resolver/binding-android-arm64": "11.21.3", - "@oxc-resolver/binding-darwin-arm64": "11.21.3", - "@oxc-resolver/binding-darwin-x64": "11.21.3", - "@oxc-resolver/binding-freebsd-x64": "11.21.3", - "@oxc-resolver/binding-linux-arm-gnueabihf": "11.21.3", - "@oxc-resolver/binding-linux-arm-musleabihf": "11.21.3", - "@oxc-resolver/binding-linux-arm64-gnu": "11.21.3", - "@oxc-resolver/binding-linux-arm64-musl": "11.21.3", - "@oxc-resolver/binding-linux-ppc64-gnu": "11.21.3", - "@oxc-resolver/binding-linux-riscv64-gnu": "11.21.3", - "@oxc-resolver/binding-linux-riscv64-musl": "11.21.3", - "@oxc-resolver/binding-linux-s390x-gnu": "11.21.3", - "@oxc-resolver/binding-linux-x64-gnu": "11.21.3", - "@oxc-resolver/binding-linux-x64-musl": "11.21.3", - "@oxc-resolver/binding-openharmony-arm64": "11.21.3", - "@oxc-resolver/binding-wasm32-wasi": "11.21.3", - "@oxc-resolver/binding-win32-arm64-msvc": "11.21.3", - "@oxc-resolver/binding-win32-x64-msvc": "11.21.3" + "engines": { + "node": ">=8" } }, - "node_modules/p-limit": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-7.3.0.tgz", - "integrity": "sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw==", - "dependencies": { - "yocto-queue": "^1.2.1" - }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/package-manager-detector": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.7.0.tgz", - "integrity": "sha512-xg1eHpwYL/D/HEdWw2goFZP6vV0FH7W+PZ5rFkGjdIDLtxq7EkzBUeT3m+lndYCt8wKbmofUu1MUdMCXkCk9ZQ==", + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, - "license": "MIT" + "engines": { + "node": ">=0.3.1" + } }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + "node_modules/diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } }, - "node_modules/parent-module": { - "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", + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dependencies": { - "callsites": "^3.0.0" + "path-type": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, - "license": "MIT", "dependencies": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" + "esutils": "^2.0.2" }, "engines": { - "node": ">=0.8" + "node": ">=6.0.0" } }, - "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==", + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "webidl-conversions": "^5.0.0" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", "dev": true, - "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", - "dev": true, - "license": "MIT" - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "dev": true, - "license": "MIT", "dependencies": { - "parse5": "^6.0.1" + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true, - "license": "MIT" - }, - "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==", + "node_modules/dotgitignore": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/dotgitignore/-/dotgitignore-2.1.0.tgz", + "integrity": "sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==", "dev": true, - "license": "MIT", + "dependencies": { + "find-up": "^3.0.0", + "minimatch": "^3.0.4" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "node_modules/dotgitignore/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==", "dev": true, - "license": "MIT", "dependencies": { - "path-root-regex": "^0.1.0" + "locate-path": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "node_modules/dotgitignore/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==", "dev": true, - "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/path-scurry": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", - "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", - "license": "BlueOak-1.0.0", + "node_modules/dotgitignore/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==", + "dev": true, "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" + "p-try": "^2.0.0" }, "engines": { - "node": "18 || 20 || >=22" + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "node_modules/dotgitignore/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==", "dev": true, - "license": "MIT" + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } }, - "node_modules/perfect-debounce": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz", - "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", + "node_modules/dotgitignore/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true, - "license": "MIT" + "engines": { + "node": ">=4" + } }, - "node_modules/picocolors": { - "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/electron-to-chromium": { + "version": "1.3.828", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.828.tgz", + "integrity": "sha512-2kx537tLqIVfUpx7LRknZce5PcCyxyBB1YUVOhxlkrDoCqFITGJGYfBAvSxGOdqlp+R9pHeU9Ai/dsHgsqjrvQ==", + "dev": true }, - "node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "node_modules/emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "dev": true, "engines": { - "node": ">=8.6" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sindresorhus/emittery?sponsor=1" } }, - "node_modules/pkg-types": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.1.tgz", - "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.2.4", - "exsolve": "^1.0.8", - "pathe": "^2.0.3" - } + "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==", + "dev": true }, - "node_modules/postcss": { - "version": "8.5.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.16.tgz", - "integrity": "sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==", + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", "dev": true, - "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": { - "nanoid": "^3.3.12", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "ansi-colors": "^4.1.1" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": ">=8.6" } }, - "node_modules/proper-lockfile": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", - "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", - "dev": true, - "license": "MIT", + "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==", "dependencies": { - "graceful-fs": "^4.2.4", - "retry": "^0.12.0", - "signal-exit": "^3.0.2" - } - }, - "node_modules/property-information": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", - "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "is-arrayish": "^0.2.1" } }, - "node_modules/publint": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/publint/-/publint-0.3.21.tgz", - "integrity": "sha512-OqejcnMV6E9zel2oCrUOJEiiFkGiAAni0A6ibfQNh1k9Gu5z4F+Yso8lllam7AzmV6Do0vp7u3UpZNRBwuXaHQ==", + "node_modules/es-abstract": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", + "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", "dev": true, - "license": "MIT", "dependencies": { - "@publint/pack": "^0.1.4", - "package-manager-detector": "^1.6.0", - "picocolors": "^1.1.1", - "sade": "^1.8.1" - }, - "bin": { - "publint": "src/cli.js" + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.10.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" }, "engines": { - "node": ">=18" + "node": ">= 0.4" }, "funding": { - "url": "https://bjornlu.com/sponsor" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/quansync": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", - "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/antfu" - }, - { - "type": "individual", - "url": "https://github.com/sponsors/sxzz" - } - ], - "license": "MIT" - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", - "dev": true, - "license": "MIT", "dependencies": { - "resolve": "^1.9.0" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" }, "engines": { - "node": ">= 0.10" - } - }, - "node_modules/regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", - "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", - "dev": true, - "license": "MIT", - "dependencies": { - "regex-utilities": "^2.3.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regex-recursion": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", - "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true, - "license": "MIT", - "dependencies": { - "regex-utilities": "^2.3.0" + "engines": { + "node": ">=6" } }, - "node_modules/regex-utilities": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", - "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", - "dev": true, - "license": "MIT" - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", + "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": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "engines": { - "node": ">=0.10.0" + "node": ">=0.8.0" } }, - "node_modules/resolve": { - "version": "1.22.12", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", - "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "node_modules/escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", "dev": true, - "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" }, "bin": { - "resolve": "bin/resolve" + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" }, "engines": { - "node": ">= 0.4" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "optionalDependencies": { + "source-map": "~0.6.1" } }, - "node_modules/resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "node_modules/escodegen/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", "dev": true, - "license": "MIT", - "dependencies": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=4.0" } }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, "engines": { - "node": ">=8" + "node": ">= 0.8.0" } }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true, - "license": "MIT", "engines": { - "node": ">= 4" + "node": ">= 0.8.0" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, "engines": { - "iojs": ">=1.0.0", "node": ">=0.10.0" } }, - "node_modules/rolldown": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.4.tgz", - "integrity": "sha512-IjZYiLxZwpnhwhdBH2ugdTGVSdhCQUmLxLoqyjiL0JxYjyRst+5a0P3xfrTxJ5F638j4Mvvw5FAX5XE6eHpXbA==", + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, - "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.138.0", - "@rolldown/pluginutils": "^1.0.0" - }, - "bin": { - "rolldown": "bin/cli.mjs" + "prelude-ls": "~1.1.2" }, "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.1.4", - "@rolldown/binding-darwin-arm64": "1.1.4", - "@rolldown/binding-darwin-x64": "1.1.4", - "@rolldown/binding-freebsd-x64": "1.1.4", - "@rolldown/binding-linux-arm-gnueabihf": "1.1.4", - "@rolldown/binding-linux-arm64-gnu": "1.1.4", - "@rolldown/binding-linux-arm64-musl": "1.1.4", - "@rolldown/binding-linux-ppc64-gnu": "1.1.4", - "@rolldown/binding-linux-s390x-gnu": "1.1.4", - "@rolldown/binding-linux-x64-gnu": "1.1.4", - "@rolldown/binding-linux-x64-musl": "1.1.4", - "@rolldown/binding-openharmony-arm64": "1.1.4", - "@rolldown/binding-wasm32-wasi": "1.1.4", - "@rolldown/binding-win32-arm64-msvc": "1.1.4", - "@rolldown/binding-win32-x64-msvc": "1.1.4" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" + "node": ">= 0.8.0" } }, - "node_modules/sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "node_modules/eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "dev": true, - "license": "MIT", "dependencies": { - "mri": "^1.1.0" + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" }, "engines": { - "node": ">=6" + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "node_modules/eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", "dev": true, - "license": "MIT" - }, - "node_modules/sax": { - "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" + "dependencies": { + "debug": "^3.2.7", + "resolve": "^1.20.0" } }, - "node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "dependencies": { + "ms": "^2.1.1" } }, - "node_modules/shiki": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.3.1.tgz", - "integrity": "sha512-oR+qDVi2OjX1tmDpyv+3KviX01KzO6Af+0NNnKnsp9491UEGz2YpxTuJboS/6VhYpTdqzmuJBuiTlrAWWJAssw==", + "node_modules/eslint-module-utils": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.2.tgz", + "integrity": "sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q==", "dev": true, - "license": "MIT", "dependencies": { - "@shikijs/core": "4.3.1", - "@shikijs/engine-javascript": "4.3.1", - "@shikijs/engine-oniguruma": "4.3.1", - "@shikijs/langs": "4.3.1", - "@shikijs/themes": "4.3.1", - "@shikijs/types": "4.3.1", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" + "debug": "^3.2.7", + "pkg-dir": "^2.0.0" }, "engines": { - "node": ">=20" + "node": ">=4" } }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" - }, - "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==", + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "ISC" + "dependencies": { + "ms": "^2.1.1" + } }, - "node_modules/skin-tone": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", - "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "node_modules/eslint-plugin-es": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", + "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", "dev": true, - "license": "MIT", "dependencies": { - "unicode-emoji-modifier-base": "^1.0.0" + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "engines": { - "node": ">=14.16" + "node": ">=8.10.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" } }, - "node_modules/smol-toml": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.7.0.tgz", - "integrity": "sha512-aqVvWoyO21L23mb+drl4RmMXbf6N7FdHjAhTRA9ZBL7apWBgfWC16KjrASI+1p9GAroljyMHj6fK67i0UiTNvQ==", + "node_modules/eslint-plugin-es/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, - "license": "BSD-3-Clause", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, "engines": { - "node": ">= 18" + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/cyyynthia" + "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/source-map-js": { - "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", + "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "node_modules/eslint-plugin-import": { + "version": "2.24.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz", + "integrity": "sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q==", "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "dependencies": { + "array-includes": "^3.1.3", + "array.prototype.flat": "^1.2.4", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.6.2", + "find-up": "^2.0.0", + "has": "^1.0.3", + "is-core-module": "^2.6.0", + "minimatch": "^3.0.4", + "object.values": "^1.1.4", + "pkg-up": "^2.0.0", + "read-pkg-up": "^3.0.0", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.11.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "license": "BSD-3-Clause" + "dependencies": { + "ms": "2.0.0" + } }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, - "license": "MIT" + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/std-env": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.1.0.tgz", - "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==", + "node_modules/eslint-plugin-import/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, - "license": "MIT" + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } }, - "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==", + "node_modules/eslint-plugin-import/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, - "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/eslint-plugin-import/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, - "license": "MIT", "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" + "p-try": "^1.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "engines": { + "node": ">=4" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", + "node_modules/eslint-plugin-import/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, "dependencies": { - "ansi-regex": "^5.0.1" + "p-limit": "^1.1.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", + "node_modules/eslint-plugin-import/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/strip-json-comments": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.3.tgz", - "integrity": "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==", + "node_modules/eslint-plugin-import/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true, - "license": "MIT", "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/strtok3": { - "version": "10.3.5", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.5.tgz", - "integrity": "sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==", + "node_modules/eslint-plugin-jest": { + "version": "24.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.4.0.tgz", + "integrity": "sha512-8qnt/hgtZ94E9dA6viqfViKBfkJwFHXgJmTWlMGDgunw1XJEGqm3eiPjDsTanM3/u/3Az82nyQM9GX7PM/QGmg==", "dev": true, - "license": "MIT", "dependencies": { - "@tokenizer/token": "^0.3.0" + "@typescript-eslint/experimental-utils": "^4.0.1" }, "engines": { - "node": ">=18" + "node": ">=10" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "peerDependencies": { + "@typescript-eslint/eslint-plugin": ">= 4", + "eslint": ">=5" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-node": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", "dev": true, - "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" }, "engines": { - "node": ">=8" + "node": ">=8.10.0" + }, + "peerDependencies": { + "eslint": ">=5.16.0" } }, - "node_modules/supports-hyperlinks": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", - "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", + "node_modules/eslint-plugin-node/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, - "license": "MIT", "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" + "eslint-visitor-keys": "^1.1.0" }, "engines": { - "node": ">=14.18" + "node": ">=6" }, "funding": { - "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" + "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/supports-preserve-symlinks-flag": { - "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==", + "node_modules/eslint-plugin-node/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, - "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/svg-pathdata": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-9.0.0.tgz", - "integrity": "sha512-h9FuqmNsgDKq2hQBqTMOWjZwqdZOnWijZmcg6FL4iSmH6VvRnobhHrBQSdOiP0W9nwgv0qiW5vQ3//Arrmp19g==", - "license": "MIT", + "node_modules/eslint-plugin-node/node_modules/ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true, "engines": { - "node": ">=24.14.0" - }, - "funding": { - "type": "individual", - "url": "https://github.com/sponsors/nfroidure" + "node": ">= 4" } }, - "node_modules/svg2ttf": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/svg2ttf/-/svg2ttf-6.1.0.tgz", - "integrity": "sha512-EjxgcmhKcBpx/3fR1hPwVtJAbUc/ZsDpwOTF74SI3PbzCg4pDHnxVmoSuqgEqxVJGqqkSCI6+82cucpn2D5aOw==", - "license": "MIT", - "dependencies": { - "@xmldom/xmldom": "^0.9.10", - "argparse": "^2.0.1", - "cubic2quad": "^1.2.1", - "lodash": "^4.17.10", - "microbuffer": "^1.0.0", - "svgpath": "^2.1.5" + "node_modules/eslint-plugin-promise": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-5.1.0.tgz", + "integrity": "sha512-NGmI6BH5L12pl7ScQHbg7tvtk4wPxxj8yPHH47NvSmMtFneC077PSeY3huFj06ZWZvtbfxSPt3RuOQD5XcR4ng==", + "dev": true, + "engines": { + "node": "^10.12.0 || >=12.0.0" }, - "bin": { - "svg2ttf": "svg2ttf.js" + "peerDependencies": { + "eslint": "^7.0.0" } }, - "node_modules/svg2ttf/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==" - }, - "node_modules/svgicons2svgfont": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/svgicons2svgfont/-/svgicons2svgfont-16.0.0.tgz", - "integrity": "sha512-3y4fcCuu9/XYgkoDfnNAR1RUEjmbX6lX2oTTu8NVLHYbf2xmYyZB0NZzK7WNthn8oSY68thfyEARRgWyAveZOw==", - "license": "MIT", + "node_modules/eslint-plugin-unicorn": { + "version": "35.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-35.0.0.tgz", + "integrity": "sha512-FHsaO68tDPQILfs/mGF8eSISJp8RswR4FpUuBDnueK2wyEHC6zmsc9WxjYyldXoIsBuVmru6jQyFCbCWPoW/KQ==", + "dev": true, "dependencies": { - "@types/sax": "^1.2.7", - "commander": "^14.0.0", - "debug": "^4.3.6", - "glob": "^13.0.6", - "sax": "^1.6.0", - "svg-pathdata": "^9.0.0", - "transformation-matrix": "^3.1.0", - "yerror": "^9.0.0" - }, - "bin": { - "svgicons2svgfont": "bin/svgicons2svgfont.js" + "@babel/helper-validator-identifier": "^7.14.9", + "ci-info": "^3.2.0", + "clean-regexp": "^1.0.0", + "eslint-template-visitor": "^2.3.2", + "eslint-utils": "^3.0.0", + "is-builtin-module": "^3.1.0", + "lodash": "^4.17.21", + "pluralize": "^8.0.0", + "read-pkg-up": "^7.0.1", + "regexp-tree": "^0.1.23", + "safe-regex": "^2.1.1", + "semver": "^7.3.5" }, "engines": { - "node": ">=24.14.0" + "node": ">=12" }, "funding": { - "type": "individual", - "url": "https://github.com/sponsors/nfroidure" + "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" + }, + "peerDependencies": { + "eslint": ">=7.28.0" } }, - "node_modules/svgicons2svgfont/node_modules/commander": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", - "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", - "license": "MIT", - "engines": { - "node": ">=20" + "node_modules/eslint-plugin-unicorn/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/eslint-plugin-unicorn/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" } }, - "node_modules/svgicons2svgfont/node_modules/glob": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", - "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", - "license": "BlueOak-1.0.0", + "node_modules/eslint-plugin-unicorn/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, "dependencies": { - "minimatch": "^10.2.2", - "minipass": "^7.1.3", - "path-scurry": "^2.0.2" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" }, "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "node_modules/svgo": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.1.tgz", - "integrity": "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==", - "license": "MIT", + "node_modules/eslint-plugin-unicorn/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, "dependencies": { - "commander": "^11.1.0", - "css-select": "^5.1.0", - "css-tree": "^3.0.1", - "css-what": "^6.1.0", - "csso": "^5.0.5", - "picocolors": "^1.1.1", - "sax": "^1.5.0" - }, - "bin": { - "svgo": "bin/svgo.js" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" }, "engines": { - "node": ">=16" + "node": ">=8" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/svgo" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/svgpath": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/svgpath/-/svgpath-2.3.1.tgz", - "integrity": "sha512-wNz6lCoj+99GMoyU7SozTfPqiLHz6WcJYZ30Z+F4lF/gPtxWHBCpZ4DhoDI0+oZ0dObKyYsJdSPGbL2mJq/qCg==" - }, - "node_modules/tabbable": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.5.0.tgz", - "integrity": "sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==", - "dev": true, - "license": "MIT" - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "node_modules/eslint-plugin-unicorn/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" + "engines": { + "node": ">=8" } }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "node_modules/eslint-plugin-unicorn/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, - "license": "MIT", "dependencies": { - "thenify": ">= 3.1.0 < 4" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=0.8" + "node": ">=10" } }, - "node_modules/tiny-invariant": { - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "node_modules/eslint-plugin-unicorn/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, - "license": "MIT" + "engines": { + "node": ">=8" + } }, - "node_modules/tinyexec": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", - "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", + "node_modules/eslint-rule-composer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", + "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", "dev": true, - "license": "MIT", "engines": { - "node": ">=18" + "node": ">=4.0.0" } }, - "node_modules/tinyglobby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, - "license": "MIT", "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" }, "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" + "node": ">=8.0.0" } }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "node_modules/eslint-template-visitor": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/eslint-template-visitor/-/eslint-template-visitor-2.3.2.tgz", + "integrity": "sha512-3ydhqFpuV7x1M9EK52BPNj6V0Kwu0KKkcIAfpUhwHbR8ocRln/oUHgfxQupY8O1h4Qv/POHDumb/BwwNfxbtnA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" + "dependencies": { + "@babel/core": "^7.12.16", + "@babel/eslint-parser": "^7.12.16", + "eslint-visitor-keys": "^2.0.0", + "esquery": "^1.3.1", + "multimap": "^1.1.0" }, "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } + "eslint": ">=7.0.0" } }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, - "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, "engines": { - "node": ">=12" + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" } }, - "node_modules/tinyrainbow": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", - "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, - "license": "MIT", "engines": { - "node": ">=14.0.0" + "node": ">=10" } }, - "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==", + "node_modules/eslint/node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/transformation-matrix": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/transformation-matrix/-/transformation-matrix-3.1.0.tgz", - "integrity": "sha512-oYubRWTi2tYFHAL2J8DLvPIqIYcYZ0fSOi2vmSy042Ho4jBW2ce6VP7QfD44t65WQz6bw5w1Pk22J7lcUpaTKA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/chrvadala" + "@babel/highlight": "^7.10.4" } }, - "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==", + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, - "license": "0BSD", - "optional": true - }, - "node_modules/ttf2eot": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ttf2eot/-/ttf2eot-3.1.0.tgz", - "integrity": "sha512-aHTbcYosNHVqb2Qtt9Xfta77ae/5y0VfdwNLUS6sGBeGr22cX2JDMo/i5h3uuOf+FAD3akYOr17+fYd5NK8aXw==", "dependencies": { - "argparse": "^2.0.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, - "bin": { - "ttf2eot": "ttf2eot.js" - } - }, - "node_modules/ttf2eot/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==" - }, - "node_modules/ttf2woff": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ttf2woff/-/ttf2woff-3.0.0.tgz", - "integrity": "sha512-OvmFcj70PhmAsVQKfC15XoKH55cRWuaRzvr2fpTNhTNer6JBpG8n6vOhRrIgxMjcikyYt88xqYXMMVapJ4Rjvg==", - "dependencies": { - "argparse": "^2.0.1", - "pako": "^1.0.0" + "engines": { + "node": ">=10" }, - "bin": { - "ttf2woff": "ttf2woff.js" + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/ttf2woff/node_modules/argparse": { + "node_modules/eslint/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/typescript": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", - "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", - "devOptional": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" }, "engines": { - "node": ">=14.17" + "node": ">=7.0.0" } }, - "node_modules/ufo": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", - "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", - "dev": true, - "license": "MIT" - }, - "node_modules/unbash": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/unbash/-/unbash-4.0.2.tgz", - "integrity": "sha512-8gwNZ29+0/3zmXw7ToIHZtg6wK37xnniRUdBt7B27xZxaxfgR5tGMaGHT0t0dLtBV9fXE7zurh0s6Z1DHVjfWg==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - } + "node_modules/eslint/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==", + "dev": true }, - "node_modules/unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "node_modules/eslint/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==", "dev": true, - "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/underscore.string": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz", - "integrity": "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==", + "node_modules/eslint/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, - "license": "MIT", "dependencies": { - "sprintf-js": "^1.1.1", - "util-deprecate": "^1.0.2" + "eslint-visitor-keys": "^1.1.0" }, "engines": { - "node": "*" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/underscore.string/node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/undici-types": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", - "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==" - }, - "node_modules/unicode-emoji-modifier-base": { - "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==", + "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, - "node_modules/unicorn-magic": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.4.0.tgz", - "integrity": "sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==", - "license": "MIT", + "node_modules/eslint/node_modules/globals": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", + "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { - "node": ">=20" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/unist-util-is": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", - "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "node_modules/eslint/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==", + "dev": true, + "engines": { + "node": ">=8" } }, - "node_modules/unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "node_modules/eslint/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==", "dev": true, - "license": "MIT", "dependencies": { - "@types/unist": "^3.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/unist-util-stringify-position": { + "node_modules/eslint/node_modules/resolve-from": { "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==", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=4" } }, - "node_modules/unist-util-visit": { - "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==", + "node_modules/eslint/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, - "license": "MIT", "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" + "lru-cache": "^6.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/unist-util-visit-parents": { - "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==", + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" + "has-flag": "^4.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=8" } }, - "node_modules/unplugin": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz", - "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/remapping": "^2.3.5", - "acorn": "^8.15.0", - "picomatch": "^4.0.3", - "webpack-virtual-modules": "^0.6.2" - }, "engines": { - "node": ">=18.12.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/unplugin-dts": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/unplugin-dts/-/unplugin-dts-1.0.3.tgz", - "integrity": "sha512-/GR887wfG4r1cWyt1UZsLRuMIjsmEbGkS9yJrz+0dsToHAYUD5CTyP3JMGVLv25j9K0mJcwAVvZno/aTuSUvNg==", + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, - "license": "MIT", "dependencies": { - "@rollup/pluginutils": "^5.1.4", - "@volar/typescript": "^2.4.26", - "compare-versions": "^6.1.1", - "debug": "^4.4.0", - "kolorist": "^1.8.0", - "local-pkg": "^1.1.1", - "magic-string": "^0.30.17", - "unplugin": "^2.3.2" - }, - "peerDependencies": { - "@microsoft/api-extractor": ">=7", - "@rspack/core": "^1", - "@vue/language-core": "^3.1.5", - "esbuild": "*", - "rolldown": "*", - "rollup": ">=3", - "typescript": ">=4", - "vite": ">=3", - "webpack": "^4 || ^5" + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" }, - "peerDependenciesMeta": { - "@microsoft/api-extractor": { - "optional": true - }, - "@rspack/core": { - "optional": true - }, - "@vue/language-core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "rolldown": { - "optional": true - }, - "rollup": { - "optional": true - }, - "vite": { - "optional": true - }, - "webpack": { - "optional": true - } + "engines": { + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/unplugin/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, - "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": ">=4" } }, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/v8flags": { + "node_modules/esprima": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-4.0.1.tgz", - "integrity": "sha512-fcRLaS4H/hrZk9hYwbdRM35D0U8IYMfEClhXxCivOojl+yTRAZH3Zy2sSy6qVCiGbV9YAtPssP6jaChqC9vPCg==", - "dev": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, "engines": { - "node": ">= 10.13.0" + "node": ">=4" } }, - "node_modules/validate-npm-package-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dev": true, - "license": "ISC", + "dependencies": { + "estraverse": "^5.1.0" + }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=0.10" } }, - "node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "node_modules/esquery/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=4.0" } }, - "node_modules/vfile-message": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", - "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "license": "MIT", "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" + "estraverse": "^5.2.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=4.0" } }, - "node_modules/vite": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.3.tgz", - "integrity": "sha512-Ds+gBRbj0lwRO2Y5hwnUBdxSwlAve9LeRyU4sNnAr0ewW0gWF0n5bgXgUzbgZ49MV9BVUAQUFYVcDUcilUExMA==", + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", "dev": true, - "license": "MIT", - "dependencies": { - "lightningcss": "^1.32.0", - "picomatch": "^4.0.4", - "postcss": "^8.5.16", - "rolldown": "~1.1.3", - "tinyglobby": "^0.2.17" - }, - "bin": { - "vite": "bin/vite.js" - }, "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.3.0", - "esbuild": "^0.27.0 || ^0.28.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "@vitejs/devtools": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } + "node": ">=4.0" } }, - "node_modules/vite-plugin-checker": { - "version": "0.14.4", - "resolved": "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.14.4.tgz", - "integrity": "sha512-Tw0U9UgHIRiZ+Yoe4Gh0RrYoBiCVmO9j4tomVdYr0KUjUsqXMPhqW8ouoSWmOzGp5Iimipbl3bNXZcK7OeP7Qg==", + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.0", - "chokidar": "^5.0.0", - "npm-run-path": "^6.0.0", - "picocolors": "^1.1.1", - "picomatch": "^4.0.4", - "proper-lockfile": "^4.1.2", - "tiny-invariant": "^1.3.3" - }, "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@biomejs/biome": ">=2.4.12", - "eslint": ">=9.39.4", - "meow": "^13.2.0 || ^14.0.0", - "optionator": "^0.9.4", - "oxlint": ">=1", - "stylelint": ">=16.26.1", - "typescript": "*", - "vite": ">=5.4.21", - "vue-tsc": "~2.2.10 || ^3.0.0" - }, - "peerDependenciesMeta": { - "@biomejs/biome": { - "optional": true - }, - "eslint": { - "optional": true - }, - "meow": { - "optional": true - }, - "optionator": { - "optional": true - }, - "oxlint": { - "optional": true - }, - "stylelint": { - "optional": true - }, - "typescript": { - "optional": true - }, - "vue-tsc": { - "optional": true - } + "node": ">=4.0" } }, - "node_modules/vite-plugin-checker/node_modules/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^5.0.0" - }, "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "node": ">=0.10.0" } }, - "node_modules/vite-plugin-checker/node_modules/npm-run-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", - "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, - "license": "MIT", "dependencies": { - "path-key": "^4.0.0", - "unicorn-magic": "^0.3.0" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "engines": { - "node": ">=18" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/vite-plugin-checker/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true, - "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8.0" } }, - "node_modules/vite-plugin-checker/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "node_modules/expect": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.1.0.tgz", + "integrity": "sha512-9kJngV5hOJgkFil4F/uXm3hVBubUK2nERVfvqNNwxxuW8ZOUwSTTSysgfzckYtv/LBzj/LJXbiAF7okHCXgdug==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "@jest/types": "^27.1.0", + "ansi-styles": "^5.0.0", + "jest-get-type": "^27.0.6", + "jest-matcher-utils": "^27.1.0", + "jest-message-util": "^27.1.0", + "jest-regex-util": "^27.0.6" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/vite-plugin-checker/node_modules/readdirp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", - "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "node_modules/expect/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, - "license": "MIT", "engines": { - "node": ">= 20.19.0" + "node": ">=10" }, "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/vite-plugin-checker/node_modules/unicorn-magic": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", - "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "node_modules/expect/node_modules/jest-get-type": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz", + "integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==", "dev": true, - "license": "MIT", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/vite-plugin-dts": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-5.0.3.tgz", - "integrity": "sha512-gIth6NdCEHWPiiRMCK3N6C8WjvdsrtEQrmsiG8h6Ov+lFP+b07Y+wcs9H0H7n146l0PDTYK4cQN1vgeG1pMdRQ==", - "dev": true, - "license": "MIT", + "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==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dependencies": { - "unplugin-dts": "1.0.3" - }, - "peerDependencies": { - "@microsoft/api-extractor": ">=7", - "rollup": ">=3", - "vite": ">=3" + "@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" }, - "peerDependenciesMeta": { - "@microsoft/api-extractor": { - "optional": true - }, - "rollup": { - "optional": true - }, - "vite": { - "optional": true - } + "engines": { + "node": ">=8.6.0" } }, - "node_modules/vite/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "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==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/fast-xml-parser": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.19.0.tgz", + "integrity": "sha512-4pXwmBplsCPv8FOY1WRakF970TjNGnGnfbOnLqjlYvMiF1SR3yOHyxMR/YCXpPTOspNF5gwudqktIP4VsWkvBg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" + "bin": { + "xml2js": "cli.js" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dependencies": { + "reusify": "^1.0.4" } }, - "node_modules/vitepress": { - "version": "2.0.0-alpha.18", - "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-2.0.0-alpha.18.tgz", - "integrity": "sha512-Lk1G2/QqSf+MwNLICl9fmzWOtoCEwjZoWgaQy41QvWTfcGpLE9XwJDbcCyES/9rj6R2g1zFqFvLVkYKLLDALFw==", + "node_modules/fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", "dev": true, - "license": "MIT", "dependencies": { - "@docsearch/css": "^4.6.3", - "@docsearch/js": "^4.6.3", - "@docsearch/sidepanel-js": "^4.6.3", - "@iconify-json/simple-icons": "^1.2.87", - "@shikijs/core": "^4.3.0", - "@shikijs/transformers": "^4.3.0", - "@shikijs/types": "^4.3.0", - "@types/markdown-it": "^14.1.2", - "@vitejs/plugin-vue": "^6.0.7", - "@vue/devtools-api": "^8.1.4", - "@vue/shared": "^3.5.39", - "@vueuse/core": "^14.3.0", - "@vueuse/integrations": "^14.3.0", - "focus-trap": "^8.2.2", - "mark.js": "8.11.1", - "minisearch": "^7.2.0", - "shiki": "^4.3.0", - "vite": "^8.1.3", - "vue": "^3.5.39" - }, - "bin": { - "vitepress": "bin/vitepress.js" - }, - "peerDependencies": { - "markdown-it-mathjax3": "^4", - "postcss": "^8" - }, - "peerDependenciesMeta": { - "markdown-it-mathjax3": { - "optional": true - }, - "postcss": { - "optional": true - } + "bser": "2.1.1" } }, - "node_modules/vitest": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.9.tgz", - "integrity": "sha512-nE3/LEyc0z87uHYLZebqCUOaJr2hdtuPp7BQ4BosVFnfltxgAvMG08NyrSGlPpOUWvR27c5flSmYFTNr78L9GQ==", + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, - "license": "MIT", "dependencies": { - "@vitest/expect": "4.1.9", - "@vitest/mocker": "4.1.9", - "@vitest/pretty-format": "4.1.9", - "@vitest/runner": "4.1.9", - "@vitest/snapshot": "4.1.9", - "@vitest/spy": "4.1.9", - "@vitest/utils": "4.1.9", - "es-module-lexer": "^2.0.0", - "expect-type": "^1.3.0", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^4.0.0-rc.1", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.1.0", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" + "escape-string-regexp": "^1.0.5" }, "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=8" }, "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.1.9", - "@vitest/browser-preview": "4.1.9", - "@vitest/browser-webdriverio": "4.1.9", - "@vitest/coverage-istanbul": "4.1.9", - "@vitest/coverage-v8": "4.1.9", - "@vitest/ui": "4.1.9", - "happy-dom": "*", - "jsdom": "*", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/coverage-istanbul": { - "optional": true - }, - "@vitest/coverage-v8": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - }, - "vite": { - "optional": false - } + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/vitest/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "flat-cache": "^3.0.4" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "engines": { + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/vscode-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", - "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/vue": { - "version": "3.5.39", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.39.tgz", - "integrity": "sha512-xmZCYabFGcirU8r0fTuvl/LICc1OU620rnqepaJDL/a141ZigkG7AyaxQLdqJ02ZRYzWe6YPaDHeQx7MfknQfA==", - "dev": true, - "license": "MIT", + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dependencies": { - "@vue/compiler-dom": "3.5.39", - "@vue/compiler-sfc": "3.5.39", - "@vue/runtime-dom": "3.5.39", - "@vue/server-renderer": "3.5.39", - "@vue/shared": "3.5.39" - }, - "peerDependencies": { - "typescript": "*" + "to-regex-range": "^5.0.1" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "engines": { + "node": ">=8" } }, - "node_modules/walk-up-path": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-4.0.0.tgz", - "integrity": "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==", - "dev": true, - "license": "ISC", + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, "engines": { - "node": "20 || >=22" + "node": ">=8" } }, - "node_modules/wawoff2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wawoff2/-/wawoff2-2.0.1.tgz", - "integrity": "sha512-r0CEmvpH63r4T15ebFqeOjGqU4+EgTx4I510NtK35EMciSdcTxCw3Byy3JnBonz7iyIFZ0AbVo0bbFpEVuhCYA==", - "license": "MIT", + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, "dependencies": { - "argparse": "^2.0.1" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" }, - "bin": { - "woff2_compress.js": "bin/woff2_compress.js", - "woff2_decompress.js": "bin/woff2_decompress.js" + "engines": { + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/wawoff2/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==" - }, - "node_modules/webfont": { - "resolved": "packages/webfont", - "link": true - }, - "node_modules/webpack-virtual-modules": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", - "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", - "dev": true, - "license": "MIT" + "node_modules/flatted": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.1.tgz", + "integrity": "sha512-OMQjaErSFHmHqZe+PSidH5n8j3O0F2DdnVh8JB4j4eUQ2k6KvB0qGfrKIhapvez5JerBbmWkaLYUYWISaESoXg==", + "dev": true }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "dev": true, - "license": "ISC", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" }, "engines": { - "node": ">= 8" + "node": ">= 6" } }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "node_modules/fs-access": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", "dev": true, - "license": "MIT", "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" + "null-check": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/woff2sfnt-sfnt2woff": { + "node_modules/fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/woff2sfnt-sfnt2woff/-/woff2sfnt-sfnt2woff-1.0.0.tgz", - "integrity": "sha512-edK4COc1c1EpRfMqCZO1xJOvdUtM5dbVb9iz97rScvnTevqEB3GllnLWCmMVp1MfQBdF1DFg/11I0rSyAdS4qQ==", - "license": "MIT", - "dependencies": { - "pako": "^1.0.7" + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "node_modules/gensync": { + "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==", "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=6.9.0" } }, - "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/geometry-interfaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/geometry-interfaces/-/geometry-interfaces-1.1.4.tgz", + "integrity": "sha512-qD6OdkT6NcES9l4Xx3auTpwraQruU7dARbQPVO71MKvkGYw5/z/oIiGymuFXrRaEQa5Y67EIojUpaLeGEa5hGA==" + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, - "license": "ISC" + "engines": { + "node": "6.* || 8.* || >= 10.*" + } }, - "node_modules/xml2js": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", - "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", - "license": "MIT", + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" }, - "engines": { - "node": ">=4.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "engines": { - "node": ">=4.0" - } + "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==", + "dev": true }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, - "license": "ISC", "engines": { - "node": ">=10" + "node": ">=8.0.0" } }, - "node_modules/yaml": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", - "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "node_modules/get-pkg-repo": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.1.2.tgz", + "integrity": "sha512-/FjamZL9cBYllEbReZkxF2IMh80d8TJoC4e3bmLNif8ibHw95aj0N/tzqK0kZz9eU/3w3dL6lF4fnnX/sDdW3A==", "dev": true, - "license": "ISC", + "dependencies": { + "@hutson/parse-repository-url": "^3.0.0", + "hosted-git-info": "^4.0.0", + "meow": "^7.0.0", + "through2": "^2.0.0" + }, "bin": { - "yaml": "bin.mjs" + "get-pkg-repo": "src/cli.js" }, "engines": { - "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" + "node": ">=6.9.0" } }, - "node_modules/yargs": { - "version": "16.2.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.2.tgz", - "integrity": "sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w==", + "node_modules/get-pkg-repo/node_modules/meow": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz", + "integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==", "dev": true, - "license": "MIT", "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^2.5.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.13.1", + "yargs-parser": "^18.1.3" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "node_modules/get-pkg-repo/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "node_modules/yerror": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/yerror/-/yerror-9.1.1.tgz", - "integrity": "sha512-6XGifXCr19Zy0O3YuoWs7287A/9Ush4C/xN9buokIBVUVGrblN3FTrumLmIZFSsSdDlKdJhjXV2GLpba3qoljA==", - "license": "MIT", - "engines": { - "node": ">=24.14.0" + "node_modules/get-pkg-repo/node_modules/normalize-package-data/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/get-pkg-repo/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" }, - "funding": { - "type": "individual", - "url": "https://github.com/sponsors/nfroidure" + "engines": { + "node": ">=8" } }, - "node_modules/yocto-queue": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", - "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "node_modules/get-pkg-repo/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, "engines": { - "node": ">=12.20" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/zod": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", - "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "node_modules/get-pkg-repo/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" + "engines": { + "node": ">=8" } }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "node_modules/get-pkg-repo/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "engines": { + "node": ">=8" } }, - "packages/grunt-webfont-recipe": { - "devDependencies": { - "grunt": "1.6.2", - "grunt-cli": "1.5.0", - "webfont": "file:../webfont" + "node_modules/get-pkg-repo/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "packages/webfont": { - "version": "12.5.0", - "license": "MIT", - "dependencies": { - "cosmiconfig": "9.0.2", - "deepmerge": "^4.2.2", - "enquirer": "2.4.1", - "fonteditor-core": "2.6.3", - "fontverter": "2.0.0", - "globby": "16.2.1", - "meow": "14.1.0", - "nunjucks": "3.2.4", - "p-limit": "7.3.0", - "resolve-from": "^5.0.0", - "svg2ttf": "^6.1.0", - "svgicons2svgfont": "^16.0.0", - "svgo": "4.0.1", - "ttf2eot": "3.1.0", - "ttf2woff": "^3.0.0", - "wawoff2": "2.0.1", - "xml2js": "0.6.2" - }, + "node_modules/get-pkg-repo/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, "bin": { - "webfont": "dist/cli.mjs" - }, - "devDependencies": { - "@arethetypeswrong/cli": "0.18.4", - "@biomejs/biome": "2.5.2", - "@types/node": "26.1.0", - "@types/nunjucks": "3.2.6", - "@types/svg2ttf": "5.0.3", - "@types/ttf2eot": "2.0.2", - "@types/ttf2woff": "2.0.4", - "@types/wawoff2": "1.0.2", - "@types/xml2js": "0.4.14", - "@vitest/coverage-v8": "4.1.9", - "is-eot": "1.0.0", - "is-svg": "6.1.0", - "is-ttf": "0.2.2", - "is-woff": "1.0.3", - "is-woff2": "1.0.0", - "knip": "6.24.0", - "publint": "0.3.21", - "typescript": "6.0.3", - "vite": "8.1.3", - "vite-plugin-checker": "0.14.4", - "vite-plugin-dts": "5.0.3", - "vitest": "4.1.9" - }, - "engines": { - "node": ">=24.14.0" - } - }, - "packages/webfont/node_modules/globby": { - "version": "16.2.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-16.2.1.tgz", - "integrity": "sha512-JmsqJalahxxgW8V2ecSQ2G7UjPlI9cpKdrkG9KoNiXhd/YslXOTEB0cViENWUznuovIuNT+FkMbraDGjr4FCUg==", - "dependencies": { - "@sindresorhus/merge-streams": "^4.0.0", - "fast-glob": "^3.3.3", - "ignore": "^7.0.5", - "is-path-inside": "^4.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.4.0" - }, - "engines": { - "node": ">=20" + "semver": "bin/semver" + } + }, + "node_modules/get-pkg-repo/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==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/get-pkg-repo/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/get-pkg-repo/node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "engines": { + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } - } - }, - "dependencies": { - "@andrewbranch/untar.js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@andrewbranch/untar.js/-/untar.js-1.0.3.tgz", - "integrity": "sha512-Jh15/qVmrLGhkKJBdXlK1+9tY4lZruYjsgkDFj08ZmDiWVBLJcqkok7Z0/R0In+i1rScBpJlSvrTS2Lm41Pbnw==", - "dev": true }, - "@arethetypeswrong/cli": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@arethetypeswrong/cli/-/cli-0.18.4.tgz", - "integrity": "sha512-kNWo6LTzGAuLYPpJ7Sgo63whSUeeSuKMlYx6IBgzs4ONEG807gW4hSSENvpeCHzO2H2wIzG5EFl0OKBbqGBAyA==", + "node_modules/get-pkg-repo/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, - "requires": { - "@arethetypeswrong/core": "0.18.4", - "chalk": "^4.1.2", - "cli-table3": "^0.6.3", - "commander": "^10.0.1", - "marked": "^9.1.2", - "marked-terminal": "^7.1.0", - "semver": "^7.5.4" - }, "dependencies": { - "commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true - } + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" } }, - "@arethetypeswrong/core": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@arethetypeswrong/core/-/core-0.18.4.tgz", - "integrity": "sha512-M5F0ePyN6h2Z6XxRiyIPqjGbltotXLjR0CKA0uKspsDu0QmgTNYvRb4RSQPMUs2ZXZHCCYpbaZbFbYOXLxCjUA==", + "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==", "dev": true, - "requires": { - "@andrewbranch/untar.js": "^1.0.3", - "@loaderkit/resolve": "^1.0.2", - "cjs-module-lexer": "^1.2.3", - "fflate": "^0.8.3", - "lru-cache": "^11.0.1", - "semver": "^7.5.4", - "typescript": "5.6.1-rc", - "validate-npm-package-name": "^5.0.0" + "engines": { + "node": ">=10" }, - "dependencies": { - "typescript": { - "version": "5.6.1-rc", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.1-rc.tgz", - "integrity": "sha512-E3b2+1zEFu84jB0YQi9BORDjz9+jGbwwy1Zi3G0LUNw7a7cePUrHMRNy8aPh53nXpkFGVHSxIZo5vKTfYaFiBQ==", - "dev": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/code-frame": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", - "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", - "requires": { - "@babel/helper-validator-identifier": "^7.29.7", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" + "node_modules/git-raw-commits": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.10.tgz", + "integrity": "sha512-sHhX5lsbG9SOO6yXdlwgEMQ/ljIn7qMpAbJZCGfXX2fq5T8M5SrDnpYk9/4HswTildcIqatsWa91vty6VhWSaQ==", + "dev": true, + "dependencies": { + "dargs": "^7.0.0", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "git-raw-commits": "cli.js" + }, + "engines": { + "node": ">=10" } }, - "@babel/helper-string-parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", - "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "node_modules/git-raw-commits/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, - "@babel/helper-validator-identifier": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==" - }, - "@babel/parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", - "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "node_modules/git-raw-commits/node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", "dev": true, - "requires": { - "@babel/types": "^7.29.7" + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/types": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", - "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "node_modules/git-raw-commits/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7" + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" } }, - "@biomejs/biome": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.5.2.tgz", - "integrity": "sha512-VQ3RCqr7JmDIX+w6stWYl+g/3bYofN3q2wDBHUKKc/c7i5QWrFKFBZYCYPWTE6agsUPMIZZe6/CMmVUfUAhkKA==", + "node_modules/git-raw-commits/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, - "requires": { - "@biomejs/cli-darwin-arm64": "2.5.2", - "@biomejs/cli-darwin-x64": "2.5.2", - "@biomejs/cli-linux-arm64": "2.5.2", - "@biomejs/cli-linux-arm64-musl": "2.5.2", - "@biomejs/cli-linux-x64": "2.5.2", - "@biomejs/cli-linux-x64-musl": "2.5.2", - "@biomejs/cli-win32-arm64": "2.5.2", - "@biomejs/cli-win32-x64": "2.5.2" + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@biomejs/cli-darwin-arm64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.5.2.tgz", - "integrity": "sha512-e7P3P7EkwFc/KiX2AHw4YDLIBOMfG9CPCAwy52k5Bp0dfhkozx9hf6wCmIr2QeXy2XeccJ3V/Sg+hDmzYEqxSg==", + "node_modules/git-raw-commits/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, - "optional": true + "engines": { + "node": ">=8" + } }, - "@biomejs/cli-darwin-x64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.5.2.tgz", - "integrity": "sha512-ymzMvjC1Jg0b9K0D26ZdARqFQXs7MocfLC5FOCGfkC0Ss+ACUJkX5364ZM5nT4NLZanHRZNVrZEy+Ibwcvux/g==", + "node_modules/git-raw-commits/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, - "optional": true + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } }, - "@biomejs/cli-linux-arm64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.5.2.tgz", - "integrity": "sha512-t7sseOmqND57uUWTwlawU6BYj+J06T/9EkydzBhkrgw/FK3QVhjU2wsJR0frljrKZ0/I8A/rYw7284QgqjQfIQ==", + "node_modules/git-raw-commits/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true, - "optional": true + "engines": { + "node": ">=8" + } }, - "@biomejs/cli-linux-arm64-musl": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.5.2.tgz", - "integrity": "sha512-w+ANG0ZvTu9IeEg9QnstoOnk6L0fpwJifW6aHR18+cb5Z39bkANItYjAfMrnvce5tmMK+IQ6nPX7/kQFdam5iw==", + "node_modules/git-raw-commits/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, - "optional": true + "bin": { + "semver": "bin/semver" + } }, - "@biomejs/cli-linux-x64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.5.2.tgz", - "integrity": "sha512-M/lOZrewzTCRDINbjhQ1gYYru37KlD3kJBQwwKCG0ckz5E9IZwIoJ3X0wBwRXA+yBDIwWUuPBHS67HzJY4dTfA==", + "node_modules/git-raw-commits/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true, - "optional": true + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "@biomejs/cli-linux-x64-musl": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.5.2.tgz", - "integrity": "sha512-VArNLAzND063tF+XY0yPyM+DyahpzOMzOAvb7qs259nhjJWRjvjZdssuA+Rfl+l07+NOesKZ0Xu2yFrXyBMtzw==", + "node_modules/git-remote-origin-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", "dev": true, - "optional": true + "dependencies": { + "gitconfiglocal": "^1.0.0", + "pify": "^2.3.0" + }, + "engines": { + "node": ">=4" + } }, - "@biomejs/cli-win32-arm64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.5.2.tgz", - "integrity": "sha512-kbjFFKyZlzYnAuw7sRy5qDoFG6zrP40UK08oPQsWK0ct3NMnGSt+Bs1iviEEyEIP57N5MrykGXdO/wRiaR4lww==", + "node_modules/git-remote-origin-url/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true, - "optional": true + "engines": { + "node": ">=0.10.0" + } }, - "@biomejs/cli-win32-x64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.5.2.tgz", - "integrity": "sha512-4InchVpdVmdkkkgjQqKpgvyu+VPnoF/7RPSw5YATgEVpt2j72wcCAeV5TwaE9ZGJUZWZn7v2CwSAj6CrMJEx8A==", + "node_modules/git-semver-tags": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", + "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", "dev": true, - "optional": true + "dependencies": { + "meow": "^8.0.0", + "semver": "^6.0.0" + }, + "bin": { + "git-semver-tags": "cli.js" + }, + "engines": { + "node": ">=10" + } }, - "@braidai/lang": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@braidai/lang/-/lang-1.1.2.tgz", - "integrity": "sha512-qBcknbBufNHlui137Hft8xauQMTZDKdophmLFv05r2eNmdIv/MlPuP4TdUknHG68UdWLgVZwgxVe735HzJNIwA==", + "node_modules/git-semver-tags/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, - "@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "node_modules/git-semver-tags/node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", "dev": true, - "optional": true - }, - "@docsearch/css": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.6.3.tgz", - "integrity": "sha512-nlOwcXcsNAptQl4vlL4MA78qNJKO0Qlds5GuBjCoePgkebTXLSf8Qt1oyZ3YBshYupKXG9VRGEsk1zr23d+bzQ==", - "dev": true - }, - "@docsearch/js": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-4.6.3.tgz", - "integrity": "sha512-qUIX2b4Apew3tv4F0qhmgShsl/Lfw4m6mqv/5/5dWNxwTcDdLMp2s3YwZ+NMGh3IKCg0pBaXm7Q5VdyU5Rj+cQ==", - "dev": true - }, - "@docsearch/sidepanel-js": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/@docsearch/sidepanel-js/-/sidepanel-js-4.6.3.tgz", - "integrity": "sha512-grGSmvXzG0if+mrzdIKykvpIAuEQ9u0sEJ2eLRRCaQfJvsWqh2C2/aY04bIzWvDh7myi5rvl8D+tUNsVrjYQ3A==", - "dev": true + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "@emnapi/core": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", - "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", + "node_modules/git-semver-tags/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, - "optional": true, - "requires": { - "@emnapi/wasi-threads": "1.2.2", - "tslib": "^2.4.0" + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" } }, - "@emnapi/runtime": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", - "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "node_modules/git-semver-tags/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, - "optional": true, - "requires": { - "tslib": "^2.4.0" + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@emnapi/wasi-threads": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", - "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", + "node_modules/git-semver-tags/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, - "optional": true, - "requires": { - "tslib": "^2.4.0" + "engines": { + "node": ">=8" } }, - "@file-type/xml": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@file-type/xml/-/xml-0.4.4.tgz", - "integrity": "sha512-NhCyXoHlVZ8TqM476hyzwGJ24+D5IPSaZhmrPj7qXnEVb3q6jrFzA3mM9TBpknKSI9EuQeGTKRg2DXGUwvBBoQ==", + "node_modules/git-semver-tags/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, - "requires": { - "sax": "^1.4.1", - "strtok3": "^10.3.4" + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "@iconify-json/simple-icons": { - "version": "1.2.88", - "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.88.tgz", - "integrity": "sha512-+cvi1qCuvReL29ehi6t62L4fb7GDXe+UlGHFcsJcV7I2l9wtqn9XE2IBKcDr3CI5iGUGS5ISnXv699pSGpyx1Q==", + "node_modules/git-semver-tags/node_modules/read-pkg/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, - "requires": { - "@iconify/types": "*" + "bin": { + "semver": "bin/semver" } }, - "@iconify/types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", - "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", - "dev": true - }, - "@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==", + "node_modules/git-semver-tags/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true, - "requires": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" + "engines": { + "node": ">=8" } }, - "@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "node_modules/git-semver-tags/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@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==", - "dev": true + "node_modules/gitconfiglocal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", + "dev": true, + "dependencies": { + "ini": "^1.3.2" + } }, - "@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==", - "dev": true + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "@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==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "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==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" } }, - "@loaderkit/resolve": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@loaderkit/resolve/-/resolve-1.0.6.tgz", - "integrity": "sha512-G8FdIoF5CypfwmD9rl8BXod5HDn8JqB0CCNBXDTaRZ+yRYhARrrSToX1zg1zy9jX3zLqigsELwhT4gNtkdQAUg==", + "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==", "dev": true, - "requires": { - "@braidai/lang": "^1.0.0" + "engines": { + "node": ">=4" } }, - "@napi-rs/wasm-runtime": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", - "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", - "dev": true, - "optional": true, - "requires": { - "@tybys/wasm-util": "^0.10.3" + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@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==", - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "node_modules/globby/node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "engines": { + "node": ">= 4" } }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } + "node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true }, - "@oxc-parser/binding-android-arm-eabi": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm-eabi/-/binding-android-arm-eabi-0.137.0.tgz", - "integrity": "sha512-KDs+0VPdEmasOkpuJHW9V5WCF+cvYdMQv2Jd+aJXt+cxIx12NToRQRbXaRwUEDsZw+/jMk81Ve8ZFbjUkJTOwA==", + "node_modules/handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", "dev": true, - "optional": true + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } }, - "@oxc-parser/binding-android-arm64": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.137.0.tgz", - "integrity": "sha512-WhALNzfy3x/RfC6bsqX+csavuUY0yHHE7XfgPE5M542uhoBZUUoGTPG+nkMbGoG4+gcfss5s7urMyn5QBHu0sw==", + "node_modules/handlebars/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "optional": true + "engines": { + "node": ">=0.10.0" + } }, - "@oxc-parser/binding-darwin-arm64": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.137.0.tgz", - "integrity": "sha512-bFPr5hgmNMOMoyPTGtdsK4Ug21RovIPojRMgDDhSp1LtCnc/DkLwGONKjgRjszg677RlGnkYSviQ8hHaUPOVYA==", - "dev": true, - "optional": true + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "engines": { + "node": ">=6" + } }, - "@oxc-parser/binding-darwin-x64": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.137.0.tgz", - "integrity": "sha512-CL5dMm1asqXIDZHg14FLxj3Mc36w8PI7xCWh1uA4is6z8g2XrIILoTcQYOxDbwzuk34RDPX5IAGUxZr6LA9KAg==", - "dev": true, - "optional": true + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } }, - "@oxc-parser/binding-freebsd-x64": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.137.0.tgz", - "integrity": "sha512-79h8rYGnSlKPGWo7mHr2ixO6ea7aW8B0CT965SZ8SLbNnCOH5aOYBTeVXUY6eMvEaiLyWr8Skuiugr5pDYgLGw==", + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", "dev": true, - "optional": true + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "@oxc-parser/binding-linux-arm-gnueabihf": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.137.0.tgz", - "integrity": "sha512-ASgmlSimhGyr0lksgVIo6hibz1obnDq4qJbiMX/AzltfgPnanRrzG1Q+23g8ljOHOjv6dsznkUuCYL3gg0sY1Q==", - "dev": true, - "optional": true + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } }, - "@oxc-parser/binding-linux-arm-musleabihf": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.137.0.tgz", - "integrity": "sha512-AU2J9aa22Sx32wRGnDjybOU9TQXXQUud5sdUi+ZB0XxwM8aToWLweV+yA0wlQm0yIUVqljquqoHCYEq9II8gJQ==", + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "dev": true, - "optional": true + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "@oxc-parser/binding-linux-arm64-gnu": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.137.0.tgz", - "integrity": "sha512-GdEtiG89yMr7XkUGxifgodXEEm2f+xW2f9CpDjlgAnBOwhTmrpQMvhOGobLVKUyzf/qHBXW16smk5zbF3nZU6w==", - "dev": true, - "optional": true + "node_modules/hosted-git-info": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", + "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } }, - "@oxc-parser/binding-linux-arm64-musl": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.137.0.tgz", - "integrity": "sha512-EGJ+Bs8iXx8KBH8DQ5BLoEm5lnHaYjlh4/8j8vFhrr/6z4tqONy5BZDzLpKmmNWlN6Hlc5r8YOuBVHqZ9vRFEQ==", + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", "dev": true, - "optional": true + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } }, - "@oxc-parser/binding-linux-ppc64-gnu": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.137.0.tgz", - "integrity": "sha512-vzFUQENy/fnbSe5DZWovq6tIBc1uhuMztanSW6rz1e9WdQE4gHwYuD7ZII6JnrJifd1R3RSoqiZbgRFlVL2tYQ==", - "dev": true, - "optional": true + "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==", + "dev": true }, - "@oxc-parser/binding-linux-riscv64-gnu": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.137.0.tgz", - "integrity": "sha512-SfVI14HBQs9gtLcUD5hTt5hsNbdrqSUNg9S8muN+LhVQ5nf1WwH3hAoK6B9NKgdYgWAQSXFXGiiBedQ4r/BKuw==", + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dev": true, - "optional": true + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } }, - "@oxc-parser/binding-linux-riscv64-musl": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.137.0.tgz", - "integrity": "sha512-e7Ppy4FCIFNQxT/ikSeIWFoQ0l+N9vgtRBtLcyZXeolTzApyVoPqEXsYPrcdM/9i0Bwk8knvYd37vaEMxHyi6g==", + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", "dev": true, - "optional": true + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } }, - "@oxc-parser/binding-linux-s390x-gnu": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.137.0.tgz", - "integrity": "sha512-Bho5qFwdhqsIFR7gipYEUlqvi3SRrY8sugxXig380MIaakBB1PyU9+7dBiBVScfImTNWhijUxdBwqrprGdq5WA==", + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, - "optional": true + "engines": { + "node": ">=10.17.0" + } }, - "@oxc-parser/binding-linux-x64-gnu": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.137.0.tgz", - "integrity": "sha512-36mGWtg7PyFzjJwGDkH6/F4o2nIDEoKXLPr/X/lwqklkomQwJJt1I5GJVmGhovUEmgPK5WAeAZMqlFCehwiy9Q==", + "node_modules/husky": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/husky/-/husky-7.0.2.tgz", + "integrity": "sha512-8yKEWNX4z2YsofXAMT7KvA1g8p+GxtB1ffV8XtpAEGuXNAbCV5wdNKH+qTpw8SM9fh4aMPDR+yQuKfgnreyZlg==", "dev": true, - "optional": true + "bin": { + "husky": "lib/bin.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } }, - "@oxc-parser/binding-linux-x64-musl": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.137.0.tgz", - "integrity": "sha512-/Jqx6+N7A44n2BdvUr7pXhVr2vFjs6WGH3unZRczwrfiH0H1zY0QwKQMG/dtRiTlKGDKGukznPT8lx84/oEsZg==", + "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==", "dev": true, - "optional": true + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } }, - "@oxc-parser/binding-openharmony-arm64": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-openharmony-arm64/-/binding-openharmony-arm64-0.137.0.tgz", - "integrity": "sha512-9Uj0qHNNl+OgT1UTGwF7ixIXU6T1u2SbMidmgPy/h1h/fl2gRS6YpAxxY1gwHofcWjoTwkoMFd8xs5Vuj6GOFA==", + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true, - "optional": true + "engines": { + "node": ">= 4" + } }, - "@oxc-parser/binding-wasm32-wasi": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.137.0.tgz", - "integrity": "sha512-gW2vfkytNGgMVADiuzdvOfw0mWG9za20F/1fCJsif5aBMAvWJTSbpIXbIe0XkOe0VENk+PadpQ7cZgUy2sUJcA==", - "dev": true, - "optional": true, - "requires": { - "@emnapi/core": "1.11.1", - "@emnapi/runtime": "1.11.1", - "@napi-rs/wasm-runtime": "^1.1.5" + "node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "@oxc-parser/binding-win32-arm64-msvc": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.137.0.tgz", - "integrity": "sha512-x+pFANF0yL5uK/6T7lu6SlR5qid6sp//eZXKLq5iNsIE+EQg6EaS8/wsW7E91nXXjpnPhSoMOHXShSVhGRdn8w==", - "dev": true, - "optional": true + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "engines": { + "node": ">=4" + } }, - "@oxc-parser/binding-win32-ia32-msvc": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.137.0.tgz", - "integrity": "sha512-sQUqym80PFi6McRsIqfJrSu2JrSClEZIXXD+/FjAFoULEKzOPsldIdFBG96xdX8aVMzCNQ9792FPx3MfkEIrFA==", + "node_modules/import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", "dev": true, - "optional": true + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + } }, - "@oxc-parser/binding-win32-x64-msvc": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.137.0.tgz", - "integrity": "sha512-2AsevxlvNN4WKxpEn3RtqD5zbqMaXF+T7JXblsP4gVuY+vC9dXS4ED/PwfRCliFqoeisYS3Iro4DHzxr0TEvVA==", + "node_modules/import-local/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, - "optional": true - }, - "@oxc-project/types": { - "version": "0.138.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.138.0.tgz", - "integrity": "sha512-1a7ZKmrRTCoN1XMZ4L0PyyqrMnrNlLyPuOkdSX2MZg7IiIGRUyurNhAm73ptDOraoBcIordsIGKNPKUzy3ZmfA==", - "dev": true + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, - "@oxc-resolver/binding-android-arm-eabi": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm-eabi/-/binding-android-arm-eabi-11.21.3.tgz", - "integrity": "sha512-eNU11A2WNizh04v3uyaJCootrHIaS0B9aHYXvAvVnPNk4xYSjMUjHnhQ6dewPN2MRYDskV85d1N0Aw0WNWhcyg==", + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true, - "optional": true + "engines": { + "node": ">=0.8.19" + } }, - "@oxc-resolver/binding-android-arm64": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm64/-/binding-android-arm64-11.21.3.tgz", - "integrity": "sha512-8Q+ZjTLvn2dIcWsrmhdrEihm7q+ag/k+mkry7Z+t0QbbHaVxXQfvH9AewyVMh/WrpEKhQ3DDgx9fYbqeCpeOEw==", - "dev": true, - "optional": true + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } }, - "@oxc-resolver/binding-darwin-arm64": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-arm64/-/binding-darwin-arm64-11.21.3.tgz", - "integrity": "sha512-wkh0qKZGHXVUDxFw3oA1TXnU2BDYY/r775oJflGeIr8uDPPoN2pk8gijQIzYRT6hoql/lg3+Tx/SaTn9e2/aGg==", - "dev": true, - "optional": true + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } }, - "@oxc-resolver/binding-darwin-x64": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-x64/-/binding-darwin-x64-11.21.3.tgz", - "integrity": "sha512-HbNc23FAQYbuyDV2vBWMez4u4mrsm5RAkniGZAWqr6lYZ3N4beeqIb776jzwRl8qL2zRhHVXpUj97X0QgogVzg==", - "dev": true, - "optional": true + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "@oxc-resolver/binding-freebsd-x64": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-freebsd-x64/-/binding-freebsd-x64-11.21.3.tgz", - "integrity": "sha512-K6xNsTUPEUdfrn0+kbMq5nOUB5w1C5pavPQngt4TM2FpN91lP0PBe2srSpamb4d69O7h86oAi/qWX/kZNRSjkw==", - "dev": true, - "optional": true + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true }, - "@oxc-resolver/binding-linux-arm-gnueabihf": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-11.21.3.tgz", - "integrity": "sha512-VcFmOpcpWX1zoEy8M58tR2M9YxM+Z9RuQhqAx5q0CTmrruaP7Gveejg75hzd/5sg5nk9G3aLALEa3hE2FsmmTQ==", - "dev": true, - "optional": true + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, - "@oxc-resolver/binding-linux-arm-musleabihf": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-11.21.3.tgz", - "integrity": "sha512-quVoxFLBy43hWaQbbDtQNRwAX5vX76mv7n64icAtQcJ3eNgVeblqmkupF/hAneNthdqSlnd1sTjb3aQSaDPaCQ==", + "node_modules/is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", "dev": true, - "optional": true + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "@oxc-resolver/binding-linux-arm64-gnu": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-11.21.3.tgz", - "integrity": "sha512-X0AqNZgcD07Q4V3RDK18/vYOj/HQT/FnmEFGYS2jTWqY7JO13ryE3TEs3eAIgUJhBnNkpEaiXqz3VK8M7qQhWQ==", + "node_modules/is-boolean-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", "dev": true, - "optional": true + "dependencies": { + "call-bind": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "@oxc-resolver/binding-linux-arm64-musl": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-musl/-/binding-linux-arm64-musl-11.21.3.tgz", - "integrity": "sha512-YkaQnaKYdbuaXvRt5Qd0GpbihzVnyfR6z1SpYfIUC6RTu4NF7lDKPjVkYb+jRI2gedVO2rVpN35Y6akG6ud4Lw==", + "node_modules/is-builtin-module": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.1.0.tgz", + "integrity": "sha512-OV7JjAgOTfAFJmHZLvpSTb4qi0nIILDV1gWPYDnDJUTNFM5aGlRAhk4QcT8i7TuAleeEV5Fdkqn3t4mS+Q11fg==", "dev": true, - "optional": true + "dependencies": { + "builtin-modules": "^3.0.0" + }, + "engines": { + "node": ">=6" + } }, - "@oxc-resolver/binding-linux-ppc64-gnu": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-11.21.3.tgz", - "integrity": "sha512-gB9HwhrPiFqUzDeEq+y/CgAijz1YdI6BnXz5GaH2Pa9cWdutchlkGFAiAuGb/PjVQpiK6NFKzFuztxrweoit7A==", + "node_modules/is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", "dev": true, - "optional": true + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "@oxc-resolver/binding-linux-riscv64-gnu": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-11.21.3.tgz", - "integrity": "sha512-zjDWBlYk8QGv0H8dsPUWqkfjYIIjG2TvspGkzXL0eImbgxtZorA/klKeHyolevoT3Kvbi+1iMr9Lhrh7jf54Og==", + "node_modules/is-ci": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", + "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", "dev": true, - "optional": true + "dependencies": { + "ci-info": "^3.1.1" + }, + "bin": { + "is-ci": "bin.js" + } }, - "@oxc-resolver/binding-linux-riscv64-musl": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-11.21.3.tgz", - "integrity": "sha512-4UfsQvacV388y1zpXL7C1x1FNYaV52JtuNRiuzrfQA2z1z6ElVrsidkGsrvQ5EgeSq1Pj7kaKqrgGkvFuxJ/tw==", - "dev": true, - "optional": true + "node_modules/is-core-module": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", + "integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "@oxc-resolver/binding-linux-s390x-gnu": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-11.21.3.tgz", - "integrity": "sha512-b5uH+HKH0MP5mNBYaK75SKsJbw52URqrx2LavYdq6wb0l3ExAG5niYRP9DWUNHdKilpaBVM2bXk9HNWrH3ew7Q==", + "node_modules/is-date-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", "dev": true, - "optional": true + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "@oxc-resolver/binding-linux-x64-gnu": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-gnu/-/binding-linux-x64-gnu-11.21.3.tgz", - "integrity": "sha512-PjYlmilBpNRh2ntXNYAK3Am5w/nPfEpnU/96iNx7CI8EzAn12J4JRiec63wHJTH31nLoCNxBg/829pN+3CfG3Q==", - "dev": true, - "optional": true + "node_modules/is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "engines": { + "node": ">=0.10.0" + } }, - "@oxc-resolver/binding-linux-x64-musl": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-musl/-/binding-linux-x64-musl-11.21.3.tgz", - "integrity": "sha512-QTBAb7JuHlZ7JUEyM8UiQi2f7m/L4swBhP2TNpYIDc9Wp/wRw1G/8sl6i13aIzQAXH7LKIm294LeOHd0lQR8zA==", + "node_modules/is-eot": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-eot/-/is-eot-1.0.0.tgz", + "integrity": "sha1-6EnEDw4YpoU8DWtrrCTvHyxznms=", "dev": true, - "optional": true + "engines": { + "node": ">=0.10.0" + } }, - "@oxc-resolver/binding-openharmony-arm64": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-openharmony-arm64/-/binding-openharmony-arm64-11.21.3.tgz", - "integrity": "sha512-4j1DFwjwv36ec9kds0jU/ucQ5Ha4ERO/H95BxR5JFf0kqUUAJ1kwII7XhTc1vZrkdJkvLGC9Q2MbpObpum8RBg==", - "dev": true, - "optional": true - }, - "@oxc-resolver/binding-wasm32-wasi": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-wasm32-wasi/-/binding-wasm32-wasi-11.21.3.tgz", - "integrity": "sha512-i8oluoel5kru/j1WNrjmQSiA3GQ7wvIYVR1IwIoZtKogAhya2iub+ZKIeSIkcJOrnzQ18Tzl/F+kL3fYOxZLvA==", - "dev": true, - "optional": true, - "requires": { - "@emnapi/core": "1.11.0", - "@emnapi/runtime": "1.11.0", - "@napi-rs/wasm-runtime": "^1.1.5" - }, - "dependencies": { - "@emnapi/core": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.0.tgz", - "integrity": "sha512-l9Oo58x0HOP5znGzVhYW9U3e5wVuA4LAZU2AGezTmkhO1CgQRFDhDg4nneHsu/t3WniXg9QrG2nIXL/ZS8ln8Q==", - "dev": true, - "optional": true, - "requires": { - "@emnapi/wasi-threads": "1.2.2", - "tslib": "^2.4.0" - } - }, - "@emnapi/runtime": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.0.tgz", - "integrity": "sha512-55coeOFKHv1ywEcUXJtWU5f+Jr/W5tZDvZig8DLKSwUN1JpROQ4rk/SNOQiFWmaR/VKF4zuFyW1B8JduOSv6Pg==", - "dev": true, - "optional": true, - "requires": { - "tslib": "^2.4.0" - } - } + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "engines": { + "node": ">=0.10.0" } }, - "@oxc-resolver/binding-win32-arm64-msvc": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-11.21.3.tgz", - "integrity": "sha512-M/8dw8dD6aOs+NlPJax401CZB9I7Aut84isQLgALGGwke4Afvw+/7yYhZb94yXf6t2sPLhQLmSmtSV+2FhsOWg==", - "dev": true, - "optional": true - }, - "@oxc-resolver/binding-win32-x64-msvc": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-x64-msvc/-/binding-win32-x64-msvc-11.21.3.tgz", - "integrity": "sha512-H7BCt/VnS9hnmMp42eGhZ99izSCRvlnWwy/N71K1/J8QoExwY4262Z8QiEkMDtduRJrztayDxETTckmUuAVL9Q==", - "dev": true, - "optional": true - }, - "@publint/pack": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@publint/pack/-/pack-0.1.5.tgz", - "integrity": "sha512-edgyN2pP07uXiP4tJs0s8KVmU8M8i60YPbbI0/WDeok1mIJHRXz+CgD8I0nelwDkoCh3EWL/G5kGfbuHjsdbvw==", + "node_modules/is-fullwidth-code-point": { + "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==", "dev": true, - "requires": { - "tinyexec": "^1.2.4" + "engines": { + "node": ">=8" } }, - "@rolldown/binding-android-arm64": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.4.tgz", - "integrity": "sha512-EZLpf/8y7GXkkra90ML47kzik/GMP3EMcE9bPyHmRfxLC6z9+aW5A8poCsoxjrT5GfEcNAAvWwUHjvP1pUQkfw==", - "dev": true, - "optional": true - }, - "@rolldown/binding-darwin-arm64": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.4.tgz", - "integrity": "sha512-aUi+HBvmYb7j8krl1+qJgkG8C17fO79gk3c+jPw4S8glRFc1DTija9S3EyaTSQUm5GJXYKDAsugBEhFHH2vYiQ==", - "dev": true, - "optional": true - }, - "@rolldown/binding-darwin-x64": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.4.tgz", - "integrity": "sha512-F7hHC3gwY11+vByKPRWqwGbeXWVgKmL+pTGCinaEhdihzBV2aQ0fvZOch9cXYUOKuKKq429HeYXOqQLc7wFCEg==", - "dev": true, - "optional": true - }, - "@rolldown/binding-freebsd-x64": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.4.tgz", - "integrity": "sha512-sI5yw+7s92SK6odiEhD5lKCBlWcpjHS5qyqpVQbZAJ0fIzEUXrmbl3DH2ybR3PZogulNJF+COLtmA8hUfvkCCQ==", - "dev": true, - "optional": true - }, - "@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.4.tgz", - "integrity": "sha512-mCi0OKgEieFircrtVYmQAFGszRtMnZ6fpZAXrxanXAu7lqZcsK1E1RAaZNG0uKAnxox3B1f4EyQNnoyMfN1vAA==", - "dev": true, - "optional": true - }, - "@rolldown/binding-linux-arm64-gnu": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.4.tgz", - "integrity": "sha512-B9Ial3Kv5sh0SHnB1g/QWcUQCEvCF6QKGAl4zXypYj65mVI+B4AhFBwPtSN7pDrJeIx8Z7zdy4ntx+wQABom7w==", - "dev": true, - "optional": true - }, - "@rolldown/binding-linux-arm64-musl": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.4.tgz", - "integrity": "sha512-lZVym0PuHE1KZ22gmFTC15lAkrg9iTszR617oYRB/iPY1A56ywoJzVKOJBKaot5RiikCObmur6pogpse3gRcng==", - "dev": true, - "optional": true - }, - "@rolldown/binding-linux-ppc64-gnu": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.4.tgz", - "integrity": "sha512-t2DNiLJWNTbnEHyUzTumldML6ET4/g16467LZoDDJ3tSxGvguL5/NyC2lCsNKuyRycg9XeDQF5SSv+TNOhQEXg==", - "dev": true, - "optional": true - }, - "@rolldown/binding-linux-s390x-gnu": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.4.tgz", - "integrity": "sha512-0WIRnL1Uw4BvTZRLQt+PVgo6ZKTJadlC2btP+/EOXv2f/DWbY0rEgl+y834mIVwP1FkTlWVTrGGJXf12lru7EQ==", + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, - "optional": true + "engines": { + "node": ">=6" + } }, - "@rolldown/binding-linux-x64-gnu": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.4.tgz", - "integrity": "sha512-JWtGshGfX+oENAKonoNkqEJX+7hC8yfhi9GUyPX1VX4mdh1y5r+ZiJLR5XzAB0aoP6s/PcILsGjKq8O0mm24bw==", - "dev": true, - "optional": true + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } }, - "@rolldown/binding-linux-x64-musl": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.4.tgz", - "integrity": "sha512-rT6yQcxUuXs4CnbofqwHRRV0iem349rLMYpTjkgQGLjrY4ado/eDzwPZPTCgTOlF6Nkp8NEv70yLMTn6qkWxsQ==", + "node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", "dev": true, - "optional": true + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "@rolldown/binding-openharmony-arm64": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.4.tgz", - "integrity": "sha512-KXMGoboq5cyaCQjDA4GLuRiOwBQ0EyFnJoVViLeZ45/3rFItRODEr+NdsBcVpll40hhNArlm/speWGRvj08LzA==", - "dev": true, - "optional": true + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } }, - "@rolldown/binding-wasm32-wasi": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.4.tgz", - "integrity": "sha512-5K83rb36oJiY7BCyE9zLZtGcPV4g5wvq+xwdO0XPIwDVZI8cyB/AUjkNXGb92/rnmezEkjMOpgY61rtwjQtFwg==", + "node_modules/is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", "dev": true, - "optional": true, - "requires": { - "@emnapi/core": "1.11.1", - "@emnapi/runtime": "1.11.1", - "@napi-rs/wasm-runtime": "^1.1.6" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@rolldown/binding-win32-arm64-msvc": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.4.tgz", - "integrity": "sha512-PnWBtw3TV5KOg69HQQDR0mnQuyCmSGR2pAB4DC1rPF808fgKeTUMj2EOEyKATpgiuxuR5APQmiDO7PDgEjTFSA==", + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "dev": true, - "optional": true + "engines": { + "node": ">=8" + } }, - "@rolldown/binding-win32-x64-msvc": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.4.tgz", - "integrity": "sha512-M1lpniBePobTfsa7Ks9a199e1akxsXn+GYBUKsEzv3YFzOm1HJAMNwKI3qr0Zq+mxwx9gOZoTdP1yXRYsZUocQ==", - "dev": true, - "optional": true + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "engines": { + "node": ">=0.10.0" + } }, - "@rolldown/pluginutils": { + "node_modules/is-potential-custom-element-name": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "dev": true }, - "@rollup/pluginutils": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz", - "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==", + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", "dev": true, - "requires": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^4.0.2" - }, "dependencies": { - "picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true - } + "@types/estree": "*" } }, - "@shikijs/core": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.3.1.tgz", - "integrity": "sha512-ANMDxuaPsNMdDC1m4vfvhlDmJweMwkE5XitTwrq2rWHx5jM+dlm4MmHt2PP6t0uejfR77SuhrhJ0zEijIF/uhA==", + "node_modules/is-regex": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", "dev": true, - "requires": { - "@shikijs/primitive": "4.3.1", - "@shikijs/types": "4.3.1", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4", - "hast-util-to-html": "^9.0.5" + "dependencies": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@shikijs/engine-javascript": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.3.1.tgz", - "integrity": "sha512-JBItcnPuYq7jVJdZo/vMj94r+szT7XEjHFX+mvFDGSEIbVAXAGyHAHzhbWzpGOwYidCZrErJLLgn2PVeiokHnQ==", + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", "dev": true, - "requires": { - "@shikijs/types": "4.3.1", - "@shikijs/vscode-textmate": "^10.0.2", - "oniguruma-to-es": "^4.3.6" + "engines": { + "node": ">=0.10.0" } }, - "@shikijs/engine-oniguruma": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.3.1.tgz", - "integrity": "sha512-OXyNMzg0pews+msMj4cHeqT4xiYKKvbnn6VbdAXxfoFl3SSx4fJTc8FadECuc5/H9p3BzhNAoAUXKwAu9rWYhg==", + "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==", "dev": true, - "requires": { - "@shikijs/types": "4.3.1", - "@shikijs/vscode-textmate": "^10.0.2" + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@shikijs/langs": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.3.1.tgz", - "integrity": "sha512-m0l9nsDqgBHvbZbk7A0/kXz/impK3uB/c6rAn6Gpg/uPtdZRQ+alsN/17MU5thb68XTj/4DxkZAotrM0GGSpDQ==", + "node_modules/is-string": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", "dev": true, - "requires": { - "@shikijs/types": "4.3.1" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@shikijs/primitive": { + "node_modules/is-svg": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.3.1.tgz", - "integrity": "sha512-CXQRQOYy1leqQ8ceTeJdmXv/bsUY++6QyLpXJ94LZAAYj5X2SKRdc5ipguv4NPyGVKItB2PPwUpRNe0Sjh5S1A==", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-4.3.1.tgz", + "integrity": "sha512-h2CGs+yPUyvkgTJQS9cJzo9lYK06WgRiXUqBBHtglSzVKAuH4/oWsqk7LGfbSa1hGk9QcZ0SyQtVggvBA8LZXA==", "dev": true, - "requires": { - "@shikijs/types": "4.3.1", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" + "dependencies": { + "fast-xml-parser": "^3.19.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@shikijs/themes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.3.1.tgz", - "integrity": "sha512-dgpoJ4WqNi2yTmizQHBJ5zcX6j2lE6icN/0yt4l1kkf16jrY/pwPLoTb1ETsWMz0OBLf9ZNvwmxft+cH+N9qSA==", + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, - "requires": { - "@shikijs/types": "4.3.1" + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@shikijs/transformers": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-4.3.1.tgz", - "integrity": "sha512-z6ir0bGDgWcF2FduktEfPgIsdOtIlDiLAjFBgBzE42Q9xHbkkIXZtORHzlLVB71iZP9elEcqKg6keajvOUwE2A==", + "node_modules/is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", "dev": true, - "requires": { - "@shikijs/core": "4.3.1", - "@shikijs/types": "4.3.1" + "dependencies": { + "text-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "@shikijs/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.3.1.tgz", - "integrity": "sha512-CHFxE0jztBIZRHH6gxXE7DXUCFXjReEGxZ/j0rfSLGKZuwp2xBYycEP14875DSa9KLL/6700oxIq6oO6ef9K2g==", + "node_modules/is-ttf": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/is-ttf/-/is-ttf-0.2.2.tgz", + "integrity": "sha1-cVWCSjOGfuT6iceeYV49RxbrGzo=", "dev": true, - "requires": { - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" + "dependencies": { + "b3b": "0.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "@shikijs/vscode-textmate": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", - "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", - "dev": true - }, - "@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==", - "dev": true - }, - "@sindresorhus/merge-streams": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", - "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==" - }, - "@standard-schema/spec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, - "@tokenizer/token": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", - "dev": true + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "@tybys/wasm-util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", - "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", + "node_modules/is-woff": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-woff/-/is-woff-1.0.3.tgz", + "integrity": "sha1-SVHeYEqSGPRYwsGMZMg1gC4C+ms=", "dev": true, - "optional": true, - "requires": { - "tslib": "^2.4.0" + "engines": { + "node": ">=0.10.0" } }, - "@types/chai": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "node_modules/is-woff2": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-woff2/-/is-woff2-1.0.0.tgz", + "integrity": "sha1-XrnK2W2cPR04TyZ5L5UyThWC7dg=", "dev": true, - "requires": { - "@types/deep-eql": "*", - "assertion-error": "^2.0.1" + "engines": { + "node": ">=0.10.0" } }, - "@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, - "@types/estree": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "@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==", + "node_modules/istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", "dev": true, - "requires": { - "@types/unist": "*" + "engines": { + "node": ">=8" } }, - "@types/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", - "dev": true - }, - "@types/markdown-it": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", - "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", "dev": true, - "requires": { - "@types/linkify-it": "^5", - "@types/mdurl": "^2" + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" } }, - "@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, - "requires": { - "@types/unist": "*" - } - }, - "@types/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", - "dev": true - }, - "@types/node": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.0.tgz", - "integrity": "sha512-O0A1G3xPGy4w7AgQdAQYUlQ+BKk2Oovw8eRpofyp5KdBZULnbe+WqaOVNrm705SHphCiG4XHsACrSmPu1f+Kgw==", - "requires": { - "undici-types": "~8.3.0" - } - }, - "@types/nunjucks": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@types/nunjucks/-/nunjucks-3.2.6.tgz", - "integrity": "sha512-pHiGtf83na1nCzliuAdq8GowYiXvH5l931xZ0YEHaLMNFgynpEqx+IPStlu7UaDkehfvl01e4x/9Tpwhy7Ue3w==", - "dev": true - }, - "@types/sax": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", - "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", - "requires": { - "@types/node": "*" + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" } }, - "@types/svg2ttf": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@types/svg2ttf/-/svg2ttf-5.0.3.tgz", - "integrity": "sha512-hL+/A4qMISvDbDTtdY73R0zuvsdc7YRYnV5FyAfKVGk8OsluXu/tCFxop7IB5Sgr+ZCS0hHtFxylD0REmm+abA==", - "dev": true - }, - "@types/ttf2eot": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/ttf2eot/-/ttf2eot-2.0.2.tgz", - "integrity": "sha512-KynDvCZEd1UuMkvGo/4TcrBlFj3K0HIrSlachIUrTHzqsGmxCL3I6QG6k83JPdxgbXSFGS+BILq0yZeLHgpkww==", + "node_modules/istanbul-lib-report/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==", "dev": true, - "requires": { - "@types/node": "*" + "engines": { + "node": ">=8" } }, - "@types/ttf2woff": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/ttf2woff/-/ttf2woff-2.0.4.tgz", - "integrity": "sha512-pD66iwSkU5lIMWWTz5sxIMjwM7/qs/EYgE01vqu5C3S1izONHiF1GRy2dWvlKMlC39TfZszP7+OVXgVk3BccOg==", + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "requires": { - "@types/node": "*" + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "dev": true - }, - "@types/wawoff2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/wawoff2/-/wawoff2-1.0.2.tgz", - "integrity": "sha512-UVq4NxMuBywz5gklafg1HcENrK02trh/q+ifyvO6xktflGXRtf11GYsia3/l5nxg2edFQRlnUT6ivnk898WDiw==", + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", "dev": true, - "requires": { - "@types/node": "*" + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8" } }, - "@types/web-bluetooth": { - "version": "0.0.21", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", - "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", - "dev": true - }, - "@types/xml2js": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.14.tgz", - "integrity": "sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==", + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "requires": { - "@types/node": "*" + "engines": { + "node": ">=0.10.0" } }, - "@ungap/structured-clone": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.2.tgz", - "integrity": "sha512-5jsZFwgR5rTdKwidH9Qmat75RKwqfpKlWWB1frDkljN127mwqBu8K0PYo7/hFpF03IEJpfVPpCQDY/eDx3iHvA==", - "dev": true - }, - "@vitejs/plugin-vue": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.7.tgz", - "integrity": "sha512-km+p+XdSz9Sxm5rqUbqcSfZYaAniKxWBj1KURl+Jr7UaPvvX7BmaWMdP69I5rrFDeQGyxAG7NXdc57vz+snhWg==", + "node_modules/istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", "dev": true, - "requires": { - "@rolldown/pluginutils": "^1.0.1" + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "@vitest/coverage-v8": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.9.tgz", - "integrity": "sha512-G9/lgqibheLVBDRuya45EbsEXTYcWoSG+TLg7i2axuzx0Eq62eXn+aWXyaVdV5vKvFSWd6ywcX8hA7la9Pvu8g==", + "node_modules/jest": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.1.0.tgz", + "integrity": "sha512-pSQDVwRSwb109Ss13lcMtdfS9r8/w2Zz8+mTUA9VORD66GflCdl8nUFCqM96geOD2EBwWCNURrNAfQsLIDNBdg==", "dev": true, - "requires": { - "@bcoe/v8-coverage": "^1.0.2", - "@vitest/utils": "4.1.9", - "ast-v8-to-istanbul": "^1.0.0", - "istanbul-lib-coverage": "^3.2.2", - "istanbul-lib-report": "^3.0.1", - "istanbul-reports": "^3.2.0", - "magicast": "^0.5.2", - "obug": "^2.1.1", - "std-env": "^4.0.0-rc.1", - "tinyrainbow": "^3.1.0" - }, "dependencies": { - "@bcoe/v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", - "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", - "dev": true + "@jest/core": "^27.1.0", + "import-local": "^3.0.2", + "jest-cli": "^27.1.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true } } }, - "@vitest/expect": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.9.tgz", - "integrity": "sha512-vl/rYsUKcBr3SnQn166+XR5ZQcgMx3DQhFWdfli/cWpLnLUmbxZvyrJZotLFUryib+LtArYMSTJ5RbQ57ZqrlA==", + "node_modules/jest-changed-files": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.1.0.tgz", + "integrity": "sha512-eRcb13TfQw0xiV2E98EmiEgs9a5uaBIqJChyl0G7jR9fCIvGjXovnDS6Zbku3joij4tXYcSK4SE1AXqOlUxjWg==", "dev": true, - "requires": { - "@standard-schema/spec": "^1.1.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.9", - "@vitest/utils": "4.1.9", - "chai": "^6.2.2", - "tinyrainbow": "^3.1.0" + "dependencies": { + "@jest/types": "^27.1.0", + "execa": "^5.0.0", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "@vitest/mocker": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.9.tgz", - "integrity": "sha512-EVkXzBjrPGM+cK8/ANWgBrkUCfJfb38/EfTSO8h7pWvKkyPkpWxvR7BkD2MyItMF62C97zAEoqdpUixwR/e+Rw==", + "node_modules/jest-circus": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.1.0.tgz", + "integrity": "sha512-6FWtHs3nZyZlMBhRf1wvAC5CirnflbGJAY1xssSAnERLiiXQRH+wY2ptBVtXjX4gz4AA2EwRV57b038LmifRbA==", "dev": true, - "requires": { - "@vitest/spy": "4.1.9", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, "dependencies": { - "estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "requires": { - "@types/estree": "^1.0.0" - } - } - } - }, - "@vitest/pretty-format": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.9.tgz", - "integrity": "sha512-s0iufns3iIFitdgm+YR7g1whCAaGtXz459VS9/PqyKDEEFgYIhsHOQmXgIgDuYCt7DeQmiZT0Qe2OA2p4ZPu5A==", + "@jest/environment": "^27.1.0", + "@jest/test-result": "^27.1.0", + "@jest/types": "^27.1.0", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.1.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.1.0", + "jest-matcher-utils": "^27.1.0", + "jest-message-util": "^27.1.0", + "jest-runtime": "^27.1.0", + "jest-snapshot": "^27.1.0", + "jest-util": "^27.1.0", + "pretty-format": "^27.1.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "requires": { - "tinyrainbow": "^3.1.0" + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "@vitest/runner": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.9.tgz", - "integrity": "sha512-KXLMDtc7oe70+3mJfGrPUWPesswH+3sTxAMAMl8DG7I8IUQT4XW718dY5ID3vPUcmlu27CcKfY4P3h3I29SLJg==", + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "requires": { - "@vitest/utils": "4.1.9", - "pathe": "^2.0.3" + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "@vitest/snapshot": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.9.tgz", - "integrity": "sha512-Jc7RKGNBo8Z28WYIm0Niej4xdSPByRf6mU58VpHQkd6Zh05rlnA+twjbK5HyeIGHxrzsc3mJgS43uM0CZKzaIA==", + "node_modules/jest-circus/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "requires": { - "@vitest/pretty-format": "4.1.9", - "@vitest/utils": "4.1.9", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "@vitest/spy": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.9.tgz", - "integrity": "sha512-fHpsS6mIi+PiEW+vcRVOMkX1oSaPKne3VOclSFICPcGOmfKgXPU5iAah+wcNcj2xPrCCmfq99IDGf+EojhhvhA==", + "node_modules/jest-circus/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==", "dev": true }, - "@vitest/utils": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.9.tgz", - "integrity": "sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==", - "dev": true, - "requires": { - "@vitest/pretty-format": "4.1.9", - "convert-source-map": "^2.0.0", - "tinyrainbow": "^3.1.0" - } - }, - "@volar/language-core": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz", - "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==", + "node_modules/jest-circus/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==", "dev": true, - "requires": { - "@volar/source-map": "2.4.28" + "engines": { + "node": ">=8" } }, - "@volar/source-map": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz", - "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==", - "dev": true - }, - "@volar/typescript": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz", - "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==", + "node_modules/jest-circus/node_modules/pretty-format": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.1.0.tgz", + "integrity": "sha512-4aGaud3w3rxAO6OXmK3fwBFQ0bctIOG3/if+jYEFGNGIs0EvuidQm3bZ9mlP2/t9epLNC/12czabfy7TZNSwVA==", "dev": true, - "requires": { - "@volar/language-core": "2.4.28", - "path-browserify": "^1.0.1", - "vscode-uri": "^3.0.8" + "dependencies": { + "@jest/types": "^27.1.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "@vue/compiler-core": { - "version": "3.5.39", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.39.tgz", - "integrity": "sha512-16KBTEXAJCpDr0mwlw+AZyhu8iyC7R3S2vBwsI7QnWJU6X3WKc9VKeNEZpiMdZ569qWhz9574L3vV55qRL0Vtw==", + "node_modules/jest-circus/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, - "requires": { - "@babel/parser": "^7.29.7", - "@vue/shared": "3.5.39", - "entities": "^7.0.1", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.1" + "engines": { + "node": ">=10" }, - "dependencies": { - "entities": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", - "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", - "dev": true - } + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "@vue/compiler-dom": { - "version": "3.5.39", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.39.tgz", - "integrity": "sha512-oQPigALqYbNxTNPvNgSOe+czwVExfbVF02lz8jP0S3AXJiu3jxYDygNUiqSep4ezzW8XgnubqH63My2A7JR/vg==", + "node_modules/jest-circus/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "requires": { - "@vue/compiler-core": "3.5.39", - "@vue/shared": "3.5.39" + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "@vue/compiler-sfc": { - "version": "3.5.39", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.39.tgz", - "integrity": "sha512-d0ki86iOyN8LoZPBmk5SJWNwHP19CnDDCfuo//+2WJa2g5Ke0Jay983PIBIcSSzldC68I8DrD5GrHV3OSDfodg==", + "node_modules/jest-cli": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.1.0.tgz", + "integrity": "sha512-h6zPUOUu+6oLDrXz0yOWY2YXvBLk8gQinx4HbZ7SF4V3HzasQf+ncoIbKENUMwXyf54/6dBkYXvXJos+gOHYZw==", "dev": true, - "requires": { - "@babel/parser": "^7.29.7", - "@vue/compiler-core": "3.5.39", - "@vue/compiler-dom": "3.5.39", - "@vue/compiler-ssr": "3.5.39", - "@vue/shared": "3.5.39", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.21", - "postcss": "^8.5.15", - "source-map-js": "^1.2.1" + "dependencies": { + "@jest/core": "^27.1.0", + "@jest/test-result": "^27.1.0", + "@jest/types": "^27.1.0", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "jest-config": "^27.1.0", + "jest-util": "^27.1.0", + "jest-validate": "^27.1.0", + "prompts": "^2.0.1", + "yargs": "^16.0.3" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "@vue/compiler-ssr": { - "version": "3.5.39", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.39.tgz", - "integrity": "sha512-Ce7/wvwMHai74bdszfXExdazFigYnlF9zgCmEQUcM1j0fOymlouZ7XilTYNo8oUjhlnjYOZbGrcYKuqjz89Ucw==", + "node_modules/jest-cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "requires": { - "@vue/compiler-dom": "3.5.39", - "@vue/shared": "3.5.39" + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "@vue/devtools-api": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-8.1.5.tgz", - "integrity": "sha512-YJipMVAKe5wT5CWf5kTYCaNV7NMNjFVxJkIkJaJ4W/nCxEBzlZzrOsYKeCymdCrFZmBS/+wTWFoUs3Jf/Q6XSQ==", + "node_modules/jest-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "requires": { - "@vue/devtools-kit": "^8.1.5" + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "@vue/devtools-kit": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-8.1.5.tgz", - "integrity": "sha512-FcSAxsi4eWuXLCB7Rv9lj0aIVHHPNVQ2BazGf4RJTc2JCqb4BQg0hk87ZFhminCfl+mD5OUI0rX2cgyu4kJOGA==", + "node_modules/jest-cli/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "requires": { - "@vue/devtools-shared": "^8.1.5", - "birpc": "^2.6.1", - "hookable": "^5.5.3", - "perfect-debounce": "^2.0.0" + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "@vue/devtools-shared": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-8.1.5.tgz", - "integrity": "sha512-mhT4zcPFhF+Xk1O4BfhhrbXzpmfqY03fS6xGpcllbQG7lDjhQf8pQHcTIhqQIYx1hfwtHmk/6jM96ele0UxPqQ==", + "node_modules/jest-cli/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==", "dev": true }, - "@vue/reactivity": { - "version": "3.5.39", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.39.tgz", - "integrity": "sha512-TpsuBJ9gGlZa5d23XcM2y8EXanz9dZeVDQBXRwzy46ItgvM+rWpzs+UVM0wcRLxGvcav0HE5jz2gNL53xlRAog==", + "node_modules/jest-cli/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==", "dev": true, - "requires": { - "@vue/shared": "3.5.39" + "engines": { + "node": ">=8" } }, - "@vue/runtime-core": { - "version": "3.5.39", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.39.tgz", - "integrity": "sha512-9GLtNyRvPAUMbX+7ono0RC2j0guo2LXVi8LvcmAooImACUKm0oFf0jjwbX8/H0AE/t1nxhAkn8RSl9PMCzzxZw==", + "node_modules/jest-cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "requires": { - "@vue/reactivity": "3.5.39", - "@vue/shared": "3.5.39" + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "@vue/runtime-dom": { - "version": "3.5.39", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.39.tgz", - "integrity": "sha512-7Y6aAGboKcXAZ3ECuUy7RrS5yy2r47dhTp2SKaJmYxjopImaVFaNa5Ne66NwGovsrxVAl5S5rwc7m22UG7Lmww==", + "node_modules/jest-config": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.1.0.tgz", + "integrity": "sha512-GMo7f76vMYUA3b3xOdlcKeKQhKcBIgurjERO2hojo0eLkKPGcw7fyIoanH+m6KOP2bLad+fGnF8aWOJYxzNPeg==", "dev": true, - "requires": { - "@vue/reactivity": "3.5.39", - "@vue/runtime-core": "3.5.39", - "@vue/shared": "3.5.39", - "csstype": "^3.2.3" + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^27.1.0", + "@jest/types": "^27.1.0", + "babel-jest": "27.1.0", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "is-ci": "^3.0.0", + "jest-circus": "^27.1.0", + "jest-environment-jsdom": "^27.1.0", + "jest-environment-node": "^27.1.0", + "jest-get-type": "^27.0.6", + "jest-jasmine2": "^27.1.0", + "jest-regex-util": "^27.0.6", + "jest-resolve": "^27.1.0", + "jest-runner": "^27.1.0", + "jest-util": "^27.1.0", + "jest-validate": "^27.1.0", + "micromatch": "^4.0.4", + "pretty-format": "^27.1.0" + }, + "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 + } } }, - "@vue/server-renderer": { - "version": "3.5.39", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.39.tgz", - "integrity": "sha512-yZSakiAGw85rZfG7UM8akMnIF+FmeiNk47uvHf2nVBBSe+dIKUhZuZq9+XgJhbV3nS5Z4ALH23/MpXofW+mbcw==", + "node_modules/jest-config/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "requires": { - "@vue/compiler-ssr": "3.5.39", - "@vue/shared": "3.5.39" + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "@vue/shared": { - "version": "3.5.39", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.39.tgz", - "integrity": "sha512-l1rrBtBfTnmxvtsvdQDXltUUy8S1Y+ZaqdfUzmAnJkTd8Z8rv5v/ytW+TKiqEOWyHPoqtPlNFSs0lhRmYVSHVA==", - "dev": true - }, - "@vueuse/core": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-14.3.0.tgz", - "integrity": "sha512-aHfz47g0ZhMtTVHmIzMVpJy8ePhhOy68GY5bv110+5DVtZ+W7BsOx+m61UNQqfrWyPztIHIanWa3E2tib3NFIw==", + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "requires": { - "@types/web-bluetooth": "^0.0.21", - "@vueuse/metadata": "14.3.0", - "@vueuse/shared": "14.3.0" + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "@vueuse/integrations": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-14.3.0.tgz", - "integrity": "sha512-76I5FT2ESvCmCaSwapI+a/u/CFtNXmzl9f9lNp1hRtx8vKB8hfiokJr8IvQqcQG5ckGXElyXK516b54ozV3MvA==", + "node_modules/jest-config/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "requires": { - "@vueuse/core": "14.3.0", - "@vueuse/shared": "14.3.0" + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "@vueuse/metadata": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-14.3.0.tgz", - "integrity": "sha512-BwxmbAzwAVF50+MW57GXOUEV61nFBGnlBvrTqj49PqWJu3uw7hdu72ztXeZ33RdZtDY6kO+bfCAE1PCn88Tktw==", + "node_modules/jest-config/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==", "dev": true }, - "@vueuse/shared": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-14.3.0.tgz", - "integrity": "sha512-bZpge9eSXwa4ToSiqJ7j6KRwhAsneMFoSz3LMWKQDkqimm3D/tbFlrklrs/IOqC8tEcYmXQZJ6N0UrjhBirVCg==", + "node_modules/jest-config/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==", "dev": true, - "requires": {} - }, - "@xmldom/xmldom": { - "version": "0.9.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.9.10.tgz", - "integrity": "sha512-A9gOqLdi6cV4ibazAjcQufGj0B1y/vDqYrcuP6d/6x8P27gRS8643Dj9o1dEKtB6O7fwxb2FgBmJS2mX7gpvdw==" - }, - "a-sync-waterfall": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", - "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==" + "engines": { + "node": ">=8" + } }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true + "node_modules/jest-config/node_modules/jest-get-type": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz", + "integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } }, - "acorn": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", - "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", - "dev": true + "node_modules/jest-config/node_modules/pretty-format": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.1.0.tgz", + "integrity": "sha512-4aGaud3w3rxAO6OXmK3fwBFQ0bctIOG3/if+jYEFGNGIs0EvuidQm3bZ9mlP2/t9epLNC/12czabfy7TZNSwVA==", + "dev": true, + "dependencies": { + "@jest/types": "^27.1.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } }, - "ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==" + "node_modules/jest-config/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, - "ansi-escapes": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", - "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", + "node_modules/jest-config/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "requires": { - "environment": "^1.0.0" + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true + "node_modules/jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } }, - "ansi-styles": { + "node_modules/jest-diff/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "requires": { + "dependencies": { "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, - "requires": { - "sprintf-js": "~1.0.2" + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", - "dev": true - }, - "array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" - }, - "assertion-error": { + "node_modules/jest-diff/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true - }, - "ast-v8-to-istanbul": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.4.tgz", - "integrity": "sha512-0bC0/4bTSrnwdhU3IsZDwEdojvuPrSg59OYZfKsLRtJZ0u8VBx9DebfqqG8bRdCC0I7vjgxmPi41P0lpkhJHtA==", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.31", - "estree-walker": "^3.0.3", - "js-tokens": "^10.0.0" - }, "dependencies": { - "estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "requires": { - "@types/estree": "^1.0.0" - } - }, - "js-tokens": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", - "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", - "dev": true - } + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true - }, - "b3b": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/b3b/-/b3b-0.0.1.tgz", - "integrity": "sha1-/2n4pY2JGscysgF15HVGeZdU75s=", - "dev": true - }, - "balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==" - }, - "birpc": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", - "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "node_modules/jest-diff/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==", "dev": true }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" - }, - "brace-expansion": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", - "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", - "requires": { - "balanced-match": "^4.0.2" + "node_modules/jest-diff/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==", + "dev": true, + "engines": { + "node": ">=8" } }, - "braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "requires": { - "fill-range": "^7.1.1" + "node_modules/jest-diff/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + "node_modules/jest-docblock": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.0.6.tgz", + "integrity": "sha512-Fid6dPcjwepTFraz0YxIMCi7dejjJ/KL9FBjPYhBp4Sv1Y9PdhImlKZqYU555BlN4TQKaTc+F2Av1z+anVyGkA==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } }, - "ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "dev": true + "node_modules/jest-each": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.1.0.tgz", + "integrity": "sha512-K/cNvQlmDqQMRHF8CaQ0XPzCfjP5HMJc2bIJglrIqI9fjwpNqITle63IWE+wq4p+3v+iBgh7Wq0IdGpLx5xjDg==", + "dev": true, + "dependencies": { + "@jest/types": "^27.1.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.0.6", + "jest-util": "^27.1.0", + "pretty-format": "^27.1.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } }, - "chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true + "node_modules/jest-each/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, - "chalk": { + "node_modules/jest-each/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "requires": { + "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "dev": true - }, - "character-entities-legacy": { - "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==", - "dev": true + "node_modules/jest-each/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } }, - "cjs-module-lexer": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", - "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "node_modules/jest-each/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==", "dev": true }, - "cli-highlight": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", - "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "node_modules/jest-each/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==", "dev": true, - "requires": { - "chalk": "^4.0.0", - "highlight.js": "^10.7.1", - "mz": "^2.4.0", - "parse5": "^5.1.1", - "parse5-htmlparser2-tree-adapter": "^6.0.0", - "yargs": "^16.0.0" + "engines": { + "node": ">=8" } }, - "cli-table3": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "node_modules/jest-each/node_modules/jest-get-type": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz", + "integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==", "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each/node_modules/pretty-format": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.1.0.tgz", + "integrity": "sha512-4aGaud3w3rxAO6OXmK3fwBFQ0bctIOG3/if+jYEFGNGIs0EvuidQm3bZ9mlP2/t9epLNC/12czabfy7TZNSwVA==", + "dev": true, + "dependencies": { + "@jest/types": "^27.1.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.1.0.tgz", + "integrity": "sha512-JbwOcOxh/HOtsj56ljeXQCUJr3ivnaIlM45F5NBezFLVYdT91N5UofB1ux2B1CATsQiudcHdgTaeuqGXJqjJYQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.1.0", + "@jest/fake-timers": "^27.1.0", + "@jest/types": "^27.1.0", + "@types/node": "*", + "jest-mock": "^27.1.0", + "jest-util": "^27.1.0", + "jsdom": "^16.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.1.0.tgz", + "integrity": "sha512-JIyJ8H3wVyM4YCXp7njbjs0dIT87yhGlrXCXhDKNIg1OjurXr6X38yocnnbXvvNyqVTqSI4M9l+YfPKueqL1lw==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.1.0", + "@jest/fake-timers": "^27.1.0", + "@jest/types": "^27.1.0", + "@types/node": "*", + "jest-mock": "^27.1.0", + "jest-util": "^27.1.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-haste-map": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.1.0.tgz", + "integrity": "sha512-7mz6LopSe+eA6cTFMf10OfLLqRoIPvmMyz5/OnSXnHO7hB0aDP1iIeLWCXzAcYU5eIJVpHr12Bk9yyq2fTW9vg==", + "dev": true, + "dependencies": { + "@jest/types": "^27.1.0", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^27.0.6", + "jest-serializer": "^27.0.6", + "jest-util": "^27.1.0", + "jest-worker": "^27.1.0", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-jasmine2": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.1.0.tgz", + "integrity": "sha512-Z/NIt0wBDg3przOW2FCWtYjMn3Ip68t0SL60agD/e67jlhTyV3PIF8IzT9ecwqFbeuUSO2OT8WeJgHcalDGFzQ==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^27.1.0", + "@jest/source-map": "^27.0.6", + "@jest/test-result": "^27.1.0", + "@jest/types": "^27.1.0", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.1.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.1.0", + "jest-matcher-utils": "^27.1.0", + "jest-message-util": "^27.1.0", + "jest-runtime": "^27.1.0", + "jest-snapshot": "^27.1.0", + "jest-util": "^27.1.0", + "pretty-format": "^27.1.0", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-jasmine2/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-jasmine2/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-jasmine2/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==", + "dev": true + }, + "node_modules/jest-jasmine2/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-jasmine2/node_modules/pretty-format": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.1.0.tgz", + "integrity": "sha512-4aGaud3w3rxAO6OXmK3fwBFQ0bctIOG3/if+jYEFGNGIs0EvuidQm3bZ9mlP2/t9epLNC/12czabfy7TZNSwVA==", + "dev": true, + "dependencies": { + "@jest/types": "^27.1.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-jasmine2/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-leak-detector": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.1.0.tgz", + "integrity": "sha512-oHvSkz1E80VyeTKBvZNnw576qU+cVqRXUD3/wKXh1zpaki47Qty2xeHg2HKie9Hqcd2l4XwircgNOWb/NiGqdA==", + "dev": true, + "dependencies": { + "jest-get-type": "^27.0.6", + "pretty-format": "^27.1.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-leak-detector/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-leak-detector/node_modules/jest-get-type": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz", + "integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-leak-detector/node_modules/pretty-format": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.1.0.tgz", + "integrity": "sha512-4aGaud3w3rxAO6OXmK3fwBFQ0bctIOG3/if+jYEFGNGIs0EvuidQm3bZ9mlP2/t9epLNC/12czabfy7TZNSwVA==", + "dev": true, + "dependencies": { + "@jest/types": "^27.1.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.1.0.tgz", + "integrity": "sha512-VmAudus2P6Yt/JVBRdTPFhUzlIN8DYJd+et5Rd9QDsO/Z82Z4iwGjo43U8Z+PTiz8CBvKvlb6Fh3oKy39hykkQ==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.1.0", + "jest-get-type": "^27.0.6", + "pretty-format": "^27.1.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-matcher-utils/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==", + "dev": true + }, + "node_modules/jest-matcher-utils/node_modules/diff-sequences": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz", + "integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-matcher-utils/node_modules/jest-diff": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.1.0.tgz", + "integrity": "sha512-rjfopEYl58g/SZTsQFmspBODvMSytL16I+cirnScWTLkQVXYVZfxm78DFfdIIXc05RCYuGjxJqrdyG4PIFzcJg==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.0.6", + "jest-get-type": "^27.0.6", + "pretty-format": "^27.1.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/jest-get-type": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz", + "integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/pretty-format": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.1.0.tgz", + "integrity": "sha512-4aGaud3w3rxAO6OXmK3fwBFQ0bctIOG3/if+jYEFGNGIs0EvuidQm3bZ9mlP2/t9epLNC/12czabfy7TZNSwVA==", + "dev": true, + "dependencies": { + "@jest/types": "^27.1.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.1.0.tgz", + "integrity": "sha512-Eck8NFnJ5Sg36R9XguD65cf2D5+McC+NF5GIdEninoabcuoOfWrID5qJhufq5FB0DRKoiyxB61hS7MKoMD0trQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.1.0", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.4", + "pretty-format": "^27.1.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-message-util/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==", + "dev": true + }, + "node_modules/jest-message-util/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.1.0.tgz", + "integrity": "sha512-4aGaud3w3rxAO6OXmK3fwBFQ0bctIOG3/if+jYEFGNGIs0EvuidQm3bZ9mlP2/t9epLNC/12czabfy7TZNSwVA==", + "dev": true, + "dependencies": { + "@jest/types": "^27.1.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-mock": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.1.0.tgz", + "integrity": "sha512-iT3/Yhu7DwAg/0HvvLCqLvrTKTRMyJlrrfJYWzuLSf9RCAxBoIXN3HoymZxMnYsC3eD8ewGbUa9jUknwBenx2w==", + "dev": true, + "dependencies": { + "@jest/types": "^27.1.0", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.0.6.tgz", + "integrity": "sha512-SUhPzBsGa1IKm8hx2F4NfTGGp+r7BXJ4CulsZ1k2kI+mGLG+lxGrs76veN2LF/aUdGosJBzKgXmNCw+BzFqBDQ==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.1.0.tgz", + "integrity": "sha512-TXvzrLyPg0vLOwcWX38ZGYeEztSEmW+cQQKqc4HKDUwun31wsBXwotRlUz4/AYU/Fq4GhbMd/ileIWZEtcdmIA==", + "dev": true, + "dependencies": { + "@jest/types": "^27.1.0", + "chalk": "^4.0.0", + "escalade": "^3.1.1", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.1.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.1.0", + "jest-validate": "^27.1.0", + "resolve": "^1.20.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.1.0.tgz", + "integrity": "sha512-Kq5XuDAELuBnrERrjFYEzu/A+i2W7l9HnPWqZEeKGEQ7m1R+6ndMbdXCVCx29Se1qwLZLgvoXwinB3SPIaitMQ==", + "dev": true, + "dependencies": { + "@jest/types": "^27.1.0", + "jest-regex-util": "^27.0.6", + "jest-snapshot": "^27.1.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-resolve/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==", + "dev": true + }, + "node_modules/jest-resolve/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.1.0.tgz", + "integrity": "sha512-ZWPKr9M5w5gDplz1KsJ6iRmQaDT/yyAFLf18fKbb/+BLWsR1sCNC2wMT0H7pP3gDcBz0qZ6aJraSYUNAGSJGaw==", + "dev": true, + "dependencies": { + "@jest/console": "^27.1.0", + "@jest/environment": "^27.1.0", + "@jest/test-result": "^27.1.0", + "@jest/transform": "^27.1.0", + "@jest/types": "^27.1.0", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-docblock": "^27.0.6", + "jest-environment-jsdom": "^27.1.0", + "jest-environment-node": "^27.1.0", + "jest-haste-map": "^27.1.0", + "jest-leak-detector": "^27.1.0", + "jest-message-util": "^27.1.0", + "jest-resolve": "^27.1.0", + "jest-runtime": "^27.1.0", + "jest-util": "^27.1.0", + "jest-worker": "^27.1.0", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runner/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==", + "dev": true + }, + "node_modules/jest-runner/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.1.0.tgz", + "integrity": "sha512-okiR2cpGjY0RkWmUGGado6ETpFOi9oG3yV0CioYdoktkVxy5Hv0WRLWnJFuArSYS8cHMCNcceUUMGiIfgxCO9A==", + "dev": true, + "dependencies": { + "@jest/console": "^27.1.0", + "@jest/environment": "^27.1.0", + "@jest/fake-timers": "^27.1.0", + "@jest/globals": "^27.1.0", + "@jest/source-map": "^27.0.6", + "@jest/test-result": "^27.1.0", + "@jest/transform": "^27.1.0", + "@jest/types": "^27.1.0", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.1.0", + "jest-message-util": "^27.1.0", + "jest-mock": "^27.1.0", + "jest-regex-util": "^27.0.6", + "jest-resolve": "^27.1.0", + "jest-snapshot": "^27.1.0", + "jest-util": "^27.1.0", + "jest-validate": "^27.1.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^16.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runtime/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==", + "dev": true + }, + "node_modules/jest-runtime/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-serializer": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.0.6.tgz", + "integrity": "sha512-PtGdVK9EGC7dsaziskfqaAPib6wTViY3G8E5wz9tLVPhHyiDNTZn/xjZ4khAw+09QkoOVpn7vF5nPSN6dtBexA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.1.0.tgz", + "integrity": "sha512-eaeUBoEjuuRwmiRI51oTldUsKOohB1F6fPqWKKILuDi/CStxzp2IWekVUXbuHHoz5ik33ioJhshiHpgPFbYgcA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/parser": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.1.0", + "@jest/types": "^27.1.0", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.1.0", + "graceful-fs": "^4.2.4", + "jest-diff": "^27.1.0", + "jest-get-type": "^27.0.6", + "jest-haste-map": "^27.1.0", + "jest-matcher-utils": "^27.1.0", + "jest-message-util": "^27.1.0", + "jest-resolve": "^27.1.0", + "jest-util": "^27.1.0", + "natural-compare": "^1.4.0", + "pretty-format": "^27.1.0", + "semver": "^7.3.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-snapshot/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==", + "dev": true + }, + "node_modules/jest-snapshot/node_modules/diff-sequences": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz", + "integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot/node_modules/jest-diff": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.1.0.tgz", + "integrity": "sha512-rjfopEYl58g/SZTsQFmspBODvMSytL16I+cirnScWTLkQVXYVZfxm78DFfdIIXc05RCYuGjxJqrdyG4PIFzcJg==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.0.6", + "jest-get-type": "^27.0.6", + "pretty-format": "^27.1.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-get-type": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz", + "integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/pretty-format": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.1.0.tgz", + "integrity": "sha512-4aGaud3w3rxAO6OXmK3fwBFQ0bctIOG3/if+jYEFGNGIs0EvuidQm3bZ9mlP2/t9epLNC/12czabfy7TZNSwVA==", + "dev": true, + "dependencies": { + "@jest/types": "^27.1.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.1.0.tgz", + "integrity": "sha512-edSLD2OneYDKC6gZM1yc+wY/877s/fuJNoM1k3sOEpzFyeptSmke3SLnk1dDHk9CgTA+58mnfx3ew3J11Kes/w==", + "dev": true, + "dependencies": { + "@jest/types": "^27.1.0", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^3.0.0", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-util/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==", + "dev": true + }, + "node_modules/jest-util/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.1.0.tgz", + "integrity": "sha512-QiJ+4XuSuMsfPi9zvdO//IrSRSlG6ybJhOpuqYSsuuaABaNT84h0IoD6vvQhThBOKT+DIKvl5sTM0l6is9+SRA==", + "dev": true, + "dependencies": { + "@jest/types": "^27.1.0", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.0.6", + "leven": "^3.1.0", + "pretty-format": "^27.1.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-validate/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==", + "dev": true + }, + "node_modules/jest-validate/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate/node_modules/jest-get-type": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz", + "integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate/node_modules/pretty-format": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.1.0.tgz", + "integrity": "sha512-4aGaud3w3rxAO6OXmK3fwBFQ0bctIOG3/if+jYEFGNGIs0EvuidQm3bZ9mlP2/t9epLNC/12czabfy7TZNSwVA==", + "dev": true, + "dependencies": { + "@jest/types": "^27.1.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.1.0.tgz", + "integrity": "sha512-ivaWTrA46aHWdgPDgPypSHiNQjyKnLBpUIHeBaGg11U+pDzZpkffGlcB1l1a014phmG0mHgkOHtOgiqJQM6yKQ==", + "dev": true, + "dependencies": { + "@jest/test-result": "^27.1.0", + "@jest/types": "^27.1.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.1.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-watcher/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-watcher/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==", + "dev": true + }, + "node_modules/jest-watcher/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.1.0.tgz", + "integrity": "sha512-mO4PHb2QWLn9yRXGp7rkvXLAYuxwhq1ZYUo0LoDhg8wqvv4QizP1ZWEJOeolgbEgAWZLIEU0wsku8J+lGWfBhg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "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==" + }, + "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==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "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.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/acorn": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "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==" + }, + "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==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + }, + "node_modules/lint-staged": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-11.1.2.tgz", + "integrity": "sha512-6lYpNoA9wGqkL6Hew/4n1H6lRqF3qCsujVT0Oq5Z4hiSAM7S6NksPJ3gnr7A7R52xCtiZMcEUNNQ6d6X5Bvh9w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.1", + "cli-truncate": "^2.1.0", + "commander": "^7.2.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.3.1", + "enquirer": "^2.3.6", + "execa": "^5.0.0", + "listr2": "^3.8.2", + "log-symbols": "^4.1.0", + "micromatch": "^4.0.4", + "normalize-path": "^3.0.0", + "please-upgrade-node": "^3.2.0", + "string-argv": "0.3.1", + "stringify-object": "^3.3.0" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/lint-staged/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==", + "dev": true + }, + "node_modules/lint-staged/node_modules/cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lint-staged/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/lint-staged/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==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/lint-staged/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/listr2": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.11.0.tgz", + "integrity": "sha512-XLJVe2JgXCyQTa3FbSv11lkKExYmEyA4jltVo8z4FX10Vt1Yj8IMekBfwim0BSOM9uj1QMTJvDQQpHyuPbB/dQ==", + "dev": true, + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^1.2.2", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rxjs": "^6.6.7", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + } + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "node_modules/lodash.ismatch": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", + "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/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==", + "dev": true + }, + "node_modules/log-symbols/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-update/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==", + "dev": true + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.4" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "dependencies": { + "tmpl": "1.0.x" + } + }, + "node_modules/map-obj": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz", + "integrity": "sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "node_modules/meow/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "engines": { + "node": ">=10" + }, + "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==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/microbuffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/microbuffer/-/microbuffer-1.0.0.tgz", + "integrity": "sha1-izgy7UDIfVH0e7I0kTppinVtGdI=" + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", + "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.32", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", + "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "dev": true, + "dependencies": { + "mime-db": "1.49.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true + }, + "node_modules/multimap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multimap/-/multimap-1.1.0.tgz", + "integrity": "sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/neatequal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/neatequal/-/neatequal-1.0.0.tgz", + "integrity": "sha1-LuEhG8n6bkxVcV/SELsFYC6xrjs=", + "dependencies": { + "varstream": "^0.3.2" + } + }, + "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==", + "dev": true + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node_modules/node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-releases": { + "version": "1.1.75", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.75.tgz", + "integrity": "sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.2.tgz", + "integrity": "sha512-6CdZocmfGaKnIHPVFhJJZ3GuR8SsLKvDANFp47Jmy51aKIr8akjAWTSxtpI+MBgBFdSMRyo4hMpDlT6dTffgZg==", + "dependencies": { + "hosted-git-info": "^4.0.1", + "resolve": "^1.20.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/null-check": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", + "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nunjucks": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.3.tgz", + "integrity": "sha512-psb6xjLj47+fE76JdZwskvwG4MYsQKXUtMsPh6U0YMvmyjRtKRFcxnlXGWglNybtNTNVmGdp94K62/+NjF5FDQ==", + "dependencies": { + "a-sync-waterfall": "^1.0.0", + "asap": "^2.0.3", + "commander": "^5.1.0" + }, + "bin": { + "nunjucks-precompile": "bin/precompile" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "chokidar": "^3.3.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/nunjucks/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "node_modules/object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", + "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "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==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/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==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/parent-module": { + "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==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module/node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "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/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "dependencies": { + "node-modules-regexp": "^1.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "dependencies": { + "semver-compare": "^1.0.0" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/pretty-format/node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/pretty-format/node_modules/@types/yargs": { + "version": "15.0.14", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", + "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-format/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/pretty-format/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/pretty-format/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==", + "dev": true + }, + "node_modules/pretty-format/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-format/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/prompts": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", + "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "engines": { + "node": ">=8" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexp-tree": { + "version": "0.1.23", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.23.tgz", + "integrity": "sha512-+7HWfb4Bvu8Rs2eQTUIpX9I/PlQkYOuTNbRpKLJlQpSgwSkzFYh+pUj0gtvglnOZLKB6YgnIgRuJ2/IlpL48qw==", + "dev": true, + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", + "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.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": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "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==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "2.56.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.56.3.tgz", + "integrity": "sha512-Au92NuznFklgQCUcV96iXlxUbHuB1vQMaH76DHl5M11TotjOHwqk9CwcrT78+Tnv4FN9uTBxq6p4EJoYkpyekg==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/rxjs/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/safe-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", + "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", + "dev": true, + "dependencies": { + "regexp-tree": "~0.1.1" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/slice-ansi/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==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", + "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==" + }, + "node_modules/split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "node_modules/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/standard-version": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-9.3.1.tgz", + "integrity": "sha512-5qMxXw/FxLouC5nANyx/5RY1kiorJx9BppUso8gN07MG64q2uLRmrPb4KfXp3Ql4s/gxjZwZ89e0FwxeLubGww==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "conventional-changelog": "3.1.24", + "conventional-changelog-config-spec": "2.1.0", + "conventional-changelog-conventionalcommits": "4.5.0", + "conventional-recommended-bump": "6.1.0", + "detect-indent": "^6.0.0", + "detect-newline": "^3.1.0", + "dotgitignore": "^2.1.0", + "figures": "^3.1.0", + "find-up": "^5.0.0", + "fs-access": "^1.0.1", + "git-semver-tags": "^4.0.0", + "semver": "^7.1.1", + "stringify-package": "^1.0.1", + "yargs": "^16.0.0" + }, + "bin": { + "standard-version": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/standard-version/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==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/standard-version/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==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/standard-version/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==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/standard-version/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/stringify-object/node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stringify-package": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.1.tgz", + "integrity": "sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==", + "dev": true + }, + "node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "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==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/svg-pathdata": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-6.0.0.tgz", + "integrity": "sha512-8XoCZjKbP0fvJbDsm6KFxVau2N3SkWkMj8OniADm87q4OiFXk/gSgri5Uyr8hE1fQ9npI+9XzRlTUObgWmBBNw==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/svg2ttf": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/svg2ttf/-/svg2ttf-6.0.3.tgz", + "integrity": "sha512-CgqMyZrbOPpc+WqH7aga4JWkDPso23EgypLsbQ6gN3uoPWwwiLjXvzgrwGADBExvCRJrWFzAeK1bSoSpE7ixSQ==", + "dependencies": { + "@xmldom/xmldom": "^0.7.2", + "argparse": "^2.0.1", + "cubic2quad": "^1.2.1", + "lodash": "^4.17.10", + "microbuffer": "^1.0.0", + "svgpath": "^2.1.5" + }, + "bin": { + "svg2ttf": "svg2ttf.js" + } + }, + "node_modules/svg2ttf/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==" + }, + "node_modules/svgicons2svgfont": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/svgicons2svgfont/-/svgicons2svgfont-10.0.3.tgz", + "integrity": "sha512-tV0/KV1obxil8iHxTh+XpceIRFAgC1vHBreF7J9ke6K1U6QZAoUHxGzdP/e1NLdU6GVivL08f4W8PgcHyZWBhQ==", + "dependencies": { + "commander": "^7.2.0", + "geometry-interfaces": "^1.1.4", + "glob": "^7.1.6", + "neatequal": "^1.0.0", + "readable-stream": "^3.4.0", + "sax": "^1.2.4", + "svg-pathdata": "^6.0.0" + }, + "bin": { + "svgicons2svgfont": "bin/svgicons2svgfont.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/svgpath": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/svgpath/-/svgpath-2.3.1.tgz", + "integrity": "sha512-wNz6lCoj+99GMoyU7SozTfPqiLHz6WcJYZ30Z+F4lF/gPtxWHBCpZ4DhoDI0+oZ0dObKyYsJdSPGbL2mJq/qCg==" + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", + "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/table/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/table/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==", + "dev": true + }, + "node_modules/table/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==", + "dev": true + }, + "node_modules/table/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/throat": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", + "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "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": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/trim-off-newlines": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", + "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ts-node": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.2.1.tgz", + "integrity": "sha512-hCnyOyuGmD5wHleOQX6NIjJtYVIO8bPP8F2acWkB4W06wdlkgyvJtubO/I9NkI88hCFECbsEgoLc0VNkYmcSfw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "0.6.1", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "engines": { + "node": ">=12.0.0" + }, + "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 + } + } + }, + "node_modules/ts-node/node_modules/acorn": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz", + "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ts-node/node_modules/acorn-walk": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.1.1.tgz", + "integrity": "sha512-FbJdceMlPHEAWJOILDk1fXD8lnTlEIWFkqtfk+MvmL5q/qlHfN7GEHcsFZWt/Tea9jRNPWUZG4G976nqAAmU9w==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz", + "integrity": "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "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" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/ttf2eot": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ttf2eot/-/ttf2eot-2.0.0.tgz", + "integrity": "sha1-jmM3pYWr0WCKDISVirSDzmn2ZUs=", + "dependencies": { + "argparse": "^1.0.6", + "microbuffer": "^1.0.0" + }, + "bin": { + "ttf2eot": "ttf2eot.js" + } + }, + "node_modules/ttf2woff": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ttf2woff/-/ttf2woff-3.0.0.tgz", + "integrity": "sha512-OvmFcj70PhmAsVQKfC15XoKH55cRWuaRzvr2fpTNhTNer6JBpG8n6vOhRrIgxMjcikyYt88xqYXMMVapJ4Rjvg==", + "dependencies": { + "argparse": "^2.0.1", + "pako": "^1.0.0" + }, + "bin": { + "ttf2woff": "ttf2woff.js" + } + }, + "node_modules/ttf2woff/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==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "node_modules/typedarray-to-buffer": { + "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==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", + "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/uglify-js": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.0.tgz", + "integrity": "sha512-R/tiGB1ZXp2BC+TkRGLwj8xUZgdfT2f4UZEgX6aVjJ5uttPrr4fYmwTWDGqVnBCLbOXRMY6nr/BTbwCtVfps0g==", + "dev": true, + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.0.0.tgz", + "integrity": "sha512-LkmXi8UUNxnCC+JlH7/fsfsKr5AU110l+SYGJimWNkWhxbN5EyeOtm1MJ0hhvqMMOhGwBj1Fp70Yv9i+hX0QAg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/varstream": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/varstream/-/varstream-0.3.2.tgz", + "integrity": "sha1-GKxklHZfP/GjWtmkvgU77BiKXeE=", + "dependencies": { + "readable-stream": "^1.0.33" + }, + "bin": { + "json2varstream": "cli/json2varstream.js", + "varstream2json": "cli/varstream2json.js" + }, + "engines": { + "node": ">=0.10.*" + } + }, + "node_modules/varstream/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "node_modules/varstream/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/varstream/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "dependencies": { + "makeerror": "1.0.x" + } + }, + "node_modules/wawoff2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wawoff2/-/wawoff2-2.0.0.tgz", + "integrity": "sha512-5gjFj+fyQO9cMrg5vYaVM7+T37xSHpqUWM/S6UCEiBx8wRmfpvuhYjPM3toB2UujpmWQt1hSPKRo/jIRE/j9Eg==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "woff2_compress.js": "bin/woff2_compress.js", + "woff2_decompress.js": "bin/woff2_decompress.js" + } + }, + "node_modules/wawoff2/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==" + }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true, + "engines": { + "node": ">=10.4" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/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==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "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==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.4.tgz", + "integrity": "sha512-zP9z6GXm6zC27YtspwH99T3qTG7bBFv2VIkeHstMLrLlDJuzA7tQ5ls3OJ1hOGGCzTQPniNJoHXIAOS0Jljohg==", + "dev": true, + "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 + } + } + }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "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/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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" + } + } + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "requires": { + "@babel/highlight": "^7.14.5" + } + }, + "@babel/compat-data": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", + "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", + "dev": true + }, + "@babel/core": { + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.8.tgz", + "integrity": "sha512-/AtaeEhT6ErpDhInbXmjHcUQXH0L0TEgscfcxk1qbOvLuKCa5aZT0SOOtDKFY96/CLROwbLSKyFor6idgNaU4Q==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.8", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-module-transforms": "^7.14.8", + "@babel/helpers": "^7.14.8", + "@babel/parser": "^7.14.8", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.8", + "@babel/types": "^7.14.8", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + } + }, + "@babel/eslint-parser": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.14.7.tgz", + "integrity": "sha512-6WPwZqO5priAGIwV6msJcdc9TsEPzYeYdS/Xuoap+/ihkgN6dzHp2bcAAwyWZ5bLzk0vvjDmKvRwkqNaiJ8BiQ==", + "dev": true, + "requires": { + "eslint-scope": "^5.1.1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.0" + } + }, + "@babel/eslint-plugin": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/eslint-plugin/-/eslint-plugin-7.14.5.tgz", + "integrity": "sha512-nzt/YMnOOIRikvSn2hk9+W2omgJBy6U8TN0R+WTTmqapA+HnZTuviZaketdTE9W7/k/+E/DfZlt1ey1NSE39pg==", + "dev": true, + "requires": { + "eslint-rule-composer": "^0.3.0" + } + }, + "@babel/generator": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.4.tgz", + "integrity": "sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz", + "integrity": "sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz", + "integrity": "sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", + "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz", + "integrity": "sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", + "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "regexpu-core": "^4.7.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz", + "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz", + "integrity": "sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-function-name": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", + "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", + "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", + "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", + "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-module-imports": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", + "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-module-transforms": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.4.tgz", + "integrity": "sha512-9fHHSGE9zTC++KuXLZcB5FKgvlV83Ox+NLUmQTawovwlJ85+QMhk1CnVk406CQVj97LaWod6KVjl2Sfgw9Aktw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-simple-access": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/helper-validator-identifier": "^7.14.9", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", + "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz", + "integrity": "sha512-v53MxgvMK/HCwckJ1bZrq6dNKlmwlyRNYM6ypaRTdXWGOE2c1/SCa6dL/HimhPulGhZKw9W0QhREM583F/t0vQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-wrap-function": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-replace-supers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", + "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-simple-access": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", + "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz", + "integrity": "sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", + "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==" + }, + "@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz", + "integrity": "sha512-Y2o+H/hRV5W8QhIfTpRIBwl57y8PrZt6JM3V8FOo5qarjshHItyH5lXlpMfBfmBefOqSCpKZs/6Dxqp0E/U+uw==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helpers": { + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.8.tgz", + "integrity": "sha512-ZRDmI56pnV+p1dH6d+UN6GINGz7Krps3+270qqI9UJ4wxYThfAIcI5i7j5vXC4FJ3Wap+S9qcebxeYiqn87DZw==", + "dev": true, + "requires": { + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.8", + "@babel/types": "^7.14.8" + } + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.4.tgz", + "integrity": "sha512-xmzz+7fRpjrvDUj+GV7zfz/R3gSK2cOxGlazaXooxspCr539cbTXJKvBJzSVI2pPhcRGquoOtaIkKCsHQUiO3w==", + "dev": true + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz", + "integrity": "sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.15.4", + "@babel/plugin-proposal-optional-chaining": "^7.14.5" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.15.4.tgz", + "integrity": "sha512-2zt2g5vTXpMC3OmK6uyjvdXptbhBXfA77XGrd3gh93zwG8lZYBLOBImiGBEG0RANu3JqKEACCz5CGk73OJROBw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.15.4", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", + "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.15.4.tgz", + "integrity": "sha512-M682XWrrLNk3chXCjoPUQWOyYsB93B9z3mRyjtqqYJWDf2mfCdIYgDrA11cgNVhAQieaq6F2fn2f3wI0U4aTjA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", + "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", + "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz", + "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", + "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", + "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", + "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz", + "integrity": "sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.14.7", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.14.5" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz", + "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", + "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.15.4.tgz", + "integrity": "sha512-X0UTixkLf0PCCffxgu5/1RQyGGbgZuKoI+vXP4iSbJSYwPb7hu06omsFGBvQ9lJEvwgrxHdS8B5nbfcd8GyUNA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz", + "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", + "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz", + "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", + "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz", + "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz", + "integrity": "sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.15.4.tgz", + "integrity": "sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz", + "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", + "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz", + "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz", + "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz", + "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz", + "integrity": "sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz", + "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz", + "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz", + "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz", + "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.4.tgz", + "integrity": "sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.15.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.15.4.tgz", + "integrity": "sha512-fJUnlQrl/mezMneR72CKCgtOoahqGJNVKpompKwzv3BrEXdlPspTcyxrZ1XmDTIr9PpULrgEQo3qNKp6dW7ssw==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz", + "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz", + "integrity": "sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz", + "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz", + "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.15.4.tgz", + "integrity": "sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz", + "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz", + "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz", + "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz", + "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz", + "integrity": "sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz", + "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz", + "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz", + "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.15.4.tgz", + "integrity": "sha512-sM1/FEjwYjXvMwu1PJStH11kJ154zd/lpY56NQJ5qH2D0mabMv1CAy/kdvS9RP4Xgfj9fBBA3JiSLdDHgXdzOA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-typescript": "^7.14.5" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", + "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz", + "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/preset-env": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.4.tgz", + "integrity": "sha512-4f2nLw+q6ht8gl3sHCmNhmA5W6b1ItLzbH3UrKuJxACHr2eCpk96jwjrAfCAaXaaVwTQGnyUYHY2EWXJGt7TUQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.15.4", + "@babel/plugin-proposal-async-generator-functions": "^7.15.4", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.15.4", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.14.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.15.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", + "@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-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-transform-arrow-functions": "^7.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.15.3", + "@babel/plugin-transform-classes": "^7.15.4", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.7", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.15.4", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.15.4", + "@babel/plugin-transform-modules-systemjs": "^7.15.4", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.9", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.15.4", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.14.6", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.15.4", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.16.0", + "semver": "^6.3.0" + } + }, + "@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/preset-typescript": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.15.0.tgz", + "integrity": "sha512-lt0Y/8V3y06Wq/8H/u0WakrqciZ7Fz7mwPDHWUJAXlABL5hiUG42BNlRXiELNjeWjO5rWmnNKlx+yzJvxezHow==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-typescript": "^7.15.0" + } + }, + "@babel/runtime": { + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz", + "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", + "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/traverse": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", + "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.4.tgz", + "integrity": "sha512-0f1HJFuGmmbrKTCZtbm3cU+b/AqdEYk5toj5iQur58xkVMlS0JWaKxTBSmCXd47uiN7vbcozAupm6Mvs80GNhw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@cspotcode/source-map-consumer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", + "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", + "dev": true + }, + "@cspotcode/source-map-support": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.6.1.tgz", + "integrity": "sha512-DX3Z+T5dt1ockmPdobJS/FAsQPW4V4SrWEhD2iYQT2Cb2tQsiMnYxrcUH9By/Z3B+v0S5LMBkQtV/XOBbpLEOg==", + "dev": true, + "requires": { + "@cspotcode/source-map-consumer": "0.8.0" + } + }, + "@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "globals": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", + "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "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==", + "dev": true + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true + }, + "@hutson/parse-repository-url": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", + "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", + "dev": true + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jest/console": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.1.0.tgz", + "integrity": "sha512-+Vl+xmLwAXLNlqT61gmHEixeRbS4L8MUzAjtpBCOPWH+izNI/dR16IeXjkXJdRtIVWVSf9DO1gdp67B1XorZhQ==", + "dev": true, + "requires": { + "@jest/types": "^27.1.0", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.1.0", + "jest-util": "^27.1.0", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/core": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.1.0.tgz", + "integrity": "sha512-3l9qmoknrlCFKfGdrmiQiPne+pUR4ALhKwFTYyOeKw6egfDwJkO21RJ1xf41rN8ZNFLg5W+w6+P4fUqq4EMRWA==", + "dev": true, + "requires": { + "@jest/console": "^27.1.0", + "@jest/reporters": "^27.1.0", + "@jest/test-result": "^27.1.0", + "@jest/transform": "^27.1.0", + "@jest/types": "^27.1.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^27.1.0", + "jest-config": "^27.1.0", + "jest-haste-map": "^27.1.0", + "jest-message-util": "^27.1.0", + "jest-regex-util": "^27.0.6", + "jest-resolve": "^27.1.0", + "jest-resolve-dependencies": "^27.1.0", + "jest-runner": "^27.1.0", + "jest-runtime": "^27.1.0", + "jest-snapshot": "^27.1.0", + "jest-util": "^27.1.0", + "jest-validate": "^27.1.0", + "jest-watcher": "^27.1.0", + "micromatch": "^4.0.4", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/environment": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.1.0.tgz", + "integrity": "sha512-wRp50aAMY2w1U2jP1G32d6FUVBNYqmk8WaGkiIEisU48qyDV0WPtw3IBLnl7orBeggveommAkuijY+RzVnNDOQ==", + "dev": true, + "requires": { + "@jest/fake-timers": "^27.1.0", + "@jest/types": "^27.1.0", + "@types/node": "*", + "jest-mock": "^27.1.0" + } + }, + "@jest/fake-timers": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.1.0.tgz", + "integrity": "sha512-22Zyn8il8DzpS+30jJNVbTlm7vAtnfy1aYvNeOEHloMlGy1PCYLHa4PWlSws0hvNsMM5bON6GISjkLoQUV3oMA==", + "dev": true, + "requires": { + "@jest/types": "^27.1.0", + "@sinonjs/fake-timers": "^7.0.2", + "@types/node": "*", + "jest-message-util": "^27.1.0", + "jest-mock": "^27.1.0", + "jest-util": "^27.1.0" + } + }, + "@jest/globals": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.1.0.tgz", + "integrity": "sha512-73vLV4aNHAlAgjk0/QcSIzzCZSqVIPbmFROJJv9D3QUR7BI4f517gVdJpSrCHxuRH3VZFhe0yGG/tmttlMll9g==", + "dev": true, + "requires": { + "@jest/environment": "^27.1.0", + "@jest/types": "^27.1.0", + "expect": "^27.1.0" + } + }, + "@jest/reporters": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.1.0.tgz", + "integrity": "sha512-5T/zlPkN2HnK3Sboeg64L5eC8iiaZueLpttdktWTJsvALEtP2YMkC5BQxwjRWQACG9SwDmz+XjjkoxXUDMDgdw==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.1.0", + "@jest/test-result": "^27.1.0", + "@jest/transform": "^27.1.0", + "@jest/types": "^27.1.0", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^27.1.0", + "jest-resolve": "^27.1.0", + "jest-util": "^27.1.0", + "jest-worker": "^27.1.0", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/source-map": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.0.6.tgz", + "integrity": "sha512-Fek4mi5KQrqmlY07T23JRi0e7Z9bXTOOD86V/uS0EIW4PClvPDqZOyFlLpNJheS6QI0FNX1CgmPjtJ4EA/2M+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@jest/test-result": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.1.0.tgz", + "integrity": "sha512-Aoz00gpDL528ODLghat3QSy6UBTD5EmmpjrhZZMK/v1Q2/rRRqTGnFxHuEkrD4z/Py96ZdOHxIWkkCKRpmnE1A==", + "dev": true, + "requires": { + "@jest/console": "^27.1.0", + "@jest/types": "^27.1.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.1.0.tgz", + "integrity": "sha512-lnCWawDr6Z1DAAK9l25o3AjmKGgcutq1iIbp+hC10s/HxnB8ZkUsYq1FzjOoxxZ5hW+1+AthBtvS4x9yno3V1A==", + "dev": true, + "requires": { + "@jest/test-result": "^27.1.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.1.0", + "jest-runtime": "^27.1.0" + } + }, + "@jest/transform": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.1.0.tgz", + "integrity": "sha512-ZRGCA2ZEVJ00ubrhkTG87kyLbN6n55g1Ilq0X9nJb5bX3MhMp3O6M7KG+LvYu+nZRqG5cXsQnJEdZbdpTAV8pQ==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.1.0", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.1.0", + "jest-regex-util": "^27.0.6", + "jest-util": "^27.1.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/types": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.1.0.tgz", + "integrity": "sha512-pRP5cLIzN7I7Vp6mHKRSaZD7YpBTK7hawx5si8trMKqk4+WOdK8NEKOTO2G8PKWD1HbKMVckVB6/XHh/olhf2g==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@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==", + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@rollup/plugin-commonjs": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-20.0.0.tgz", + "integrity": "sha512-5K0g5W2Ol8hAcTHqcTBHiA7M58tfmYi1o9KxeJuuRNpGaTa5iLjcyemBitCBcKXaHamOBBEH2dGom6v6Unmqjg==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.1.0", + "commondir": "^1.0.1", + "estree-walker": "^2.0.1", + "glob": "^7.1.6", + "is-reference": "^1.2.1", + "magic-string": "^0.25.7", + "resolve": "^1.17.0" + } + }, + "@rollup/plugin-typescript": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-8.2.5.tgz", + "integrity": "sha512-QL/LvDol/PAGB2O0S7/+q2HpSUNodpw7z6nGn9BfoVCPOZ0r4EALrojFU29Bkoi2Hr2jgTocTejJ5GGWZfOxbQ==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.1.0", + "resolve": "^1.17.0" + } + }, + "@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "requires": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "dependencies": { + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + } + } + }, + "@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", + "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, + "@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", + "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", + "dev": true + }, + "@types/babel__core": { + "version": "7.1.15", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.15.tgz", + "integrity": "sha512-bxlMKPDbY8x5h6HBwVzEOk2C8fb6SLfYQ5Jw3uBYuYF1lfWk/kbLd81la82vrIkBb0l+JdmrZaDikPrNxpS/Ew==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.3.tgz", + "integrity": "sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", + "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "@types/glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "26.0.24", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.24.tgz", + "integrity": "sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==", + "dev": true, + "requires": { + "jest-diff": "^26.0.0", + "pretty-format": "^26.0.0" + } + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, + "@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==" + }, + "@types/node": { + "version": "15.14.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.14.9.tgz", + "integrity": "sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==", + "dev": true + }, + "@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==" + }, + "@types/nunjucks": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@types/nunjucks/-/nunjucks-3.1.5.tgz", + "integrity": "sha512-0zEdmQNNvQ+xyV9kqQvAV93UVroTwhE78toVUDT0GBnGcW2jQBZnB4al9qq2LqI5qHOqROy/DvvAY/UwrbvV1A==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@types/prettier": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.2.tgz", + "integrity": "sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog==", + "dev": true + }, + "@types/rimraf": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-3.0.1.tgz", + "integrity": "sha512-CAoSlbco40aKZ0CkelBF2g3JeN6aioRaTVnqSX5pWsn/WApm6IDxI4e4tD9D0dY/meCkyyleP1IQDVN13F4maA==", + "dev": true, + "requires": { + "@types/glob": "*", + "@types/node": "*" + } + }, + "@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "20.2.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", + "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.38.0.tgz", + "integrity": "sha512-GgHi/GNuUbTOeoJiEANi0oI6fF3gBQc3bGFYj40nnAPCbhrtEDf2rjBmefFadweBmO1Du1YovHeDP2h5JLhtTQ==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.38.0", + "@typescript-eslint/type-utils": "5.38.0", + "@typescript-eslint/utils": "5.38.0", + "debug": "^4.3.4", + "ignore": "^5.2.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.0.tgz", + "integrity": "sha512-ByhHIuNyKD9giwkkLqzezZ9y5bALW8VNY6xXcP+VxoH4JBDKjU5WNnsiD4HJdglHECdV+lyaxhvQjTUbRboiTA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/visitor-keys": "5.38.0" + } + }, + "@typescript-eslint/types": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.0.tgz", + "integrity": "sha512-HHu4yMjJ7i3Cb+8NUuRCdOGu2VMkfmKyIJsOr9PfkBVYLYrtMCK/Ap50Rpov+iKpxDTfnqvDbuPLgBE5FwUNfA==", + "dev": true + }, + "@typescript-eslint/visitor-keys": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.0.tgz", + "integrity": "sha512-MxnrdIyArnTi+XyFLR+kt/uNAcdOnmT+879os7qDRI+EYySR4crXJq9BXPfRzzLGq0wgxkwidrCJ9WCAoacm1w==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.38.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/experimental-utils": { + "version": "4.28.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.5.tgz", + "integrity": "sha512-bGPLCOJAa+j49hsynTaAtQIWg6uZd8VLiPcyDe4QPULsvQwLHGLSGKKcBN8/lBxIX14F74UEMK2zNDI8r0okwA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.28.5", + "@typescript-eslint/types": "4.28.5", + "@typescript-eslint/typescript-estree": "4.28.5", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.38.0.tgz", + "integrity": "sha512-/F63giJGLDr0ms1Cr8utDAxP2SPiglaD6V+pCOcG35P2jCqdfR7uuEhz1GIC3oy4hkUF8xA1XSXmd9hOh/a5EA==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.38.0", + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/typescript-estree": "5.38.0", + "debug": "^4.3.4" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.0.tgz", + "integrity": "sha512-ByhHIuNyKD9giwkkLqzezZ9y5bALW8VNY6xXcP+VxoH4JBDKjU5WNnsiD4HJdglHECdV+lyaxhvQjTUbRboiTA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/visitor-keys": "5.38.0" + } + }, + "@typescript-eslint/types": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.0.tgz", + "integrity": "sha512-HHu4yMjJ7i3Cb+8NUuRCdOGu2VMkfmKyIJsOr9PfkBVYLYrtMCK/Ap50Rpov+iKpxDTfnqvDbuPLgBE5FwUNfA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.0.tgz", + "integrity": "sha512-6P0RuphkR+UuV7Avv7MU3hFoWaGcrgOdi8eTe1NwhMp2/GjUJoODBTRWzlHpZh6lFOaPmSvgxGlROa0Sg5Zbyg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/visitor-keys": "5.38.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.0.tgz", + "integrity": "sha512-MxnrdIyArnTi+XyFLR+kt/uNAcdOnmT+879os7qDRI+EYySR4crXJq9BXPfRzzLGq0wgxkwidrCJ9WCAoacm1w==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.38.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.28.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.5.tgz", + "integrity": "sha512-PHLq6n9nTMrLYcVcIZ7v0VY1X7dK309NM8ya9oL/yG8syFINIMHxyr2GzGoBYUdv3NUfCOqtuqps0ZmcgnZTfQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.28.5", + "@typescript-eslint/visitor-keys": "4.28.5" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.38.0.tgz", + "integrity": "sha512-iZq5USgybUcj/lfnbuelJ0j3K9dbs1I3RICAJY9NZZpDgBYXmuUlYQGzftpQA9wC8cKgtS6DASTvF3HrXwwozA==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "5.38.0", + "@typescript-eslint/utils": "5.38.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "dependencies": { + "@typescript-eslint/types": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.0.tgz", + "integrity": "sha512-HHu4yMjJ7i3Cb+8NUuRCdOGu2VMkfmKyIJsOr9PfkBVYLYrtMCK/Ap50Rpov+iKpxDTfnqvDbuPLgBE5FwUNfA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.0.tgz", + "integrity": "sha512-6P0RuphkR+UuV7Avv7MU3hFoWaGcrgOdi8eTe1NwhMp2/GjUJoODBTRWzlHpZh6lFOaPmSvgxGlROa0Sg5Zbyg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/visitor-keys": "5.38.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.0.tgz", + "integrity": "sha512-MxnrdIyArnTi+XyFLR+kt/uNAcdOnmT+879os7qDRI+EYySR4crXJq9BXPfRzzLGq0wgxkwidrCJ9WCAoacm1w==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.38.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/types": { + "version": "4.28.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.5.tgz", + "integrity": "sha512-MruOu4ZaDOLOhw4f/6iudyks/obuvvZUAHBDSW80Trnc5+ovmViLT2ZMDXhUV66ozcl6z0LJfKs1Usldgi/WCA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.28.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.5.tgz", + "integrity": "sha512-FzJUKsBX8poCCdve7iV7ShirP8V+ys2t1fvamVeD1rWpiAnIm550a+BX/fmTHrjEpQJ7ZAn+Z7ZZwJjytk9rZw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.28.5", + "@typescript-eslint/visitor-keys": "4.28.5", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/utils": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.38.0.tgz", + "integrity": "sha512-6sdeYaBgk9Fh7N2unEXGz+D+som2QCQGPAf1SxrkEr+Z32gMreQ0rparXTNGRRfYUWk/JzbGdcM8NSSd6oqnTA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.38.0", + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/typescript-estree": "5.38.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.0.tgz", + "integrity": "sha512-ByhHIuNyKD9giwkkLqzezZ9y5bALW8VNY6xXcP+VxoH4JBDKjU5WNnsiD4HJdglHECdV+lyaxhvQjTUbRboiTA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/visitor-keys": "5.38.0" + } + }, + "@typescript-eslint/types": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.0.tgz", + "integrity": "sha512-HHu4yMjJ7i3Cb+8NUuRCdOGu2VMkfmKyIJsOr9PfkBVYLYrtMCK/Ap50Rpov+iKpxDTfnqvDbuPLgBE5FwUNfA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.0.tgz", + "integrity": "sha512-6P0RuphkR+UuV7Avv7MU3hFoWaGcrgOdi8eTe1NwhMp2/GjUJoODBTRWzlHpZh6lFOaPmSvgxGlROa0Sg5Zbyg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/visitor-keys": "5.38.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.0.tgz", + "integrity": "sha512-MxnrdIyArnTi+XyFLR+kt/uNAcdOnmT+879os7qDRI+EYySR4crXJq9BXPfRzzLGq0wgxkwidrCJ9WCAoacm1w==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.38.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.28.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.5.tgz", + "integrity": "sha512-dva/7Rr+EkxNWdJWau26xU/0slnFlkh88v3TsyTgRS/IIYFi5iIfpCFM4ikw0vQTFUR9FYSSyqgK4w64gsgxhg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.28.5", + "eslint-visitor-keys": "^2.0.0" + } + }, + "@xmldom/xmldom": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.6.tgz", + "integrity": "sha512-HHXP9hskkFQHy8QxxUXkS7946FFIhYVfGqsk0WLwllmexN9x/+R4UBLvurHEuyXRfVEObVR8APuQehykLviwSQ==" + }, + "a-sync-waterfall": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", + "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==" + }, + "abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "add-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", + "integrity": "sha1-anmQQ3ynNtXhKI25K9MmbV9csqo=", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", + "dev": true + }, + "array-includes": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" + } + }, + "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==" + }, + "array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "b3b": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/b3b/-/b3b-0.0.1.tgz", + "integrity": "sha1-/2n4pY2JGscysgF15HVGeZdU75s=", + "dev": true + }, + "babel-jest": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.1.0.tgz", + "integrity": "sha512-6NrdqzaYemALGCuR97QkC/FkFIEBWP5pw5TMJoUHZTVXyOgocujp6A0JE2V6gE0HtqAAv6VKU/nI+OCR1Z4gHA==", + "dev": true, + "requires": { + "@jest/transform": "^27.1.0", + "@jest/types": "^27.1.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^27.0.6", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "babel-plugin-dynamic-import-node": { + "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==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.0.6.tgz", + "integrity": "sha512-CewFeM9Vv2gM7Yr9n5eyyLVPRSiBnk6lKZRjgwYnGKSl9M14TMn2vkN02wTF04OGuSDLEzlWiMzvjXuW9mB6Gw==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", + "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.2", + "semver": "^6.1.1" + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.3.tgz", + "integrity": "sha512-rCOFzEIJpJEAU14XCcV/erIf/wZQMmMT5l5vXOpL5uoznyOGfDIjPj6FVytMvtzaKSTSVKouOCTPJ5OMUZH30g==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.2", + "core-js-compat": "^3.14.0" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz", + "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.2" + } + }, + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@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-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.0.6.tgz", + "integrity": "sha512-WObA0/Biw2LrVVwZkF/2GqbOdzhKD6Fkdwhoy9ASIrOWr/zodcSpQh72JOkEn6NWyjmnPDjNSqaGN4KnpKzhXw==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^27.0.6", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "browserslist": { + "version": "4.16.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.8.tgz", + "integrity": "sha512-sc2m9ohR/49sWEbPj14ZSSZqp+kbi16aLao42Hmn3Z8FpjuMaq2xCA2l4zl9ITfyzvnvyE0hcg62YkIGKxgaNQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001251", + "colorette": "^1.3.0", + "electron-to-chromium": "^1.3.811", + "escalade": "^3.1.1", + "node-releases": "^1.1.75" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "builtin-modules": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", + "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", + "dev": true + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + } + }, + "caniuse-lite": { + "version": "1.0.30001252", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001252.tgz", + "integrity": "sha512-I56jhWDGMtdILQORdusxBOH+Nl/KgQSdDmpJezYddnAkVOmnoU8zwjTV9xAjMIYxr0iPreEAVylCGcmHCjfaOw==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true + }, + "ci-info": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", + "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", + "dev": true + }, + "cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true + }, + "clean-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", + "integrity": "sha1-jffHquUf02h06PjQW5GAvBGj/tc=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "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==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "colorette": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.3.0.tgz", + "integrity": "sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "requires": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "conventional-changelog": { + "version": "3.1.24", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.24.tgz", + "integrity": "sha512-ed6k8PO00UVvhExYohroVPXcOJ/K1N0/drJHx/faTH37OIZthlecuLIRX/T6uOp682CAoVoFpu+sSEaeuH6Asg==", + "dev": true, + "requires": { + "conventional-changelog-angular": "^5.0.12", + "conventional-changelog-atom": "^2.0.8", + "conventional-changelog-codemirror": "^2.0.8", + "conventional-changelog-conventionalcommits": "^4.5.0", + "conventional-changelog-core": "^4.2.1", + "conventional-changelog-ember": "^2.0.9", + "conventional-changelog-eslint": "^3.0.9", + "conventional-changelog-express": "^2.0.6", + "conventional-changelog-jquery": "^3.0.11", + "conventional-changelog-jshint": "^2.0.9", + "conventional-changelog-preset-loader": "^2.3.4" + } + }, + "conventional-changelog-angular": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.12.tgz", + "integrity": "sha512-5GLsbnkR/7A89RyHLvvoExbiGbd9xKdKqDTrArnPbOqBqG/2wIosu0fHwpeIRI8Tl94MhVNBXcLJZl92ZQ5USw==", + "dev": true, + "requires": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + } + }, + "conventional-changelog-atom": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz", + "integrity": "sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-codemirror": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz", + "integrity": "sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-config-spec": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-config-spec/-/conventional-changelog-config-spec-2.1.0.tgz", + "integrity": "sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==", + "dev": true + }, + "conventional-changelog-conventionalcommits": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.5.0.tgz", + "integrity": "sha512-buge9xDvjjOxJlyxUnar/+6i/aVEVGA7EEh4OafBCXPlLUQPGbRUBhBUveWRxzvR8TEjhKEP4BdepnpG2FSZXw==", + "dev": true, + "requires": { + "compare-func": "^2.0.0", + "lodash": "^4.17.15", + "q": "^1.5.1" + } + }, + "conventional-changelog-core": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.3.tgz", + "integrity": "sha512-MwnZjIoMRL3jtPH5GywVNqetGILC7g6RQFvdb8LRU/fA/338JbeWAku3PZ8yQ+mtVRViiISqJlb0sOz0htBZig==", + "dev": true, + "requires": { + "add-stream": "^1.0.0", + "conventional-changelog-writer": "^5.0.0", + "conventional-commits-parser": "^3.2.0", + "dateformat": "^3.0.0", + "get-pkg-repo": "^4.0.0", + "git-raw-commits": "^2.0.8", + "git-remote-origin-url": "^2.0.0", + "git-semver-tags": "^4.1.1", + "lodash": "^4.17.15", + "normalize-package-data": "^3.0.0", + "q": "^1.5.1", + "read-pkg": "^3.0.0", + "read-pkg-up": "^3.0.0", + "through2": "^4.0.0" + } + }, + "conventional-changelog-ember": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz", + "integrity": "sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-eslint": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz", + "integrity": "sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-express": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz", + "integrity": "sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-jquery": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz", + "integrity": "sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-jshint": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz", + "integrity": "sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==", + "dev": true, + "requires": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + } + }, + "conventional-changelog-preset-loader": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", + "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", + "dev": true + }, + "conventional-changelog-writer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.0.tgz", + "integrity": "sha512-HnDh9QHLNWfL6E1uHz6krZEQOgm8hN7z/m7tT16xwd802fwgMN0Wqd7AQYVkhpsjDUx/99oo+nGgvKF657XP5g==", + "dev": true, + "requires": { + "conventional-commits-filter": "^2.0.7", + "dateformat": "^3.0.0", + "handlebars": "^4.7.6", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "semver": "^6.0.0", + "split": "^1.0.0", + "through2": "^4.0.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true + } + } + }, + "conventional-commits-filter": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", + "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", + "dev": true, + "requires": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" + } + }, + "conventional-commits-parser": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.1.tgz", + "integrity": "sha512-OG9kQtmMZBJD/32NEw5IhN5+HnBqVjy03eC+I71I0oQRFA5rOgA4OtPOYG7mz1GkCfCNxn3gKIX8EiHJYuf1cA==", + "dev": true, + "requires": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0", + "trim-off-newlines": "^1.0.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true + } + } + }, + "conventional-recommended-bump": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz", + "integrity": "sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==", + "dev": true, + "requires": { + "concat-stream": "^2.0.0", + "conventional-changelog-preset-loader": "^2.3.4", + "conventional-commits-filter": "^2.0.7", + "conventional-commits-parser": "^3.2.0", + "git-raw-commits": "^2.0.8", + "git-semver-tags": "^4.1.1", + "meow": "^8.0.0", + "q": "^1.5.1" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true + } + } + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "core-js-compat": { + "version": "3.17.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.17.2.tgz", + "integrity": "sha512-lHnt7A1Oqplebl5i0MrQyFv/yyEzr9p29OjlkcsFRDDgHwwQyVckfRGJ790qzXhkwM8ba4SFHHa2sO+T5f1zGg==", + "dev": true, + "requires": { + "browserslist": "^4.16.8", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + } + } + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "cubic2quad": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cubic2quad/-/cubic2quad-1.2.1.tgz", + "integrity": "sha512-wT5Y7mO8abrV16gnssKdmIhIbA9wSkeMzhh27jAguKrV82i24wER0vL5TGhUJ9dbJNDcigoRZ0IAHFEEEI4THQ==" + }, + "dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + } + }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + } + } + }, + "decimal.js": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", + "dev": true + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + } + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "dotgitignore": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/dotgitignore/-/dotgitignore-2.1.0.tgz", + "integrity": "sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "minimatch": "^3.0.4" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "electron-to-chromium": { + "version": "1.3.828", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.828.tgz", + "integrity": "sha512-2kx537tLqIVfUpx7LRknZce5PcCyxyBB1YUVOhxlkrDoCqFITGJGYfBAvSxGOdqlp+R9pHeU9Ai/dsHgsqjrvQ==", + "dev": true + }, + "emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "dev": true + }, + "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==", + "dev": true + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "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==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", + "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.10.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, + "eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "globals": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", + "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "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==", + "dev": true + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, + "eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-module-utils": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.2.tgz", + "integrity": "sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-plugin-es": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", + "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", + "dev": true, + "requires": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "dependencies": { + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "eslint-plugin-import": { + "version": "2.24.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz", + "integrity": "sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q==", + "dev": true, + "requires": { + "array-includes": "^3.1.3", + "array.prototype.flat": "^1.2.4", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.6.2", + "find-up": "^2.0.0", + "has": "^1.0.3", + "is-core-module": "^2.6.0", + "minimatch": "^3.0.4", + "object.values": "^1.1.4", + "pkg-up": "^2.0.0", + "read-pkg-up": "^3.0.0", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.11.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "eslint-plugin-jest": { + "version": "24.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.4.0.tgz", + "integrity": "sha512-8qnt/hgtZ94E9dA6viqfViKBfkJwFHXgJmTWlMGDgunw1XJEGqm3eiPjDsTanM3/u/3Az82nyQM9GX7PM/QGmg==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "^4.0.1" + } + }, + "eslint-plugin-node": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", + "dev": true, + "requires": { + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + }, + "dependencies": { + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + } + } + }, + "eslint-plugin-promise": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-5.1.0.tgz", + "integrity": "sha512-NGmI6BH5L12pl7ScQHbg7tvtk4wPxxj8yPHH47NvSmMtFneC077PSeY3huFj06ZWZvtbfxSPt3RuOQD5XcR4ng==", + "dev": true, + "requires": {} + }, + "eslint-plugin-unicorn": { + "version": "35.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-35.0.0.tgz", + "integrity": "sha512-FHsaO68tDPQILfs/mGF8eSISJp8RswR4FpUuBDnueK2wyEHC6zmsc9WxjYyldXoIsBuVmru6jQyFCbCWPoW/KQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "ci-info": "^3.2.0", + "clean-regexp": "^1.0.0", + "eslint-template-visitor": "^2.3.2", + "eslint-utils": "^3.0.0", + "is-builtin-module": "^3.1.0", + "lodash": "^4.17.21", + "pluralize": "^8.0.0", + "read-pkg-up": "^7.0.1", + "regexp-tree": "^0.1.23", + "safe-regex": "^2.1.1", + "semver": "^7.3.5" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "eslint-rule-composer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", + "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", + "dev": true + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-template-visitor": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/eslint-template-visitor/-/eslint-template-visitor-2.3.2.tgz", + "integrity": "sha512-3ydhqFpuV7x1M9EK52BPNj6V0Kwu0KKkcIAfpUhwHbR8ocRln/oUHgfxQupY8O1h4Qv/POHDumb/BwwNfxbtnA==", + "dev": true, + "requires": { + "@babel/core": "^7.12.16", + "@babel/eslint-parser": "^7.12.16", + "eslint-visitor-keys": "^2.0.0", + "esquery": "^1.3.1", + "multimap": "^1.1.0" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expect": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.1.0.tgz", + "integrity": "sha512-9kJngV5hOJgkFil4F/uXm3hVBubUK2nERVfvqNNwxxuW8ZOUwSTTSysgfzckYtv/LBzj/LJXbiAF7okHCXgdug==", + "dev": true, + "requires": { + "@jest/types": "^27.1.0", + "ansi-styles": "^5.0.0", + "jest-get-type": "^27.0.6", + "jest-matcher-utils": "^27.1.0", + "jest-message-util": "^27.1.0", + "jest-regex-util": "^27.0.6" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + }, + "jest-get-type": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz", + "integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==", + "dev": true + } + } + }, + "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==", + "dev": true + }, + "fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "requires": { + "@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" + } + }, + "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==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fast-xml-parser": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.19.0.tgz", + "integrity": "sha512-4pXwmBplsCPv8FOY1WRakF970TjNGnGnfbOnLqjlYvMiF1SR3yOHyxMR/YCXpPTOspNF5gwudqktIP4VsWkvBg==", + "dev": true + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "requires": { + "reusify": "^1.0.4" + } + }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "requires": { - "@colors/colors": "1.5.0", - "string-width": "^4.2.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "flatted": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.1.tgz", + "integrity": "sha512-OMQjaErSFHmHqZe+PSidH5n8j3O0F2DdnVh8JB4j4eUQ2k6KvB0qGfrKIhapvez5JerBbmWkaLYUYWISaESoXg==", + "dev": true + }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "dev": true, "requires": { - "color-name": "~1.1.4" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" } }, - "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==", + "fs-access": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "dev": true, + "requires": { + "null-check": "^1.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w==", + "gensync": { + "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==", "dev": true }, - "comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "geometry-interfaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/geometry-interfaces/-/geometry-interfaces-1.1.4.tgz", + "integrity": "sha512-qD6OdkT6NcES9l4Xx3auTpwraQruU7dARbQPVO71MKvkGYw5/z/oIiGymuFXrRaEQa5Y67EIojUpaLeGEa5hGA==" + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, - "commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==" + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } }, - "compare-versions": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", - "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", + "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==", "dev": true }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true }, - "confbox": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", - "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", + "get-pkg-repo": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.1.2.tgz", + "integrity": "sha512-/FjamZL9cBYllEbReZkxF2IMh80d8TJoC4e3bmLNif8ibHw95aj0N/tzqK0kZz9eU/3w3dL6lF4fnnX/sDdW3A==", + "dev": true, + "requires": { + "@hutson/parse-repository-url": "^3.0.0", + "hosted-git-info": "^4.0.0", + "meow": "^7.0.0", + "through2": "^2.0.0" + }, + "dependencies": { + "meow": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz", + "integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^2.5.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.13.1", + "yargs-parser": "^18.1.3" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + } + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "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==", "dev": true }, - "convert-source-map": { + "git-raw-commits": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.10.tgz", + "integrity": "sha512-sHhX5lsbG9SOO6yXdlwgEMQ/ljIn7qMpAbJZCGfXX2fq5T8M5SrDnpYk9/4HswTildcIqatsWa91vty6VhWSaQ==", + "dev": true, + "requires": { + "dargs": "^7.0.0", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true + } + } + }, + "git-remote-origin-url": { "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==", - "dev": true + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", + "dev": true, + "requires": { + "gitconfiglocal": "^1.0.0", + "pify": "^2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } }, - "cosmiconfig": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.2.tgz", - "integrity": "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==", + "git-semver-tags": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", + "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", + "dev": true, "requires": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" + "meow": "^8.0.0", + "semver": "^6.0.0" }, "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true }, - "js-yaml": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", - "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", + "meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, "requires": { - "argparse": "^2.0.1" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } } + }, + "type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true + } + } + }, + "gitconfiglocal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", + "dev": true, + "requires": { + "ini": "^1.3.2" + } + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "dependencies": { + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" + } + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, - "css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "hosted-git-info": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", + "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "husky": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/husky/-/husky-7.0.2.tgz", + "integrity": "sha512-8yKEWNX4z2YsofXAMT7KvA1g8p+GxtB1ffV8XtpAEGuXNAbCV5wdNKH+qTpw8SM9fh4aMPDR+yQuKfgnreyZlg==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" + "safer-buffer": ">= 2.1.2 < 3" } }, - "css-tree": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", - "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", "requires": { - "mdn-data": "2.27.1", - "source-map-js": "^1.2.1" + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } } }, - "css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==" - }, - "csso": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, "requires": { - "css-tree": "~2.2.0" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" }, "dependencies": { - "css-tree": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, "requires": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" + "find-up": "^4.0.0" } - }, - "mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==" } } }, - "csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, - "cubic2quad": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/cubic2quad/-/cubic2quad-1.2.1.tgz", - "integrity": "sha512-wT5Y7mO8abrV16gnssKdmIhIbA9wSkeMzhh27jAguKrV82i24wER0vL5TGhUJ9dbJNDcigoRZ0IAHFEEEI4THQ==" - }, - "dateformat": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", - "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", - "dev": true + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" }, - "debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "ms": "^2.1.3" + "once": "^1.3.0", + "wrappy": "1" } }, - "deepmerge": { - "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==" + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", - "dev": true + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, - "detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", "dev": true }, - "devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "is-boolean-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", "dev": true, "requires": { - "dequal": "^2.0.0" + "call-bind": "^1.0.2" } }, - "dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "is-builtin-module": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.1.0.tgz", + "integrity": "sha512-OV7JjAgOTfAFJmHZLvpSTb4qi0nIILDV1gWPYDnDJUTNFM5aGlRAhk4QcT8i7TuAleeEV5Fdkqn3t4mS+Q11fg==", + "dev": true, "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" + "builtin-modules": "^3.0.0" } }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true }, - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "is-ci": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", + "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", + "dev": true, "requires": { - "domelementtype": "^2.3.0" + "ci-info": "^3.1.1" } }, - "domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "is-core-module": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", + "integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==", "requires": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" + "has": "^1.0.3" } }, - "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==", + "is-date-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", "dev": true }, - "emojilib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", - "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" + }, + "is-eot": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-eot/-/is-eot-1.0.0.tgz", + "integrity": "sha1-6EnEDw4YpoU8DWtrrCTvHyxznms=", "dev": true }, - "enquirer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-fullwidth-code-point": { + "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==", + "dev": true + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "requires": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" + "is-extglob": "^2.1.1" } }, - "entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", + "dev": true }, - "env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true }, - "environment": { + "is-plain-obj": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "dev": true }, - "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==", + "is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, "requires": { - "is-arrayish": "^0.2.1" + "@types/estree": "*" } }, - "es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "is-regex": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", "dev": true }, - "es-module-lexer": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.0.tgz", - "integrity": "sha512-KLdwQm2NvGLDkQDCGvmiQrhkd0JbMzXthwQAUgWjQuQdBLFa3eiBP5arXZyA+f8x+x7OXgud6bq2rxjGtHV2tw==", + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, - "escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "is-string": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", "dev": true }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "is-svg": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-4.3.1.tgz", + "integrity": "sha512-h2CGs+yPUyvkgTJQS9cJzo9lYK06WgRiXUqBBHtglSzVKAuH4/oWsqk7LGfbSa1hGk9QcZ0SyQtVggvBA8LZXA==", + "dev": true, + "requires": { + "fast-xml-parser": "^3.19.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", + "dev": true, + "requires": { + "text-extensions": "^1.0.0" + } + }, + "is-ttf": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/is-ttf/-/is-ttf-0.2.2.tgz", + "integrity": "sha1-cVWCSjOGfuT6iceeYV49RxbrGzo=", + "dev": true, + "requires": { + "b3b": "0.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, - "estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "is-woff": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-woff/-/is-woff-1.0.3.tgz", + "integrity": "sha1-SVHeYEqSGPRYwsGMZMg1gC4C+ms=", "dev": true }, - "eventemitter2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", - "integrity": "sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==", + "is-woff2": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-woff2/-/is-woff2-1.0.0.tgz", + "integrity": "sha1-XrnK2W2cPR04TyZ5L5UyThWC7dg=", "dev": true }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, - "exit-x": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz", - "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==", + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", "dev": true, "requires": { - "homedir-polyfill": "^1.0.1" + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" } }, - "expect-type": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", - "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==", - "dev": true + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } }, - "exsolve": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.0.tgz", - "integrity": "sha512-D+42+T12DdIlJM3uepa55qGiL3sYdLBOxIl2ifQCzCHz4c7eiolaHsi3BIqEr7JxBzxv2pYZQX9kw16ziMcEmw==", - "dev": true + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } }, - "extend": { + "istanbul-reports": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } }, - "fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "jest": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.1.0.tgz", + "integrity": "sha512-pSQDVwRSwb109Ss13lcMtdfS9r8/w2Zz8+mTUA9VORD66GflCdl8nUFCqM96geOD2EBwWCNURrNAfQsLIDNBdg==", + "dev": true, "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" + "@jest/core": "^27.1.0", + "import-local": "^3.0.2", + "jest-cli": "^27.1.0" } }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "jest-changed-files": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.1.0.tgz", + "integrity": "sha512-eRcb13TfQw0xiV2E98EmiEgs9a5uaBIqJChyl0G7jR9fCIvGjXovnDS6Zbku3joij4tXYcSK4SE1AXqOlUxjWg==", + "dev": true, "requires": { - "reusify": "^1.0.4" + "@jest/types": "^27.1.0", + "execa": "^5.0.0", + "throat": "^6.0.1" + } + }, + "jest-circus": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.1.0.tgz", + "integrity": "sha512-6FWtHs3nZyZlMBhRf1wvAC5CirnflbGJAY1xssSAnERLiiXQRH+wY2ptBVtXjX4gz4AA2EwRV57b038LmifRbA==", + "dev": true, + "requires": { + "@jest/environment": "^27.1.0", + "@jest/test-result": "^27.1.0", + "@jest/types": "^27.1.0", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.1.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.1.0", + "jest-matcher-utils": "^27.1.0", + "jest-message-util": "^27.1.0", + "jest-runtime": "^27.1.0", + "jest-snapshot": "^27.1.0", + "jest-util": "^27.1.0", + "pretty-format": "^27.1.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "pretty-format": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.1.0.tgz", + "integrity": "sha512-4aGaud3w3rxAO6OXmK3fwBFQ0bctIOG3/if+jYEFGNGIs0EvuidQm3bZ9mlP2/t9epLNC/12czabfy7TZNSwVA==", + "dev": true, + "requires": { + "@jest/types": "^27.1.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "fd-package-json": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fd-package-json/-/fd-package-json-2.0.0.tgz", - "integrity": "sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==", + "jest-cli": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.1.0.tgz", + "integrity": "sha512-h6zPUOUu+6oLDrXz0yOWY2YXvBLk8gQinx4HbZ7SF4V3HzasQf+ncoIbKENUMwXyf54/6dBkYXvXJos+gOHYZw==", "dev": true, "requires": { - "walk-up-path": "^4.0.0" - } - }, - "fflate": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.3.tgz", - "integrity": "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==", - "dev": true - }, - "fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "requires": { - "to-regex-range": "^5.0.1" + "@jest/core": "^27.1.0", + "@jest/test-result": "^27.1.0", + "@jest/types": "^27.1.0", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "jest-config": "^27.1.0", + "jest-util": "^27.1.0", + "jest-validate": "^27.1.0", + "prompts": "^2.0.1", + "yargs": "^16.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "findup-sync": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", - "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", + "jest-config": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.1.0.tgz", + "integrity": "sha512-GMo7f76vMYUA3b3xOdlcKeKQhKcBIgurjERO2hojo0eLkKPGcw7fyIoanH+m6KOP2bLad+fGnF8aWOJYxzNPeg==", "dev": true, "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.3", + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^27.1.0", + "@jest/types": "^27.1.0", + "babel-jest": "27.1.0", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "is-ci": "^3.0.0", + "jest-circus": "^27.1.0", + "jest-environment-jsdom": "^27.1.0", + "jest-environment-node": "^27.1.0", + "jest-get-type": "^27.0.6", + "jest-jasmine2": "^27.1.0", + "jest-regex-util": "^27.0.6", + "jest-resolve": "^27.1.0", + "jest-runner": "^27.1.0", + "jest-util": "^27.1.0", + "jest-validate": "^27.1.0", "micromatch": "^4.0.4", - "resolve-dir": "^1.0.1" + "pretty-format": "^27.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-get-type": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz", + "integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==", + "dev": true + }, + "pretty-format": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.1.0.tgz", + "integrity": "sha512-4aGaud3w3rxAO6OXmK3fwBFQ0bctIOG3/if+jYEFGNGIs0EvuidQm3bZ9mlP2/t9epLNC/12czabfy7TZNSwVA==", + "dev": true, + "requires": { + "@jest/types": "^27.1.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", "dev": true, "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", - "dev": true - }, - "focus-trap": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-8.2.2.tgz", - "integrity": "sha512-qV0g8hRYBqgACcFOH3f9wXc4zPKhr/0z9RI2a6ZijZ72EeBi4g8oBy8zAWuUR1TsMpOzwpUMFvjdasrC41Joug==", + "jest-docblock": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.0.6.tgz", + "integrity": "sha512-Fid6dPcjwepTFraz0YxIMCi7dejjJ/KL9FBjPYhBp4Sv1Y9PdhImlKZqYU555BlN4TQKaTc+F2Av1z+anVyGkA==", "dev": true, "requires": { - "tabbable": "^6.5.0" + "detect-newline": "^3.0.0" } }, - "fonteditor-core": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/fonteditor-core/-/fonteditor-core-2.6.3.tgz", - "integrity": "sha512-YUryIKjkenjZ41E7JvM3V+02Ak4mTHDDTwBWgs9KBzypzHqLZHuua1UDRevZNTKawmnq1dbBAa70Jddl2+F4FQ==", + "jest-each": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.1.0.tgz", + "integrity": "sha512-K/cNvQlmDqQMRHF8CaQ0XPzCfjP5HMJc2bIJglrIqI9fjwpNqITle63IWE+wq4p+3v+iBgh7Wq0IdGpLx5xjDg==", + "dev": true, "requires": { - "@xmldom/xmldom": "^0.8.3" + "@jest/types": "^27.1.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.0.6", + "jest-util": "^27.1.0", + "pretty-format": "^27.1.0" }, "dependencies": { - "@xmldom/xmldom": { - "version": "0.8.13", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.13.tgz", - "integrity": "sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==" + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-get-type": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz", + "integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==", + "dev": true + }, + "pretty-format": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.1.0.tgz", + "integrity": "sha512-4aGaud3w3rxAO6OXmK3fwBFQ0bctIOG3/if+jYEFGNGIs0EvuidQm3bZ9mlP2/t9epLNC/12czabfy7TZNSwVA==", + "dev": true, + "requires": { + "@jest/types": "^27.1.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, - "fontverter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fontverter/-/fontverter-2.0.0.tgz", - "integrity": "sha512-DFVX5hvXuhi1Jven1tbpebYTCT9XYnvx6/Z+HFUPb7ZRMCW+pj2clU9VMhoTPgWKPhAs7JJDSk3CW1jNUvKCZQ==", + "jest-environment-jsdom": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.1.0.tgz", + "integrity": "sha512-JbwOcOxh/HOtsj56ljeXQCUJr3ivnaIlM45F5NBezFLVYdT91N5UofB1ux2B1CATsQiudcHdgTaeuqGXJqjJYQ==", + "dev": true, "requires": { - "wawoff2": "^2.0.0", - "woff2sfnt-sfnt2woff": "^1.0.0" + "@jest/environment": "^27.1.0", + "@jest/fake-timers": "^27.1.0", + "@jest/types": "^27.1.0", + "@types/node": "*", + "jest-mock": "^27.1.0", + "jest-util": "^27.1.0", + "jsdom": "^16.6.0" } }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "jest-environment-node": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.1.0.tgz", + "integrity": "sha512-JIyJ8H3wVyM4YCXp7njbjs0dIT87yhGlrXCXhDKNIg1OjurXr6X38yocnnbXvvNyqVTqSI4M9l+YfPKueqL1lw==", + "dev": true, + "requires": { + "@jest/environment": "^27.1.0", + "@jest/fake-timers": "^27.1.0", + "@jest/types": "^27.1.0", + "@types/node": "*", + "jest-mock": "^27.1.0", + "jest-util": "^27.1.0" + } + }, + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", "dev": true }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "jest-haste-map": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.1.0.tgz", + "integrity": "sha512-7mz6LopSe+eA6cTFMf10OfLLqRoIPvmMyz5/OnSXnHO7hB0aDP1iIeLWCXzAcYU5eIJVpHr12Bk9yyq2fTW9vg==", "dev": true, "requires": { - "for-in": "^1.0.1" + "@jest/types": "^27.1.0", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^27.0.6", + "jest-serializer": "^27.0.6", + "jest-util": "^27.1.0", + "jest-worker": "^27.1.0", + "micromatch": "^4.0.4", + "walker": "^1.0.7" } }, - "formatly": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/formatly/-/formatly-0.3.0.tgz", - "integrity": "sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w==", + "jest-jasmine2": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.1.0.tgz", + "integrity": "sha512-Z/NIt0wBDg3przOW2FCWtYjMn3Ip68t0SL60agD/e67jlhTyV3PIF8IzT9ecwqFbeuUSO2OT8WeJgHcalDGFzQ==", "dev": true, "requires": { - "fd-package-json": "^2.0.0" + "@babel/traverse": "^7.1.0", + "@jest/environment": "^27.1.0", + "@jest/source-map": "^27.0.6", + "@jest/test-result": "^27.1.0", + "@jest/types": "^27.1.0", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.1.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.1.0", + "jest-matcher-utils": "^27.1.0", + "jest-message-util": "^27.1.0", + "jest-runtime": "^27.1.0", + "jest-snapshot": "^27.1.0", + "jest-util": "^27.1.0", + "pretty-format": "^27.1.0", + "throat": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "pretty-format": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.1.0.tgz", + "integrity": "sha512-4aGaud3w3rxAO6OXmK3fwBFQ0bctIOG3/if+jYEFGNGIs0EvuidQm3bZ9mlP2/t9epLNC/12czabfy7TZNSwVA==", + "dev": true, + "requires": { + "@jest/types": "^27.1.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-tsconfig": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz", - "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==", + "jest-leak-detector": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.1.0.tgz", + "integrity": "sha512-oHvSkz1E80VyeTKBvZNnw576qU+cVqRXUD3/wKXh1zpaki47Qty2xeHg2HKie9Hqcd2l4XwircgNOWb/NiGqdA==", "dev": true, "requires": { - "resolve-pkg-maps": "^1.0.0" + "jest-get-type": "^27.0.6", + "pretty-format": "^27.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + }, + "jest-get-type": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz", + "integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==", + "dev": true + }, + "pretty-format": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.1.0.tgz", + "integrity": "sha512-4aGaud3w3rxAO6OXmK3fwBFQ0bctIOG3/if+jYEFGNGIs0EvuidQm3bZ9mlP2/t9epLNC/12czabfy7TZNSwVA==", + "dev": true, + "requires": { + "@jest/types": "^27.1.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + } + } } }, - "getobject": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz", - "integrity": "sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==", - "dev": true - }, - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "jest-matcher-utils": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.1.0.tgz", + "integrity": "sha512-VmAudus2P6Yt/JVBRdTPFhUzlIN8DYJd+et5Rd9QDsO/Z82Z4iwGjo43U8Z+PTiz8CBvKvlb6Fh3oKy39hykkQ==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "3.1.5", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "chalk": "^4.0.0", + "jest-diff": "^27.1.0", + "jest-get-type": "^27.0.6", + "pretty-format": "^27.1.0" }, "dependencies": { - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "diff-sequences": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz", + "integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-diff": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.1.0.tgz", + "integrity": "sha512-rjfopEYl58g/SZTsQFmspBODvMSytL16I+cirnScWTLkQVXYVZfxm78DFfdIIXc05RCYuGjxJqrdyG4PIFzcJg==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^27.0.6", + "jest-get-type": "^27.0.6", + "pretty-format": "^27.1.0" + } + }, + "jest-get-type": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz", + "integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==", "dev": true }, - "brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "pretty-format": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.1.0.tgz", + "integrity": "sha512-4aGaud3w3rxAO6OXmK3fwBFQ0bctIOG3/if+jYEFGNGIs0EvuidQm3bZ9mlP2/t9epLNC/12czabfy7TZNSwVA==", "dev": true, "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@jest/types": "^27.1.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } } }, - "minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "has-flag": "^4.0.0" } } } }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "jest-message-util": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.1.0.tgz", + "integrity": "sha512-Eck8NFnJ5Sg36R9XguD65cf2D5+McC+NF5GIdEninoabcuoOfWrID5qJhufq5FB0DRKoiyxB61hS7MKoMD0trQ==", "dev": true, "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.1.0", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.4", + "pretty-format": "^27.1.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" }, "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "isexe": "^2.0.0" + "color-convert": "^2.0.1" } - } - } - }, - "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==", - "dev": true - }, - "grunt": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.6.2.tgz", - "integrity": "sha512-bUzh5nA/P5L66ihXTDP6J5BGnMB/8lXJXejYWSbH4Y4TvWM9t2S39sggQDYYQlx06cYcCsmu63HMYHGCIzUVfg==", - "dev": true, - "requires": { - "dateformat": "~4.6.2", - "eventemitter2": "~0.4.13", - "exit": "~0.1.2", - "findup-sync": "~5.0.0", - "glob": "~7.1.6", - "grunt-cli": "^1.4.3", - "grunt-known-options": "~2.0.0", - "grunt-legacy-log": "~3.0.0", - "grunt-legacy-util": "~2.0.1", - "iconv-lite": "~0.6.3", - "js-yaml": "3.15.0", - "minimatch": "3.1.5", - "nopt": "^5.0.0" - }, - "dependencies": { - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "pretty-format": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.1.0.tgz", + "integrity": "sha512-4aGaud3w3rxAO6OXmK3fwBFQ0bctIOG3/if+jYEFGNGIs0EvuidQm3bZ9mlP2/t9epLNC/12czabfy7TZNSwVA==", "dev": true, "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@jest/types": "^27.1.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } } }, - "minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "has-flag": "^4.0.0" } } } }, - "grunt-cli": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.5.0.tgz", - "integrity": "sha512-rILKAFoU0dzlf22SUfDtq2R1fosChXXlJM5j7wI6uoW8gwmXDXzbUvirlKZSYCdXl3LXFbR+8xyS+WFo+b6vlA==", + "jest-mock": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.1.0.tgz", + "integrity": "sha512-iT3/Yhu7DwAg/0HvvLCqLvrTKTRMyJlrrfJYWzuLSf9RCAxBoIXN3HoymZxMnYsC3eD8ewGbUa9jUknwBenx2w==", "dev": true, "requires": { - "grunt-known-options": "~2.0.0", - "interpret": "~1.1.0", - "liftup": "~3.0.1", - "nopt": "~5.0.0", - "v8flags": "^4.0.1" + "@jest/types": "^27.1.0", + "@types/node": "*" } }, - "grunt-known-options": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz", - "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==", + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true, + "requires": {} + }, + "jest-regex-util": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.0.6.tgz", + "integrity": "sha512-SUhPzBsGa1IKm8hx2F4NfTGGp+r7BXJ4CulsZ1k2kI+mGLG+lxGrs76veN2LF/aUdGosJBzKgXmNCw+BzFqBDQ==", "dev": true }, - "grunt-legacy-log": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.1.tgz", - "integrity": "sha512-vytI3IUC8qUK9TcvvpHpGJzDojua/sfJV4TdLB4FtCFzospqduzBuL3+dEfpvO+tGECv7/273+33hjjMXSa92g==", + "jest-resolve": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.1.0.tgz", + "integrity": "sha512-TXvzrLyPg0vLOwcWX38ZGYeEztSEmW+cQQKqc4HKDUwun31wsBXwotRlUz4/AYU/Fq4GhbMd/ileIWZEtcdmIA==", "dev": true, "requires": { - "colors": "~1.1.2", - "grunt-legacy-log-utils": "^2.1.3", - "hooker": "~0.2.3", - "lodash": "^4.18.0" + "@jest/types": "^27.1.0", + "chalk": "^4.0.0", + "escalade": "^3.1.1", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.1.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.1.0", + "jest-validate": "^27.1.0", + "resolve": "^1.20.0", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "grunt-legacy-log-utils": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.3.tgz", - "integrity": "sha512-sgG+QvKmdb44wZyzJP+ejDsy3jYxG2wzohpol+JTMlXqMUBDoZb01JPQ5jKAedtZBFwhmABAc88T9hEBLy3U+Q==", + "jest-resolve-dependencies": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.1.0.tgz", + "integrity": "sha512-Kq5XuDAELuBnrERrjFYEzu/A+i2W7l9HnPWqZEeKGEQ7m1R+6ndMbdXCVCx29Se1qwLZLgvoXwinB3SPIaitMQ==", "dev": true, "requires": { - "chalk": "^4.1.0" + "@jest/types": "^27.1.0", + "jest-regex-util": "^27.0.6", + "jest-snapshot": "^27.1.0" } }, - "grunt-legacy-util": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.2.tgz", - "integrity": "sha512-0xoDILyR4BVJel5uJwnhjdWN9evOQ8A0uXbQUIJ0hgVthIA6kloXHSoqATQPj6BRrHrHkcQtCeGVb0ixFoHyEQ==", + "jest-runner": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.1.0.tgz", + "integrity": "sha512-ZWPKr9M5w5gDplz1KsJ6iRmQaDT/yyAFLf18fKbb/+BLWsR1sCNC2wMT0H7pP3gDcBz0qZ6aJraSYUNAGSJGaw==", "dev": true, "requires": { - "async": "~3.2.0", - "exit-x": "~0.2.2", - "getobject": "~1.0.0", - "hooker": "~0.2.3", - "lodash": "^4.18.0", - "underscore.string": "~3.3.5", - "which": "~2.0.2" + "@jest/console": "^27.1.0", + "@jest/environment": "^27.1.0", + "@jest/test-result": "^27.1.0", + "@jest/transform": "^27.1.0", + "@jest/types": "^27.1.0", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-docblock": "^27.0.6", + "jest-environment-jsdom": "^27.1.0", + "jest-environment-node": "^27.1.0", + "jest-haste-map": "^27.1.0", + "jest-leak-detector": "^27.1.0", + "jest-message-util": "^27.1.0", + "jest-resolve": "^27.1.0", + "jest-runtime": "^27.1.0", + "jest-util": "^27.1.0", + "jest-worker": "^27.1.0", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "grunt-webfont-recipe": { - "version": "file:packages/grunt-webfont-recipe", + "jest-runtime": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.1.0.tgz", + "integrity": "sha512-okiR2cpGjY0RkWmUGGado6ETpFOi9oG3yV0CioYdoktkVxy5Hv0WRLWnJFuArSYS8cHMCNcceUUMGiIfgxCO9A==", + "dev": true, "requires": { - "grunt": "1.6.2", - "grunt-cli": "1.5.0", - "webfont": "file:../webfont" + "@jest/console": "^27.1.0", + "@jest/environment": "^27.1.0", + "@jest/fake-timers": "^27.1.0", + "@jest/globals": "^27.1.0", + "@jest/source-map": "^27.0.6", + "@jest/test-result": "^27.1.0", + "@jest/transform": "^27.1.0", + "@jest/types": "^27.1.0", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.1.0", + "jest-message-util": "^27.1.0", + "jest-mock": "^27.1.0", + "jest-regex-util": "^27.0.6", + "jest-resolve": "^27.1.0", + "jest-snapshot": "^27.1.0", + "jest-util": "^27.1.0", + "jest-validate": "^27.1.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^16.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "hasown": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", - "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "jest-serializer": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.0.6.tgz", + "integrity": "sha512-PtGdVK9EGC7dsaziskfqaAPib6wTViY3G8E5wz9tLVPhHyiDNTZn/xjZ4khAw+09QkoOVpn7vF5nPSN6dtBexA==", "dev": true, "requires": { - "function-bind": "^1.1.2" + "@types/node": "*", + "graceful-fs": "^4.2.4" } }, - "hast-util-to-html": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", - "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "jest-snapshot": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.1.0.tgz", + "integrity": "sha512-eaeUBoEjuuRwmiRI51oTldUsKOohB1F6fPqWKKILuDi/CStxzp2IWekVUXbuHHoz5ik33ioJhshiHpgPFbYgcA==", "dev": true, "requires": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-whitespace": "^3.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "stringify-entities": "^4.0.0", - "zwitch": "^2.0.4" + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/parser": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.1.0", + "@jest/types": "^27.1.0", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.1.0", + "graceful-fs": "^4.2.4", + "jest-diff": "^27.1.0", + "jest-get-type": "^27.0.6", + "jest-haste-map": "^27.1.0", + "jest-matcher-utils": "^27.1.0", + "jest-message-util": "^27.1.0", + "jest-resolve": "^27.1.0", + "jest-util": "^27.1.0", + "natural-compare": "^1.4.0", + "pretty-format": "^27.1.0", + "semver": "^7.3.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "diff-sequences": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz", + "integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-diff": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.1.0.tgz", + "integrity": "sha512-rjfopEYl58g/SZTsQFmspBODvMSytL16I+cirnScWTLkQVXYVZfxm78DFfdIIXc05RCYuGjxJqrdyG4PIFzcJg==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^27.0.6", + "jest-get-type": "^27.0.6", + "pretty-format": "^27.1.0" + } + }, + "jest-get-type": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz", + "integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==", + "dev": true + }, + "pretty-format": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.1.0.tgz", + "integrity": "sha512-4aGaud3w3rxAO6OXmK3fwBFQ0bctIOG3/if+jYEFGNGIs0EvuidQm3bZ9mlP2/t9epLNC/12czabfy7TZNSwVA==", + "dev": true, + "requires": { + "@jest/types": "^27.1.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "hast-util-whitespace": { - "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==", + "jest-util": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.1.0.tgz", + "integrity": "sha512-edSLD2OneYDKC6gZM1yc+wY/877s/fuJNoM1k3sOEpzFyeptSmke3SLnk1dDHk9CgTA+58mnfx3ew3J11Kes/w==", "dev": true, "requires": { - "@types/hast": "^3.0.0" + "@jest/types": "^27.1.0", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^3.0.0", + "picomatch": "^2.2.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "highlight.js": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", - "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", - "dev": true - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "jest-validate": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.1.0.tgz", + "integrity": "sha512-QiJ+4XuSuMsfPi9zvdO//IrSRSlG6ybJhOpuqYSsuuaABaNT84h0IoD6vvQhThBOKT+DIKvl5sTM0l6is9+SRA==", "dev": true, "requires": { - "parse-passwd": "^1.0.0" + "@jest/types": "^27.1.0", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.0.6", + "leven": "^3.1.0", + "pretty-format": "^27.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-get-type": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz", + "integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==", + "dev": true + }, + "pretty-format": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.1.0.tgz", + "integrity": "sha512-4aGaud3w3rxAO6OXmK3fwBFQ0bctIOG3/if+jYEFGNGIs0EvuidQm3bZ9mlP2/t9epLNC/12czabfy7TZNSwVA==", + "dev": true, + "requires": { + "@jest/types": "^27.1.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "hookable": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", - "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", - "dev": true - }, - "hooker": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", - "integrity": "sha512-t+UerCsQviSymAInD01Pw+Dn/usmz1sRO+3Zk1+lx8eg+WKpD2ulcwWqHHL0+aseRBr+3+vIhiG1K1JTwaIcTA==", - "dev": true - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "html-void-elements": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", - "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", - "dev": true - }, - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "jest-watcher": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.1.0.tgz", + "integrity": "sha512-ivaWTrA46aHWdgPDgPypSHiNQjyKnLBpUIHeBaGg11U+pDzZpkffGlcB1l1a014phmG0mHgkOHtOgiqJQM6yKQ==", "dev": true, "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==" - }, - "import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "@jest/test-result": "^27.1.0", + "@jest/types": "^27.1.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.1.0", + "string-length": "^4.0.1" }, "dependencies": { - "resolve-from": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "jest-worker": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.1.0.tgz", + "integrity": "sha512-mO4PHb2QWLn9yRXGp7rkvXLAYuxwhq1ZYUo0LoDhg8wqvv4QizP1ZWEJOeolgbEgAWZLIEU0wsku8J+lGWfBhg==", "dev": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha512-CLM8SNMDu7C5psFCn6Wg/tgpj/bKAg7hc2gWqcuR9OD5Ft9PhBpIu8PLicPeis+xDd6YX2ncI8MCA64I9tftIA==", - "dev": true + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, + "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==", "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "is-core-module": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", - "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", "dev": true, "requires": { - "hasown": "^2.0.3" + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "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.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "dev": true + } } }, - "is-eot": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-eot/-/is-eot-1.0.0.tgz", - "integrity": "sha1-6EnEDw4YpoU8DWtrrCTvHyxznms=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-fullwidth-code-point": { - "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==", + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "requires": { - "is-extglob": "^2.1.1" - } + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + "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==" }, - "is-path-inside": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", - "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==" + "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==", + "dev": true }, - "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==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "requires": { - "is-unc-path": "^1.0.0" - } + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true }, - "is-svg": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-6.1.0.tgz", - "integrity": "sha512-i7YPdvYuSCYcaLQrKwt8cvKTlwHcdA6Hp8N9SO3Q5jIzo8x6kH3N47W0BvPP7NdxVBmIHx7X9DK36czYYW7lHg==", + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", "dev": true, "requires": { - "@file-type/xml": "^0.4.3" + "minimist": "^1.2.5" } }, - "is-ttf": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/is-ttf/-/is-ttf-0.2.2.tgz", - "integrity": "sha1-cVWCSjOGfuT6iceeYV49RxbrGzo=", - "dev": true, - "requires": { - "b3b": "0.0.1" - } + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", "dev": true, "requires": { - "unc-path-regex": "^0.1.2" + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" } }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-woff": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-woff/-/is-woff-1.0.3.tgz", - "integrity": "sha1-SVHeYEqSGPRYwsGMZMg1gC4C+ms=", - "dev": true - }, - "is-woff2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-woff2/-/is-woff2-1.0.0.tgz", - "integrity": "sha1-XrnK2W2cPR04TyZ5L5UyThWC7dg=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, - "istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "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==", "dev": true }, - "istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-reports": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" } }, - "jiti": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", - "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" }, - "js-yaml": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.0.tgz", - "integrity": "sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog==", + "lint-staged": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-11.1.2.tgz", + "integrity": "sha512-6lYpNoA9wGqkL6Hew/4n1H6lRqF3qCsujVT0Oq5Z4hiSAM7S6NksPJ3gnr7A7R52xCtiZMcEUNNQ6d6X5Bvh9w==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "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==" + "chalk": "^4.1.1", + "cli-truncate": "^2.1.0", + "commander": "^7.2.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.3.1", + "enquirer": "^2.3.6", + "execa": "^5.0.0", + "listr2": "^3.8.2", + "log-symbols": "^4.1.0", + "micromatch": "^4.0.4", + "normalize-path": "^3.0.0", + "please-upgrade-node": "^3.2.0", + "string-argv": "0.3.1", + "stringify-object": "^3.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "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==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true + "listr2": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.11.0.tgz", + "integrity": "sha512-XLJVe2JgXCyQTa3FbSv11lkKExYmEyA4jltVo8z4FX10Vt1Yj8IMekBfwim0BSOM9uj1QMTJvDQQpHyuPbB/dQ==", + "dev": true, + "requires": { + "cli-truncate": "^2.1.0", + "colorette": "^1.2.2", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rxjs": "^6.6.7", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + } }, - "knip": { - "version": "6.24.0", - "resolved": "https://registry.npmjs.org/knip/-/knip-6.24.0.tgz", - "integrity": "sha512-PokLlgeEjLh1rAsB7ts+52wZ37HBr1nDhE6NNONwEaXdeZGCJOkP7ZlIAI2Gtu8xohquzTWy75bc/1diI9shQw==", + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dev": true, "requires": { - "fdir": "^6.5.0", - "formatly": "^0.3.0", - "get-tsconfig": "4.14.0", - "jiti": "^2.7.0", - "oxc-parser": "^0.137.0", - "oxc-resolver": "11.21.3", - "picomatch": "^4.0.4", - "smol-toml": "^1.6.1", - "strip-json-comments": "5.0.3", - "tinyglobby": "^0.2.17", - "unbash": "^4.0.1", - "yaml": "^2.9.0", - "zod": "^4.1.11" + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" }, "dependencies": { - "fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, - "requires": {} + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } }, - "picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true } } }, - "kolorist": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", - "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", - "dev": true - }, - "lefthook": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/lefthook/-/lefthook-2.1.9.tgz", - "integrity": "sha512-bwDaIOViTktE8kJLf9jP0p+H2/RDTlFFlc43Am2YgUsX22hI6Sq4RbzsrecwzY5y+MHTipOH7WsmWSEniePHWQ==", - "dev": true, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "requires": { - "lefthook-darwin-arm64": "2.1.9", - "lefthook-darwin-x64": "2.1.9", - "lefthook-freebsd-arm64": "2.1.9", - "lefthook-freebsd-x64": "2.1.9", - "lefthook-linux-arm64": "2.1.9", - "lefthook-linux-x64": "2.1.9", - "lefthook-openbsd-arm64": "2.1.9", - "lefthook-openbsd-x64": "2.1.9", - "lefthook-windows-arm64": "2.1.9", - "lefthook-windows-x64": "2.1.9" + "p-locate": "^4.1.0" } }, - "lefthook-darwin-arm64": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/lefthook-darwin-arm64/-/lefthook-darwin-arm64-2.1.9.tgz", - "integrity": "sha512-119HryNcvr4nqn0wUIrNPgpMEPn9yMQzEcW/lezRsnb56PCJriJB92+MCySPVcWDxJnZef7o0T3jdnPNiSH7Qg==", - "dev": true, - "optional": true - }, - "lefthook-darwin-x64": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/lefthook-darwin-x64/-/lefthook-darwin-x64-2.1.9.tgz", - "integrity": "sha512-dwo5Tke2XcQCM56DGHgFKBfRbJIL6xs2wZ0zG1TUVZgl4t4mQUt6LiZ4V/ZQfYHTZF9qywvXoIlR5N35qOaiVQ==", - "dev": true, - "optional": true - }, - "lefthook-freebsd-arm64": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/lefthook-freebsd-arm64/-/lefthook-freebsd-arm64-2.1.9.tgz", - "integrity": "sha512-+09PVap6nl6xsaHch5JLtq7WvIR++U1Q2MzA2ai0M4uB/VP3AqrvKqHw6+9hjyKnIH+HHL83uqi77EAY+LaxLA==", - "dev": true, - "optional": true - }, - "lefthook-freebsd-x64": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/lefthook-freebsd-x64/-/lefthook-freebsd-x64-2.1.9.tgz", - "integrity": "sha512-8XresjKIYpkE9ARgCtBEZgJZxAU3T4MIqzj4zNy15XRT59I1Us+QdqXTNm+pkZ41Yd2X/nxs2Pkvbq3NWWlIGw==", - "dev": true, - "optional": true - }, - "lefthook-linux-arm64": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/lefthook-linux-arm64/-/lefthook-linux-arm64-2.1.9.tgz", - "integrity": "sha512-1oNIQfwrPe6rgU2KcDM3aF6+hpZDCKx1TmawQKpXUY5gVsbZ7MqX0Sk/1lnnWxqPm+kQQ5f6J2dpFWd+4xH8jg==", - "dev": true, - "optional": true + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "lefthook-linux-x64": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/lefthook-linux-x64/-/lefthook-linux-x64-2.1.9.tgz", - "integrity": "sha512-fT+7Q+BJyGp+CslFQkNXmdFRgyVXsPHPi9NAsDX0a6QOyNnoORByAsvx6zeAKuF5rL3BBgNfho1/v2RuGxGy9w==", - "dev": true, - "optional": true + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true }, - "lefthook-openbsd-arm64": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/lefthook-openbsd-arm64/-/lefthook-openbsd-arm64-2.1.9.tgz", - "integrity": "sha512-4bVuafBk3dddVNo0+3hMbjcJs4mqYAstxpPMmX2ufkudSTYFNIhWoqwuGVQV/SS/xdcOKJAldW4qayAzed2ysw==", - "dev": true, - "optional": true + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true }, - "lefthook-openbsd-x64": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/lefthook-openbsd-x64/-/lefthook-openbsd-x64-2.1.9.tgz", - "integrity": "sha512-PmPoMmLP/wQQWcQ9u2YH86bTZ3UCfBsxuEmVTEyPU2U8R1qSTp5r/Gs3G8cN5Mxo91XB9oBERtF1n+xD3W6aVA==", - "dev": true, - "optional": true + "lodash.ismatch": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", + "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=", + "dev": true }, - "lefthook-windows-arm64": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/lefthook-windows-arm64/-/lefthook-windows-arm64-2.1.9.tgz", - "integrity": "sha512-KphfkBKmwBnmolyrdhIl3lrBaOyTcCgXBT2AB/9OHnEXhOLvv5uTCUkrD4YRAxXPtFKq6UvnapIeoL3GZq0bdA==", - "dev": true, - "optional": true + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true }, - "lefthook-windows-x64": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/lefthook-windows-x64/-/lefthook-windows-x64-2.1.9.tgz", - "integrity": "sha512-2qlUtkJHZ3MyUxgV5XTEmcrIoNZA07iwaquoswAcqv/1MeBFXlD+O+koFRfrzWng2O5WYEbpJnd8tvaYnV8fTA==", - "dev": true, - "optional": true + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true }, - "liftup": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", - "integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==", + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "requires": { - "extend": "^3.0.2", - "findup-sync": "^4.0.0", - "fined": "^1.2.0", - "flagged-respawn": "^1.0.1", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.1", - "rechoir": "^0.7.0", - "resolve": "^1.19.0" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "dependencies": { - "findup-sync": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", - "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^4.0.2", - "resolve-dir": "^1.0.1" + "has-flag": "^4.0.0" } } } }, - "lightningcss": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", - "dev": true, - "requires": { - "detect-libc": "^2.0.3", - "lightningcss-android-arm64": "1.32.0", - "lightningcss-darwin-arm64": "1.32.0", - "lightningcss-darwin-x64": "1.32.0", - "lightningcss-freebsd-x64": "1.32.0", - "lightningcss-linux-arm-gnueabihf": "1.32.0", - "lightningcss-linux-arm64-gnu": "1.32.0", - "lightningcss-linux-arm64-musl": "1.32.0", - "lightningcss-linux-x64-gnu": "1.32.0", - "lightningcss-linux-x64-musl": "1.32.0", - "lightningcss-win32-arm64-msvc": "1.32.0", - "lightningcss-win32-x64-msvc": "1.32.0" - } - }, - "lightningcss-android-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", - "dev": true, - "optional": true - }, - "lightningcss-darwin-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", - "dev": true, - "optional": true - }, - "lightningcss-darwin-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", - "dev": true, - "optional": true - }, - "lightningcss-freebsd-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", - "dev": true, - "optional": true - }, - "lightningcss-linux-arm-gnueabihf": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", - "dev": true, - "optional": true - }, - "lightningcss-linux-arm64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", - "dev": true, - "optional": true - }, - "lightningcss-linux-arm64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", - "dev": true, - "optional": true - }, - "lightningcss-linux-x64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", - "dev": true, - "optional": true - }, - "lightningcss-linux-x64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", - "dev": true, - "optional": true - }, - "lightningcss-win32-arm64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", - "dev": true, - "optional": true - }, - "lightningcss-win32-x64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", - "dev": true, - "optional": true - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" - }, - "local-pkg": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.2.1.tgz", - "integrity": "sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==", + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", "dev": true, "requires": { - "mlly": "^1.7.4", - "pkg-types": "^2.3.0", - "quansync": "^0.2.11" + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } } }, - "lodash": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", - "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==" - }, "lru-cache": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", - "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==" - }, - "magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { - "@jridgewell/sourcemap-codec": "^1.5.5" + "yallist": "^4.0.0" } }, - "magicast": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.3.tgz", - "integrity": "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==", + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", "dev": true, "requires": { - "@babel/parser": "^7.29.3", - "@babel/types": "^7.29.0", - "source-map-js": "^1.2.1" + "sourcemap-codec": "^1.4.4" } }, "make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "requires": { - "semver": "^7.5.3" - } - }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { - "kind-of": "^6.0.2" + "semver": "^6.0.0" } }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", - "dev": true - }, - "mark.js": { - "version": "8.11.1", - "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", - "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", - "dev": true - }, - "marked": { - "version": "9.1.6", - "resolved": "https://registry.npmjs.org/marked/-/marked-9.1.6.tgz", - "integrity": "sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q==", + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, - "marked-terminal": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-7.3.0.tgz", - "integrity": "sha512-t4rBvPsHc57uE/2nJOLmMbZCQ4tgAccAED3ngXQqW6g+TxA488JzJ+FK3lQkzBQOI1mRV/r/Kq+1ZlJ4D0owQw==", + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", "dev": true, "requires": { - "ansi-escapes": "^7.0.0", - "ansi-regex": "^6.1.0", - "chalk": "^5.4.1", - "cli-highlight": "^2.1.11", - "cli-table3": "^0.6.5", - "node-emoji": "^2.2.0", - "supports-hyperlinks": "^3.1.0" - }, - "dependencies": { - "chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "dev": true - } + "tmpl": "1.0.x" } }, - "mdast-util-to-hast": { - "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==", - "dev": true, + "map-obj": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz", + "integrity": "sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==" + }, + "meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", "requires": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==" + } } }, - "mdn-data": { - "version": "2.27.1", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", - "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==" - }, - "meow": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-14.1.0.tgz", - "integrity": "sha512-EDYo6VlmtnumlcBCbh1gLJ//9jvM/ndXHfVXIFrZVr6fGcwTUyCTFNTLCKuY3ffbK8L/+3Mzqnd58RojiZqHVw==" + "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==", + "dev": true }, "merge2": { "version": "1.4.1", @@ -10568,165 +21269,167 @@ "resolved": "https://registry.npmjs.org/microbuffer/-/microbuffer-1.0.0.tgz", "integrity": "sha1-izgy7UDIfVH0e7I0kTppinVtGdI=" }, - "micromark-util-character": { - "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==", - "dev": true, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "requires": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "braces": "^3.0.1", + "picomatch": "^2.2.3" } }, - "micromark-util-encode": { - "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==", + "mime-db": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", + "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", "dev": true }, - "micromark-util-sanitize-uri": { - "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==", + "mime-types": { + "version": "2.1.32", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", + "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", "dev": true, "requires": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" + "mime-db": "1.49.0" } }, - "micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "dev": true - }, - "micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, - "micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "requires": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - } + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" }, "minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "^5.0.5" + "brace-expansion": "^1.1.7" } }, - "minipass": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==" - }, - "minisearch": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.2.0.tgz", - "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==", + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, - "mlly": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", - "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", - "dev": true, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "requires": { - "acorn": "^8.16.0", - "pathe": "^2.0.3", - "pkg-types": "^1.3.1", - "ufo": "^1.6.3" - }, - "dependencies": { - "confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "dev": true - }, - "pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - "dev": true, - "requires": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" - } - } + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" } }, - "mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", "dev": true }, "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true }, - "mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, + "multimap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multimap/-/multimap-1.1.0.tgz", + "integrity": "sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "neatequal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/neatequal/-/neatequal-1.0.0.tgz", + "integrity": "sha1-LuEhG8n6bkxVcV/SELsFYC6xrjs=", "requires": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" + "varstream": "^0.3.2" } }, - "nanoid": { - "version": "3.3.15", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", - "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", + "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==", "dev": true }, - "node-emoji": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", - "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", - "dev": true, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, + "node-releases": { + "version": "1.1.75", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.75.tgz", + "integrity": "sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==", + "dev": true + }, + "normalize-package-data": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.2.tgz", + "integrity": "sha512-6CdZocmfGaKnIHPVFhJJZ3GuR8SsLKvDANFp47Jmy51aKIr8akjAWTSxtpI+MBgBFdSMRyo4hMpDlT6dTffgZg==", "requires": { - "@sindresorhus/is": "^4.6.0", - "char-regex": "^1.0.2", - "emojilib": "^2.4.0", - "skin-tone": "^2.0.0" + "hosted-git-info": "^4.0.1", + "resolve": "^1.20.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } } }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "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==", "dev": true, "requires": { - "abbrev": "1" + "path-key": "^3.0.0" } }, - "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==", - "requires": { - "boolbase": "^1.0.0" - } + "null-check": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", + "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", + "dev": true }, "nunjucks": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.4.tgz", - "integrity": "sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.3.tgz", + "integrity": "sha512-psb6xjLj47+fE76JdZwskvwG4MYsQKXUtMsPh6U0YMvmyjRtKRFcxnlXGWglNybtNTNVmGdp94K62/+NjF5FDQ==", "requires": { "a-sync-waterfall": "^1.0.0", "asap": "^2.0.3", @@ -10740,152 +21443,123 @@ } } }, - "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==", + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", "dev": true }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", - "dev": true, - "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - } + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "dev": true, "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" } }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "object.values": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", + "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", "dev": true, "requires": { - "isobject": "^3.0.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" } }, - "obug": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.3.tgz", - "integrity": "sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==", - "dev": true - }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { "wrappy": "1" } }, - "oniguruma-parser": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz", - "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==", - "dev": true - }, - "oniguruma-to-es": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz", - "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==", + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "requires": { - "oniguruma-parser": "^0.12.2", - "regex": "^6.1.0", - "regex-recursion": "^6.0.2" + "mimic-fn": "^2.1.0" } }, - "oxc-parser": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.137.0.tgz", - "integrity": "sha512-yFImD+WLElJpLKy8llG1qe4DCmMsL18peRp8XP1JKfig/gISbJkglnpDtX2aTmAn10kZF7164HbN2H8QPsXxGg==", + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, "requires": { - "@oxc-parser/binding-android-arm-eabi": "0.137.0", - "@oxc-parser/binding-android-arm64": "0.137.0", - "@oxc-parser/binding-darwin-arm64": "0.137.0", - "@oxc-parser/binding-darwin-x64": "0.137.0", - "@oxc-parser/binding-freebsd-x64": "0.137.0", - "@oxc-parser/binding-linux-arm-gnueabihf": "0.137.0", - "@oxc-parser/binding-linux-arm-musleabihf": "0.137.0", - "@oxc-parser/binding-linux-arm64-gnu": "0.137.0", - "@oxc-parser/binding-linux-arm64-musl": "0.137.0", - "@oxc-parser/binding-linux-ppc64-gnu": "0.137.0", - "@oxc-parser/binding-linux-riscv64-gnu": "0.137.0", - "@oxc-parser/binding-linux-riscv64-musl": "0.137.0", - "@oxc-parser/binding-linux-s390x-gnu": "0.137.0", - "@oxc-parser/binding-linux-x64-gnu": "0.137.0", - "@oxc-parser/binding-linux-x64-musl": "0.137.0", - "@oxc-parser/binding-openharmony-arm64": "0.137.0", - "@oxc-parser/binding-wasm32-wasi": "0.137.0", - "@oxc-parser/binding-win32-arm64-msvc": "0.137.0", - "@oxc-parser/binding-win32-ia32-msvc": "0.137.0", - "@oxc-parser/binding-win32-x64-msvc": "0.137.0", - "@oxc-project/types": "^0.137.0" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" }, "dependencies": { - "@oxc-project/types": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.137.0.tgz", - "integrity": "sha512-WT+Gb24i8hmvo85AIv2oEYouEXkRlKAlT9WaCa3TfLgNCN+GhrJOGZuIlMouAh38Qe4QOx26eUOVsq70qXrywA==", - "dev": true + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } } } }, - "oxc-resolver": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/oxc-resolver/-/oxc-resolver-11.21.3.tgz", - "integrity": "sha512-2Mx3fKQz7+xgrBONjsxOgCGtMHOn38/HxMzW1I5efwXB5a4lRN0Vp40gYUJFBWJslcrvwoofTrqoTnLbwTd3pA==", - "dev": true, - "requires": { - "@oxc-resolver/binding-android-arm-eabi": "11.21.3", - "@oxc-resolver/binding-android-arm64": "11.21.3", - "@oxc-resolver/binding-darwin-arm64": "11.21.3", - "@oxc-resolver/binding-darwin-x64": "11.21.3", - "@oxc-resolver/binding-freebsd-x64": "11.21.3", - "@oxc-resolver/binding-linux-arm-gnueabihf": "11.21.3", - "@oxc-resolver/binding-linux-arm-musleabihf": "11.21.3", - "@oxc-resolver/binding-linux-arm64-gnu": "11.21.3", - "@oxc-resolver/binding-linux-arm64-musl": "11.21.3", - "@oxc-resolver/binding-linux-ppc64-gnu": "11.21.3", - "@oxc-resolver/binding-linux-riscv64-gnu": "11.21.3", - "@oxc-resolver/binding-linux-riscv64-musl": "11.21.3", - "@oxc-resolver/binding-linux-s390x-gnu": "11.21.3", - "@oxc-resolver/binding-linux-x64-gnu": "11.21.3", - "@oxc-resolver/binding-linux-x64-musl": "11.21.3", - "@oxc-resolver/binding-openharmony-arm64": "11.21.3", - "@oxc-resolver/binding-wasm32-wasi": "11.21.3", - "@oxc-resolver/binding-win32-arm64-msvc": "11.21.3", - "@oxc-resolver/binding-win32-x64-msvc": "11.21.3" - } - }, - "p-limit": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-7.3.0.tgz", - "integrity": "sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw==", + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, "requires": { - "yocto-queue": "^1.2.1" + "aggregate-error": "^3.0.0" } }, - "package-manager-detector": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.7.0.tgz", - "integrity": "sha512-xg1eHpwYL/D/HEdWw2goFZP6vV0FH7W+PZ5rFkGjdIDLtxq7EkzBUeT3m+lndYCt8wKbmofUu1MUdMCXkCk9ZQ==", - "dev": true + "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==" }, "pako": { "version": "1.0.11", @@ -10896,19 +21570,17 @@ "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==", - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", "dev": true, "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" + "callsites": "^3.0.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + } } }, "parse-json": { @@ -10922,220 +21594,573 @@ "lines-and-columns": "^1.1.6" } }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true }, - "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "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==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, - "parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "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==" + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, "requires": { - "parse5": "^6.0.1" + "find-up": "^2.1.0" }, "dependencies": { - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true } } }, - "path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } }, - "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==", + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, + "pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "dev": true }, - "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==", + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", "dev": true, "requires": { - "path-root-regex": "^0.1.0" + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "15.0.14", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", + "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "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==", "dev": true }, - "path-scurry": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", - "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "prompts": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", + "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", + "dev": true, "requires": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" } }, - "pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, - "perfect-debounce": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz", - "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, - "picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true }, - "picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==" + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" }, - "pkg-types": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.1.tgz", - "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==", + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==" + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, "requires": { - "confbox": "^0.2.4", - "exsolve": "^1.0.8", - "pathe": "^2.0.3" + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, - "postcss": { - "version": "8.5.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.16.tgz", - "integrity": "sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==", + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", "dev": true, "requires": { - "nanoid": "^3.3.12", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } } }, - "proper-lockfile": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", - "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", - "dev": true, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { - "graceful-fs": "^4.2.4", - "retry": "^0.12.0", - "signal-exit": "^3.0.2" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, - "property-information": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", - "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", - "dev": true - }, - "publint": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/publint/-/publint-0.3.21.tgz", - "integrity": "sha512-OqejcnMV6E9zel2oCrUOJEiiFkGiAAni0A6ibfQNh1k9Gu5z4F+Yso8lllam7AzmV6Do0vp7u3UpZNRBwuXaHQ==", - "dev": true, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "requires": { - "@publint/pack": "^0.1.4", - "package-manager-detector": "^1.6.0", - "picocolors": "^1.1.1", - "sade": "^1.8.1" + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" } }, - "quansync": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", - "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "dev": true }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dev": true }, - "rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", "dev": true, "requires": { - "resolve": "^1.9.0" + "@babel/runtime": "^7.8.4" } }, - "regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", - "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "regexp-tree": { + "version": "0.1.23", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.23.tgz", + "integrity": "sha512-+7HWfb4Bvu8Rs2eQTUIpX9I/PlQkYOuTNbRpKLJlQpSgwSkzFYh+pUj0gtvglnOZLKB6YgnIgRuJ2/IlpL48qw==", + "dev": true + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", "dev": true, "requires": { - "regex-utilities": "^2.3.0" - } + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true }, - "regex-recursion": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", - "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "regjsparser": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", + "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", "dev": true, "requires": { - "regex-utilities": "^2.3.0" + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } } }, - "regex-utilities": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", - "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", - "dev": true - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-from-string": { + "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==", "dev": true }, "resolve": { - "version": "1.22.12", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", - "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", - "dev": true, + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "requires": { - "es-errors": "^1.3.0", - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" } }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" + "resolve-from": "^5.0.0" } }, "resolve-from": { @@ -11143,46 +22168,37 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" }, - "resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" }, - "rolldown": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.4.tgz", - "integrity": "sha512-IjZYiLxZwpnhwhdBH2ugdTGVSdhCQUmLxLoqyjiL0JxYjyRst+5a0P3xfrTxJ5F638j4Mvvw5FAX5XE6eHpXbA==", - "dev": true, - "requires": { - "@oxc-project/types": "=0.138.0", - "@rolldown/binding-android-arm64": "1.1.4", - "@rolldown/binding-darwin-arm64": "1.1.4", - "@rolldown/binding-darwin-x64": "1.1.4", - "@rolldown/binding-freebsd-x64": "1.1.4", - "@rolldown/binding-linux-arm-gnueabihf": "1.1.4", - "@rolldown/binding-linux-arm64-gnu": "1.1.4", - "@rolldown/binding-linux-arm64-musl": "1.1.4", - "@rolldown/binding-linux-ppc64-gnu": "1.1.4", - "@rolldown/binding-linux-s390x-gnu": "1.1.4", - "@rolldown/binding-linux-x64-gnu": "1.1.4", - "@rolldown/binding-linux-x64-musl": "1.1.4", - "@rolldown/binding-openharmony-arm64": "1.1.4", - "@rolldown/binding-wasm32-wasi": "1.1.4", - "@rolldown/binding-win32-arm64-msvc": "1.1.4", - "@rolldown/binding-win32-x64-msvc": "1.1.4", - "@rolldown/pluginutils": "^1.0.0" + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rollup": { + "version": "2.56.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.56.3.tgz", + "integrity": "sha512-Au92NuznFklgQCUcV96iXlxUbHuB1vQMaH76DHl5M11TotjOHwqk9CwcrT78+Tnv4FN9uTBxq6p4EJoYkpyekg==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" } }, "run-parallel": { @@ -11193,13 +22209,36 @@ "queue-microtask": "^1.2.2" } }, - "sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "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==", + "dev": true + }, + "safe-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", + "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", "dev": true, "requires": { - "mri": "^1.1.0" + "regexp-tree": "~0.1.1" } }, "safer-buffer": { @@ -11209,180 +22248,428 @@ "dev": true }, "sax": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", - "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==" + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } }, "semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, - "shiki": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.3.1.tgz", - "integrity": "sha512-oR+qDVi2OjX1tmDpyv+3KviX01KzO6Af+0NNnKnsp9491UEGz2YpxTuJboS/6VhYpTdqzmuJBuiTlrAWWJAssw==", + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "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==", "dev": true, "requires": { - "@shikijs/core": "4.3.1", - "@shikijs/engine-javascript": "4.3.1", - "@shikijs/engine-oniguruma": "4.3.1", - "@shikijs/langs": "4.3.1", - "@shikijs/themes": "4.3.1", - "@shikijs/types": "4.3.1", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" + "shebang-regex": "^3.0.0" } }, - "siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, "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==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, - "skin-tone": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", - "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", "dev": true, "requires": { - "unicode-emoji-modifier-base": "^1.0.0" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + } } }, - "slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==" - }, - "smol-toml": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.7.0.tgz", - "integrity": "sha512-aqVvWoyO21L23mb+drl4RmMXbf6N7FdHjAhTRA9ZBL7apWBgfWC16KjrASI+1p9GAroljyMHj6fK67i0UiTNvQ==", + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, - "source-map-js": { - "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==" + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } }, - "space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", + "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==" + }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "requires": { + "through": "2" + } + }, + "split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "requires": { + "readable-stream": "^3.0.0" + } + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, - "stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true + "stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } }, - "std-env": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.1.0.tgz", - "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==", + "standard-version": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-9.3.1.tgz", + "integrity": "sha512-5qMxXw/FxLouC5nANyx/5RY1kiorJx9BppUso8gN07MG64q2uLRmrPb4KfXp3Ql4s/gxjZwZ89e0FwxeLubGww==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "conventional-changelog": "3.1.24", + "conventional-changelog-config-spec": "2.1.0", + "conventional-changelog-conventionalcommits": "4.5.0", + "conventional-recommended-bump": "6.1.0", + "detect-indent": "^6.0.0", + "detect-newline": "^3.1.0", + "dotgitignore": "^2.1.0", + "figures": "^3.1.0", + "find-up": "^5.0.0", + "fs-access": "^1.0.1", + "git-semver-tags": "^4.0.0", + "semver": "^7.1.1", + "stringify-package": "^1.0.1", + "yargs": "^16.0.0" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "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==", + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, + "string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", "dev": true }, + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, "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==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "strip-ansi": "^6.0.0" } }, - "stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", "dev": true, "requires": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, "requires": { - "ansi-regex": "^5.0.1" + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" }, "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true } } }, - "strip-json-comments": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.3.tgz", - "integrity": "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==", + "stringify-package": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.1.tgz", + "integrity": "sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==", "dev": true }, - "strtok3": { - "version": "10.3.5", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.5.tgz", - "integrity": "sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==", + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { - "@tokenizer/token": "^0.3.0" + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "requires": { + "min-indent": "^1.0.0" } }, + "strip-json-comments": { + "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==", + "dev": true + }, "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { - "has-flag": "^4.0.0" + "has-flag": "^3.0.0" } }, "supports-hyperlinks": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", - "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", "dev": true, "requires": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "supports-preserve-symlinks-flag": { - "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==", - "dev": true - }, "svg-pathdata": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-9.0.0.tgz", - "integrity": "sha512-h9FuqmNsgDKq2hQBqTMOWjZwqdZOnWijZmcg6FL4iSmH6VvRnobhHrBQSdOiP0W9nwgv0qiW5vQ3//Arrmp19g==" + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-6.0.0.tgz", + "integrity": "sha512-8XoCZjKbP0fvJbDsm6KFxVau2N3SkWkMj8OniADm87q4OiFXk/gSgri5Uyr8hE1fQ9npI+9XzRlTUObgWmBBNw==" }, "svg2ttf": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/svg2ttf/-/svg2ttf-6.1.0.tgz", - "integrity": "sha512-EjxgcmhKcBpx/3fR1hPwVtJAbUc/ZsDpwOTF74SI3PbzCg4pDHnxVmoSuqgEqxVJGqqkSCI6+82cucpn2D5aOw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/svg2ttf/-/svg2ttf-6.0.3.tgz", + "integrity": "sha512-CgqMyZrbOPpc+WqH7aga4JWkDPso23EgypLsbQ6gN3uoPWwwiLjXvzgrwGADBExvCRJrWFzAeK1bSoSpE7ixSQ==", "requires": { - "@xmldom/xmldom": "^0.9.10", + "@xmldom/xmldom": "^0.7.2", "argparse": "^2.0.1", "cubic2quad": "^1.2.1", "lodash": "^4.17.10", @@ -11398,127 +22685,163 @@ } }, "svgicons2svgfont": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/svgicons2svgfont/-/svgicons2svgfont-16.0.0.tgz", - "integrity": "sha512-3y4fcCuu9/XYgkoDfnNAR1RUEjmbX6lX2oTTu8NVLHYbf2xmYyZB0NZzK7WNthn8oSY68thfyEARRgWyAveZOw==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/svgicons2svgfont/-/svgicons2svgfont-10.0.3.tgz", + "integrity": "sha512-tV0/KV1obxil8iHxTh+XpceIRFAgC1vHBreF7J9ke6K1U6QZAoUHxGzdP/e1NLdU6GVivL08f4W8PgcHyZWBhQ==", + "requires": { + "commander": "^7.2.0", + "geometry-interfaces": "^1.1.4", + "glob": "^7.1.6", + "neatequal": "^1.0.0", + "readable-stream": "^3.4.0", + "sax": "^1.2.4", + "svg-pathdata": "^6.0.0" + } + }, + "svgpath": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/svgpath/-/svgpath-2.3.1.tgz", + "integrity": "sha512-wNz6lCoj+99GMoyU7SozTfPqiLHz6WcJYZ30Z+F4lF/gPtxWHBCpZ4DhoDI0+oZ0dObKyYsJdSPGbL2mJq/qCg==" + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "dev": true, "requires": { - "@types/sax": "^1.2.7", - "commander": "^14.0.0", - "debug": "^4.3.6", - "glob": "^13.0.6", - "sax": "^1.6.0", - "svg-pathdata": "^9.0.0", - "transformation-matrix": "^3.1.0", - "yerror": "^9.0.0" + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" }, "dependencies": { - "commander": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", - "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==" + "ajv": { + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", + "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true }, - "glob": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", - "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, "requires": { - "minimatch": "^10.2.2", - "minipass": "^7.1.3", - "path-scurry": "^2.0.2" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" } } } }, - "svgo": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.1.tgz", - "integrity": "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==", - "requires": { - "commander": "^11.1.0", - "css-select": "^5.1.0", - "css-tree": "^3.0.1", - "css-what": "^6.1.0", - "csso": "^5.0.5", - "picocolors": "^1.1.1", - "sax": "^1.5.0" - } - }, - "svgpath": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/svgpath/-/svgpath-2.3.1.tgz", - "integrity": "sha512-wNz6lCoj+99GMoyU7SozTfPqiLHz6WcJYZ30Z+F4lF/gPtxWHBCpZ4DhoDI0+oZ0dObKyYsJdSPGbL2mJq/qCg==" - }, - "tabbable": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.5.0.tgz", - "integrity": "sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==", - "dev": true - }, - "thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "dev": true, "requires": { - "any-promise": "^1.0.0" + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" } }, - "thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "requires": { - "thenify": ">= 3.1.0 < 4" + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" } }, - "tiny-invariant": { - "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==", + "text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", "dev": true }, - "tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "tinyexec": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", - "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", + "throat": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", + "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", "dev": true }, - "tinyglobby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "dev": true, "requires": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "dependencies": { - "fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "requires": {} - }, - "picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true - } + "readable-stream": "3" } }, - "tinyrainbow": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", - "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true }, "to-regex-range": { @@ -11529,39 +22852,132 @@ "is-number": "^7.0.0" } }, - "transformation-matrix": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/transformation-matrix/-/transformation-matrix-3.1.0.tgz", - "integrity": "sha512-oYubRWTi2tYFHAL2J8DLvPIqIYcYZ0fSOi2vmSy042Ho4jBW2ce6VP7QfD44t65WQz6bw5w1Pk22J7lcUpaTKA==" + "tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "dev": true, + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + } + }, + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } }, - "trim-lines": { + "trim-newlines": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==" + }, + "trim-off-newlines": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", + "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", "dev": true }, - "tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "ts-node": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.2.1.tgz", + "integrity": "sha512-hCnyOyuGmD5wHleOQX6NIjJtYVIO8bPP8F2acWkB4W06wdlkgyvJtubO/I9NkI88hCFECbsEgoLc0VNkYmcSfw==", "dev": true, - "optional": true + "requires": { + "@cspotcode/source-map-support": "0.6.1", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "yn": "3.1.1" + }, + "dependencies": { + "acorn": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz", + "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==", + "dev": true + }, + "acorn-walk": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.1.1.tgz", + "integrity": "sha512-FbJdceMlPHEAWJOILDk1fXD8lnTlEIWFkqtfk+MvmL5q/qlHfN7GEHcsFZWt/Tea9jRNPWUZG4G976nqAAmU9w==", + "dev": true + } + } }, - "ttf2eot": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ttf2eot/-/ttf2eot-3.1.0.tgz", - "integrity": "sha512-aHTbcYosNHVqb2Qtt9Xfta77ae/5y0VfdwNLUS6sGBeGr22cX2JDMo/i5h3uuOf+FAD3akYOr17+fYd5NK8aXw==", + "tsconfig-paths": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz", + "integrity": "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==", + "dev": true, "requires": { - "argparse": "^2.0.1" + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" }, "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true } } }, + "ttf2eot": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ttf2eot/-/ttf2eot-2.0.0.tgz", + "integrity": "sha1-jmM3pYWr0WCKDISVirSDzmn2ZUs=", + "requires": { + "argparse": "^1.0.6", + "microbuffer": "^1.0.0" + } + }, "ttf2woff": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ttf2woff/-/ttf2woff-3.0.0.tgz", @@ -11578,369 +22994,211 @@ } } }, - "typescript": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", - "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", - "devOptional": true + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } }, - "ufo": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", - "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, - "unbash": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/unbash/-/unbash-4.0.2.tgz", - "integrity": "sha512-8gwNZ29+0/3zmXw7ToIHZtg6wK37xnniRUdBt7B27xZxaxfgR5tGMaGHT0t0dLtBV9fXE7zurh0s6Z1DHVjfWg==", + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, - "underscore.string": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz", - "integrity": "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==", + "typedarray-to-buffer": { + "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==", "dev": true, "requires": { - "sprintf-js": "^1.1.1", - "util-deprecate": "^1.0.2" - }, - "dependencies": { - "sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true - } + "is-typedarray": "^1.0.0" } }, - "undici-types": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", - "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==" - }, - "unicode-emoji-modifier-base": { - "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==", + "typescript": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", + "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==", "dev": true }, - "unicorn-magic": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.4.0.tgz", - "integrity": "sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==" - }, - "unist-util-is": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", - "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "uglify-js": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.0.tgz", + "integrity": "sha512-R/tiGB1ZXp2BC+TkRGLwj8xUZgdfT2f4UZEgX6aVjJ5uttPrr4fYmwTWDGqVnBCLbOXRMY6nr/BTbwCtVfps0g==", "dev": true, - "requires": { - "@types/unist": "^3.0.0" - } + "optional": true }, - "unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", "dev": true, "requires": { - "@types/unist": "^3.0.0" + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" } }, - "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==", - "dev": true, - "requires": { - "@types/unist": "^3.0.0" - } + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true }, - "unist-util-visit": { - "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==", + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", "dev": true, "requires": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" } }, - "unist-util-visit-parents": { - "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==", - "dev": true, - "requires": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - } + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true }, - "unplugin": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz", - "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", - "dev": true, - "requires": { - "@jridgewell/remapping": "^2.3.5", - "acorn": "^8.15.0", - "picomatch": "^4.0.3", - "webpack-virtual-modules": "^0.6.2" - }, - "dependencies": { - "picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true - } - } + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true }, - "unplugin-dts": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/unplugin-dts/-/unplugin-dts-1.0.3.tgz", - "integrity": "sha512-/GR887wfG4r1cWyt1UZsLRuMIjsmEbGkS9yJrz+0dsToHAYUD5CTyP3JMGVLv25j9K0mJcwAVvZno/aTuSUvNg==", + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "requires": { - "@rollup/pluginutils": "^5.1.4", - "@volar/typescript": "^2.4.26", - "compare-versions": "^6.1.1", - "debug": "^4.4.0", - "kolorist": "^1.8.0", - "local-pkg": "^1.1.1", - "magic-string": "^0.30.17", - "unplugin": "^2.3.2" + "punycode": "^2.1.0" } }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "v8flags": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-4.0.1.tgz", - "integrity": "sha512-fcRLaS4H/hrZk9hYwbdRM35D0U8IYMfEClhXxCivOojl+yTRAZH3Zy2sSy6qVCiGbV9YAtPssP6jaChqC9vPCg==", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, - "validate-npm-package-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, - "vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "dev": true, - "requires": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - } - }, - "vfile-message": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", - "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", - "dev": true, - "requires": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - } - }, - "vite": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.3.tgz", - "integrity": "sha512-Ds+gBRbj0lwRO2Y5hwnUBdxSwlAve9LeRyU4sNnAr0ewW0gWF0n5bgXgUzbgZ49MV9BVUAQUFYVcDUcilUExMA==", + "v8-to-istanbul": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.0.0.tgz", + "integrity": "sha512-LkmXi8UUNxnCC+JlH7/fsfsKr5AU110l+SYGJimWNkWhxbN5EyeOtm1MJ0hhvqMMOhGwBj1Fp70Yv9i+hX0QAg==", "dev": true, "requires": { - "fsevents": "~2.3.3", - "lightningcss": "^1.32.0", - "picomatch": "^4.0.4", - "postcss": "^8.5.16", - "rolldown": "~1.1.3", - "tinyglobby": "^0.2.17" + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" }, "dependencies": { - "picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true } } }, - "vite-plugin-checker": { - "version": "0.14.4", - "resolved": "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.14.4.tgz", - "integrity": "sha512-Tw0U9UgHIRiZ+Yoe4Gh0RrYoBiCVmO9j4tomVdYr0KUjUsqXMPhqW8ouoSWmOzGp5Iimipbl3bNXZcK7OeP7Qg==", - "dev": true, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "varstream": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/varstream/-/varstream-0.3.2.tgz", + "integrity": "sha1-GKxklHZfP/GjWtmkvgU77BiKXeE=", "requires": { - "@babel/code-frame": "^7.29.0", - "chokidar": "^5.0.0", - "npm-run-path": "^6.0.0", - "picocolors": "^1.1.1", - "picomatch": "^4.0.4", - "proper-lockfile": "^4.1.2", - "tiny-invariant": "^1.3.3" + "readable-stream": "^1.0.33" }, "dependencies": { - "chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "dev": true, - "requires": { - "readdirp": "^5.0.0" - } + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, - "npm-run-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", - "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", - "dev": true, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "requires": { - "path-key": "^4.0.0", - "unicorn-magic": "^0.3.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true - }, - "picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true - }, - "readdirp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", - "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", - "dev": true - }, - "unicorn-magic": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", - "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", - "dev": true + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" } } }, - "vite-plugin-dts": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-5.0.3.tgz", - "integrity": "sha512-gIth6NdCEHWPiiRMCK3N6C8WjvdsrtEQrmsiG8h6Ov+lFP+b07Y+wcs9H0H7n146l0PDTYK4cQN1vgeG1pMdRQ==", - "dev": true, - "requires": { - "unplugin-dts": "1.0.3" - } - }, - "vitepress": { - "version": "2.0.0-alpha.18", - "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-2.0.0-alpha.18.tgz", - "integrity": "sha512-Lk1G2/QqSf+MwNLICl9fmzWOtoCEwjZoWgaQy41QvWTfcGpLE9XwJDbcCyES/9rj6R2g1zFqFvLVkYKLLDALFw==", - "dev": true, - "requires": { - "@docsearch/css": "^4.6.3", - "@docsearch/js": "^4.6.3", - "@docsearch/sidepanel-js": "^4.6.3", - "@iconify-json/simple-icons": "^1.2.87", - "@shikijs/core": "^4.3.0", - "@shikijs/transformers": "^4.3.0", - "@shikijs/types": "^4.3.0", - "@types/markdown-it": "^14.1.2", - "@vitejs/plugin-vue": "^6.0.7", - "@vue/devtools-api": "^8.1.4", - "@vue/shared": "^3.5.39", - "@vueuse/core": "^14.3.0", - "@vueuse/integrations": "^14.3.0", - "focus-trap": "^8.2.2", - "mark.js": "8.11.1", - "minisearch": "^7.2.0", - "shiki": "^4.3.0", - "vite": "^8.1.3", - "vue": "^3.5.39" - } - }, - "vitest": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.9.tgz", - "integrity": "sha512-nE3/LEyc0z87uHYLZebqCUOaJr2hdtuPp7BQ4BosVFnfltxgAvMG08NyrSGlPpOUWvR27c5flSmYFTNr78L9GQ==", - "dev": true, - "requires": { - "@vitest/expect": "4.1.9", - "@vitest/mocker": "4.1.9", - "@vitest/pretty-format": "4.1.9", - "@vitest/runner": "4.1.9", - "@vitest/snapshot": "4.1.9", - "@vitest/spy": "4.1.9", - "@vitest/utils": "4.1.9", - "es-module-lexer": "^2.0.0", - "expect-type": "^1.3.0", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^4.0.0-rc.1", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.1.0", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", - "why-is-node-running": "^2.3.0" - }, - "dependencies": { - "picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true - } + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" } }, - "vscode-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", - "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", - "dev": true - }, - "vue": { - "version": "3.5.39", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.39.tgz", - "integrity": "sha512-xmZCYabFGcirU8r0fTuvl/LICc1OU620rnqepaJDL/a141ZigkG7AyaxQLdqJ02ZRYzWe6YPaDHeQx7MfknQfA==", + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", "dev": true, "requires": { - "@vue/compiler-dom": "3.5.39", - "@vue/compiler-sfc": "3.5.39", - "@vue/runtime-dom": "3.5.39", - "@vue/server-renderer": "3.5.39", - "@vue/shared": "3.5.39" + "xml-name-validator": "^3.0.0" } }, - "walk-up-path": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-4.0.0.tgz", - "integrity": "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==", - "dev": true + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } }, "wawoff2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wawoff2/-/wawoff2-2.0.1.tgz", - "integrity": "sha512-r0CEmvpH63r4T15ebFqeOjGqU4+EgTx4I510NtK35EMciSdcTxCw3Byy3JnBonz7iyIFZ0AbVo0bbFpEVuhCYA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wawoff2/-/wawoff2-2.0.0.tgz", + "integrity": "sha512-5gjFj+fyQO9cMrg5vYaVM7+T37xSHpqUWM/S6UCEiBx8wRmfpvuhYjPM3toB2UujpmWQt1hSPKRo/jIRE/j9Eg==", "requires": { "argparse": "^2.0.1" }, @@ -11952,71 +23210,38 @@ } } }, - "webfont": { - "version": "file:packages/webfont", - "requires": { - "@arethetypeswrong/cli": "0.18.4", - "@biomejs/biome": "2.5.2", - "@types/node": "26.1.0", - "@types/nunjucks": "3.2.6", - "@types/svg2ttf": "5.0.3", - "@types/ttf2eot": "2.0.2", - "@types/ttf2woff": "2.0.4", - "@types/wawoff2": "1.0.2", - "@types/xml2js": "0.4.14", - "@vitest/coverage-v8": "4.1.9", - "cosmiconfig": "9.0.2", - "deepmerge": "^4.2.2", - "enquirer": "2.4.1", - "fonteditor-core": "2.6.3", - "fontverter": "2.0.0", - "globby": "16.2.1", - "is-eot": "1.0.0", - "is-svg": "6.1.0", - "is-ttf": "0.2.2", - "is-woff": "1.0.3", - "is-woff2": "1.0.0", - "knip": "6.24.0", - "meow": "14.1.0", - "nunjucks": "3.2.4", - "p-limit": "7.3.0", - "publint": "0.3.21", - "resolve-from": "^5.0.0", - "svg2ttf": "^6.1.0", - "svgicons2svgfont": "^16.0.0", - "svgo": "4.0.1", - "ttf2eot": "3.1.0", - "ttf2woff": "^3.0.0", - "typescript": "6.0.3", - "vite": "8.1.3", - "vite-plugin-checker": "0.14.4", - "vite-plugin-dts": "5.0.3", - "vitest": "4.1.9", - "wawoff2": "2.0.1", - "xml2js": "0.6.2" - }, - "dependencies": { - "globby": { - "version": "16.2.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-16.2.1.tgz", - "integrity": "sha512-JmsqJalahxxgW8V2ecSQ2G7UjPlI9cpKdrkG9KoNiXhd/YslXOTEB0cViENWUznuovIuNT+FkMbraDGjr4FCUg==", - "requires": { - "@sindresorhus/merge-streams": "^4.0.0", - "fast-glob": "^3.3.3", - "ignore": "^7.0.5", - "is-path-inside": "^4.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.4.0" - } - } + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" } }, - "webpack-virtual-modules": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", - "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", "dev": true }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -12026,23 +23251,30 @@ "isexe": "^2.0.0" } }, - "why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, "requires": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" } }, - "woff2sfnt-sfnt2woff": { + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wordwrap": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/woff2sfnt-sfnt2woff/-/woff2sfnt-sfnt2woff-1.0.0.tgz", - "integrity": "sha512-edK4COc1c1EpRfMqCZO1xJOvdUtM5dbVb9iz97rScvnTevqEB3GllnLWCmMVp1MfQBdF1DFg/11I0rSyAdS4qQ==", - "requires": { - "pako": "^1.0.7" - } + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true }, "wrap-ansi": { "version": "7.0.0", @@ -12053,18 +23285,68 @@ "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + } } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "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==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.4.tgz", + "integrity": "sha512-zP9z6GXm6zC27YtspwH99T3qTG7bBFv2VIkeHstMLrLlDJuzA7tQ5ls3OJ1hOGGCzTQPniNJoHXIAOS0Jljohg==", + "dev": true, + "requires": {} + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", "dev": true }, "xml2js": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", - "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", "requires": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -12075,22 +23357,39 @@ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "yaml": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", - "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true }, "yargs": { - "version": "16.2.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.2.tgz", - "integrity": "sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { "cliui": "^7.0.2", @@ -12105,30 +23404,18 @@ "yargs-parser": { "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - }, - "yerror": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/yerror/-/yerror-9.1.1.tgz", - "integrity": "sha512-6XGifXCr19Zy0O3YuoWs7287A/9Ush4C/xN9buokIBVUVGrblN3FTrumLmIZFSsSdDlKdJhjXV2GLpba3qoljA==" - }, - "yocto-queue": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", - "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==" + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" }, - "zod": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", - "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true }, - "zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "dev": true + "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==" } } } diff --git a/package.json b/package.json index 05fb3e0a..6dc13d72 100644 --- a/package.json +++ b/package.json @@ -1,51 +1,91 @@ { - "name": "webfont-workspace", - "private": true, - "description": "Monorepo for webfont — npm workspaces", - "workspaces": [ - "packages/*" + "directories": { + "lib": "dist", + "source": "src" + }, + "files": [ + "dist", + "dist/src/index.d.ts", + "templates", + "!**/__tests__", + "!**/__mocks__", + "README.md" ], + "main": "dist/index.js", + "bin": "dist/cli.js", + "source": "src/index.ts", + "types": "dist/src/index.d.ts", + "typings": "dist/src/index.d.ts", "scripts": { - "build": "npm run build -w webfont", - "clean": "npm run clean -w webfont", - "demo": "npm run demo -w webfont", - "docs:build": "npm run build && npm run docs:site", - "docs:demo": "node packages/webfont/dist/cli.mjs './packages/webfont/src/fixtures/svg-icons/*.svg' -d public/font-demo -t html --normalize --center-horizontally --dest-create", - "predocs:site": "npm run docs:cli && node -e \"require('node:fs').existsSync('packages/webfont/dist/cli.mjs')||require('node:child_process').execSync('npm run build',{stdio:'inherit'})\"", - "docs:site": "npm run docs:demo && vitepress build", - "docs:dev": "vitepress dev", - "docs:preview": "vitepress preview", - "lint": "biome check .", - "lint:suppressions": "node scripts/check-no-suppressions.mjs", - "typecheck": "npm run typecheck -w webfont", - "depcheck": "npm run depcheck -w webfont", - "prepare": "lefthook install", - "prettify": "biome check --write .", - "render:homebrew-core": "node scripts/render-homebrew-core-formula.mjs", - "sync:homebrew": "node scripts/sync-homebrew-formula.mjs", - "test": "npm run test:scripts && npm run test -w webfont", - "test:scripts": "vitest run --config vitest.scripts.config.ts", - "audit": "npm audit --audit-level=info", - "test:package": "npm run test:package -w webfont", - "testc": "npm run testc -w webfont", - "test-debug": "npm run test-debug -w webfont", - "testu": "npm run testu -w webfont", - "deprecate-pre-12": "npm run deprecate-pre-12 -w webfont", - "docs:cli": "npm run docs:cli -w webfont" + "build": "rollup -c", + "clean": "rm -rf dist/ temp/", + "demo": "node dist/cli.js './src/fixtures/svg-icons/*.svg' -d demo -t html --normalize --center-horizontally", + "lint": "eslint .", + "postbuild": "tsc --declaration --declarationDir dist --emitDeclarationOnly", + "prebuild": "npm run clean && npm run lint", + "predemo": "npm run build", + "prepublishOnly": "npm run build", + "prerelease": "npm run test", + "pretest": "npm run build", + "prettify": "npm run lint --fix", + "preversion": "npm run test", + "push-tags": "git push origin --tags", + "release": "standard-version", + "release-alpha": "npm run release -- --prerelease alpha", + "test": "jest src", + "testc": "npm test -- --coverage", + "test-debug": "npm test --detectOpenHandles --runInBand", + "testu": "npm test -- -u" }, - "devDependencies": { - "@biomejs/biome": "2.5.2", - "lefthook": "2.1.9", - "vitepress": "2.0.0-alpha.18" + "dependencies": { + "cosmiconfig": "^5.2.0", + "deepmerge": "^4.2.2", + "globby": "^11.0.0", + "meow": "^9.0.0", + "nunjucks": "^3.2.3", + "p-limit": "^3.1.0", + "parse-json": "^5.2.0", + "resolve-from": "^5.0.0", + "svg2ttf": "^6.0.2", + "svgicons2svgfont": "^10.0.3", + "ttf2eot": "^2.0.0", + "ttf2woff": "^3.0.0", + "wawoff2": "^2.0.0", + "xml2js": "^0.4.23" }, - "overrides": { - "minimatch": "10.2.5", - "grunt": { - "js-yaml": "3.15.0", - "minimatch": "3.1.5" - }, - "test-exclude": "7.0.2", - "woff2sfnt-sfnt2woff": "1.0.0" + "devDependencies": { + "@babel/eslint-plugin": "latest", + "@babel/preset-env": "latest", + "@babel/preset-typescript": "latest", + "@rollup/plugin-commonjs": "latest", + "@rollup/plugin-typescript": "latest", + "@types/jest": "26.0.24", + "@types/node": "15.14.9", + "@types/nunjucks": "latest", + "@types/rimraf": "latest", + "@typescript-eslint/eslint-plugin": "latest", + "@typescript-eslint/parser": "latest", + "babel-jest": "27.1.0", + "eslint": "latest", + "eslint-plugin-import": "latest", + "eslint-plugin-jest": "latest", + "eslint-plugin-node": "latest", + "eslint-plugin-promise": "latest", + "eslint-plugin-unicorn": "latest", + "husky": "latest", + "is-eot": "latest", + "is-svg": "latest", + "is-ttf": "latest", + "is-woff": "latest", + "is-woff2": "latest", + "jest": "27.1.0", + "lint-staged": "11.1.2", + "rimraf": "latest", + "rollup": "2.56.3", + "standard-version": "latest", + "ts-node": "latest", + "tslib": "latest", + "typescript": "latest" }, "repository": { "type": "git", @@ -53,11 +93,44 @@ }, "author": "itgalaxy ", "license": "MIT", + "contributors": [ + { + "name": "Alexander Krasnoyarov", + "email": "alexander.krasnoyarov@itgalaxy.company", + "url": "https://vk.com/sterling_archer" + }, + { + "name": "Jimmy Andrade", + "email": "webfont@jimmyandrade.com", + "url": "https://github.com/jimmyandrade" + } + ], + "bugs": { + "url": "https://github.com/itgalaxy/webfont/issues" + }, + "homepage": "https://github.com/itgalaxy/webfont#readme", "engines": { - "node": ">=24.14.0" + "node": ">= 12.0.0" }, - "allowScripts": { - "lefthook@2.1.9": true, - "fsevents@2.3.3": true - } + "keywords": [ + "cli", + "standalone", + "font", + "fonts", + "webfont", + "webfonts", + "svg", + "ttf", + "woff", + "woff2", + "otf", + "ttf2eot", + "ttf2woff", + "ttf2svg", + "svg2ttf", + "css", + "scss", + "builder", + "generator" + ] } diff --git a/packages/grunt-webfont-recipe/.gitignore b/packages/grunt-webfont-recipe/.gitignore deleted file mode 100644 index f06235c4..00000000 --- a/packages/grunt-webfont-recipe/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -dist diff --git a/packages/grunt-webfont-recipe/Gruntfile.cjs b/packages/grunt-webfont-recipe/Gruntfile.cjs deleted file mode 100644 index cc824ea7..00000000 --- a/packages/grunt-webfont-recipe/Gruntfile.cjs +++ /dev/null @@ -1,35 +0,0 @@ -"use strict"; - -const path = require("node:path"); -const { webfont, writeResultFiles } = require("webfont"); - -/** @param {import("grunt")} grunt */ -module.exports = function registerWebfontGruntTask(grunt) { - grunt.registerTask("webfont", "Generate icon fonts from SVG sources", function registerWebfontTask() { - const done = this.async(); - const dest = path.resolve("dist/fonts"); - - void (async () => { - try { - const result = await webfont({ - files: path.join(__dirname, "icons/**/*.svg"), - fontName: "icons", - formats: ["woff2"], - template: "css", - dest, - destCreate: true, - }); - - await writeResultFiles(result); - grunt.log.ok(`Wrote fonts to ${dest}`); - done(); - } catch (error) { - const message = error instanceof Error ? error.message : String(error); - grunt.log.error(message); - done(false); - } - })(); - }); - - grunt.registerTask("default", ["webfont"]); -}; diff --git a/packages/grunt-webfont-recipe/README.md b/packages/grunt-webfont-recipe/README.md deleted file mode 100644 index 9d6be20c..00000000 --- a/packages/grunt-webfont-recipe/README.md +++ /dev/null @@ -1,120 +0,0 @@ -# Grunt recipe — webfont - -Use [webfont](https://github.com/itgalaxy/webfont) from [Grunt](https://gruntjs.com/) as a replacement for the archived [`grunt-webfont`](https://github.com/sapegin/grunt-webfont) plugin. No separate npm package is required — register a small custom task that calls `webfont()` and `writeResultFiles()` (the same disk-write helper the CLI uses). - -## When to use this - -- You still run **Grunt** in a legacy project and want a maintained, pure-JS icon font generator. -- You do **not** need FontForge, BEM/Bootstrap CSS presets, or `data:uri` embedding from grunt-webfont (see [parity gaps](#parity-gaps-vs-grunt-webfont) below). - -For new projects, prefer **npm scripts**, **Vite**, or the [webpack plugin](https://github.com/itgalaxy/webfont-webpack-plugin) instead of Grunt. - -## Install - -```shell -npm install --save-dev webfont grunt grunt-cli -``` - -## Custom task (recommended) - -`Gruntfile.cjs` in this folder is a minimal working example: - -```js -"use strict"; - -const path = require("node:path"); -const { webfont, writeResultFiles } = require("webfont"); - -module.exports = function (grunt) { - grunt.registerTask("webfont", "Generate icon fonts from SVG sources", function () { - const done = this.async(); - const dest = path.resolve("dist/fonts"); - - void (async () => { - try { - const result = await webfont({ - files: path.join(__dirname, "icons/**/*.svg"), - fontName: "icons", - formats: ["woff2"], - template: "css", - dest, - destCreate: true, - }); - - await writeResultFiles(result); - grunt.log.ok(`Wrote fonts to ${dest}`); - done(); - } catch (error) { - grunt.log.error(error instanceof Error ? error.message : String(error)); - done(false); - } - })(); - }); - - grunt.registerTask("default", ["webfont"]); -}; -``` - -Run: - -```shell -npx grunt webfont -``` - -Outputs `dist/fonts/icons.woff2` and `dist/fonts/icons.css` (built-in CSS template). - -### Options - -Pass any [`webfont()` option](https://webfont.js.org/introduction/configuration) in the object above — `formats`, `template`, `normalize`, `ligatures`, `metadataProvider`, `ttfPostProcess`, and so on. Set `dest` and `destCreate: true` so `writeResultFiles` can create the output directory. - -## Alternative: shell out to the CLI - -If you prefer not to import the API: - -```js -grunt.registerTask("webfont", "Generate icon fonts via CLI", function () { - const done = this.async(); - grunt.util.spawn( - { - cmd: "npx", - args: [ - "webfont", - "icons/**/*.svg", - "-d", - "dist/fonts", - "-f", - "woff2", - "-t", - "css", - "-u", - "icons", - "--dest-create", - ], - }, - (error) => done(error === null), - ); -}); -``` - -## Parity gaps vs grunt-webfont - -| grunt-webfont | webfont recipe | -|---------------|----------------| -| Native Grunt task config | Custom task + `webfont()` options | -| FontForge engine | Pure JS (`svg2ttf`) | -| BEM / Bootstrap CSS presets | Custom [Nunjucks template](https://webfont.js.org/introduction/configuration#template) | -| `embed` (data:uri in CSS) | Not built-in — use a custom template | -| `codepointsFile` | Use `metadataProvider` or manage codepoints in your own file | -| `autoHint` | Opt-in via `ttfPostProcess` + external `ttfautohint` ([#749](https://github.com/itgalaxy/webfont/issues/749)) | - -Full comparison: [MIGRATION.md — grunt-webfont](../../MIGRATION.md#comparison-with-grunt-webfont). - -## Official Grunt plugin? - -Not planned unless demand shows up ([#771](https://github.com/itgalaxy/webfont/issues/771)). This recipe keeps maintenance low while covering the common SVG → webfont workflow. - -## Related - -- [Install guide](../webfont/install.md) -- [Configuration](../webfont/docs/configuration.md) -- [Troubleshooting](../../TROUBLESHOOTING.md) diff --git a/packages/grunt-webfont-recipe/icons/icon.svg b/packages/grunt-webfont-recipe/icons/icon.svg deleted file mode 100644 index f06cde05..00000000 --- a/packages/grunt-webfont-recipe/icons/icon.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/packages/grunt-webfont-recipe/package.json b/packages/grunt-webfont-recipe/package.json deleted file mode 100644 index 747127c4..00000000 --- a/packages/grunt-webfont-recipe/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "grunt-webfont-recipe", - "private": true, - "description": "Reference Grunt task for webfont (not published to npm)", - "scripts": { - "grunt": "grunt", - "test": "grunt webfont" - }, - "devDependencies": { - "grunt": "1.6.2", - "grunt-cli": "1.5.0", - "webfont": "file:../webfont" - } -} diff --git a/packages/webfont/LICENSE b/packages/webfont/LICENSE deleted file mode 100644 index bf511f00..00000000 --- a/packages/webfont/LICENSE +++ /dev/null @@ -1,17 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016-present itgalaxy inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, -and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. diff --git a/packages/webfont/NOTICE.md b/packages/webfont/NOTICE.md deleted file mode 100644 index 28faeafc..00000000 --- a/packages/webfont/NOTICE.md +++ /dev/null @@ -1,165 +0,0 @@ -# webfont — Legal Notices - -This document covers **copyright and licensing for fonts you process**, **disclaimers** about using the webfont software, **community attribution guidelines**, and **third-party open-source components** bundled with or used by this project. - -It does **not** replace the [MIT License](./LICENSE) for the webfont source code. If anything here conflicts with `LICENSE`, `LICENSE` governs the software itself. - -**This is not legal advice.** When in doubt about a font or icon license, consult the rights holder or qualified counsel. - ---- - -## 1. webfont software license - -The **webfont** program (source code, CLI, and npm package) is licensed under the **[MIT License](./LICENSE)**. - -Copyright (c) 2016–present [itgalaxy](https://github.com/itgalaxy). - -You may use, copy, modify, and distribute the **software** under the terms of `LICENSE`, provided the copyright and permission notice are preserved in copies or substantial portions. - ---- - -## 2. Disclaimer of warranties and limitation of liability - -THE WEBFONT SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -**You are solely responsible** for how you use webfont, what files you pass into it, and what you do with the output. - ---- - -## 3. Fonts and icons you provide (user content) - -webfont is a **technical tool**. It does **not**: - -- grant any copyright, trademark, or distribution rights in fonts or icons; -- change the license terms of input or output files; -- verify that you have permission to use, modify, decompress, convert, or redistribute any font or SVG; -- remove or replace copyright or license metadata embedded in font files (name tables, etc.). - -### 3.1 SVG icon input - -If you build a font from **`.svg` icons**, you must have the right to use those artworks (your own work, licensed stock, client assets with permission, open-source icons under compatible terms, etc.). - -Generated font files may be subject to the same restrictions as the source icons and to any third-party notices you embed via options such as `metadata` / `copyright`. - -### 3.3 TTF to webfont encoding - -If you **encode** one or more `.ttf` files to `eot`, `woff`, or `woff2`, you are re-wrapping font data you already hold. That operation: - -- does **not** make a restricted or commercial font free to use or share; -- does **not** bypass foundry EULAs or redistribution terms; -- preserves copyright/metadata embedded in the source TTF; -- does **not** merge multiple weights into one file — each input yields separate outputs. - -**Only process fonts you are authorized to convert and redistribute** under their license. - -### 3.4 WOFF / WOFF2 decompression - -If you **decompress** one or more `.woff` or `.woff2` files (from disk or from an `http(s)` URL) to `.ttf` or `.otf`, you are extracting the **SFNT payload** inside each container. That operation: - -- does **not** make a restricted or commercial font free to use or share; -- does **not** bypass foundry EULAs, app terms of service, CDN hotlinking policies, or site download terms; -- may produce files that are **easier to reuse** than the original webfonts — compliance with the **original font license** remains your obligation; -- does **not** merge multiple weights into one font file — each input yields a separate output. - -**Only process fonts you are authorized to use and download** under their license. For remote URLs, you must also have permission to fetch and store those bytes. - -### 3.5 Redistribution of output - -Publishing, shipping, or sublicensing fonts produced or extracted with webfont (in apps, websites, PDFs, design assets, npm packages, etc.) is **your responsibility**. The MIT license on webfont does **not** apply to those font files. - ---- - -## 4. Community attribution guidelines - -These guidelines help the community use and reference webfont fairly. They are **social expectations**, not additional legal terms beyond `LICENSE`. - -### 4.1 Using webfont in your project - -- **No attribution required** for normal use (install via npm, run in CI, internal tooling) under the MIT License. -- **Appreciated** when webfont is a visible part of a product, tutorial, or open-source repo: mention [webfont](https://github.com/itgalaxy/webfont) and link to the repository or [npm package](https://www.npmjs.com/package/webfont). - -### 4.2 Tutorials, posts, and courses - -When documenting a workflow that centers on webfont, please: - -- name the tool (**webfont**) and link to the official repo or npm page; -- distinguish **webfont the software** (MIT) from **fonts you demonstrate** (which may be proprietary); -- avoid implying **endorsement** by itgalaxy unless you have written permission. - -### 4.3 Forks, wrappers, and hosted services - -If you redistribute webfont code, ship a fork, or offer a hosted “font converter” built on webfont: - -- comply with the **MIT License** (retain copyright and permission notice); -- do **not** use the itgalaxy name, logo, or webfont branding to suggest official affiliation without permission; -- provide **your own** terms and privacy policy for user-uploaded fonts; make clear that **users** must have rights to their files. - -### 4.4 Citing underlying libraries - -webfont builds on several open-source font libraries (see [Section 5](#5-third-party-open-source-dependencies)). If you publish academic work, a detailed case study, or compliance documentation that discusses **how** conversion is implemented, consider citing those libraries alongside webfont. - ---- - -## 5. Third-party open-source dependencies - -webfont depends on the following **runtime** npm packages (direct dependencies). Versions follow `package.json` / `package-lock.json` at release time. - -| Package | Typical license | Role in webfont | -|---------|-----------------|-----------------| -| [cosmiconfig](https://github.com/cosmiconfig/cosmiconfig) | MIT | Configuration file discovery | -| [deepmerge](https://github.com/TehShrike/deepmerge) | MIT | Option merging | -| [fontverter](https://github.com/papandreou/fontverter) | BSD-3-Clause | WOFF/WOFF2 → SFNT decompression | -| [globby](https://github.com/sindresorhus/globby) | MIT | Input file globbing | -| [meow](https://github.com/sindresorhus/meow) | MIT | CLI argument parsing | -| [nunjucks](https://github.com/mozilla/nunjucks) | BSD-2-Clause | CSS / SCSS / Styl templates | -| [p-limit](https://github.com/sindresorhus/p-limit) | MIT | Concurrency limiting | -| [resolve-from](https://github.com/sindresorhus/resolve-from) | MIT | Module resolution | -| [svgo](https://github.com/svg/svgo) | MIT | Optional SVG optimization (`optimizeSvg`) | -| [svg2ttf](https://github.com/fontello/svg2ttf) | MIT | SVG font → TTF | -| [svgicons2svgfont](https://github.com/nfroidure/svgicons2svgfont) | MIT | SVG icons → SVG font | -| [ttf2eot](https://github.com/fontello/ttf2eot) | MIT | TTF → EOT | -| [ttf2woff](https://github.com/fontello/ttf2woff) | MIT | TTF → WOFF | -| [wawoff2](https://github.com/fontello/wawoff2) | MIT | TTF ↔ WOFF2 compression | -| [xml2js](https://github.com/Leonidas-from-XIV/node-xml2js) | MIT | SVG XML parsing | - -Transitive dependencies (and their licenses) are recorded in `package-lock.json`. For a full license report after install, you can run: - -```shell -npx license-checker --production --direct -``` - -(Third-party tool; not maintained by this project.) - -### BSD-licensed components - -**fontverter** (BSD-3-Clause) and **nunjucks** (BSD-2-Clause) are subject to their own copyright notices and license terms. Redistributions of webfont that include source or substantial portions of those dependencies should preserve their respective notices as required by those licenses. - ---- - -## 6. Test fixtures and examples - -Font and SVG files under `src/fixtures/` are intended **for automated tests and documentation examples** only. They are not a grant of rights to use those assets outside this repository. Do not assume fixture fonts or icons are redistributable for your own products. - ---- - -## 7. Keeping this document current - -Update **NOTICE.md** in the same pull request when you: - -- add or remove **runtime dependencies** that affect licensing or attribution; -- change **user-facing behavior** around font decompression or output formats in ways that affect legal expectations; -- publish new **community guidelines** for attribution or acceptable use. - -See also [FEATURES.md](./FEATURES.md) (product capabilities) and [CONTRIBUTING.md](./CONTRIBUTING.md) (documentation expectations). - ---- - -## 8. Questions and reports - -- **Software bugs and features:** [GitHub Issues](https://github.com/itgalaxy/webfont/issues) -- **Code of conduct:** [CODE_OF_CONDUCT.md](./CODE_OF_CONDUCT.md) -- **License of the webfont source:** [LICENSE](./LICENSE) - -For font licensing questions about **your** input files, contact the font foundry, vendor, or rights holder — maintainers cannot advise on third-party font EULAs. diff --git a/packages/webfont/README.md b/packages/webfont/README.md deleted file mode 100644 index c260a29a..00000000 --- a/packages/webfont/README.md +++ /dev/null @@ -1,76 +0,0 @@ -# webfont - -Generator of fonts from SVG icons; decompress WOFF/WOFF2 to embedded TTF/OTF (not TTF↔OTF transcoding). - -Requires **Node.js** >= 24.14.0. Use at **build time** only — do not import from browser or React client bundles ([#198](https://github.com/itgalaxy/webfont/issues/198)). - -## Install - -```shell -npm install --save-dev webfont -``` - -Add a CLI script (optional): - -```json -{ - "scripts": { - "icons": "webfont 'src/icons/*.svg' -d dist/fonts -t css" - } -} -``` - -Full setup (cosmiconfig, verification, first run): **[install.md](./install.md)** · [webfont.js.org/introduction/install](https://webfont.js.org/introduction/install) - -## Usage - -Use the **named export** (recommended for ESM and CommonJS): - -```js -import { webfont } from "webfont"; - -const result = await webfont({ - files: "src/svg-icons/**/*.svg", - fontName: "my-font-name", -}); -``` - -CommonJS: - -```js -const { webfont } = require("webfont"); -``` - -`import webfont from "webfont"` works on **12.x+** (default export is the function). On older releases use the named import — see [migration notes](https://webfont.js.org/migrating/issue-0618-esm-default-import). - -## Pipelines - -Each run uses **one** mode (inputs cannot be mixed): - -- **SVG icons** (default) — `.svg` → `svg`, `ttf`, `eot`, `woff`, `woff2` -- **TTF encoding** — `.ttf` → `woff`, `woff2`, and optional `svg` / `eot` (auto-detected) -- **Webfont decompress** — `.woff` / `.woff2` (paths, globs, or URLs) → `ttf` and/or `otf` per file - -Details and limits: [webfont.js.org/introduction/getting-started](https://webfont.js.org/introduction/getting-started) · [Features](https://webfont.js.org/introduction/features) - -## Documentation (shipped with this package) - -| Guide | File | -|-------|------| -| Install & CLI wiring | [install.md](./install.md) | -| `webfont()` options & svgicons2svgfont | [docs/configuration.md](./docs/configuration.md) | -| CLI flags & exit codes | [docs/cli.md](./docs/cli.md) | -| Font licensing & legal notices | [NOTICE.md](./NOTICE.md) | - -## More documentation - -- **Site:** [webfont.js.org](https://webfont.js.org) -- **Repository:** [github.com/itgalaxy/webfont](https://github.com/itgalaxy/webfont) -- **Troubleshooting:** [webfont.js.org/introduction/troubleshooting](https://webfont.js.org/introduction/troubleshooting) -- **Migration:** [webfont.js.org/migrating/](https://webfont.js.org/migrating/) -- **Issues:** [github.com/itgalaxy/webfont/issues](https://github.com/itgalaxy/webfont/issues) -- **Changelog:** [webfont.js.org/introduction/whats-new](https://webfont.js.org/introduction/whats-new) · [GitHub](https://github.com/itgalaxy/webfont/blob/master/packages/webfont/CHANGELOG.md) - -## License - -The **webfont software** is licensed under the [MIT License](./LICENSE). That license does **not** apply to fonts or icons you process with the tool — see [NOTICE.md](./NOTICE.md). diff --git a/packages/webfont/docs/cli.md b/packages/webfont/docs/cli.md deleted file mode 100644 index 8e4ab52f..00000000 --- a/packages/webfont/docs/cli.md +++ /dev/null @@ -1,205 +0,0 @@ -# Command Line Interface - -The interface for command-line usage is fairly simplistic at this stage, as seen in the usage section below. - -Install the package and wire the CLI script first: [Install guide](https://webfont.js.org/introduction/install) ([source](../install.md)). - -## Usage - - -> **Maintainers:** CLI help is generated from `packages/webfont/src/cli/meow/cliFlagCatalog.ts`. After editing flag metadata, run `npm run docs:cli` at the repo root (unit tests also guard drift). - -```shell - Usage: webfont [input] [options] - - Input: File(s) or glob(s). - - SVG icons: one or more `.svg` files (default pipeline). - Webfont decompression: one or more `.woff` / `.woff2` paths, globs, or http(s) URLs. - You must have rights to any font file you process (see NOTICE.md). - - If an input argument is wrapped in quotation marks, it will be passed to "fast-glob" - for cross-platform glob support. - - Options: - - --assistant - - Interactive wizard (webfont-assistant style): prompts for font name, icon prefix, - glyph/output paths, formats, and built-in or custom templates; writes a `.was` config. - - --assistant-config - - Path to a `.was` file (webfont-assistant format). The file contents may be a single - config object or a JSON array of configs; this flag is not inline JSON. - Distinct from `--config` (cosmiconfig). - - --config - - Path to a specific configuration file (JSON, YAML, or CommonJS) - or the name of a module in `node_modules` that points to one. - If no `--config` argument is provided, webfont will search for - configuration files in the following places, in this order: - - a `webfont` property in `package.json` - - a `.webfontrc` file (with or without filename extension: - `.json`, `.yaml`, and `.js` are available) - - a `webfont.config.js` file exporting a JS object - The search will begin in the working directory and move up the - directory tree until a configuration file is found. - - -u, --fontName - - The font family name you want, default: "webfont". - - -h, --help - - Output usage information. - - -v, --version - - Output the version number. - - -f, --formats - - Font formats to generate. Pass a JSON array (e.g. '["woff2"]') or a - comma-separated list (e.g. woff2 or svg, ttf, woff2). - SVG input: svg, ttf, eot, woff, woff2 (not otf). - WOFF/WOFF2 input: ttf and/or otf matching the embedded SFNT flavor. - - -d, --dest - - Destination for generated fonts. - - -m, --dest-create - - Create destination directory if it does not exist. - - -t, --template - - Built-in template name(s) ('css', 'scss', 'styl', 'html', 'json') or path to a custom template. - Pass a JSON array (e.g. '["html","scss"]') or comma-separated list for multiple outputs. - - -s, --destTemplate - - Destination for generated template. If not passed used `dest` argument value. - - -c, --templateClassName - - Class name in css template. - - -p, --templateFontPath - - Font path in css template. - - -n, --templateFontName - - Font name in css template. - - --templateCacheString - - Specify cache string in scss/css template. - - --no-sort - - Keeps the files in the same order of entry - - --ligatures - - Add OpenType ligature glyphs (icon names as text). Off by default — large - icon sets can hang Firefox on Windows (#558). Prefer class + codepoint CSS. - - --unicode-range - - Emit unicode-range in built-in @font-face rules (computed from glyph code points). - Off by default — enabling may prevent ligature names from rendering; see README. - - --no-template-font-ligatures - - Omit font-feature-settings: "liga" from the built-in HTML preview template - - --optimize-svg - - Run a conservative SVGO pass on each SVG before font generation - (does not convert strokes to fills; use glyphContentTransformFn for that) - - --verbose - - Tell me everything!. - - --svg-diagnose - - (Alpha) Scan SVG icons for icon-font incompatibilities (stroke-only paths, - fill-rule: evenodd, unsupported elements) and log warnings. - - For "svgicons2svgfont": - - --fontId - - The font id you want, default as "--fontName". - - --fontStyle - - The font style you want. - - --fontWeight - - The font weight you want. - - --fixedWidth - - Creates a monospace font of the width of the largest input icon. - - --centerHorizontally - - Calculate the bounds of a glyph and center it horizontally. - - --centerVertically - - Center the glyphs vertically in the generated font. - - --normalize - - Normalize icons by scaling them to the height of the highest icon. - - --fontHeight - - The outputted font height [MAX(icons.height)]. - - --round - - Setup the SVG path rounding [10e12]. - - --descent - - The font descent [0]. - - --ascent - - The font ascent [height - descent]. - - --startUnicode - - The start unicode codepoint for files without prefix [0xEA01]. - - --prependUnicode - - Prefix files with their automatically allocated unicode codepoint. - - --metadata - - Content of the metadata tag. - - --addHashInFontUrl - - Append an MD5 content hash to font URLs in built-in templates - (?v=[hash]) while keeping output filenames stable (fontName.woff2, etc.). - Use with a fixed fontName — do not randomize fontName for cache busting. -``` - -## Exit codes - -The CLI can exit the process with the following exit codes: - -- **0** — All ok. -- **1** — Something unknown went wrong. -- **Other** — Related to using packages. diff --git a/packages/webfont/docs/configuration.md b/packages/webfont/docs/configuration.md deleted file mode 100644 index 873703cd..00000000 --- a/packages/webfont/docs/configuration.md +++ /dev/null @@ -1,415 +0,0 @@ -# Configuration - -Reference for `webfont()` options, cosmiconfig files, and svgicons2svgfont parameters. CLI flags map to the same names — see the [CLI reference](./cli.md). - -## Result - -`webfont()` resolves to an object with generated font buffers (and optional `template` output). The `config` property contains the **effective options** used for the run (defaults, discovered config, and any options you passed in), plus optional **output metadata** when a configuration file was found or loaded. - -`Result` and `ResultConfig` are exported from the package entry: - -```ts -import { webfont, type Result, type ResultConfig } from "webfont"; - -const result: Result = await webfont({ files: "src/svg-icons/**/*.svg" }); -const config: ResultConfig | undefined = result.config; -``` - -### `result.config.filePath` - -- Type: `string` | `undefined` -- Description: Absolute path to the configuration file that was discovered or loaded. Omitted when no configuration file was found and defaults were used. -- Note: Output-only metadata — not an input option. Do not set `filePath` in `.webfontrc`, `package.json`, or the `webfont()` call. - -### Writing results to disk - -The API does not write files by itself. Pass `dest` (and `destCreate: true` when the folder may not exist), then call `writeResultFiles` — the same helper the CLI uses: - -```ts -import { webfont, writeResultFiles } from "webfont"; - -const result = await webfont({ - files: "src/icons/**/*.svg", - fontName: "icons", - formats: ["woff2"], - template: "css", - dest: "dist/fonts", - destCreate: true, -}); - -await writeResultFiles(result); -``` - -Grunt integration: [Grunt recipe](../../../packages/grunt-webfont-recipe/README.md). - -## files - -- Type: `string` | `array` -- Description: A file glob, or array of file globs. Ultimately passed to [fast-glob](https://github.com/mrmlnc/fast-glob) to figure out what files you want to get. -- **SVG mode**: one or more `.svg` icon paths or globs (default pipeline). -- **TTF encoding mode**: one or more `.ttf` paths or globs. -- **Webfont decompress mode**: one or more `.woff` / `.woff2` paths, globs, or `https://…` URLs (see [`formats`](#formats) and [Capabilities at a glance](../../README.md#capabilities-at-a-glance)). -- Do not mix `.svg`, `.ttf`, and `.woff` / `.woff2` in the same run. -- Every matched file must have a supported extension (`.svg`, `.ttf`, `.woff`, `.woff2`); extension-less files such as `LICENSE` are not ignored when matched by a broad glob. -- `node_modules` and `bower_components` are always ignored. - -## configFile - -- Type: `string` -- Description: Path to a specific configuration file `(JSON, YAML, or CommonJS)` or the name of a module in `node_modules` that points to one. -- Note: If you do not provide `configFile`, webfont will search up the directory tree for configuration file in the following places, in this order: - 1. a `webfont` property in `package.json` - 2. a `.webfontrc` file (with or without filename extension: `.json`, `.yaml`, and `.js` are available) - 3. a `webfont.config.js` file exporting a JS `object`. - The search will begin in the working directory and move up the directory tree until it finds a configuration file. -- Note: When a configuration file is discovered or loaded, the resolved absolute path is available on `result.config.filePath` (see [Result](#result)). - -## fontName - -- Type: `string` -- Default: `webfont` -- Description: The font family name you want. - -## formats - -- Type: `array` -- Default: `['svg', 'ttf', 'eot', 'woff', 'woff2']` (SVG input). For TTF input, defaults to `['woff', 'woff2']` when SVG-pipeline formats are still configured. For WOFF/WOFF2 input, defaults to `['ttf']` when SVG-pipeline formats are still configured. -- Possible values: `svg`, `ttf`, `otf`, `eot`, `woff`, `woff2` -- Description: Font file types to generate. - - **SVG input**: `svg`, `ttf`, `eot`, `woff`, `woff2` only. **`otf` is not supported** (pipeline uses TrueType outlines). - - **TTF input**: `svg` (SVG font), `ttf`, `eot`, `woff`, and/or `woff2`. `svg` is **opt-in** (not in the default `woff` + `woff2` set); **`otf` is not produced** in this mode. - - **WOFF/WOFF2 input**: `ttf` and/or `otf` only — must match the decompressed SFNT flavor inside the file (not arbitrary transcoding). `eot`, `woff`, `woff2`, and `svg` are not produced in this mode. -- CLI: pass `-f` / `--formats` as a JSON array (for example `'["woff2"]'`) or as a comma-separated list (for example `woff2` or `svg, ttf, woff2`). Invalid format names throw an error. -- API and config files: `formats` must be an array of the values above; unknown names (for example `icon`) throw before the pipeline runs. - -## template - -- Type: `string` or `string[]` -- Default: `null` -- Possible values: `css`, `scss`, `styl`, `html`, `json` (feel free to contribute more), or a path to a custom `.njk` template. -- Pass an **array** to generate multiple outputs in one run (for example `['html', 'scss']` for preview + styles, #158). -- CLI: pass `-t` / `--template` as a single name, a JSON array (`'["html","scss"]'`), or a comma-separated list (`html,scss`). -- Note: If you want to use a custom template use this option pass in a path `string` like this: - - ```js - webfont({ - template: "./path/to/my-template.css", - }); - ``` - - Or - - ```js - webfont({ - template: path.resolve(__dirname, "./my-template.css"), - }); - ``` - - Or - - ```js - webfont({ - template: path.resolve(__dirname, "./my-template.styl"), - }); - ``` - -## templateClassName - -- Type: `string` -- Default: `null` -- Description: Default font class name. - -## templateFontPath - -- Type: `string` -- Default: `./` -- Description: Path to generated fonts in the `CSS` file. - -## templateFontName - -- Type: `string` -- Default: Same as [`fontName`](#fontname) when not set. -- Description: CSS `font-family` name emitted by built-in templates (`fontFamily` in Nunjucks context). Output **font files** are always named after `fontName` (for example `icons-a.woff2`); built-in templates reference those files with Nunjucks `fontName` / `fontFamily` placeholders in `url(...)` and `font-family` ([#331](https://github.com/itgalaxy/webfont/issues/331)). - -## templateCacheString - -- Type: `string` -- Default: `Date.now()` at generation time -- Description: Query string appended to font `url(...)` values in built-in templates (before optional `&v=` hash). Use a fixed value (for example `v=1`) when you only need manual cache busting; pair with [`addHashInFontUrl`](#addhashinfonturl) for automatic content-based busting. - -## addHashInFontUrl - -- Type: `boolean` -- Default: `false` -- Description: When `true` and a built-in `template` is used, append `&v=` to each font URL in the generated CSS/SCSS/Styl. The hash is derived from the SVG font output — it changes only when icon data changes. **Output filenames stay** `fontName.woff2`, `fontName.scss`, etc. (stable `@import` paths). -- CLI: `--addHashInFontUrl` -- Addresses browser cache issues without renaming font files on every build ([#125](https://github.com/itgalaxy/webfont/issues/125)). - -**Example — stable `webfont.scss`, cache-busted font URLs:** - -```shell -webfont "icons/*.svg" -d dist/icons -t scss --addHashInFontUrl -``` - -```js -import { webfont } from "webfont"; - -await webfont({ - files: "src/icons/**/*.svg", - fontName: "webfont", - template: "scss", - templateFontPath: "./fonts/", - addHashInFontUrl: true, -}); -// Writes dist/icons/webfont.scss and dist/icons/webfont.woff2 (fixed names). -// SCSS contains url("./fonts/webfont.woff2?...&v=") — hash updates when icons change. -``` - -Do **not** use `Math.random()` in `fontName` — that renames both font files and the stylesheet on every run. - -## unicodeRange - -- Type: `boolean | string` -- Default: `false` (omit `unicode-range` from built-in templates) -- Description: When `true` and a built-in `template` is used, emit a `unicode-range` declaration in `@font-face` so the browser can load only the icon font that owns the code points on the page. With the default `startUnicode` (`0xEA01`), the range is derived from the minimum and maximum allocated code points (for example `U+EA01-EA03`). Pass a CSS value string (for example `U+EA01-EAFF`) to override the computed range. Set to `false` to omit the rule (default). -- CLI: `--unicode-range` to enable auto-computed range -- Helps when **multiple icon fonts** share a page ([#322](https://github.com/itgalaxy/webfont/issues/322)) — each `@font-face` can declare which private-use code points it owns so the browser skips downloading fonts that cannot render the glyphs in use. -- **Ligature trade-off:** computed `unicode-range` covers **private-use code points only** (ligature names are ignored when building the range). If you type icon names with OpenType ligatures (`font-feature-settings: "liga"`), a PUA-only `unicode-range` prevents the browser from applying the icon font to ASCII letters, so ligatures **do not render**. Prefer class + codepoint icons in production when `unicode-range` is enabled, or leave `unicodeRange` at the default `false` if you rely on ligature names. - -## ligatures - -- Type: `boolean` -- Default: `false` (ligature glyphs are **not** added unless you opt in) -- Description: When `true`, each glyph gets a second unicode entry: the icon name with hyphens replaced by underscores (for example `phone-call` → `phone_call`). Browsers can map that character sequence to the icon glyph when OpenType ligatures are enabled (`font-feature-settings: "liga"`). -- CLI: `--ligatures` to enable ligature glyphs in the font. -- **Why off by default:** large icon sets (thousands of glyphs) produce huge GSUB tables. **Firefox on Windows** (DirectWrite) can hang or slow dramatically when ligatures are enabled ([#558](https://github.com/itgalaxy/webfont/issues/558)). Prefer **class + private-use codepoint** CSS for MDI-scale fonts. webfont prints a warning when glyph count exceeds 2000 with ligatures enabled. - -## templateFontLigatures - -- Type: `boolean` -- Default: `true` -- Description: When `true` and the built-in **`html`** preview template is used, the generated CSS enables `font-feature-settings: "liga"` on the **Ligature** section (`#icon-ligatures`) so ligature names render as icons instead of invisible/missing glyphs. If you also enable [`unicodeRange`](#unicoderange), the HTML template **omits** `unicode-range` on `@font-face` while ligature preview is on (ligature strings are ASCII; a PUA-only `unicode-range` would block the icon font for those characters). Set to `false` if you inject your own ligature CSS. -- CLI: `--no-template-font-ligatures` to omit the CSS rule. -- Requires [`ligatures`](#ligatures) enabled (`--ligatures` / `ligatures: true`). Class-based icons (`.font-name-icon::before` with a private-use codepoint) work without this option. - -## glyphTransformFn - -- Type: `function` -- Default: `null` -- Description: If you want to transform glyph metadata (e.g. titles of CSS classes or unicode) before transferring it in your style template for your icons, you can use this option with glyphs metadata object. -- Example: - - ```js - import { webfont } from "webfont"; - - webfont({ - files: "src/svg-icons/**/*.svg", - glyphTransformFn: (obj) => { - obj.name += "_transform"; - something(); - - return obj; - }, - }) - .then((result) => { - // Do something with result - Function.prototype(result); - // Or return it - return result; - }) - .catch((error) => { - throw error; - }); - ``` - -## glyphContentTransformFn - -- Type: `function` -- Default: `null` -- Description: Transform each SVG glyph **before** font generation (SVG pipeline only). Use this hook to preprocess SVGs — for example stroke-based icons converted to filled paths. **webfont does not bundle preprocessors**; install tools such as [`svg-outline-stroke`](https://github.com/elrumordelaluz/outline-stroke) in **your** project and call them from this function (see [ADR 0011](../../../docs/adr/0011-no-svg-outline-stroke-dependency.md)). `glyphTransformFn` only changes metadata; this hook receives the full `GlyphData` (`contents`, `srcPath`, optional `metadata`) and must return the new SVG string. -- Example (stroke icons, #144 — **install `svg-outline-stroke` in your app**, not in webfont): - - ```js - import outlineStroke from "svg-outline-stroke"; - import { webfont } from "webfont"; - - await webfont({ - files: "src/svg-icons/**/*.svg", - glyphContentTransformFn: async (glyph) => outlineStroke(glyph.contents), - }); - ``` - - For better trace quality with `svg-outline-stroke`, use a larger `width` / `height` / `viewBox` on the source SVG (see the library README). - -## optimizeSvg - -- Type: `boolean` -- Default: `false` -- Description: When `true`, run a **conservative** [SVGO](https://github.com/svg/svgo) pass on each SVG **after** diagnostics and **before** `glyphContentTransformFn`. Removes editor cruft (comments, metadata, doctype) without rewriting paths or removing `viewBox`. Does **not** convert stroke-only artwork to fills — pair with [`glyphContentTransformFn`](#glyphcontenttransformfn) for stroke icons ([#327](https://github.com/itgalaxy/webfont/issues/327), [#724](https://github.com/itgalaxy/webfont/issues/724)). -- CLI: `--optimize-svg` -- Optional: `svgoConfig` — SVGO `Config` object; when `plugins` is set, it replaces the built-in conservative plugin list. - - ```js - import { webfont } from "webfont"; - - await webfont({ - files: "src/icons/**/*.svg", - optimizeSvg: true, - glyphContentTransformFn: async (glyph) => { - // optional: stroke-to-fill after SVGO cleanup - return glyph.contents; - }, - }); - ``` - -## svgTools (alpha) - -- Type: `{ diagnose?: boolean; onMessage?: (message: string) => void }` -- Default: `undefined` (disabled) -- Description: **Alpha.** Scan SVG sources for icon-font incompatibilities before font generation (SVG pipeline only). Does **not** modify SVGs — use [`glyphContentTransformFn`](#glyphcontenttransformfn) to preprocess (for example stroke-to-fill with [`svg-outline-stroke`](https://github.com/elrumordelaluz/outline-stroke), installed in your project). See [ADR 0011](../../../docs/adr/0011-no-svg-outline-stroke-dependency.md). - - **`diagnose`:** log warnings for `fill-rule: evenodd`, stroke-only paths (`fill="none"` + `stroke`), `` symbol references ([#612](https://github.com/itgalaxy/webfont/issues/612)), and poorly supported elements (``, ``, ``). Results are also returned on `result.svgDiagnostics` when enabled. - - **`onMessage`:** optional sink for diagnostic log lines (tests, custom UIs). -- CLI: `--svg-diagnose` (alpha). -- Example: - - ```js - import { webfont } from "webfont"; - - const result = await webfont({ - files: "src/icons/**/*.svg", - svgTools: { diagnose: true }, - }); - - console.log(result.svgDiagnostics); - ``` - - See [TROUBLESHOOTING.md](../../TROUBLESHOOTING.md) — “Icon details missing after export”. - -## ttfPostProcess - -- Type: `function` -- Default: `undefined` -- Description: Post-process the generated **TTF** buffer **after** it is built and **before** webfont derives WOFF/WOFF2/EOT from it (SVG pipeline only). The callback receives `(ttf, { fontName, formats })` and returns the new font bytes (`Buffer` or `Uint8Array`, sync or async). Every derived format is produced from the returned buffer. This is a **caller-owned** extension point — webfont bundles nothing here, so optional/native steps such as **autohinting** (`ttfautohint`) live in **your** project or a separate package, keeping the core free of native dependencies (same philosophy as [`glyphContentTransformFn`](#glyphcontenttransformfn) and [ADR 0011](../../../docs/adr/0011-no-svg-outline-stroke-dependency.md); see [#749](https://github.com/itgalaxy/webfont/issues/749)). -- Example (autohinting — **install the hinting tool in your app**, not in webfont): - - ```js - import { webfont } from "webfont"; - import { autohint } from "some-ttfautohint-wrapper"; - - await webfont({ - files: "src/svg-icons/**/*.svg", - formats: ["ttf", "woff2"], - ttfPostProcess: async (ttf) => autohint(ttf), - }); - ``` - -## metadataProvider - -- Type: `function` -- Default: built-in metadata service (reads icon names and unicode from SVG files) -- Description: Custom callback to resolve glyph metadata for each source file. Receives the file path and a Node-style callback `(error, metadata)` where `metadata` is `{ name: string, unicode?: string | string[] }`. When omitted, webfont uses its default metadata reader. - - ```js - import { webfont } from "webfont"; - - webfont({ - files: "src/svg-icons/**/*.svg", - metadataProvider: (srcPath, callback) => { - callback(null, { name: "custom-icon-name" }); - }, - }); - ``` - -## sort - -- Type: `bool` -- Default: `true` -- Description: Whether you want to sort the icons sorted by name. - -## svgicons2svgfont - -These options are passed directly to [svgicons2svgfont](https://github.com/nfroidure/svgicons2svgfont) as top-level `webfont()` fields (same names as CLI flags). - -## fontName - -- Type: `string` -- Default: Taken from the [fontName](#fontname) -- Description: The font family name you want. - -## fontId - -- Type: `string` -- Default: The `fontName` value -- Description: The font id you want. - -## fontStyle - -- Type: `string` -- Default: `''` -- Description: The font style you want. - -## fontWeight - -- Type: `string` -- Default: `''` -- Description: The font weight you want. - -## fixedWidth - -- Type: `boolean` -- Default: `false` -- Description: Creates a monospace font of the width of the largest input icon. - -## centerHorizontally - -- Type: `boolean` -- Default: `false` -- Description: Calculate the bounds of a glyph and center it horizontally. - -## centerVertically - -- Type: `boolean` -- Default: `false` -- Description: Center the glyphs vertically in the generated font. - -## normalize - -- Type: `boolean` -- Default: `false` -- Description: Normalize icons by scaling them to the height of the highest icon. - -## fontHeight - -- Type: `number` -- Default: `MAX(icons.height)` -- Description: The outputted font height (defaults to the height of the highest input icon). - -## round - -- Type: `number` -- Default: `10e12` Setup SVG path rounding. - -## descent - -- Type: `number` -- Default: `0` -- Description: The font descent. It is useful to fix the font baseline yourself. -- Warning: The descent is a positive value!. - -## ascent - -- Type: `number` -- Default: `fontHeight - descent` -- Description: The font ascent. Use this options only if you know what you're doing. A suitable value for this is computed for you. - -## metadata - -- Type: `string` -- Default: `undefined` -- Description: The font [metadata](http://www.w3.org/TR/SVG/metadata.html). - You can set any character data in, but this is the recommended place for a copyright mention. - -## Are you a contributor? - -Update this file in the same PR when `webfont()` options, defaults, accepted values, or svgicons2svgfont forwarding change. See [CONTRIBUTING.md](../../CONTRIBUTING.md). - diff --git a/packages/webfont/install.md b/packages/webfont/install.md deleted file mode 100644 index b0a6781e..00000000 --- a/packages/webfont/install.md +++ /dev/null @@ -1,248 +0,0 @@ -# Install webfont - -Generate icon fonts from SVG files at **build time** with the `webfont` CLI or the Node.js `webfont()` API. This guide covers install, wiring, optional config, and a first successful run. - -## Requirements - -- **Node.js** >= 24.14.0 (`engines` in `package.json`; CI tests Node 24.x and 26.x) -- **Build-time only** — use npm scripts, the CLI, or Node build hooks. Do not import webfont from browser or React client bundles ([troubleshooting](../../TROUBLESHOOTING.md#cant-resolve-fs-webpack--react--vite-client-bundle)). - -Check your Node version: - -```shell -node --version -``` - -## Install - -### npm (recommended for projects) - -From your project root: - -```shell -npm install --save-dev webfont -``` - -### Homebrew (macOS / Linux CLI) - -**Recommended** — [homebrew-core](https://github.com/Homebrew/homebrew-core) (no tap): - -```shell -brew install webfont -``` - -If Homebrew reports that no formula named `webfont` exists, refresh the index first: - -```shell -brew update -brew install webfont -``` - -Homebrew installs the published npm tarball and requires the `node` formula. Verify the CLI: - -```shell -webfont --version -``` - -**Monorepo tap (optional)** — use when you want the `webfonts` alias or a formula change before it lands in core ([#769](https://github.com/itgalaxy/webfont/issues/769)): - -```shell -brew tap itgalaxy/webfont https://github.com/itgalaxy/webfont -brew install webfont -``` - -The alias `webfonts` works only in the tap: - -```shell -brew install webfonts -``` - -**Switching from tap to core** — if you already installed from `itgalaxy/webfont` and want the core formula: - -```shell -brew uninstall webfont -brew untap itgalaxy/webfont -brew update -brew install webfont -``` - -For library use inside a Node project, prefer the npm dev dependency above. - -### Grunt (legacy projects) - -[`grunt-webfont`](https://github.com/sapegin/grunt-webfont) is archived. Use a custom Grunt task that calls `webfont()` and `writeResultFiles()` — see [`packages/grunt-webfont-recipe`](../../packages/grunt-webfont-recipe/README.md) ([#771](https://github.com/itgalaxy/webfont/issues/771)). - -## Verify - -**CLI (npm project)** - -```shell -npx webfont --version -``` - -**CLI (Homebrew)** - -```shell -webfont --version -``` - -**Programmatic API** — prefer the named export: - -```shell -node --input-type=module -e "import { webfont } from 'webfont'; console.log(typeof webfont)" -``` - -Expected: `function`. CommonJS also works: `const { webfont } = require("webfont")`. - -On webfont **12.x+**, default ESM import is callable too; `{ webfont }` remains the recommended form for new code. - -## Use the CLI - -Add a script to `package.json`: - -```json -{ - "scripts": { - "webfont": "node node_modules/webfont/dist/cli.mjs" - } -} -``` - -On Windows-heavy teams, [cross-env](https://www.npmjs.com/package/cross-env) avoids path issues: - -```json -{ - "scripts": { - "webfont": "cross-env node_modules/webfont/dist/cli.mjs" - } -} -``` - -Run with `npm run webfont -- ` (`--` forwards arguments to the CLI). - -All flags: [CLI reference](https://webfont.js.org/introduction/cli) · [source](./docs/cli.md) - -### Interactive assistant - -For a guided flow (same idea as [webfont-assistant](https://github.com/kmorope/webfont-assistant)): - -```shell -webfont --assistant -``` - -Rerun from a saved `.was` config: - -```shell -webfont --assistant-config assets/fonts/MyAwesomeFont.was -``` - -`--assistant-config` is **not** the same as `--config` (cosmiconfig). - -## Use the programmatic API - -```js -import { webfont } from "webfont"; - -const result = await webfont({ - files: "src/icons/**/*.svg", - fontName: "my-icons", - formats: ["woff2"], -}); - -// result.woff2, result.ttf, result.template, … -``` - -Full options: [Configuration](./docs/configuration.md) · [docs site](https://webfont.js.org/introduction/configuration) - -## Configuration files - -Store defaults in cosmiconfig instead of repeating flags every run. When no explicit path is given, webfont searches **upward from the working directory**: - -1. `webfont` key in `package.json` -2. `.webfontrc` (`.json`, `.yaml`, or `.js`) -3. `webfont.config.js` - -**`package.json`** - -```json -{ - "webfont": { - "files": "src/icons/**/*.svg", - "fontName": "my-icons", - "formats": ["woff2"], - "template": "css", - "dest": "dist/fonts" - } -} -``` - -**`webfont.config.js`** - -```js -export default { - files: "src/icons/**/*.svg", - fontName: "my-icons", - formats: ["woff2"], - template: "css", - dest: "dist/fonts", -}; -``` - -Point to a specific file with CLI `--config` or API `configFile`. After a run, `result.config.filePath` shows which file was loaded (output metadata only — do not set this in config). - -## First run - -Put at least one `.svg` in `icons/` (e.g. `icons/star.svg`). - -**CLI** - -```shell -npm run webfont -- "./icons/*.svg" -d dist/fonts -f woff2 -t css -u my-icons --dest-create -``` - -**API** — write buffers yourself (the API does not write to disk unless you use the CLI flow): - -```js -import { mkdir, writeFile } from "node:fs/promises"; -import path from "node:path"; -import { webfont } from "webfont"; - -const dest = "dist/fonts"; -await mkdir(dest, { recursive: true }); - -const result = await webfont({ - files: "icons/*.svg", - fontName: "my-icons", - formats: ["woff2"], - template: "css", -}); - -await writeFile(path.join(dest, "my-icons.woff2"), result.woff2); -if (result.template) { - await writeFile(path.join(dest, "my-icons.css"), result.template); -} -``` - -Confirm output: - -```shell -ls dist/fonts/ -``` - -You should see `my-icons.woff2` and, with `-t css`, `my-icons.css`. - -## Tips - -- **Pipelines** are mutually exclusive per run: `.svg` (icon font), `.ttf` (encode), or `.woff`/`.woff2` (decompress). See [Capabilities at a glance](../../README.md#capabilities-at-a-glance). -- **Font rights:** you must be allowed to process every input file. See [NOTICE.md](./NOTICE.md). -- **Webpack:** prefer the [webpack plugin](https://github.com/itgalaxy/webfont-webpack-plugin) or call webfont from a Node build script, not from client bundles. -- **Grunt:** see [`packages/grunt-webfont-recipe`](../../packages/grunt-webfont-recipe/README.md) (replacement for archived `grunt-webfont`). - -## Related - -- [Configuration](./docs/configuration.md) — all `webfont()` options -- [Features](../../FEATURES.md) — what is stable, in progress, or planned -- [Troubleshooting](../../TROUBLESHOOTING.md) — common errors on the current release -- [Migration](../../MIGRATION.md) — upgrading from older webfont versions - -This file lives at `packages/webfont/install.md` in the monorepo and ships on npm as `webfont/install.md` for tooling such as [install.md](https://install.md/). diff --git a/packages/webfont/knip.json b/packages/webfont/knip.json deleted file mode 100644 index 29a87227..00000000 --- a/packages/webfont/knip.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "$schema": "https://unpkg.com/knip@6/schema.json", - "entry": [ - "src/browser.ts", - "src/cli/index.ts", - "src/types/index.ts", - "templates/index.ts", - "src/fixtures/config-discovery/js-config/webfont.config.js", - "src/fixtures/configs/webfont.config-cli.js", - "src/fixtures/config-discovery/js-rc/.webfontrc.js", - "src/fixtures/config-package/index.js" - ], - "project": ["src/**/*.{ts,js}", "templates/**/*.{ts,js}"], - "exclude": ["duplicates"], - "ignoreExportsUsedInFile": { - "interface": true, - "type": true - }, - "ignoreIssues": { - "src/cli/meow/index.ts": ["exports"], - "src/cli/program.ts": ["exports"], - "src/node/writeResultFiles.ts": ["exports"], - "templates/index.ts": ["exports"], - "src/index.ts": ["exports"], - "src/standalone/index.ts": ["exports"], - "src/lib/execCLI/index.ts": ["types"], - "src/standalone/toTtf.ts": ["types"], - "src/types/index.ts": ["types"], - "src/types/Result.ts": ["types"] - } -} diff --git a/packages/webfont/package.json b/packages/webfont/package.json deleted file mode 100644 index a2151f4a..00000000 --- a/packages/webfont/package.json +++ /dev/null @@ -1,167 +0,0 @@ -{ - "name": "webfont", - "version": "12.5.0", - "description": "Generator of fonts from SVG icons; decompress WOFF/WOFF2 to embedded TTF/OTF (not TTF↔OTF transcoding)", - "directories": { - "lib": "dist", - "source": "src" - }, - "files": [ - "dist", - "dist/src/index.d.ts", - "templates", - "install.md", - "docs/configuration.md", - "docs/cli.md", - "LICENSE", - "!**/__tests__", - "!**/__mocks__", - "README.md", - "NOTICE.md" - ], - "type": "commonjs", - "sideEffects": false, - "main": "dist/index.js", - "module": "dist/index.mjs", - "browser": "dist/browser.js", - "bin": "dist/cli.mjs", - "source": "src/index.ts", - "types": "dist/src/index.d.ts", - "typings": "dist/src/index.d.ts", - "exports": { - ".": { - "browser": { - "types": "./dist/src/index.d.ts", - "default": "./dist/browser.js" - }, - "node": { - "import": { - "types": "./dist/src/index.d.mts", - "default": "./dist/index.mjs" - }, - "require": { - "types": "./dist/src/index.d.ts", - "default": "./dist/index.js" - } - }, - "default": { - "types": "./dist/src/index.d.ts", - "default": "./dist/browser.js" - } - }, - "./package.json": "./package.json" - }, - "scripts": { - "build": "vite build --mode library && vite build --mode library-esm && vite build --mode browser && vite build --mode cli && node scripts/emit-mts-types.mjs", - "clean": "rm -rf dist/ temp/", - "demo": "node dist/cli.mjs './src/fixtures/svg-icons/*.svg' -d demo -t html --normalize --center-horizontally", - "lint": "biome check .", - "typecheck": "tsc -p tsconfig.json --noEmit", - "depcheck": "knip", - "prebuild": "npm run clean && npm run lint", - "predemo": "npm run build", - "prepublishOnly": "npm whoami && npm run build && npm run test:package", - "pretest": "npm run build", - "prettify": "biome check --write .", - "test": "vitest run src", - "test:attw": "attw --pack .", - "test:pack": "node scripts/pack-smoke-test.mjs", - "test:package": "npm run test:publint && npm run test:attw && npm run test:pack", - "test:publint": "publint --level=warning", - "testc": "vitest run src --coverage", - "test-debug": "vitest run src --no-file-parallelism", - "testu": "vitest run src -u", - "deprecate-pre-12": "npm deprecate 'webfont@>=10.0.0 <12.0.0' 'Deprecated: upgrade to webfont@12. v10–11 enabled ligatures by default (browser hangs on large fonts, #558). 12.x: ligatures off, Node 24.14+, named import, unicode-range off, template fixes. See MIGRATION.md'", - "docs:cli": "vitest run scripts/write-cli-docs.vitest.ts --config vitest.write-docs.config.ts" - }, - "dependencies": { - "cosmiconfig": "9.0.2", - "deepmerge": "^4.2.2", - "enquirer": "2.4.1", - "fonteditor-core": "2.6.3", - "fontverter": "2.0.0", - "globby": "16.2.1", - "meow": "14.1.0", - "nunjucks": "3.2.4", - "p-limit": "7.3.0", - "resolve-from": "^5.0.0", - "svg2ttf": "^6.1.0", - "svgicons2svgfont": "^16.0.0", - "svgo": "4.0.1", - "ttf2eot": "3.1.0", - "ttf2woff": "^3.0.0", - "wawoff2": "2.0.1", - "xml2js": "0.6.2" - }, - "devDependencies": { - "@arethetypeswrong/cli": "0.18.4", - "@biomejs/biome": "2.5.2", - "@types/node": "26.1.0", - "@types/nunjucks": "3.2.6", - "@types/svg2ttf": "5.0.3", - "@types/ttf2eot": "2.0.2", - "@types/ttf2woff": "2.0.4", - "@types/wawoff2": "1.0.2", - "@types/xml2js": "0.4.14", - "@vitest/coverage-v8": "4.1.9", - "is-eot": "1.0.0", - "is-svg": "6.1.0", - "is-ttf": "0.2.2", - "is-woff": "1.0.3", - "is-woff2": "1.0.0", - "knip": "6.24.0", - "publint": "0.3.21", - "typescript": "6.0.3", - "vite": "8.1.3", - "vite-plugin-checker": "0.14.4", - "vite-plugin-dts": "5.0.3", - "vitest": "4.1.9" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/itgalaxy/webfont.git", - "directory": "packages/webfont" - }, - "author": "itgalaxy ", - "license": "MIT", - "contributors": [ - { - "name": "Alexander Krasnoyarov", - "email": "alexander.krasnoyarov@itgalaxy.company", - "url": "https://vk.com/sterling_archer" - }, - { - "name": "Jimmy Andrade", - "email": "webfont@jimmyandrade.com", - "url": "https://github.com/jimmyandrade" - } - ], - "bugs": { - "url": "https://github.com/itgalaxy/webfont/issues" - }, - "homepage": "https://github.com/itgalaxy/webfont#readme", - "engines": { - "node": ">=24.14.0" - }, - "keywords": [ - "cli", - "standalone", - "font", - "fonts", - "webfont", - "webfonts", - "svg", - "ttf", - "woff", - "woff2", - "otf", - "ttf2eot", - "ttf2woff", - "ttf2svg", - "svg2ttf", - "css", - "scss", - "builder", - "generator" - ] -} diff --git a/packages/webfont/scripts/emit-mts-types.mjs b/packages/webfont/scripts/emit-mts-types.mjs deleted file mode 100644 index ffcbd7e6..00000000 --- a/packages/webfont/scripts/emit-mts-types.mjs +++ /dev/null @@ -1,157 +0,0 @@ -#!/usr/bin/env node -// After the CJS library build emits `dist/**/*.d.ts`, duplicate every -// declaration file to a matching `.d.mts` and rewrite each `.d.mts` so -// every relative import specifier ends in an explicit `.mjs` extension. -// -// Why the extension rewrite: -// TypeScript's `nodenext` / `node16` module resolution rejects -// extension-less specifiers inside `.d.mts` files. Vite's dts plugin -// emits `.d.ts` with bare specifiers like `from "./standalone"`, -// which is fine for CJS (bundler / node10) but errors as -// `InternalResolutionError` under node16 (from ESM). The `.mjs` -// specifier tells TS to look for a matching `.d.mts` (and Node would -// look for a `.mjs` runtime file, but the runtime uses a single -// bundled `dist/index.mjs` reached via `package.json#exports`, so -// the specifier is only used by TypeScript for type resolution). -// -// Why the sibling `.d.ts` files stay: the `require` and `default` -// conditions in `package.json#exports` point at `dist/src/index.d.ts` -// and consumers on CJS / bundler / node10 keep resolving those. - -import { copyFile, readFile, readdir, stat, writeFile } from "node:fs/promises"; -import { dirname, extname, join, resolve } from "node:path"; -import { fileURLToPath } from "node:url"; - -const REPO_ROOT = resolve(fileURLToPath(new URL(".", import.meta.url)), ".."); -const DIST_DIR = join(REPO_ROOT, "dist"); - -async function walkDts(dir) { - const entries = await readdir(dir); - const results = []; - for (const entry of entries) { - const full = join(dir, entry); - const stats = await stat(full); - if (stats.isDirectory()) { - results.push(...(await walkDts(full))); - } else if (entry.endsWith(".d.ts") && extname(entry) !== ".map") { - results.push(full); - } - } - return results; -} - -async function pathExists(candidate) { - try { - await stat(candidate); - return true; - } catch { - return false; - } -} - -async function isDirectory(candidate) { - try { - const s = await stat(candidate); - return s.isDirectory(); - } catch { - return false; - } -} - -const HAS_EXTENSION = /\.(?:mjs|js|json|d\.mts|d\.ts)$/u; - -async function resolveMtsSpecifier(fromFile, specifier) { - if (!specifier.startsWith(".")) return null; - if (HAS_EXTENSION.test(specifier)) return null; - - const fromDir = dirname(fromFile); - const resolved = resolve(fromDir, specifier); - - if (await pathExists(`${resolved}.d.mts`)) { - return `${specifier}.mjs`; - } - - if (await isDirectory(resolved)) { - if (await pathExists(join(resolved, "index.d.mts"))) { - return `${specifier.replace(/\/$/u, "")}/index.mjs`; - } - } - - return null; -} - -const SPECIFIER_PATTERN = - /(\bfrom\s*|\bimport\s*|\bexport\s*(?:\*|\{[^}]*\})?\s*from\s*|\brequire\s*\(\s*)(["'])(\.{1,2}\/[^"']+)\2/gu; - -async function rewriteMtsFile(file) { - const source = await readFile(file, "utf8"); - const matches = [...source.matchAll(SPECIFIER_PATTERN)]; - if (matches.length === 0) return { rewritten: 0, unresolved: [] }; - - let rewritten = 0; - const unresolved = []; - let output = ""; - let cursor = 0; - - for (const match of matches) { - const [full, prefix, quote, specifier] = match; - const start = match.index; - output += source.slice(cursor, start); - const target = await resolveMtsSpecifier(file, specifier); - if (target) { - output += `${prefix}${quote}${target}${quote}`; - rewritten += 1; - } else { - output += full; - if (specifier.startsWith(".") && !HAS_EXTENSION.test(specifier)) { - unresolved.push(specifier); - } - } - cursor = start + full.length; - } - output += source.slice(cursor); - - if (output !== source) { - await writeFile(file, output); - } - return { rewritten, unresolved }; -} - -const dtsFiles = await walkDts(DIST_DIR); -if (dtsFiles.length === 0) { - console.error("[emit-mts-types] No .d.ts files found under dist/. Did the CJS library build run?"); - process.exit(1); -} - -let copied = 0; -const mtsFiles = []; -for (const dts of dtsFiles) { - const mts = `${dts.slice(0, -".d.ts".length)}.d.mts`; - await copyFile(dts, mts); - mtsFiles.push(mts); - copied += 1; -} - -let totalRewritten = 0; -const allUnresolved = []; -for (const mts of mtsFiles) { - const { rewritten, unresolved } = await rewriteMtsFile(mts); - totalRewritten += rewritten; - for (const specifier of unresolved) { - allUnresolved.push({ file: mts, specifier }); - } -} - -console.log( - `[emit-mts-types] Duplicated ${copied} .d.ts → .d.mts; rewrote ${totalRewritten} relative import specifiers to explicit .mjs`, -); - -if (allUnresolved.length > 0) { - console.error( - `[emit-mts-types] FAILED: ${allUnresolved.length} relative import(s) in .d.mts files could not be resolved to a matching .d.mts. This will break node16 (from ESM) types resolution:`, - ); - for (const { file, specifier } of allUnresolved) { - console.error(` ${file}: ${specifier}`); - } - process.exit(1); -} diff --git a/packages/webfont/scripts/pack-smoke-test.mjs b/packages/webfont/scripts/pack-smoke-test.mjs deleted file mode 100644 index 68e36d5e..00000000 --- a/packages/webfont/scripts/pack-smoke-test.mjs +++ /dev/null @@ -1,152 +0,0 @@ -#!/usr/bin/env node -// Pack the current webfont build, install the tarball into throwaway ESM and -// CJS consumer projects, and assert both import shapes work end-to-end. This -// guards `package.json#exports`, `files`, and the built dist/*.mjs and -// dist/*.js against regressions like #618 (default ESM import was not -// callable) that unit tests against `src/` cannot catch. - -import { execFileSync } from "node:child_process"; -import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs"; -import { tmpdir } from "node:os"; -import { join, resolve } from "node:path"; -import { fileURLToPath } from "node:url"; - -const REPO_ROOT = resolve(fileURLToPath(new URL(".", import.meta.url)), ".."); -const FIXTURES_GLOB = resolve(REPO_ROOT, "src/fixtures/svg-icons/*.svg"); - -const log = (message) => console.log(`[pack-smoke] ${message}`); - -const run = (cmd, args, cwd) => - execFileSync(cmd, args, { - cwd, - stdio: ["ignore", "inherit", "inherit"], - }); - -const runCapture = (cmd, args, cwd) => - execFileSync(cmd, args, { - cwd, - encoding: "utf8", - stdio: ["ignore", "pipe", "inherit"], - }); - -const writePackageJson = (dir, contents) => { - writeFileSync(join(dir, "package.json"), `${JSON.stringify(contents, null, 2)}\n`); -}; - -let workDir; -let tarballPath; - -try { - workDir = mkdtempSync(join(tmpdir(), "webfont-pack-")); - const packDir = join(workDir, "tarball"); - const esmDir = join(workDir, "esm-consumer"); - const cjsDir = join(workDir, "cjs-consumer"); - mkdirSync(packDir); - mkdirSync(esmDir); - mkdirSync(cjsDir); - - log(`Working directory: ${workDir}`); - log("Packing webfont with `npm pack` (into isolated tarball dir)"); - const packJson = runCapture( - "npm", - ["pack", "--json", `--pack-destination=${packDir}`, "--ignore-scripts"], - REPO_ROOT, - ); - const packInfo = JSON.parse(packJson); - if (!Array.isArray(packInfo) || packInfo.length === 0 || !packInfo[0].filename) { - throw new Error("`npm pack --json` returned unexpected output"); - } - tarballPath = join(packDir, packInfo[0].filename); - log(`Tarball: ${tarballPath}`); - - const tarballFiles = new Set(packInfo[0].files.map((entry) => entry.path)); - const mustShip = ["dist/index.js", "dist/index.mjs", "dist/browser.js", "dist/cli.mjs"]; - const missing = mustShip.filter((file) => !tarballFiles.has(file)); - if (missing.length > 0) { - throw new Error(`Tarball is missing required entry points: ${missing.join(", ")}`); - } - log(`Tarball contains ${tarballFiles.size} files, including all required entry points`); - - writePackageJson(esmDir, { name: "webfont-pack-esm-consumer", private: true, type: "module" }); - writePackageJson(cjsDir, { name: "webfont-pack-cjs-consumer", private: true }); - - log("Installing tarball into ESM consumer"); - run("npm", ["install", "--no-audit", "--no-fund", "--silent", tarballPath], esmDir); - - log("Installing tarball into CJS consumer"); - run("npm", ["install", "--no-audit", "--no-fund", "--silent", tarballPath], cjsDir); - - const esmSmoke = `import webfontDefault, { webfont as webfontNamed } from "webfont"; - -const errors = []; -if (typeof webfontDefault !== "function") { - errors.push("ESM default import is " + typeof webfontDefault + " (want function)"); -} -if (typeof webfontNamed !== "function") { - errors.push("ESM named import is " + typeof webfontNamed + " (want function)"); -} -if (errors.length === 0) { - const result = await webfontDefault({ - files: ${JSON.stringify(FIXTURES_GLOB)}, - formats: ["woff2"], - }); - if (!result.woff2 || result.woff2.length === 0) { - errors.push("ESM default import did not produce a woff2 buffer"); - } -} -if (errors.length > 0) { - console.error(errors.join("\\n")); - process.exit(1); -} -console.log("esm-consumer OK"); -`; - writeFileSync(join(esmDir, "smoke.mjs"), esmSmoke); - log("Running ESM consumer smoke test (default + named import, generate woff2)"); - run("node", ["smoke.mjs"], esmDir); - - const cjsSmoke = `const webfontModule = require("webfont"); - -const errors = []; -if (typeof webfontModule.webfont !== "function") { - errors.push("CJS named export webfont is " + typeof webfontModule.webfont + " (want function)"); -} -if (typeof webfontModule.default !== "function") { - errors.push("CJS default export is " + typeof webfontModule.default + " (want function)"); -} - -(async () => { - if (errors.length === 0) { - const result = await webfontModule.webfont({ - files: ${JSON.stringify(FIXTURES_GLOB)}, - formats: ["woff2"], - }); - if (!result.woff2 || result.woff2.length === 0) { - errors.push("CJS require did not produce a woff2 buffer"); - } - } - if (errors.length > 0) { - console.error(errors.join("\\n")); - process.exit(1); - } - console.log("cjs-consumer OK"); -})(); -`; - writeFileSync(join(cjsDir, "smoke.cjs"), cjsSmoke); - log("Running CJS consumer smoke test (require default + named, generate woff2)"); - run("node", ["smoke.cjs"], cjsDir); - - log("All pack-smoke checks passed"); -} catch (error) { - console.error(`[pack-smoke] FAILED: ${error instanceof Error ? error.message : String(error)}`); - process.exitCode = 1; -} finally { - if (workDir) { - try { - rmSync(workDir, { recursive: true, force: true }); - } catch (cleanupError) { - console.warn( - `[pack-smoke] warning: failed to clean up ${workDir}: ${cleanupError instanceof Error ? cleanupError.message : String(cleanupError)}`, - ); - } - } -} diff --git a/packages/webfont/scripts/write-cli-docs.vitest.ts b/packages/webfont/scripts/write-cli-docs.vitest.ts deleted file mode 100644 index bdf15452..00000000 --- a/packages/webfont/scripts/write-cli-docs.vitest.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { existsSync, readFileSync, writeFileSync } from "node:fs"; -import { resolve } from "node:path"; -import { fileURLToPath } from "node:url"; -import { describe, expect, it } from "vitest"; -import { renderCliMarkdownDoc } from "../src/cli/meow/renderCliHelp"; - -const PACKAGE_ROOT = resolve(fileURLToPath(new URL(".", import.meta.url)), ".."); -const CLI_DOCS_PATH = resolve(PACKAGE_ROOT, "docs/cli.md"); - -describe("write-cli-docs", () => { - it("should write packages/webfont/docs/cli.md from cliFlagCatalog metadata", () => { - const next = renderCliMarkdownDoc(); - let current = ""; - - if (existsSync(CLI_DOCS_PATH)) { - current = readFileSync(CLI_DOCS_PATH, "utf8"); - } - - if (current === next) { - expect(readFileSync(CLI_DOCS_PATH, "utf8")).toBe(next); - return; - } - - writeFileSync(CLI_DOCS_PATH, next); - expect(readFileSync(CLI_DOCS_PATH, "utf8")).toBe(next); - }); -}); diff --git a/packages/webfont/src/browser.test.ts b/packages/webfont/src/browser.test.ts deleted file mode 100644 index fb1a556b..00000000 --- a/packages/webfont/src/browser.test.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { webfont } from "./browser"; - -describe("browser entry", () => { - it("should reject with guidance when bundled for the browser (#198)", async () => { - await expect(webfont()).rejects.toThrow("webfont is Node.js-only"); - await expect(webfont()).rejects.toThrow("TROUBLESHOOTING.md"); - }); -}); diff --git a/packages/webfont/src/browser.ts b/packages/webfont/src/browser.ts deleted file mode 100644 index b325dd0c..00000000 --- a/packages/webfont/src/browser.ts +++ /dev/null @@ -1,6 +0,0 @@ -const BROWSER_MESSAGE = - "webfont is Node.js-only (requires fs, globby, and other Node built-ins). Run it at build time via the CLI, a Node script, or the webfont-webpack-plugin — do not import it from client-side React/Vue code. See TROUBLESHOOTING.md (Can't resolve 'fs')."; - -export const webfont = (): Promise => Promise.reject(new Error(BROWSER_MESSAGE)); - -export default webfont; diff --git a/packages/webfont/src/cli/__snapshots__/index.test.ts.snap b/packages/webfont/src/cli/__snapshots__/index.test.ts.snap deleted file mode 100644 index 0fc5d92c..00000000 --- a/packages/webfont/src/cli/__snapshots__/index.test.ts.snap +++ /dev/null @@ -1,728 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`cli > short options > should set destTemplate with -s 1`] = ` -"@font-face { - font-display: auto; - font-family: "webfont"; - font-style: normal; - font-weight: 400; - - src: url("./webfont.eot?test"); - src: url("./webfont.eot?#iefix") format("embedded-opentype"), url("./webfont.woff2?test") format("woff2"), url("./webfont.woff?test") format("woff"), url("./webfont.ttf?test") format("truetype"), url("./webfont.svg?test#webfont") format("svg"); -} - -.webfont { - display: inline-block; - font-family: "webfont"; - font-weight: 400; - font-style: normal; - font-variant: normal; - text-rendering: auto; - line-height: 1; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; -} - -.webfont-lg { - font-size: 1.33333em; - line-height: 0.75em; - vertical-align: -0.0667em; -} - -.webfont-xs { - font-size: 0.75em; -} - -.webfont-sm { - font-size: 0.875em; -} - -.webfont-1x { - font-size: 1em; -} - -.webfont-2x { - font-size: 2em; -} - -.webfont-3x { - font-size: 3em; -} - -.webfont-4x { - font-size: 4em; -} - -.webfont-5x { - font-size: 5em; -} - -.webfont-6x { - font-size: 6em; -} - -.webfont-7x { - font-size: 7em; -} - -.webfont-8x { - font-size: 8em; -} - -.webfont-9x { - font-size: 9em; -} - -.webfont-10x { - font-size: 10em; -} - -.webfont-fw { - text-align: center; - width: 1.25em; -} - -.webfont-border { - border: solid 0.08em #eee; - border-radius: 0.1em; - padding: 0.2em 0.25em 0.15em; -} - -.webfont-pull-left { - float: left; -} - -.webfont-pull-right { - float: right; -} - -.webfont.webfont-pull-left { - margin-right: 0.3em; -} - -.webfont.webfont-pull-right { - margin-left: 0.3em; -} - - -.webfont-avatar::before { - content: "\\ea01"; -} - -.webfont-envelope::before { - content: "\\ea02"; -} - -.webfont-phone-call::before { - content: "\\ea03"; -} - -" -`; - -exports[`cli > should generate all fonts with build-in template 1`] = ` -"@font-face { - font-display: auto; - font-family: "webfont"; - font-style: normal; - font-weight: 400; - - src: url("./webfont.eot?test"); - src: url("./webfont.eot?#iefix") format("embedded-opentype"), url("./webfont.woff2?test") format("woff2"), url("./webfont.woff?test") format("woff"), url("./webfont.ttf?test") format("truetype"), url("./webfont.svg?test#webfont") format("svg"); -} - -.webfont { - display: inline-block; - font-family: "webfont"; - font-weight: 400; - font-style: normal; - font-variant: normal; - text-rendering: auto; - line-height: 1; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; -} - -.webfont-lg { - font-size: 1.33333em; - line-height: 0.75em; - vertical-align: -0.0667em; -} - -.webfont-xs { - font-size: 0.75em; -} - -.webfont-sm { - font-size: 0.875em; -} - -.webfont-1x { - font-size: 1em; -} - -.webfont-2x { - font-size: 2em; -} - -.webfont-3x { - font-size: 3em; -} - -.webfont-4x { - font-size: 4em; -} - -.webfont-5x { - font-size: 5em; -} - -.webfont-6x { - font-size: 6em; -} - -.webfont-7x { - font-size: 7em; -} - -.webfont-8x { - font-size: 8em; -} - -.webfont-9x { - font-size: 9em; -} - -.webfont-10x { - font-size: 10em; -} - -.webfont-fw { - text-align: center; - width: 1.25em; -} - -.webfont-border { - border: solid 0.08em #eee; - border-radius: 0.1em; - padding: 0.2em 0.25em 0.15em; -} - -.webfont-pull-left { - float: left; -} - -.webfont-pull-right { - float: right; -} - -.webfont.webfont-pull-left { - margin-right: 0.3em; -} - -.webfont.webfont-pull-right { - margin-left: 0.3em; -} - - -.webfont-avatar::before { - content: "\\ea01"; -} - -.webfont-envelope::before { - content: "\\ea02"; -} - -.webfont-phone-call::before { - content: "\\ea03"; -} - -" -`; - -exports[`cli > should generate built-in html template 1`] = ` -" - - - - webfont - - - -

List Icons

-

Class

-
- -
-
- .webfont-avatar -
- -
-
- .webfont-envelope -
- -
-
- .webfont-phone-call -
- -
-

Ligature

-
- -
- avatar
- avatar -
- -
- envelope
- envelope -
- -
- phone_call
- phone_call -
- -
- - -" -`; - -exports[`cli > should include font hash in template when addHashInFontUrl is enabled 1`] = ` -"@font-face { - font-display: auto; - font-family: "webfont"; - font-style: normal; - font-weight: 400; - - src: url("./webfont.eot?test&v=ead2b6f69fc603bf1cbd00bf9f8a8a33"); - src: url("./webfont.eot?v=ead2b6f69fc603bf1cbd00bf9f8a8a33#iefix") format("embedded-opentype"), url("./webfont.woff2?test&v=ead2b6f69fc603bf1cbd00bf9f8a8a33") format("woff2"), url("./webfont.woff?test&v=ead2b6f69fc603bf1cbd00bf9f8a8a33") format("woff"), url("./webfont.ttf?test&v=ead2b6f69fc603bf1cbd00bf9f8a8a33") format("truetype"), url("./webfont.svg?test&v=ead2b6f69fc603bf1cbd00bf9f8a8a33#webfont") format("svg"); -} - -.webfont { - display: inline-block; - font-family: "webfont"; - font-weight: 400; - font-style: normal; - font-variant: normal; - text-rendering: auto; - line-height: 1; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; -} - -.webfont-lg { - font-size: 1.33333em; - line-height: 0.75em; - vertical-align: -0.0667em; -} - -.webfont-xs { - font-size: 0.75em; -} - -.webfont-sm { - font-size: 0.875em; -} - -.webfont-1x { - font-size: 1em; -} - -.webfont-2x { - font-size: 2em; -} - -.webfont-3x { - font-size: 3em; -} - -.webfont-4x { - font-size: 4em; -} - -.webfont-5x { - font-size: 5em; -} - -.webfont-6x { - font-size: 6em; -} - -.webfont-7x { - font-size: 7em; -} - -.webfont-8x { - font-size: 8em; -} - -.webfont-9x { - font-size: 9em; -} - -.webfont-10x { - font-size: 10em; -} - -.webfont-fw { - text-align: center; - width: 1.25em; -} - -.webfont-border { - border: solid 0.08em #eee; - border-radius: 0.1em; - padding: 0.2em 0.25em 0.15em; -} - -.webfont-pull-left { - float: left; -} - -.webfont-pull-right { - float: right; -} - -.webfont.webfont-pull-left { - margin-right: 0.3em; -} - -.webfont.webfont-pull-right { - margin-left: 0.3em; -} - - -.webfont-avatar::before { - content: "\\ea01"; -} - -.webfont-envelope::before { - content: "\\ea02"; -} - -.webfont-phone-call::before { - content: "\\ea03"; -} - -" -`; - -exports[`cli > should respect \`font\` options 1`] = ` -" - - - - - - - - - - - - -" -`; - -exports[`cli > should respect \`template\` options 1`] = ` -"@font-face { - font-display: auto; - font-family: "testname"; - font-style: normal; - font-weight: 400; - - src: url("test/path/webfont.eot?test"); - src: url("test/path/webfont.eot?#iefix") format("embedded-opentype"), url("test/path/webfont.woff2?test") format("woff2"), url("test/path/webfont.woff?test") format("woff"), url("test/path/webfont.ttf?test") format("truetype"), url("test/path/webfont.svg?test#webfont") format("svg"); -} - -.foo { - display: inline-block; - font-family: "testname"; - font-weight: 400; - font-style: normal; - font-variant: normal; - text-rendering: auto; - line-height: 1; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; -} - -.foo-lg { - font-size: 1.33333em; - line-height: 0.75em; - vertical-align: -0.0667em; -} - -.foo-xs { - font-size: 0.75em; -} - -.foo-sm { - font-size: 0.875em; -} - -.foo-1x { - font-size: 1em; -} - -.foo-2x { - font-size: 2em; -} - -.foo-3x { - font-size: 3em; -} - -.foo-4x { - font-size: 4em; -} - -.foo-5x { - font-size: 5em; -} - -.foo-6x { - font-size: 6em; -} - -.foo-7x { - font-size: 7em; -} - -.foo-8x { - font-size: 8em; -} - -.foo-9x { - font-size: 9em; -} - -.foo-10x { - font-size: 10em; -} - -.foo-fw { - text-align: center; - width: 1.25em; -} - -.foo-border { - border: solid 0.08em #eee; - border-radius: 0.1em; - padding: 0.2em 0.25em 0.15em; -} - -.foo-pull-left { - float: left; -} - -.foo-pull-right { - float: right; -} - -.foo.foo-pull-left { - margin-right: 0.3em; -} - -.foo.foo-pull-right { - margin-left: 0.3em; -} - - -.foo-avatar::before { - content: "\\ea01"; -} - -.foo-envelope::before { - content: "\\ea02"; -} - -.foo-phone-call::before { - content: "\\ea03"; -} - -" -`; diff --git a/packages/webfont/src/cli/assistant/buildWasConfig.test.ts b/packages/webfont/src/cli/assistant/buildWasConfig.test.ts deleted file mode 100644 index 1d0aac2a..00000000 --- a/packages/webfont/src/cli/assistant/buildWasConfig.test.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { describe, expect, it } from "vitest"; -import { buildWasConfigFromWizard } from "./buildWasConfig"; - -describe("buildWasConfigFromWizard", () => { - it("should persist prefix but not deprecated .was fontName for new wizard configs", () => { - const config = buildWasConfigFromWizard( - { - glyphs: "assets/images/svg", - name: "MyAwesomeFont", - output: "assets/fonts", - prefix: "my-icon", - }, - { - formats: ["woff2"], - isCustomTemplate: false, - styleType: "css", - template: "css", - }, - ); - - expect(config.prefix).toBe("my-icon"); - expect(config.fontId).toBe("my-icon"); - expect(config.name).toBe("MyAwesomeFont"); - expect(config).not.toHaveProperty("fontName"); - }); -}); diff --git a/packages/webfont/src/cli/assistant/buildWasConfig.ts b/packages/webfont/src/cli/assistant/buildWasConfig.ts deleted file mode 100644 index 45002ea7..00000000 --- a/packages/webfont/src/cli/assistant/buildWasConfig.ts +++ /dev/null @@ -1,27 +0,0 @@ -import type { Format } from "../../types/Format"; -import type { AssistantWizardAnswers, WebfontAssistantWasConfig } from "./types"; - -export type AssistantWizardCompletion = { - formats: Format[]; - isCustomTemplate: boolean; - styleType: string; - template: string; -}; - -export const buildWasConfigFromWizard = ( - answers: AssistantWizardAnswers, - completion: AssistantWizardCompletion, -): WebfontAssistantWasConfig => ({ - dest: answers.output, - files: `${answers.glyphs}/*.svg`, - fixedWidth: true, - fontHeight: 1000, - fontId: answers.prefix, - formats: completion.formats, - isCustomTemplate: completion.isCustomTemplate, - name: answers.name, - prefix: answers.prefix, - styleType: completion.styleType, - template: completion.template, - templateFontName: answers.name, -}); diff --git a/packages/webfont/src/cli/assistant/cleanWasConfigBasename.test.ts b/packages/webfont/src/cli/assistant/cleanWasConfigBasename.test.ts deleted file mode 100644 index c76e04bf..00000000 --- a/packages/webfont/src/cli/assistant/cleanWasConfigBasename.test.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { describe, expect, it } from "vitest"; -import { cleanOptionalWasBasename, cleanWasConfigBasename, resolveWasConfigPath } from "./cleanWasConfigBasename"; - -describe("cleanWasConfigBasename", () => { - it("should strip path segments from wizard or .was font names", () => { - expect(cleanWasConfigBasename("../MyFont")).toBe("MyFont"); - expect(cleanWasConfigBasename("nested/MyFont")).toBe("MyFont"); - }); - - it("should not allow empty or traversal-only basenames", () => { - expect(() => cleanWasConfigBasename("../..")).toThrow(/Invalid font name/u); - expect(() => cleanWasConfigBasename(" ")).toThrow(/Invalid font name/u); - }); - - it("should reject non-string values with a field-specific TypeError", () => { - expect(() => cleanWasConfigBasename(42, "prefix")).toThrow('Invalid .was config: "prefix" must be a string'); - }); -}); - -describe("cleanOptionalWasBasename", () => { - it("should ignore nullish or blank optional values", () => { - expect(cleanOptionalWasBasename(undefined, "fontId")).toBeUndefined(); - expect(cleanOptionalWasBasename(null, "fontId")).toBeUndefined(); - expect(cleanOptionalWasBasename(" ", "fontId")).toBeUndefined(); - }); - - it("should reject non-string optional values with a field-specific TypeError", () => { - expect(() => cleanOptionalWasBasename(42, "fontId")).toThrow('Invalid .was config: "fontId" must be a string'); - }); -}); - -describe("resolveWasConfigPath", () => { - it("should write .was files under dest using a cleaned basename", () => { - expect(resolveWasConfigPath({ dest: "assets/fonts", name: "../MyFont" })).toBe("assets/fonts/MyFont.was"); - }); -}); diff --git a/packages/webfont/src/cli/assistant/cleanWasConfigBasename.ts b/packages/webfont/src/cli/assistant/cleanWasConfigBasename.ts deleted file mode 100644 index c4752d6e..00000000 --- a/packages/webfont/src/cli/assistant/cleanWasConfigBasename.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { basename, join } from "node:path"; -import type { WebfontAssistantWasConfig } from "./types"; - -export const cleanWasConfigBasename = (name: unknown, field = "name"): string => { - if (typeof name !== "string") { - throw new TypeError(`Invalid .was config: "${field}" must be a string`); - } - - const cleaned = basename(name.trim()); - - if (cleaned === "" || cleaned === "." || cleaned === "..") { - throw new Error(`Invalid font name for .was config: "${name}"`); - } - - return cleaned; -}; - -export const cleanOptionalWasBasename = (value: unknown, field: string): string | undefined => { - if (value === undefined || value === null) { - return undefined; - } - - if (typeof value !== "string") { - throw new TypeError(`Invalid .was config: "${field}" must be a string`); - } - - if (value.trim() === "") { - return undefined; - } - - return cleanWasConfigBasename(value, field); -}; - -export const resolveWasConfigPath = (config: Pick): string => { - const cleanName = cleanWasConfigBasename(config.name, "name"); - return join(config.dest, `${cleanName}.was`); -}; diff --git a/packages/webfont/src/cli/assistant/guardWasConfigLoad.test.ts b/packages/webfont/src/cli/assistant/guardWasConfigLoad.test.ts deleted file mode 100644 index 28438d81..00000000 --- a/packages/webfont/src/cli/assistant/guardWasConfigLoad.test.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { describe, expect, it } from "vitest"; -import { guardLoadedWasConfigs, parseWasConfigJson } from "./guardWasConfigLoad"; - -const validWas = { - dest: "dist/fonts", - files: "icons/*.svg", - formats: ["woff2"], - name: "MyFont", - template: "css", -}; - -describe("parseWasConfigJson", () => { - it("should wrap JSON.parse failures with the config path", () => { - const configPath = "/tmp/broken.was"; - - expect(() => parseWasConfigJson("{ not-json", configPath)).toThrow( - `Invalid JSON in .was config ${configPath}:`, - ); - }); -}); - -describe("guardLoadedWasConfigs", () => { - it("should accept a single valid .was object", () => { - const configs = guardLoadedWasConfigs(validWas, "/tmp/single.was"); - - expect(configs).toHaveLength(1); - expect(configs[0]?.name).toBe("MyFont"); - }); - - it("should accept an array of valid .was objects", () => { - const configs = guardLoadedWasConfigs( - [ - validWas, - { - ...validWas, - formats: ["ttf"], - name: "Second", - template: "scss", - }, - ], - "/tmp/batch.was", - ); - - expect(configs).toHaveLength(2); - expect(configs.map((config) => config.name)).toEqual(["MyFont", "Second"]); - }); - - it("should reject null or invalid entries with a helpful configPath error", () => { - const nullRoot = "/tmp/null-root.was"; - expect(() => guardLoadedWasConfigs(null, nullRoot)).toThrow( - `Invalid .was config root value in ${nullRoot}: expected an object`, - ); - - const nullItem = "/tmp/null-item.was"; - expect(() => guardLoadedWasConfigs([null], nullItem)).toThrow( - `Invalid .was config at index 0 in ${nullItem}: expected an object`, - ); - }); - - it("should require dest, files, name, and template to be non-empty strings", () => { - const configPath = "/tmp/incomplete.was"; - - expect(() => guardLoadedWasConfigs({ ...validWas, dest: "" }, configPath)).toThrow( - `Invalid .was config root value in ${configPath}: "dest" must be a non-empty string`, - ); - - expect(() => guardLoadedWasConfigs({ ...validWas, files: " " }, configPath)).toThrow( - `Invalid .was config root value in ${configPath}: "files" must be a non-empty string`, - ); - - expect(() => guardLoadedWasConfigs({ ...validWas, name: 42 }, configPath)).toThrow( - `Invalid .was config root value in ${configPath}: "name" must be a non-empty string`, - ); - - expect(() => guardLoadedWasConfigs({ ...validWas, template: null }, configPath)).toThrow( - `Invalid .was config root value in ${configPath}: "template" must be a non-empty string`, - ); - }); -}); diff --git a/packages/webfont/src/cli/assistant/guardWasConfigLoad.ts b/packages/webfont/src/cli/assistant/guardWasConfigLoad.ts deleted file mode 100644 index 7db455e9..00000000 --- a/packages/webfont/src/cli/assistant/guardWasConfigLoad.ts +++ /dev/null @@ -1,49 +0,0 @@ -import type { WebfontAssistantWasConfig } from "./types"; - -const REQUIRED_WAS_STRING_FIELDS = ["dest", "files", "name", "template"] as const; - -const isWasConfigObject = (value: unknown): value is Record => - typeof value === "object" && value !== null && !Array.isArray(value); - -const assertNonEmptyStringField = ( - value: unknown, - field: (typeof REQUIRED_WAS_STRING_FIELDS)[number], - configPath: string, - label: string, -): void => { - if (typeof value !== "string" || value.trim() === "") { - throw new Error(`Invalid .was config ${label} in ${configPath}: "${field}" must be a non-empty string`); - } -}; - -const guardWasConfigObject = (value: unknown, configPath: string, label: string): WebfontAssistantWasConfig => { - if (!isWasConfigObject(value)) { - throw new Error(`Invalid .was config ${label} in ${configPath}: expected an object`); - } - - for (const field of REQUIRED_WAS_STRING_FIELDS) { - assertNonEmptyStringField(value[field], field, configPath, label); - } - - return value as WebfontAssistantWasConfig; -}; - -export const parseWasConfigJson = (raw: string, configPath: string): unknown => { - try { - return JSON.parse(raw); - } catch (error) { - if (error instanceof SyntaxError) { - throw new Error(`Invalid JSON in .was config ${configPath}: ${error.message}`); - } - - throw error; - } -}; - -export const guardLoadedWasConfigs = (parsed: unknown, configPath: string): WebfontAssistantWasConfig[] => { - if (Array.isArray(parsed)) { - return parsed.map((item, index) => guardWasConfigObject(item, configPath, `at index ${index}`)); - } - - return [guardWasConfigObject(parsed, configPath, "root value")]; -}; diff --git a/packages/webfont/src/cli/assistant/loadWasConfigs.test.ts b/packages/webfont/src/cli/assistant/loadWasConfigs.test.ts deleted file mode 100644 index 42f9a486..00000000 --- a/packages/webfont/src/cli/assistant/loadWasConfigs.test.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { mkdtemp, rm, writeFile } from "node:fs/promises"; -import { tmpdir } from "node:os"; -import { join } from "node:path"; -import { describe, expect, it } from "vitest"; -import { loadWasConfigs } from "./loadWasConfigs"; - -const writeWasFixture = async (dir: string, name: string, contents: string): Promise => { - const configPath = join(dir, name); - await writeFile(configPath, contents, "utf8"); - return configPath; -}; - -describe("loadWasConfigs", () => { - it("should load a single .was object from disk", async () => { - const dir = await mkdtemp(join(tmpdir(), "webfont-was-")); - try { - const configPath = await writeWasFixture( - dir, - "single.was", - JSON.stringify({ - dest: "dist/fonts", - files: "icons/*.svg", - formats: ["woff2"], - name: "MyFont", - template: "css", - }), - ); - - const configs = await loadWasConfigs(configPath); - - expect(configs).toHaveLength(1); - expect(configs[0]?.name).toBe("MyFont"); - } finally { - await rm(dir, { recursive: true, force: true }); - } - }); - - it("should load an array of .was objects from disk", async () => { - const dir = await mkdtemp(join(tmpdir(), "webfont-was-")); - try { - const configPath = await writeWasFixture( - dir, - "batch.was", - JSON.stringify([ - { - dest: "dist/fonts", - files: "icons/*.svg", - formats: ["woff2"], - name: "First", - template: "css", - }, - { - dest: "dist/fonts", - files: "icons/*.svg", - formats: ["ttf"], - name: "Second", - template: "scss", - }, - ]), - ); - - const configs = await loadWasConfigs(configPath); - - expect(configs).toHaveLength(2); - expect(configs.map((config) => config.name)).toEqual(["First", "Second"]); - } finally { - await rm(dir, { recursive: true, force: true }); - } - }); - - it("should reject malformed .was files with helpful configPath errors", async () => { - const dir = await mkdtemp(join(tmpdir(), "webfont-was-")); - try { - const nullRoot = await writeWasFixture(dir, "null-root.was", "null"); - await expect(loadWasConfigs(nullRoot)).rejects.toThrow( - `Invalid .was config root value in ${nullRoot}: expected an object`, - ); - - const broken = await writeWasFixture(dir, "broken.was", "{ not-json"); - await expect(loadWasConfigs(broken)).rejects.toThrow(`Invalid JSON in .was config ${broken}:`); - - const missingDest = await writeWasFixture( - dir, - "missing-dest.was", - JSON.stringify({ - dest: "", - files: "icons/*.svg", - formats: ["woff2"], - name: "MyFont", - template: "css", - }), - ); - await expect(loadWasConfigs(missingDest)).rejects.toThrow( - `Invalid .was config root value in ${missingDest}: "dest" must be a non-empty string`, - ); - } finally { - await rm(dir, { recursive: true, force: true }); - } - }); -}); diff --git a/packages/webfont/src/cli/assistant/loadWasConfigs.ts b/packages/webfont/src/cli/assistant/loadWasConfigs.ts deleted file mode 100644 index 30f4fc46..00000000 --- a/packages/webfont/src/cli/assistant/loadWasConfigs.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { readFile } from "node:fs/promises"; -import { guardLoadedWasConfigs, parseWasConfigJson } from "./guardWasConfigLoad"; -import type { WebfontAssistantWasConfig } from "./types"; - -export const loadWasConfigs = async (configPath: string): Promise => { - const raw = await readFile(configPath, "utf8"); - const parsed = parseWasConfigJson(raw, configPath); - return guardLoadedWasConfigs(parsed, configPath); -}; diff --git a/packages/webfont/src/cli/assistant/mapWasConfigToWebfontOptions.test.ts b/packages/webfont/src/cli/assistant/mapWasConfigToWebfontOptions.test.ts deleted file mode 100644 index 0670cd96..00000000 --- a/packages/webfont/src/cli/assistant/mapWasConfigToWebfontOptions.test.ts +++ /dev/null @@ -1,162 +0,0 @@ -import { describe, expect, it } from "vitest"; -import { mapWasConfigToWebfontOptions } from "./mapWasConfigToWebfontOptions"; -import type { WebfontAssistantWasConfig } from "./types"; - -describe("mapWasConfigToWebfontOptions", () => { - it("should map legacy .was configs that store the icon prefix in fontName", () => { - const options = mapWasConfigToWebfontOptions({ - dest: "dist/fonts", - files: "icons/*.svg", - fontName: "my-icon", - formats: ["woff2"], - name: "MyAwesomeFont", - template: "css", - }); - - expect(options.fontName).toBe("MyAwesomeFont"); - expect(options.templateClassName).toBe("my-icon"); - expect(options.templateFontName).toBe("MyAwesomeFont"); - expect(options.destCreate).toBe(true); - }); - - it("should prefer prefix over legacy fontName when both are present", () => { - const options = mapWasConfigToWebfontOptions({ - dest: "dist/fonts", - files: "icons/*.svg", - fontName: "legacy-prefix", - formats: ["ttf"], - name: "BrandIcons", - prefix: "brand-icon", - template: "scss", - }); - - expect(options.templateClassName).toBe("brand-icon"); - expect(options.fontId).toBe("brand-icon"); - }); - - it("should not override webfont defaults when fixedWidth and fontHeight are omitted from .was", () => { - const options = mapWasConfigToWebfontOptions({ - dest: "dist/fonts", - files: "icons/*.svg", - fontName: "my-icon", - formats: ["woff2"], - name: "MyAwesomeFont", - template: "css", - }); - - expect(options.fixedWidth).toBeUndefined(); - expect(options.fontHeight).toBeUndefined(); - }); - - it("should apply fixedWidth and fontHeight when explicitly set in .was", () => { - const options = mapWasConfigToWebfontOptions({ - dest: "dist/fonts", - files: "icons/*.svg", - fixedWidth: true, - fontHeight: 1000, - formats: ["ttf"], - name: "MyAwesomeFont", - prefix: "my-icon", - template: "css", - }); - - expect(options.fixedWidth).toBe(true); - expect(options.fontHeight).toBe(1000); - }); - - it("should default formats when .was omits or provides invalid formats", () => { - const base = { - dest: "dist/fonts", - files: "icons/*.svg", - name: "MyAwesomeFont", - template: "css", - }; - - expect( - mapWasConfigToWebfontOptions({ - ...base, - }).formats, - ).toEqual(["ttf"]); - - expect( - mapWasConfigToWebfontOptions({ - ...base, - formats: undefined, - }).formats, - ).toEqual(["ttf"]); - - expect( - mapWasConfigToWebfontOptions({ - ...base, - formats: "woff2" as unknown as WebfontAssistantWasConfig["formats"], - }).formats, - ).toEqual(["ttf"]); - }); - - it("should clean path segments from .was names used for font output", () => { - const options = mapWasConfigToWebfontOptions({ - dest: "dist/fonts", - files: "icons/*.svg", - formats: ["woff2"], - name: "../EvilFont", - prefix: "../evil-prefix", - template: "css", - }); - - expect(options.fontName).toBe("EvilFont"); - expect(options.templateClassName).toBe("evil-prefix"); - expect(options.templateFontName).toBe("EvilFont"); - }); - - it("should reject non-string optional .was basename fields with a clear error", () => { - const base = { - dest: "dist/fonts", - files: "icons/*.svg", - formats: ["ttf"] as WebfontAssistantWasConfig["formats"], - name: "MyAwesomeFont", - template: "css", - }; - - expect(() => - mapWasConfigToWebfontOptions({ - ...base, - prefix: 42 as unknown as WebfontAssistantWasConfig["prefix"], - }), - ).toThrow('Invalid .was config: "prefix" must be a string'); - - expect(() => - mapWasConfigToWebfontOptions({ - ...base, - fontId: { bad: true } as unknown as WebfontAssistantWasConfig["fontId"], - }), - ).toThrow('Invalid .was config: "fontId" must be a string'); - - expect(() => - mapWasConfigToWebfontOptions({ - ...base, - fontName: 99 as unknown as WebfontAssistantWasConfig["fontName"], - }), - ).toThrow('Invalid .was config: "fontName" must be a string'); - - expect(() => - mapWasConfigToWebfontOptions({ - ...base, - templateFontName: false as unknown as WebfontAssistantWasConfig["templateFontName"], - }), - ).toThrow('Invalid .was config: "templateFontName" must be a string'); - }); - - it("should ignore blank optional prefix and fall back to the font display name", () => { - const options = mapWasConfigToWebfontOptions({ - dest: "dist/fonts", - files: "icons/*.svg", - formats: ["woff2"], - name: "MyAwesomeFont", - prefix: " ", - template: "css", - }); - - expect(options.templateClassName).toBe("MyAwesomeFont"); - expect(options.fontId).toBe("MyAwesomeFont"); - }); -}); diff --git a/packages/webfont/src/cli/assistant/mapWasConfigToWebfontOptions.ts b/packages/webfont/src/cli/assistant/mapWasConfigToWebfontOptions.ts deleted file mode 100644 index 4d27e8f2..00000000 --- a/packages/webfont/src/cli/assistant/mapWasConfigToWebfontOptions.ts +++ /dev/null @@ -1,57 +0,0 @@ -import type { Format } from "../../types/Format"; -import type { InitialOptions } from "../../types/InitialOptions"; -import { cleanOptionalWasBasename, cleanWasConfigBasename } from "./cleanWasConfigBasename"; -import type { WebfontAssistantWasConfig } from "./types"; - -const DEFAULT_WAS_FORMATS: Format[] = ["ttf"]; - -const normalizeWasFormats = (formats: WebfontAssistantWasConfig["formats"] | unknown): Format[] => { - if (!Array.isArray(formats) || formats.length === 0) { - return DEFAULT_WAS_FORMATS; - } - - return formats as Format[]; -}; - -export const mapWasConfigToWebfontOptions = (was: WebfontAssistantWasConfig): InitialOptions => { - const displayName = cleanWasConfigBasename(was.name, "name"); - const classPrefix = - cleanOptionalWasBasename(was.prefix, "prefix") ?? - cleanOptionalWasBasename(was.fontName, "fontName") ?? - displayName; - const formats = normalizeWasFormats(was.formats); - - let fontId = classPrefix; - const cleanedFontId = cleanOptionalWasBasename(was.fontId, "fontId"); - if (cleanedFontId !== undefined) { - fontId = cleanedFontId; - } - - let templateFontName = displayName; - const cleanedTemplateFontName = cleanOptionalWasBasename(was.templateFontName, "templateFontName"); - if (cleanedTemplateFontName !== undefined) { - templateFontName = cleanedTemplateFontName; - } - - const options: InitialOptions = { - dest: was.dest, - destCreate: true, - files: was.files, - fontId, - fontName: displayName, - formats, - template: was.template, - templateClassName: classPrefix, - templateFontName, - }; - - if (was.fixedWidth !== undefined) { - options.fixedWidth = was.fixedWidth; - } - - if (was.fontHeight !== undefined) { - options.fontHeight = was.fontHeight; - } - - return options; -}; diff --git a/packages/webfont/src/cli/assistant/runAssistant.ts b/packages/webfont/src/cli/assistant/runAssistant.ts deleted file mode 100644 index 77b2bb6f..00000000 --- a/packages/webfont/src/cli/assistant/runAssistant.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { mergeCliDestIntoConfig, writeResultFiles } from "../../node/writeResultFiles"; -import { webfont } from "../../standalone"; -import type { Result } from "../../types/Result"; -import { loadWasConfigs } from "./loadWasConfigs"; -import { mapWasConfigToWebfontOptions } from "./mapWasConfigToWebfontOptions"; -import { runAssistantWizard } from "./runAssistantWizard"; -import { saveWasConfig } from "./saveWasConfig"; -import type { WebfontAssistantWasConfig } from "./types"; - -const runWasConfig = async (was: WebfontAssistantWasConfig): Promise => { - const options = mapWasConfigToWebfontOptions(was); - const result = await webfont(options); - mergeCliDestIntoConfig(result, { dest: options.dest }); - await writeResultFiles(result); - await saveWasConfig(was); - return result; -}; - -const runWasConfigsSequentially = ( - configs: readonly WebfontAssistantWasConfig[], - emptyError: string, -): Promise => { - const [head, ...tail] = configs; - - if (!head) { - return Promise.reject(new Error(emptyError)); - } - - return tail.reduce>((chain, was) => chain.then(() => runWasConfig(was)), runWasConfig(head)); -}; - -export type RunAssistantOptions = { - configPath?: string; -}; - -export const runAssistant = async (options: RunAssistantOptions = {}): Promise => { - if (options.configPath) { - const configs = await loadWasConfigs(options.configPath); - return runWasConfigsSequentially(configs, `No assistant configs found in ${options.configPath}`); - } - - const was = await runAssistantWizard(); - return runWasConfig(was); -}; diff --git a/packages/webfont/src/cli/assistant/runAssistantWizard.test.ts b/packages/webfont/src/cli/assistant/runAssistantWizard.test.ts deleted file mode 100644 index 74ece928..00000000 --- a/packages/webfont/src/cli/assistant/runAssistantWizard.test.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { describe, expect, it } from "vitest"; -import { defaultCustomTemplatePath } from "./runAssistantWizard"; - -describe("defaultCustomTemplatePath", () => { - it("should suggest a .njk path that reflects the selected style type", () => { - expect(defaultCustomTemplatePath("css")).toBe("../templates/template.css.njk"); - expect(defaultCustomTemplatePath("scss")).toBe("../templates/template.scss.njk"); - expect(defaultCustomTemplatePath("less")).toBe("../templates/template.less.njk"); - }); -}); diff --git a/packages/webfont/src/cli/assistant/runAssistantWizard.ts b/packages/webfont/src/cli/assistant/runAssistantWizard.ts deleted file mode 100644 index 8dcda706..00000000 --- a/packages/webfont/src/cli/assistant/runAssistantWizard.ts +++ /dev/null @@ -1,122 +0,0 @@ -import type { Format } from "../../types/Format"; -import { buildWasConfigFromWizard } from "./buildWasConfig"; -import type { AssistantWizardAnswers, WebfontAssistantWasConfig } from "./types"; - -const DEFAULT_FORMATS: Format[] = ["ttf"]; - -export const defaultCustomTemplatePath = (styleType: string): string => `../templates/template.${styleType}.njk`; - -type EnquirerStatic = { - Confirm: new (options: Record) => { run: () => Promise }; - Form: new (options: Record) => { run: () => Promise }; - Input: new (options: Record) => { run: () => Promise }; - MultiSelect: new (options: Record) => { run: () => Promise }; - Select: new (options: Record) => { run: () => Promise }; -}; - -const loadEnquirer = async (): Promise => { - const module = await import("enquirer"); - const enquirer = module.default ?? module; - return enquirer as unknown as EnquirerStatic; -}; - -const pickFormats = async (): Promise => { - const { MultiSelect } = await loadEnquirer(); - const selected = await new MultiSelect({ - choices: [ - { message: "ttf", name: "ttf" }, - { message: "woff", name: "woff" }, - { message: "woff2", name: "woff2" }, - ], - limit: 6, - message: "Which font types do you need?", - name: "formats", - }).run(); - - if (selected.length === 0) { - return DEFAULT_FORMATS; - } - - return selected; -}; - -const pickStyleType = async (): Promise<{ isCustomTemplate: boolean; styleType: string; template: string }> => { - const { Confirm, Input, Select } = await loadEnquirer(); - const styleType = await new Select({ - choices: ["css", "scss", "other"], - message: "Pick a file type for style", - name: "styleType", - }).run(); - - if (styleType === "other") { - const customType = await new Input({ - initial: "less", - message: "What format do you want to use?", - name: "customType", - }).run(); - const template = await new Input({ - initial: defaultCustomTemplatePath(customType), - message: "What is your template path?", - name: "template", - }).run(); - - return { - isCustomTemplate: true, - styleType: customType, - template, - }; - } - - const useCustomTemplate = await new Confirm({ - message: "Do you have your own template?", - name: "customTemplate", - }).run(); - - if (useCustomTemplate) { - const template = await new Input({ - initial: defaultCustomTemplatePath(styleType), - message: "What is your template path?", - name: "template", - }).run(); - - return { - isCustomTemplate: true, - styleType, - template, - }; - } - - return { - isCustomTemplate: false, - styleType, - template: styleType, - }; -}; - -export const runAssistantWizard = async (): Promise => { - if (!process.stdin.isTTY) { - throw new Error("Interactive assistant requires a TTY. Use --assistant-config with a .was file in CI."); - } - - const { Form } = await loadEnquirer(); - const answers = await new Form({ - choices: [ - { initial: "MyAwesomeFont", message: "Font Name", name: "name" }, - { initial: "my-icon", message: "Icon class prefix", name: "prefix" }, - { initial: "assets/fonts", message: "Output Path", name: "output" }, - { initial: "assets/images/svg", message: "Glyphs Path", name: "glyphs" }, - ], - message: "Basic font configuration:", - name: "assistant", - }).run(); - - const formats = await pickFormats(); - const style = await pickStyleType(); - - return buildWasConfigFromWizard(answers, { - formats, - isCustomTemplate: style.isCustomTemplate, - styleType: style.styleType, - template: style.template, - }); -}; diff --git a/packages/webfont/src/cli/assistant/saveWasConfig.test.ts b/packages/webfont/src/cli/assistant/saveWasConfig.test.ts deleted file mode 100644 index 5e306698..00000000 --- a/packages/webfont/src/cli/assistant/saveWasConfig.test.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { mkdtemp, readFile, rm } from "node:fs/promises"; -import { tmpdir } from "node:os"; -import { join } from "node:path"; -import { describe, expect, it } from "vitest"; -import { saveWasConfig } from "./saveWasConfig"; - -describe("saveWasConfig", () => { - it("should persist cleaned name and matching .was filename", async () => { - const dir = await mkdtemp(join(tmpdir(), "webfont-save-was-")); - try { - const configPath = await saveWasConfig({ - dest: dir, - files: "icons/*.svg", - formats: ["woff2"], - name: "../MyFont", - template: "css", - }); - - expect(configPath).toBe(join(dir, "MyFont.was")); - - const payload = JSON.parse(await readFile(configPath, "utf8")) as { name: string }; - expect(payload.name).toBe("MyFont"); - } finally { - await rm(dir, { recursive: true, force: true }); - } - }); -}); diff --git a/packages/webfont/src/cli/assistant/saveWasConfig.ts b/packages/webfont/src/cli/assistant/saveWasConfig.ts deleted file mode 100644 index a2795a0f..00000000 --- a/packages/webfont/src/cli/assistant/saveWasConfig.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { writeFile } from "node:fs/promises"; -import { join } from "node:path"; -import { cleanWasConfigBasename } from "./cleanWasConfigBasename"; -import type { WebfontAssistantWasConfig } from "./types"; - -export const saveWasConfig = async (config: WebfontAssistantWasConfig): Promise => { - const cleanName = cleanWasConfigBasename(config.name); - const configPath = join(config.dest, `${cleanName}.was`); - const payload: WebfontAssistantWasConfig = { ...config, name: cleanName }; - - await writeFile(configPath, JSON.stringify(payload), "utf8"); - return configPath; -}; diff --git a/packages/webfont/src/cli/assistant/types.ts b/packages/webfont/src/cli/assistant/types.ts deleted file mode 100644 index 01fc4bc3..00000000 --- a/packages/webfont/src/cli/assistant/types.ts +++ /dev/null @@ -1,31 +0,0 @@ -import type { Format } from "../../types/Format"; - -/** Saved `.was` format (compatible with webfont-assistant). */ -export type WebfontAssistantWasConfig = { - dest: string; - files: string; - fixedWidth?: boolean; - fontHeight?: number; - fontId?: string; - /** - * @deprecated Icon class prefix stored under the wrong key in legacy `.was` files. - * Use `prefix`. Still read for backward compatibility; built-in `--assistant` writes - * `prefix` only. Will be removed in the next breaking `.was` format change. - */ - fontName?: string; - /** Omitted or invalid on disk defaults to `["ttf"]` at map time. */ - formats?: Format[]; - isCustomTemplate?: boolean; - name: string; - prefix?: string; - styleType?: string; - template: string; - templateFontName?: string; -}; - -export type AssistantWizardAnswers = { - glyphs: string; - name: string; - output: string; - prefix: string; -}; diff --git a/packages/webfont/src/cli/buildSvgToolsFromCliFlags.test.ts b/packages/webfont/src/cli/buildSvgToolsFromCliFlags.test.ts deleted file mode 100644 index c1358931..00000000 --- a/packages/webfont/src/cli/buildSvgToolsFromCliFlags.test.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { buildSvgToolsFromCliFlags } from "./buildSvgToolsFromCliFlags"; - -describe("buildSvgToolsFromCliFlags", () => { - it("should build diagnose-only svgTools", () => { - expect(buildSvgToolsFromCliFlags({ svgDiagnose: true })).toEqual({ diagnose: true }); - }); - - it("should return undefined when no svg tool flags are set", () => { - expect(buildSvgToolsFromCliFlags({})).toBeUndefined(); - }); -}); diff --git a/packages/webfont/src/cli/buildSvgToolsFromCliFlags.ts b/packages/webfont/src/cli/buildSvgToolsFromCliFlags.ts deleted file mode 100644 index 74146be2..00000000 --- a/packages/webfont/src/cli/buildSvgToolsFromCliFlags.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { SvgToolsOptions } from "../types/SvgToolsOptions"; - -export const buildSvgToolsFromCliFlags = (flags: { svgDiagnose?: boolean }): SvgToolsOptions | undefined => { - if (!flags.svgDiagnose) { - return undefined; - } - - return { diagnose: true }; -}; diff --git a/packages/webfont/src/cli/index.entry.test.ts b/packages/webfont/src/cli/index.entry.test.ts deleted file mode 100644 index fd9d13e4..00000000 --- a/packages/webfont/src/cli/index.entry.test.ts +++ /dev/null @@ -1,33 +0,0 @@ -const { startCli } = vi.hoisted(() => ({ - startCli: vi.fn(), -})); - -vi.mock("./program", () => ({ - startCli, -})); - -vi.mock("./meow", () => ({ - __esModule: true, - default: { - flags: {}, - input: [], - showHelp: vi.fn(), - showVersion: vi.fn(), - }, -})); - -describe("cli entrypoint", () => { - it("should wire the meow parser into startCli on load", async () => { - vi.resetModules(); - await import("./index"); - - expect(startCli).toHaveBeenCalledWith( - expect.objectContaining({ - flags: expect.any(Object), - input: expect.any(Array), - showHelp: expect.any(Function), - showVersion: expect.any(Function), - }), - ); - }); -}); diff --git a/packages/webfont/src/cli/index.test.ts b/packages/webfont/src/cli/index.test.ts deleted file mode 100755 index 7942ed51..00000000 --- a/packages/webfont/src/cli/index.test.ts +++ /dev/null @@ -1,708 +0,0 @@ -import fs from "fs"; -import * as fsPromise from "fs/promises"; -import path from "path"; -import { version } from "../../package.json"; -import { execCLI } from "../lib/execCLI"; -import { createMeowCli } from "./meow/createMeowCli"; - -const formatCliStdout = (value: string): string => value.replace(/\n$/u, ""); -const expectedHelp = () => formatCliStdout(`${createMeowCli([]).help}\n`); -const expectedVersion = () => version; -const expectedVerbose = () => "Generating SVG font..."; -const expectedGlobError = () => "Error: Files glob patterns specified did not match any supported files"; - -const destination = "temp/cli"; -const fixturesGlob = "src/fixtures"; -const source = `${fixturesGlob}/svg-icons`; -const configPackageLink = path.join("node_modules", "webfont-fixture-config"); -const configPackageSource = path.resolve(fixturesGlob, "config-package"); - -const emptyDir = async (dir: string) => { - await fsPromise.rm(dir, { force: true, recursive: true }); - await fsPromise.mkdir(dir, { recursive: true }); -}; - -const isENOENT = (error: unknown): error is NodeJS.ErrnoException => - typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT"; - -describe("cli", () => { - beforeAll(async () => { - await fsPromise.mkdir(destination, { recursive: true }); - await fsPromise.mkdir(path.dirname(configPackageLink), { recursive: true }); - - try { - await fsPromise.lstat(configPackageLink); - } catch (error) { - if (!isENOENT(error)) { - throw error; - } - - await fsPromise.symlink(configPackageSource, configPackageLink, "dir"); - } - }); - - afterAll(async () => { - try { - const stat = await fsPromise.lstat(configPackageLink); - - if (stat.isSymbolicLink()) { - await fsPromise.unlink(configPackageLink); - } - } catch (error) { - if (!isENOENT(error)) { - throw error; - } - } - }); - - beforeEach(async () => { - await emptyDir(destination); - - const files = await fsPromise.readdir(destination); - - if (files.length !== 0) { - throw new Error(`${destination} did not empty before the test.`); - } - }); - - it("should exit with code 2 and displays --help if no argument parameters are passed", async () => { - const output = await execCLI(); - - expect(output.code).toBe(2); - expect(output.stdout).toBe(expectedHelp()); - expect(output.stderr).toBe(""); - }); - - it("should show help", async () => { - const output = await execCLI("--help"); - - expect(output.code).toBe(2); - expect(output.stdout).toBe(expectedHelp()); - expect(output.stderr).toBe(""); - }); - - it("should show version with --version", async () => { - const output = await execCLI("--version"); - - expect(output.code).toBe(0); - expect(output.stdout).toBe(expectedVersion()); - expect(output.stderr).toBe(""); - }); - - describe("short options", () => { - it("should show help with -h", async () => { - const output = await execCLI("-h"); - - expect(output.code).toBe(2); - expect(output.stdout).toBe(expectedHelp()); - expect(output.stderr).toBe(""); - }); - - it("should show version with -v", async () => { - const output = await execCLI("-v"); - - expect(output.code).toBe(0); - expect(output.stdout).toBe(expectedVersion()); - expect(output.stderr).toBe(""); - }); - - it("should set destination with -d", async () => { - const output = await execCLI(`${source} -d ${destination}`); - - expect(output.files).toEqual([ - "webfont.eot", - "webfont.hash", - "webfont.svg", - "webfont.ttf", - "webfont.woff", - "webfont.woff2", - ]); - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - }); - - it("should create destination with -m", async () => { - const nonExistentDestination = `${destination}/short-option/missing-dest`; - const output = await execCLI(`${source} -d ${nonExistentDestination} -m`); - - await fsPromise.access(nonExistentDestination, fs.constants.F_OK); - - const files = await fsPromise.readdir(nonExistentDestination, { encoding: "utf-8" }); - - expect(files).toEqual( - expect.arrayContaining(["webfont.eot", "webfont.svg", "webfont.ttf", "webfont.woff", "webfont.woff2"]), - ); - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - }); - - it("should set destTemplate with -s", async () => { - const templateDest = `${destination}/template-output`; - await fsPromise.mkdir(templateDest, { recursive: true }); - - const output = await execCLI( - `${source} -d ${destination} -t css --templateCacheString test -s ${templateDest}`, - ); - - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - - const cssPath = `${templateDest}/webfont.css`; - await fsPromise.access(cssPath, fs.constants.F_OK); - const css = await fsPromise.readFile(cssPath, { encoding: "utf-8" }); - expect(css).toMatchSnapshot(); - }); - - it("should set font name with -u", async () => { - const output = await execCLI(`${source} -d ${destination} -u foobar`); - - expect(output.files).toEqual([ - "foobar.eot", - "foobar.hash", - "foobar.svg", - "foobar.ttf", - "foobar.woff", - "foobar.woff2", - ]); - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - }); - - it("should set formats with -f", async () => { - const output = await execCLI(`${source} -d ${destination} -f '["woff2"]'`); - - expect(output.files).toEqual(["webfont.hash", "webfont.woff2"]); - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - }); - - it("should reject unknown format names on the CLI (#133)", async () => { - const output = await execCLI(`${source} -d ${destination} -f icon`); - - expect(output.code).toBe(1); - expect(output.stderr).toBe(""); - expect(output.stdout).toContain('Invalid format "icon"'); - }); - - it("should set template with -t", async () => { - const output = await execCLI(`${source} -d ${destination} -t css --templateCacheString test`); - - expect(output.files).toEqual([ - "webfont.css", - "webfont.eot", - "webfont.svg", - "webfont.ttf", - "webfont.woff", - "webfont.woff2", - ]); - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - }); - - it("should set templateClassName with -c", async () => { - const output = await execCLI( - `${source} -d ${destination} -t css -c short-option-class --templateCacheString test`, - ); - - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - - const css = await fsPromise.readFile(`${destination}/webfont.css`, { encoding: "utf-8" }); - expect(css).toContain(".short-option-class"); - }); - - it("should set templateFontName with -n", async () => { - const output = await execCLI( - `${source} -d ${destination} -t css -n short-option-font --templateCacheString test`, - ); - - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - - const css = await fsPromise.readFile(`${destination}/webfont.css`, { encoding: "utf-8" }); - expect(css).toContain("short-option-font"); - }); - - it("should set templateFontPath with -p", async () => { - const output = await execCLI(`${source} -d ${destination} -t css -p short/path --templateCacheString test`); - - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - - const css = await fsPromise.readFile(`${destination}/webfont.css`, { encoding: "utf-8" }); - expect(css).toContain("short/path/"); - }); - }); - - it("should throw error `files glob patterns specified did not match any files` if not found files", async () => { - const output = await execCLI(`${fixturesGlob}/not-found-svg-icons/**/* -d ${destination}`); - - expect(output.code).toBe(1); - expect(output.stdout).toContain(expectedGlobError()); - expect(output.stderr).toBe(""); - }); - - it("should generate all fonts", async () => { - const output = await execCLI(`${source} -d ${destination}`); - - expect(output.files).toEqual([ - "webfont.eot", - "webfont.hash", - "webfont.svg", - "webfont.ttf", - "webfont.woff", - "webfont.woff2", - ]); - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - }); - - it("should generate only `woff2` font", async () => { - const output = await execCLI(`${source} -d ${destination} -f '["woff2"]'`); - - expect(output.files).toEqual(["webfont.hash", "webfont.woff2"]); - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - }); - - it("should generate all fonts with build-in template", async () => { - const output = await execCLI(`${source} -d ${destination} --template css --templateCacheString test`); - - expect(output.files).toEqual([ - "webfont.css", - "webfont.eot", - "webfont.svg", - "webfont.ttf", - "webfont.woff", - "webfont.woff2", - ]); - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - const data = await fsPromise.readFile(`${destination}/webfont.css`, { encoding: "utf-8" }); - expect(data).toMatchSnapshot(); - }); - - it("should generate multiple built-in templates (#158)", async () => { - const output = await execCLI(`${source} -d ${destination} -t '["html","scss"]' --templateCacheString test`); - - expect(output.files).toEqual( - expect.arrayContaining(["webfont.html", "webfont.scss", "webfont.woff2", "webfont.woff", "webfont.ttf"]), - ); - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - - const html = await fsPromise.readFile(`${destination}/webfont.html`, { encoding: "utf-8" }); - const scss = await fsPromise.readFile(`${destination}/webfont.scss`, { encoding: "utf-8" }); - expect(html).toContain(""); - expect(scss).toContain("$webfont-"); - }); - - it("should respect `template` options", async () => { - const output = await execCLI( - `${source} -d ${destination} --template css --templateClassName foo --templateCacheString test --templateFontPath test/path --templateFontName testname`, - ); - - expect(output.files).toEqual([ - "webfont.css", - "webfont.eot", - "webfont.svg", - "webfont.ttf", - "webfont.woff", - "webfont.woff2", - ]); - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - const data = await fsPromise.readFile(`${destination}/webfont.css`, { encoding: "utf-8" }); - expect(data).toMatchSnapshot(); - }); - - it("should load config via --config with a relative path", async () => { - const configPath = `${fixturesGlob}/configs/.webfontrc-cli.json`; - const output = await execCLI(`${source} -d ${destination} --config ${configPath}`); - - expect(output.files).toEqual(["cli-config-font.hash", "cli-config-font.woff2"]); - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - }); - - it("should load a JavaScript config via --config (#480)", async () => { - const configPath = `${fixturesGlob}/configs/webfont.config-cli.js`; - const output = await execCLI(`${source} -d ${destination} --config ${configPath}`); - - expect(output.files).toEqual(["cli-config-js-font.hash", "cli-config-js-font.woff2"]); - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - }); - - it("should load config via --config with an absolute path", async () => { - const configPath = path.resolve(fixturesGlob, "configs/.webfontrc-cli.json"); - const output = await execCLI(`${source} -d ${destination} --config ${configPath}`); - - expect(output.files).toEqual(["cli-config-font.hash", "cli-config-font.woff2"]); - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - }); - - it("should load config via --config with a node_modules package name", async () => { - const output = await execCLI(`${source} -d ${destination} --config webfont-fixture-config`); - - expect(output.files).toEqual(["config-node-module.hash", "config-node-module.woff2"]); - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - }); - - it("should use files from config when no CLI input is provided (#2)", async () => { - const configPath = `${fixturesGlob}/configs/.webfontrc-files.json`; - const output = await execCLI(`-d ${destination} --config ${configPath}`); - - expect(output.files).toEqual(["config-files-font.hash", "config-files-font.woff2"]); - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - }); - - it("should reject CLI input when config defines files (#2)", async () => { - const configPath = `${fixturesGlob}/configs/.webfontrc-files.json`; - const output = await execCLI(`${source}/envelope.svg -d ${destination} --config ${configPath}`); - - expect(output.code).toBe(1); - expect(output.stderr).toBe(""); - expect(output.stdout).toMatch( - /Cannot specify input files on the command line when `files` is set in the config file/u, - ); - }); - - it("should generate built-in html template", async () => { - const output = await execCLI( - `${source} -d ${destination} --template html --templateCacheString test --ligatures`, - ); - - expect(output.files).toEqual([ - "webfont.eot", - "webfont.html", - "webfont.svg", - "webfont.ttf", - "webfont.woff", - "webfont.woff2", - ]); - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - const data = await fsPromise.readFile(`${destination}/webfont.html`, { encoding: "utf-8" }); - expect(data).toContain(""); - expect(data).toMatchSnapshot(); - }); - - it("should include font hash in template when addHashInFontUrl is enabled", async () => { - const output = await execCLI( - `${source} -d ${destination} --template css --templateCacheString test --addHashInFontUrl`, - ); - - expect(output.files).toEqual([ - "webfont.css", - "webfont.eot", - "webfont.svg", - "webfont.ttf", - "webfont.woff", - "webfont.woff2", - ]); - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - const css = await fsPromise.readFile(`${destination}/webfont.css`, { encoding: "utf-8" }); - expect(css).toMatch(/&v=[a-f0-9]{32}/u); - expect(css).toMatchSnapshot(); - }); - - it("should include font hash in scss template when addHashInFontUrl is enabled (#125)", async () => { - const output = await execCLI( - `${source} -d ${destination} --template scss --templateCacheString test --addHashInFontUrl`, - ); - - expect(output.files).toEqual([ - "webfont.eot", - "webfont.scss", - "webfont.svg", - "webfont.ttf", - "webfont.woff", - "webfont.woff2", - ]); - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - const scss = await fsPromise.readFile(`${destination}/webfont.scss`, { encoding: "utf-8" }); - expect(scss).toMatch(/&v=[a-f0-9]{32}/u); - expect(scss).toContain('url("./webfont.woff2?'); - }); - - it("should omit unicode-range in css template by default", async () => { - const output = await execCLI( - `${source} -d ${destination} --template css --templateCacheString test --formats woff2`, - ); - - expect(output.files).toEqual(["webfont.css", "webfont.woff2"]); - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - const css = await fsPromise.readFile(`${destination}/webfont.css`, { encoding: "utf-8" }); - expect(css).not.toContain("unicode-range:"); - }); - - it("should include unicode-range when --unicode-range is passed (#322)", async () => { - const output = await execCLI( - `${source} -d ${destination} --template css --templateCacheString test --formats woff2 --unicode-range`, - ); - - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - const css = await fsPromise.readFile(`${destination}/webfont.css`, { encoding: "utf-8" }); - expect(css).toContain("unicode-range: U+EA01-EA03;"); - }); - - it("should set font name", async () => { - const output = await execCLI(`${source} -d ${destination} --fontName foobar`); - - expect(output.files).toEqual([ - "foobar.eot", - "foobar.hash", - "foobar.svg", - "foobar.ttf", - "foobar.woff", - "foobar.woff2", - ]); - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - }); - - it("should respect `font` options", async () => { - const output = await execCLI( - `${source} -d ${destination} --fontId testId --fontStyle italic --fontWeight 500 --fontHeight 15`, - ); - - expect(output.files).toEqual([ - "webfont.eot", - "webfont.hash", - "webfont.svg", - "webfont.ttf", - "webfont.woff", - "webfont.woff2", - ]); - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - const data = await fsPromise.readFile(`${destination}/webfont.svg`, { encoding: "utf-8" }); - expect(data).toMatchSnapshot(); - }); - - it("should run in verbose mode", async () => { - const output = await execCLI(`${source} -d ${destination} --verbose`); - - expect(output.files).toEqual([ - "webfont.eot", - "webfont.hash", - "webfont.svg", - "webfont.ttf", - "webfont.woff", - "webfont.woff2", - ]); - expect(output.stdout).toBe(expectedVerbose()); - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - }); - - it("should warn about evenodd fill-rule on stdout when verbose (#175)", async () => { - const output = await execCLI(`${fixturesGlob}/svg-evenodd/linkedin.svg -d ${destination} --verbose -f svg`); - - expect(output.stdout).toContain("fill-rule: evenodd"); - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - }); - - it("should log stroke-only diagnostics on stdout when --svg-diagnose is enabled", async () => { - const output = await execCLI( - `${fixturesGlob}/svg-stroke-icons/stroked-plus.svg -d ${destination} --svg-diagnose -f ttf`, - ); - - expect(output.stdout).toContain("stroke-based paths"); - expect(output.stdout).toContain("Empty glyph path"); - expect(output.code).toBe(1); - expect(output.stderr).toBe(""); - }); - - it("should fail when stroke-only SVGs produce empty glyph paths (#327)", async () => { - const output = await execCLI(`${fixturesGlob}/svg-icons-stroke-only/wave.svg -d ${destination} -f woff2`); - - expect(output.code).toBe(1); - expect(output.stderr).toBe(""); - expect(output.stdout).toContain("Empty glyph path"); - expect(output.stdout).toContain("wave.svg"); - }); - - it("should optimize messy SVGs when --optimize-svg is enabled (#724)", async () => { - const output = await execCLI( - `${fixturesGlob}/svg-icons-messy/triangle.svg -d ${destination} -f woff2 --optimize-svg`, - ); - - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - expect(output.files).toEqual(["webfont.hash", "webfont.woff2"]); - }); - - it("should convert a ttf font to an svg font via the CLI (#764)", async () => { - const output = await execCLI(`${fixturesGlob}/fonts/iconfont.ttf -d ${destination} -f svg`); - - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - expect(output.files).toContain("webfont.svg"); - - const svg = await fsPromise.readFile(`${destination}/webfont.svg`, { encoding: "utf-8" }); - expect(svg).toContain(" { - const nonExistentDestination = `${destination}/that/does/not/exist`; - const output = await execCLI(`${source} -d ${nonExistentDestination} --dest-create`); - - await fsPromise.access(nonExistentDestination, fs.constants.F_OK); - - const files = await fsPromise.readdir(nonExistentDestination, { encoding: "utf-8" }); - - output.files = files.filter((file) => file !== "that"); - - expect(output.files).toEqual(files); - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - }); - - it("should not create dest directory if it does not exist", async () => { - const nonExistentDestination = `${destination}/that/does/not/exist`; - - const output = await execCLI(`${source} -d ${nonExistentDestination}`); - - expect(output.code).toBe(1); - expect(output.stdout).toContain("Destination directory"); - expect(output.stdout).toContain(nonExistentDestination); - expect(output.stdout).toContain("does not exist"); - expect(output.stdout).toContain("--dest-create"); - expect(output.stderr).toBe(""); - - let destinationWasCreated = true; - try { - await fsPromise.access(nonExistentDestination, fs.constants.F_OK); - } catch (_exception) { - destinationWasCreated = false; - } - expect(destinationWasCreated).toBe(false); - }); - - it("should fail with a clear error when dest does not exist and verbose is enabled", async () => { - const nonExistentDestination = `${destination}/verbose/missing/dest`; - - const output = await execCLI(`${source} -d ${nonExistentDestination} --verbose`); - - expect(output.code).toBe(1); - expect(output.stdout).toContain("Generating SVG font..."); - expect(output.stdout).toContain("Destination directory"); - expect(output.stdout).toContain(nonExistentDestination); - expect(output.stdout).toContain("does not exist"); - expect(output.stdout).toContain("--dest-create"); - expect(output.stderr).toBe(""); - - let destinationWasCreated = true; - try { - await fsPromise.access(nonExistentDestination, fs.constants.F_OK); - } catch { - destinationWasCreated = false; - } - expect(destinationWasCreated).toBe(false); - }); - - it("should generate only `woff2` font from comma-separated formats", async () => { - const output = await execCLI(`${source} -d ${destination} -f woff2`); - - expect(output.files).toEqual(["webfont.hash", "webfont.woff2"]); - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - }); - - it("should honor --no-sort flag (ligatures off by default)", async () => { - const output = await execCLI(`${source} -d ${destination} --no-sort`); - - expect(output.files).toEqual([ - "webfont.eot", - "webfont.hash", - "webfont.svg", - "webfont.ttf", - "webfont.woff", - "webfont.woff2", - ]); - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - }); - - it("should respect svgicons2svgfont flags passed on the CLI", async () => { - const output = await execCLI( - `${source} -d ${destination} --normalize --centerHorizontally --centerVertically --fixedWidth --fontWeight 500 --metadata test-meta`, - ); - - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - expect(output.files).toEqual( - expect.arrayContaining(["webfont.eot", "webfont.svg", "webfont.ttf", "webfont.woff", "webfont.woff2"]), - ); - - const svg = await fsPromise.readFile(`${destination}/webfont.svg`, { encoding: "utf-8" }); - expect(svg).toContain('font-weight="500"'); - expect(svg).toContain("test-meta"); - }); - - it("should convert woff2 input to ttf output via the CLI", async () => { - const conversionDest = "temp/cli-woff2-conversion"; - const output = await execCLI( - `src/fixtures/fonts/iconfont.woff2 -d ${conversionDest} -f ttf -u iconfont --dest-create`, - conversionDest, - ); - - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - expect(output.files).toEqual(["iconfont.ttf"]); - - const ttf = await fsPromise.readFile(`${conversionDest}/iconfont.ttf`); - expect(ttf.length).toBeGreaterThan(0); - }); - - it("should batch-decompress multiple webfont files via the CLI", async () => { - const conversionDest = "temp/cli-batch-decompress"; - const output = await execCLI( - `src/fixtures/fonts/iconfont.woff src/fixtures/fonts/iconfont.woff2 -d ${conversionDest} -f ttf --dest-create`, - conversionDest, - ); - - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - expect(output.files).toEqual(expect.arrayContaining(["iconfont-woff.ttf", "iconfont-woff2.ttf"])); - }); - - it("should encode ttf input to woff and woff2 via the CLI", async () => { - const conversionDest = "temp/cli-ttf-encode"; - const output = await execCLI( - `src/fixtures/fonts/iconfont.ttf -d ${conversionDest} -f woff,woff2 -u iconfont --dest-create`, - conversionDest, - ); - - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - expect(output.files).toEqual(expect.arrayContaining(["iconfont.woff", "iconfont.woff2"])); - - const woff = await fsPromise.readFile(`${conversionDest}/iconfont.woff`); - const woff2 = await fsPromise.readFile(`${conversionDest}/iconfont.woff2`); - expect(woff.length).toBeGreaterThan(0); - expect(woff2.length).toBeGreaterThan(0); - }); - - it("should generate fonts from a webfont-assistant .was config via --assistant-config", async () => { - const assistantDest = "temp/cli-assistant"; - await emptyDir(assistantDest); - - const output = await execCLI("--assistant-config src/fixtures/assistant/assistant-fixture.was", assistantDest); - - expect(output.code).toBe(0); - expect(output.stderr).toBe(""); - expect(output.files).toEqual(expect.arrayContaining(["AssistantFixture.woff2", "AssistantFixture.was"])); - }); -}); diff --git a/packages/webfont/src/cli/index.ts b/packages/webfont/src/cli/index.ts deleted file mode 100755 index 44db6fa7..00000000 --- a/packages/webfont/src/cli/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import cli from "./meow"; -import { startCli } from "./program"; - -startCli(cli); diff --git a/packages/webfont/src/cli/meow/__mocks__/index.ts b/packages/webfont/src/cli/meow/__mocks__/index.ts deleted file mode 100644 index 5fa7d831..00000000 --- a/packages/webfont/src/cli/meow/__mocks__/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { version } from "../../../../package.json"; -import { createMeowCli } from "../createMeowCli"; - -const formatCliStdout = (value: string): string => value.replace(/\n$/u, ""); -const cli = createMeowCli([]); - -const meowMock = { - ...cli, - error: () => "Error: Files glob patterns specified did not match any files", - showHelp: () => formatCliStdout(`${cli.help}\n`), - showVersion: () => version, - verbose: () => "Generating SVG font...", -}; - -export default meowMock; diff --git a/packages/webfont/src/cli/meow/cliFlagCatalog.ts b/packages/webfont/src/cli/meow/cliFlagCatalog.ts deleted file mode 100644 index 007f00f0..00000000 --- a/packages/webfont/src/cli/meow/cliFlagCatalog.ts +++ /dev/null @@ -1,333 +0,0 @@ -export type CliFlagType = "string" | "boolean"; - -export type CliFlagCatalogEntry = { - /** meow / program camelCase key */ - key: string; - type: CliFlagType; - short?: string; - default?: boolean | string; - /** Long option as shown in `--help` (include leading `--`). */ - long: string; - /** When true and default is true, `long` documents the negated flag (e.g. `--no-sort`). */ - negatable?: boolean; - description: string | readonly string[]; -}; - -export type CliFlagSection = { - title?: string; - entries: readonly CliFlagCatalogEntry[]; -}; - -export const CLI_USAGE_LINE = "Usage: webfont [input] [options]" as const; - -export const CLI_INPUT_SECTION = { - title: "Input: File(s) or glob(s).", - lines: [ - "SVG icons: one or more `.svg` files (default pipeline).", - "Webfont decompression: one or more `.woff` / `.woff2` paths, globs, or http(s) URLs.", - " You must have rights to any font file you process (see NOTICE.md).", - "", - 'If an input argument is wrapped in quotation marks, it will be passed to "fast-glob"', - "for cross-platform glob support.", - ], -} as const; - -export const CLI_FLAG_SECTIONS: readonly CliFlagSection[] = [ - { - title: "Options:", - entries: [ - { - key: "assistant", - long: "--assistant", - type: "boolean", - description: [ - "Interactive wizard (webfont-assistant style): prompts for font name, icon prefix,", - "glyph/output paths, formats, and built-in or custom templates; writes a `.was` config.", - ], - }, - { - key: "assistantConfig", - long: "--assistant-config", - type: "string", - description: [ - "Path to a `.was` file (webfont-assistant format). The file contents may be a single", - "config object or a JSON array of configs; this flag is not inline JSON.", - "Distinct from `--config` (cosmiconfig).", - ], - }, - { - key: "config", - long: "--config", - type: "string", - description: [ - "Path to a specific configuration file (JSON, YAML, or CommonJS)", - "or the name of a module in `node_modules` that points to one.", - "If no `--config` argument is provided, webfont will search for", - "configuration files in the following places, in this order:", - " - a `webfont` property in `package.json`", - " - a `.webfontrc` file (with or without filename extension:", - " `.json`, `.yaml`, and `.js` are available)", - " - a `webfont.config.js` file exporting a JS object", - "The search will begin in the working directory and move up the", - "directory tree until a configuration file is found.", - ], - }, - { - key: "fontName", - long: "--fontName", - short: "u", - type: "string", - description: 'The font family name you want, default: "webfont".', - }, - { - key: "help", - long: "--help", - short: "h", - type: "boolean", - description: "Output usage information.", - }, - { - key: "version", - long: "--version", - short: "v", - type: "boolean", - description: "Output the version number.", - }, - { - key: "formats", - long: "--formats", - short: "f", - type: "string", - description: [ - "Font formats to generate. Pass a JSON array (e.g. '[\"woff2\"]') or a", - "comma-separated list (e.g. woff2 or svg, ttf, woff2).", - "SVG input: svg, ttf, eot, woff, woff2 (not otf).", - "WOFF/WOFF2 input: ttf and/or otf matching the embedded SFNT flavor.", - ], - }, - { - key: "dest", - long: "--dest", - short: "d", - type: "string", - description: "Destination for generated fonts.", - }, - { - key: "destCreate", - long: "--dest-create", - short: "m", - type: "boolean", - default: false, - description: "Create destination directory if it does not exist.", - }, - { - key: "template", - long: "--template", - short: "t", - type: "string", - description: [ - "Built-in template name(s) ('css', 'scss', 'styl', 'html', 'json') or path to a custom template.", - 'Pass a JSON array (e.g. \'["html","scss"]\') or comma-separated list for multiple outputs.', - ], - }, - { - key: "destTemplate", - long: "--destTemplate", - short: "s", - type: "string", - description: "Destination for generated template. If not passed used `dest` argument value.", - }, - { - key: "templateClassName", - long: "--templateClassName", - short: "c", - type: "string", - description: "Class name in css template.", - }, - { - key: "templateFontPath", - long: "--templateFontPath", - short: "p", - type: "string", - description: "Font path in css template.", - }, - { - key: "templateFontName", - long: "--templateFontName", - short: "n", - type: "string", - description: "Font name in css template.", - }, - { - key: "templateCacheString", - long: "--templateCacheString", - type: "string", - default: "", - description: "Specify cache string in scss/css template.", - }, - { - key: "sort", - long: "--no-sort", - type: "boolean", - default: true, - negatable: true, - description: "Keeps the files in the same order of entry", - }, - { - key: "ligatures", - long: "--ligatures", - type: "boolean", - default: false, - description: [ - "Add OpenType ligature glyphs (icon names as text). Off by default — large", - "icon sets can hang Firefox on Windows (#558). Prefer class + codepoint CSS.", - ], - }, - { - key: "unicodeRange", - long: "--unicode-range", - type: "boolean", - default: false, - description: [ - "Emit unicode-range in built-in @font-face rules (computed from glyph code points).", - "Off by default — enabling may prevent ligature names from rendering; see README.", - ], - }, - { - key: "templateFontLigatures", - long: "--no-template-font-ligatures", - type: "boolean", - default: true, - negatable: true, - description: 'Omit font-feature-settings: "liga" from the built-in HTML preview template', - }, - { - key: "optimizeSvg", - long: "--optimize-svg", - type: "boolean", - default: false, - description: [ - "Run a conservative SVGO pass on each SVG before font generation", - "(does not convert strokes to fills; use glyphContentTransformFn for that)", - ], - }, - { - key: "verbose", - long: "--verbose", - type: "boolean", - default: false, - description: "Tell me everything!.", - }, - { - key: "svgDiagnose", - long: "--svg-diagnose", - type: "boolean", - default: false, - description: [ - "(Alpha) Scan SVG icons for icon-font incompatibilities (stroke-only paths,", - "fill-rule: evenodd, unsupported elements) and log warnings.", - ], - }, - ], - }, - { - title: 'For "svgicons2svgfont":', - entries: [ - { - key: "fontId", - long: "--fontId", - type: "string", - description: 'The font id you want, default as "--fontName".', - }, - { - key: "fontStyle", - long: "--fontStyle", - type: "string", - description: "The font style you want.", - }, - { - key: "fontWeight", - long: "--fontWeight", - type: "string", - description: "The font weight you want.", - }, - { - key: "fixedWidth", - long: "--fixedWidth", - type: "boolean", - description: "Creates a monospace font of the width of the largest input icon.", - }, - { - key: "centerHorizontally", - long: "--centerHorizontally", - type: "boolean", - description: "Calculate the bounds of a glyph and center it horizontally.", - }, - { - key: "centerVertically", - long: "--centerVertically", - type: "boolean", - description: "Center the glyphs vertically in the generated font.", - }, - { - key: "normalize", - long: "--normalize", - type: "boolean", - description: "Normalize icons by scaling them to the height of the highest icon.", - }, - { - key: "fontHeight", - long: "--fontHeight", - type: "string", - description: "The outputted font height [MAX(icons.height)].", - }, - { - key: "round", - long: "--round", - type: "string", - description: "Setup the SVG path rounding [10e12].", - }, - { - key: "descent", - long: "--descent", - type: "string", - description: "The font descent [0].", - }, - { - key: "ascent", - long: "--ascent", - type: "string", - description: "The font ascent [height - descent].", - }, - { - key: "startUnicode", - long: "--startUnicode", - type: "string", - description: "The start unicode codepoint for files without prefix [0xEA01].", - }, - { - key: "prependUnicode", - long: "--prependUnicode", - type: "boolean", - description: "Prefix files with their automatically allocated unicode codepoint.", - }, - { - key: "metadata", - long: "--metadata", - type: "string", - description: "Content of the metadata tag.", - }, - { - key: "addHashInFontUrl", - long: "--addHashInFontUrl", - type: "boolean", - default: false, - description: [ - "Append an MD5 content hash to font URLs in built-in templates", - "(?v=[hash]) while keeping output filenames stable (fontName.woff2, etc.).", - "Use with a fixed fontName — do not randomize fontName for cache busting.", - ], - }, - ], - }, -] as const; diff --git a/packages/webfont/src/cli/meow/cliOptions.ts b/packages/webfont/src/cli/meow/cliOptions.ts deleted file mode 100644 index 935d5c63..00000000 --- a/packages/webfont/src/cli/meow/cliOptions.ts +++ /dev/null @@ -1 +0,0 @@ -export { WEBFONT_CLI_HELP_MARKERS, webfontCliHelpText, webfontMeowFlags } from "./renderCliHelp"; diff --git a/packages/webfont/src/cli/meow/createMeowCli.ts b/packages/webfont/src/cli/meow/createMeowCli.ts deleted file mode 100644 index 65a34742..00000000 --- a/packages/webfont/src/cli/meow/createMeowCli.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { pathToFileURL } from "node:url"; -import meow from "meow"; -import pkg from "../../../package.json"; -import { webfontCliHelpText, webfontMeowFlags } from "./cliOptions"; - -const meowImportMeta = { url: pathToFileURL(__filename).href } as ImportMeta; - -export const createMeowCli = (argv: readonly string[] = process.argv.slice(2)) => - meow(webfontCliHelpText, { - argv: [...argv], - autoHelp: false, - autoVersion: false, - flags: webfontMeowFlags, - importMeta: meowImportMeta, - pkg, - }); diff --git a/packages/webfont/src/cli/meow/index.test.ts b/packages/webfont/src/cli/meow/index.test.ts deleted file mode 100644 index 2307711e..00000000 --- a/packages/webfont/src/cli/meow/index.test.ts +++ /dev/null @@ -1,314 +0,0 @@ -import type { CliLike } from "../program"; -import { buildOptionsBase } from "../program"; -import { WEBFONT_CLI_HELP_MARKERS, webfontCliHelpText, webfontMeowFlags } from "./cliOptions"; -import { createMeowCli } from "./createMeowCli"; - -const PROGRAM_CLI_FLAG_KEYS = [ - "addHashInFontUrl", - "ascent", - "assistant", - "assistantConfig", - "centerHorizontally", - "centerVertically", - "config", - "descent", - "dest", - "destCreate", - "destTemplate", - "fixedWidth", - "fontHeight", - "fontId", - "fontName", - "fontStyle", - "fontWeight", - "formats", - "help", - "ligatures", - "metadata", - "normalize", - "optimizeSvg", - "prependUnicode", - "round", - "sort", - "startUnicode", - "template", - "templateCacheString", - "templateClassName", - "templateFontName", - "templateFontPath", - "templateFontLigatures", - "unicodeRange", - "verbose", - "svgDiagnose", - "version", -] as const satisfies readonly (keyof CliLike["flags"])[]; - -const meowCliFlagKeys = Object.keys(webfontMeowFlags); - -const wrapCli = (argv: readonly string[]): CliLike => { - const meowCli = createMeowCli(argv); - - return { - ...meowCli, - showHelp: vi.fn(), - showVersion: vi.fn(), - }; -}; - -const expectedHelpStdout = (): string => createMeowCli([]).help.replace(/\n$/u, ""); - -describe("cli/meow", () => { - it("should load the meow package as a callable default export", async () => { - // meow 14+ is ESM-only; Vitest resolves the default export object. - const meow = await import("meow"); - - expect(typeof meow.default).toBe("function"); - }); - - it("should expose the same flag keys that program.ts reads from CliLike", () => { - expect(meowCliFlagKeys.sort()).toEqual([...PROGRAM_CLI_FLAG_KEYS].sort()); - }); - - it("should keep help text markers in sync with the documented CLI options", () => { - for (const marker of WEBFONT_CLI_HELP_MARKERS) { - expect(webfontCliHelpText).toContain(marker); - } - }); - - describe("createMeowCli", () => { - it("should parse positional input globs", () => { - const cli = createMeowCli(["src/icons/*.svg", "more/*.svg"]); - - expect(cli.input).toEqual(["src/icons/*.svg", "more/*.svg"]); - }); - - it("should expose help text that matches the bundled CLI stdout contract", () => { - expect(expectedHelpStdout()).toContain("Usage: webfont [input] [options]"); - expect(expectedHelpStdout()).toContain( - "Generator of fonts from SVG icons; decompress WOFF/WOFF2 to embedded TTF/OTF", - ); - }); - - it("should parse --help and --version flags", () => { - expect(createMeowCli(["--help"]).flags.help).toBe(true); - expect(createMeowCli(["-h"]).flags.help).toBe(true); - expect(createMeowCli(["--version"]).flags.version).toBe(true); - expect(createMeowCli(["-v"]).flags.version).toBe(true); - }); - - it("should apply boolean defaults for sort, ligatures, unicodeRange, verbose, destCreate, and addHashInFontUrl", () => { - const cli = createMeowCli(["input.svg"]); - - expect(cli.flags.sort).toBe(true); - expect(cli.flags.ligatures).toBe(false); - expect(cli.flags.unicodeRange).toBe(false); - expect(cli.flags.templateFontLigatures).toBe(true); - expect(cli.flags.verbose).toBe(false); - expect(cli.flags.destCreate).toBe(false); - expect(cli.flags.addHashInFontUrl).toBe(false); - expect(cli.flags.optimizeSvg).toBe(false); - expect(cli.flags.templateCacheString).toBe(""); - }); - - it("should parse --no-sort, --ligatures, and --no-template-font-ligatures flags", () => { - const cli = createMeowCli(["input.svg", "--no-sort", "--ligatures", "--no-template-font-ligatures"]); - - expect(cli.flags.sort).toBe(false); - expect(cli.flags.ligatures).toBe(true); - expect(cli.flags.templateFontLigatures).toBe(false); - }); - - it("should parse --unicode-range to enable unicode-range in templates", () => { - const cli = createMeowCli(["input.svg", "--unicode-range"]); - - expect(cli.flags.unicodeRange).toBe(true); - }); - - it("should parse short aliases for common flags", () => { - const cli = createMeowCli([ - "icons/*.svg", - "-d", - "temp/out", - "-m", - "-u", - "alias-font", - "-f", - "woff2", - "-t", - "css", - "-s", - "temp/templates", - "-c", - "icon", - "-n", - "icon-font", - "-p", - "./fonts", - "--verbose", - ]); - - expect(cli.flags.dest).toBe("temp/out"); - expect(cli.flags.destCreate).toBe(true); - expect(cli.flags.fontName).toBe("alias-font"); - expect(cli.flags.formats).toBe("woff2"); - expect(cli.flags.template).toBe("css"); - expect(cli.flags.destTemplate).toBe("temp/templates"); - expect(cli.flags.templateClassName).toBe("icon"); - expect(cli.flags.templateFontName).toBe("icon-font"); - expect(cli.flags.templateFontPath).toBe("./fonts"); - expect(cli.flags.verbose).toBe(true); - }); - - it("should default argv to process.argv.slice(2) when omitted", () => { - const originalArgv = process.argv; - - process.argv = ["node", "webfont", "--help"]; - - try { - expect(createMeowCli().flags.help).toBe(true); - } finally { - process.argv = originalArgv; - } - }); - - it("should parse svgicons2svgfont-related flags", () => { - const cli = createMeowCli([ - "icons/*.svg", - "--fontId", - "id", - "--fontStyle", - "italic", - "--fontWeight", - "700", - "--fixedWidth", - "--centerHorizontally", - "--centerVertically", - "--normalize", - "--fontHeight", - "100", - "--round", - "1", - "--descent", - "5", - "--ascent", - "10", - "--startUnicode", - "0xea01", - "--prependUnicode", - "--metadata", - "meta", - "--addHashInFontUrl", - ]); - - expect(cli.flags.fontId).toBe("id"); - expect(cli.flags.fontStyle).toBe("italic"); - expect(cli.flags.fontWeight).toBe("700"); - expect(cli.flags.fixedWidth).toBe(true); - expect(cli.flags.centerHorizontally).toBe(true); - expect(cli.flags.centerVertically).toBe(true); - expect(cli.flags.normalize).toBe(true); - expect(cli.flags.fontHeight).toBe("100"); - expect(cli.flags.round).toBe("1"); - expect(cli.flags.descent).toBe("5"); - expect(cli.flags.ascent).toBe("10"); - expect(cli.flags.startUnicode).toBe("0xea01"); - expect(cli.flags.prependUnicode).toBe(true); - expect(cli.flags.metadata).toBe("meta"); - expect(cli.flags.addHashInFontUrl).toBe(true); - }); - - it("should parse --config and --templateCacheString", () => { - const cli = createMeowCli(["icons/*.svg", "--config", "webfont.config.js", "--templateCacheString", "v=1"]); - - expect(cli.flags.config).toBe("webfont.config.js"); - expect(cli.flags.templateCacheString).toBe("v=1"); - }); - - it("should map parsed argv into buildOptionsBase the same way program.ts expects", () => { - const options = buildOptionsBase( - wrapCli([ - "src/fixtures/svg-icons/*.svg", - "-d", - "temp/out", - "-m", - "-u", - "parsed-font", - "-f", - '["woff2"]', - "-t", - "css", - "-s", - "temp/templates", - "-c", - "icon", - "-n", - "icon-font", - "-p", - "./fonts", - "--templateCacheString", - "cache", - "--verbose", - "--fontId", - "id", - "--fontStyle", - "italic", - "--fontWeight", - "700", - "--fixedWidth", - "--centerHorizontally", - "--centerVertically", - "--normalize", - "--fontHeight", - "100", - "--round", - "1", - "--descent", - "5", - "--ascent", - "10", - "--startUnicode", - "0xea01", - "--prependUnicode", - "--metadata", - "meta", - "--no-sort", - "--ligatures", - "--addHashInFontUrl", - "--config", - "webfont.config.js", - ]), - ); - - expect(options.fontName).toBe("parsed-font"); - expect(options.formats).toEqual(["woff2"]); - expect(options.dest).toBe("temp/out"); - expect(options.destCreate).toBe(true); - expect(options.template).toBe("css"); - expect(options.destTemplate).toBe("temp/templates"); - expect(options.templateClassName).toBe("icon"); - expect(options.templateFontName).toBe("icon-font"); - expect(options.templateFontPath).toBe("./fonts"); - expect(options.templateCacheString).toBe("cache"); - expect(options.verbose).toBe(true); - expect(options.fontId).toBe("id"); - expect(options.fontStyle).toBe("italic"); - expect(options.fontWeight).toBe("700"); - expect(options.fixedWidth).toBe(true); - expect(options.centerHorizontally).toBe(true); - expect(options.centerVertically).toBe(true); - expect(options.normalize).toBe(true); - expect(options.fontHeight).toBe("100"); - expect(options.round).toBe("1"); - expect(options.descent).toBe("5"); - expect(options.ascent).toBe("10"); - expect(options.startUnicode).toBe("0xea01"); - expect(options.prependUnicode).toBe(true); - expect(options.metadata).toBe("meta"); - expect(options.sort).toBe(false); - expect(options.ligatures).toBe(true); - expect(options.unicodeRange).toBeUndefined(); - expect(options.addHashInFontUrl).toBe(true); - expect(options.configFile).toContain("webfont.config.js"); - }); - }); -}); diff --git a/packages/webfont/src/cli/meow/index.ts b/packages/webfont/src/cli/meow/index.ts deleted file mode 100644 index f72b3a9d..00000000 --- a/packages/webfont/src/cli/meow/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { createMeowCli } from "./createMeowCli"; - -export { WEBFONT_CLI_HELP_MARKERS, webfontCliHelpText, webfontMeowFlags } from "./cliOptions"; -export { createMeowCli } from "./createMeowCli"; - -export default createMeowCli(); diff --git a/packages/webfont/src/cli/meow/renderCliHelp.test.ts b/packages/webfont/src/cli/meow/renderCliHelp.test.ts deleted file mode 100644 index 43aa8f5c..00000000 --- a/packages/webfont/src/cli/meow/renderCliHelp.test.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { existsSync, readFileSync } from "node:fs"; -import { resolve } from "node:path"; -import { fileURLToPath } from "node:url"; -import { describe, expect, it } from "vitest"; -import { renderCliMarkdownDoc, WEBFONT_CLI_HELP_MARKERS, webfontCliHelpText } from "./renderCliHelp"; - -const PACKAGE_ROOT = resolve(fileURLToPath(new URL(".", import.meta.url)), "../../.."); -const CLI_DOCS_PATH = resolve(PACKAGE_ROOT, "docs/cli.md"); - -describe("renderCliHelp", () => { - it("should keep help text markers in sync with the documented CLI options", () => { - for (const marker of WEBFONT_CLI_HELP_MARKERS) { - expect(webfontCliHelpText).toContain(marker); - } - }); - - it("should keep packages/webfont/docs/cli.md aligned with renderCliMarkdownDoc", () => { - const expected = renderCliMarkdownDoc(); - - expect(existsSync(CLI_DOCS_PATH)).toBe(true); - expect(readFileSync(CLI_DOCS_PATH, "utf8")).toBe(expected); - }); -}); diff --git a/packages/webfont/src/cli/meow/renderCliHelp.ts b/packages/webfont/src/cli/meow/renderCliHelp.ts deleted file mode 100644 index 1392c808..00000000 --- a/packages/webfont/src/cli/meow/renderCliHelp.ts +++ /dev/null @@ -1,166 +0,0 @@ -import type { AnyFlags } from "meow"; -import { - CLI_FLAG_SECTIONS, - CLI_INPUT_SECTION, - CLI_USAGE_LINE, - type CliFlagCatalogEntry, - type CliFlagSection, -} from "./cliFlagCatalog"; - -const HELP_INDENT = " "; -const FLAG_INDENT = " "; -const DESCRIPTION_INDENT = " "; - -const formatDescription = (description: string | readonly string[]): string => { - let lines: readonly string[]; - - if (typeof description === "string") { - lines = [description]; - } else { - lines = description; - } - - return lines.map((line) => `${DESCRIPTION_INDENT}${line}`).join("\n"); -}; - -const formatFlagLine = (entry: CliFlagCatalogEntry): string => { - const long = entry.long; - - if (entry.short) { - return `${FLAG_INDENT}-${entry.short}, ${long}`; - } - - return `${FLAG_INDENT}${long}`; -}; - -const indentInputLine = (line: string): string => { - if (line === "") { - return ""; - } - - return `${FLAG_INDENT}${line}`; -}; - -const renderInputSection = (): string => { - const body = CLI_INPUT_SECTION.lines.map(indentInputLine).join("\n"); - - return `${CLI_INPUT_SECTION.title}\n\n${body}`; -}; - -const renderFlagEntry = (entry: CliFlagCatalogEntry): string => - [formatFlagLine(entry), "", formatDescription(entry.description)].join("\n"); - -const renderFlagSection = (section: CliFlagSection): string => { - const blocks = section.entries.map(renderFlagEntry); - - if (section.title) { - return [section.title, ...blocks].join("\n\n"); - } - - return blocks.join("\n\n"); -}; - -const renderCliHelpText = (): string => { - const parts = [CLI_USAGE_LINE, renderInputSection(), ...CLI_FLAG_SECTIONS.map(renderFlagSection)]; - - return `\n${HELP_INDENT}${parts.join(`\n\n${HELP_INDENT}`)}\n`; -}; - -const buildMeowFlag = (entry: CliFlagCatalogEntry): AnyFlags[string] => { - if (entry.type === "boolean") { - if (entry.short && typeof entry.default === "boolean") { - return { type: "boolean", shortFlag: entry.short, default: entry.default }; - } - - if (entry.short) { - return { type: "boolean", shortFlag: entry.short }; - } - - if (typeof entry.default === "boolean") { - return { type: "boolean", default: entry.default }; - } - - return { type: "boolean" }; - } - - if (entry.short && typeof entry.default === "string") { - return { type: "string", shortFlag: entry.short, default: entry.default }; - } - - if (entry.short) { - return { type: "string", shortFlag: entry.short }; - } - - if (typeof entry.default === "string") { - return { type: "string", default: entry.default }; - } - - return { type: "string" }; -}; - -const buildWebfontMeowFlags = (): AnyFlags => { - const flags: AnyFlags = {}; - - for (const section of CLI_FLAG_SECTIONS) { - for (const entry of section.entries) { - flags[entry.key] = buildMeowFlag(entry); - } - } - - flags.dest = { - shortFlag: "d", - default: process.cwd(), - type: "string", - }; - - return flags; -}; - -/** Markers asserted in help-text contract tests (usage line + notable documented flags). */ -export const WEBFONT_CLI_HELP_MARKERS = [ - CLI_USAGE_LINE, - "--config", - "--assistant", - "--assistant-config", - "--fontName", - "--formats", - "--dest-create", - "--no-sort", - "--ligatures", - "--unicode-range", - "--no-template-font-ligatures", - "--addHashInFontUrl", - "--optimize-svg", - "svg-diagnose", -] as const; - -const CLI_DOCS_HEADER = `# Command Line Interface - -The interface for command-line usage is fairly simplistic at this stage, as seen in the usage section below. - -Install the package and wire the CLI script first: [Install guide](https://webfont.js.org/introduction/install) ([source](../install.md)). - -## Usage - -`; - -const CLI_DOCS_FOOTER = ` - -## Exit codes - -The CLI can exit the process with the following exit codes: - -- **0** — All ok. -- **1** — Something unknown went wrong. -- **Other** — Related to using packages. -`; - -const GENERATED_NOTICE = ` -> **Maintainers:** CLI help is generated from \`packages/webfont/src/cli/meow/cliFlagCatalog.ts\`. After editing flag metadata, run \`npm run docs:cli\` at the repo root (unit tests also guard drift). -`; - -export const renderCliMarkdownDoc = (): string => - `${CLI_DOCS_HEADER}${GENERATED_NOTICE}\n\`\`\`shell${renderCliHelpText()}\`\`\`${CLI_DOCS_FOOTER}`; - -export const webfontCliHelpText = renderCliHelpText(); -export const webfontMeowFlags = buildWebfontMeowFlags(); diff --git a/packages/webfont/src/cli/parseFormatsFlag.test.ts b/packages/webfont/src/cli/parseFormatsFlag.test.ts deleted file mode 100644 index 1298dfd3..00000000 --- a/packages/webfont/src/cli/parseFormatsFlag.test.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { parseFormatsFlag } from "./parseFormatsFlag"; - -describe("parseFormatsFlag", () => { - it("should parse otf as a valid format", () => { - expect(parseFormatsFlag("otf")).toEqual(["otf"]); - expect(parseFormatsFlag('["ttf", "otf"]')).toEqual(["ttf", "otf"]); - }); - - it("should parse JSON array flags", () => { - expect(parseFormatsFlag('["woff2"]')).toEqual(["woff2"]); - expect(parseFormatsFlag('["svg", "ttf", "eot"]')).toEqual(["svg", "ttf", "eot"]); - }); - - it("should parse comma-separated flags", () => { - expect(parseFormatsFlag("woff2")).toEqual(["woff2"]); - expect(parseFormatsFlag("svg, ttf, woff2")).toEqual(["svg", "ttf", "woff2"]); - }); - - it("should reject invalid format names", () => { - expect(() => parseFormatsFlag('["not-a-format"]')).toThrow('Invalid format "not-a-format"'); - expect(() => parseFormatsFlag("woff2, bad")).toThrow('Invalid format "bad"'); - }); - - it("should reject non-array JSON values", () => { - expect(() => parseFormatsFlag('{"formats":["woff2"]}')).toThrow("formats must be a JSON array"); - }); - - it("should reject empty comma-separated values", () => { - expect(() => parseFormatsFlag("")).toThrow("formats must not be empty"); - expect(() => parseFormatsFlag(" ")).toThrow("formats must not be empty"); - }); -}); diff --git a/packages/webfont/src/cli/parseFormatsFlag.ts b/packages/webfont/src/cli/parseFormatsFlag.ts deleted file mode 100644 index 0dc74991..00000000 --- a/packages/webfont/src/cli/parseFormatsFlag.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { assertValidFormat, parseFormatsList } from "../lib/parseFormats"; -import type { Formats } from "../types/Format"; - -export const parseFormatsFlag = (value: string | undefined): Formats | undefined => { - if (value === undefined) { - return undefined; - } - - const trimmed = value.trim(); - - if (trimmed.length === 0) { - throw new Error("formats must not be empty"); - } - - if (trimmed.startsWith("[") || trimmed.startsWith("{")) { - let parsed: unknown; - - try { - parsed = JSON.parse(trimmed); - } catch { - throw new Error('formats must be a JSON array (e.g. ["woff2","svg"]) or comma-separated list'); - } - - if (!Array.isArray(parsed)) { - throw new Error('formats must be a JSON array (e.g. ["woff2","svg"]) or comma-separated list'); - } - - return parseFormatsList(parsed); - } - - return trimmed - .split(",") - .map((part) => part.trim()) - .filter((part) => part.length > 0) - .map(assertValidFormat); -}; diff --git a/packages/webfont/src/cli/parseTemplateFlag.test.ts b/packages/webfont/src/cli/parseTemplateFlag.test.ts deleted file mode 100644 index 64339413..00000000 --- a/packages/webfont/src/cli/parseTemplateFlag.test.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { parseTemplateFlag } from "./parseTemplateFlag"; - -describe("parseTemplateFlag", () => { - it("should parse a single built-in template", () => { - expect(parseTemplateFlag("css")).toBe("css"); - }); - - it("should parse JSON array templates (#158)", () => { - expect(parseTemplateFlag('["html","scss"]')).toEqual(["html", "scss"]); - }); - - it("should parse comma-separated templates", () => { - expect(parseTemplateFlag("html, scss")).toEqual(["html", "scss"]); - }); - - it("should reject non-array JSON values", () => { - expect(() => parseTemplateFlag('{"template":"css"}')).toThrow("template must be a JSON array"); - }); -}); diff --git a/packages/webfont/src/cli/parseTemplateFlag.ts b/packages/webfont/src/cli/parseTemplateFlag.ts deleted file mode 100644 index 76b43fc3..00000000 --- a/packages/webfont/src/cli/parseTemplateFlag.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { normalizeTemplateOption, type TemplateOption } from "../lib/parseTemplateOption"; - -export const parseTemplateFlag = (value: string | undefined): TemplateOption | undefined => { - if (value === undefined) { - return undefined; - } - - const trimmed = value.trim(); - - if (trimmed.length === 0) { - throw new Error("template must not be empty"); - } - - if (trimmed.startsWith("[") || trimmed.startsWith("{")) { - let parsed: unknown; - - try { - parsed = JSON.parse(trimmed); - } catch { - throw new Error('template must be a JSON array (e.g. ["html","scss"]) or a template name'); - } - - if (!Array.isArray(parsed)) { - throw new Error('template must be a JSON array (e.g. ["html","scss"]) or a template name'); - } - - return normalizeTemplateOption(parsed); - } - - if (trimmed.includes(",")) { - return normalizeTemplateOption( - trimmed - .split(",") - .map((part) => part.trim()) - .filter((part) => part.length > 0), - ); - } - - return trimmed; -}; diff --git a/packages/webfont/src/cli/program.meow.integration.test.ts b/packages/webfont/src/cli/program.meow.integration.test.ts deleted file mode 100644 index 92c649ea..00000000 --- a/packages/webfont/src/cli/program.meow.integration.test.ts +++ /dev/null @@ -1,163 +0,0 @@ -import * as fsPromise from "fs/promises"; -import path from "path"; -import { webfont } from "../standalone"; -import type { ResultConfig } from "../types/ResultConfig"; -import { createMeowCli } from "./meow/createMeowCli"; -import { runCli } from "./program"; - -vi.mock("../standalone", async (importOriginal) => { - const actual = await importOriginal(); - - return { - ...actual, - webfont: vi.fn(), - }; -}); - -const mockedWebfont = vi.mocked(webfont); - -const wrapMeowCli = (argv: readonly string[]) => { - const meowCli = createMeowCli(argv); - - return { - ...meowCli, - showHelp: vi.fn(), - showVersion: vi.fn(), - }; -}; - -const makeResultConfig = (overrides: Partial = {}): ResultConfig => ({ - centerHorizontally: false, - centerVertically: false, - descent: 0, - files: "icons/*.svg", - fixedWidth: false, - fontHeight: undefined, - fontId: undefined, - fontName: "webfont", - fontStyle: "", - fontWeight: "", - formats: ["svg"], - formatsOptions: {}, - ligatures: false, - maxConcurrency: 1, - metadata: undefined, - normalize: false, - prependUnicode: false, - round: 1000, - sort: false, - startUnicode: 0xea01, - templateFontPath: "", - verbose: false, - ...overrides, -}); - -describe("cli program with createMeowCli argv", () => { - beforeEach(() => { - vi.clearAllMocks(); - }); - - it("should forward parsed flags and input globs to webfont", async () => { - const destination = "temp/cli-program-meow"; - await fsPromise.mkdir(destination, { recursive: true }); - - mockedWebfont.mockResolvedValue({ - config: makeResultConfig({ - dest: destination, - files: "src/fixtures/svg-icons/*.svg", - fontName: "webfont", - formats: ["woff2"], - formatsOptions: {}, - maxConcurrency: 1, - }), - woff2: Buffer.from("woff2"), - }); - - const cli = wrapMeowCli([ - "src/fixtures/svg-icons/*.svg", - "-d", - destination, - "-f", - '["woff2"]', - "-u", - "argv-font", - "--no-sort", - "--addHashInFontUrl", - ]); - - await runCli(cli); - - expect(mockedWebfont).toHaveBeenCalledWith( - expect.objectContaining({ - files: ["src/fixtures/svg-icons/*.svg"], - dest: destination, - fontName: "argv-font", - formats: ["woff2"], - sort: false, - addHashInFontUrl: true, - }), - ); - }); - - it("should call showHelp when argv has no input files", async () => { - mockedWebfont.mockRejectedValue(new Error("Files glob patterns specified did not match any files")); - const cli = wrapMeowCli([]); - - await expect(runCli(cli)).rejects.toThrow("Files glob patterns specified did not match any files"); - expect(cli.showHelp).toHaveBeenCalled(); - }); - - it("should call showHelp and showVersion when help and version flags are set", async () => { - const destination = "temp/cli-program-meow-help"; - await fsPromise.mkdir(destination, { recursive: true }); - - mockedWebfont.mockResolvedValue({ - config: makeResultConfig({ - dest: destination, - files: "icons/*.svg", - fontName: "webfont", - formats: ["svg"], - formatsOptions: {}, - maxConcurrency: 1, - }), - svg: Buffer.from("svg"), - }); - - const cli = wrapMeowCli(["src/fixtures/svg-icons/*.svg", "-d", destination, "--help", "--version"]); - - await runCli(cli); - - expect(cli.showHelp).toHaveBeenCalled(); - expect(cli.showVersion).toHaveBeenCalled(); - }); - - it("should combine dest-create with a parsed destination directory", async () => { - const destination = path.join("temp/cli-program-meow", "nested", "created"); - await fsPromise.rm(destination, { recursive: true, force: true }); - - mockedWebfont.mockResolvedValue({ - config: makeResultConfig({ - dest: destination, - destCreate: true, - files: "icons/*.svg", - fontName: "webfont", - formats: ["svg"], - formatsOptions: {}, - maxConcurrency: 1, - }), - svg: Buffer.from("svg"), - }); - - const cli = wrapMeowCli(["src/fixtures/svg-icons/*.svg", "-d", destination, "-m"]); - - await runCli(cli); - - await fsPromise.access(destination); - expect(mockedWebfont).toHaveBeenCalledWith( - expect.objectContaining({ - dest: destination, - destCreate: true, - }), - ); - }); -}); diff --git a/packages/webfont/src/cli/program.test.ts b/packages/webfont/src/cli/program.test.ts deleted file mode 100644 index 1e98fcdb..00000000 --- a/packages/webfont/src/cli/program.test.ts +++ /dev/null @@ -1,749 +0,0 @@ -import * as fs from "fs"; -import * as fsPromise from "fs/promises"; -import path from "path"; -import { - ensureDestExists, - ensureResultConfig, - getDecompressedFontOutputBasename, - getResultOutputPath, - mergeCliDestIntoConfig, - resolveDestTemplate, - writeDecompressedFontFiles, - writeResultFiles, - writeTranscodedFontFiles, -} from "../node/writeResultFiles"; -import { webfont } from "../standalone"; -import type { Result } from "../types/Result"; -import type { ResultConfig } from "../types/ResultConfig"; -import { buildOptionsBase, type CliLike, getExitCode, runCli, startCli } from "./program"; - -vi.mock("../standalone", async (importOriginal) => { - const actual = await importOriginal(); - - return { - ...actual, - webfont: vi.fn(), - }; -}); - -const mockedWebfont = vi.mocked(webfont); - -const createCli = (overrides: Partial = {}): CliLike => ({ - flags: {}, - input: ["src/fixtures/svg-icons/*.svg"], - showHelp: vi.fn(), - showVersion: vi.fn(), - ...overrides, -}); - -const makeResultConfig = (overrides: Partial = {}): ResultConfig => ({ - centerHorizontally: false, - centerVertically: false, - descent: 0, - files: "icons/*.svg", - fixedWidth: false, - fontHeight: undefined, - fontId: undefined, - fontName: "webfont", - fontStyle: "", - fontWeight: "", - formats: ["svg"], - formatsOptions: {}, - ligatures: false, - maxConcurrency: 1, - metadata: undefined, - normalize: false, - prependUnicode: false, - round: 1000, - sort: false, - startUnicode: 0xea01, - templateFontPath: "", - verbose: false, - ...overrides, -}); - -describe("cli program", () => { - beforeEach(() => { - vi.clearAllMocks(); - }); - - describe("buildOptionsBase", () => { - it("should map all supported CLI flags to options", () => { - const options = buildOptionsBase( - createCli({ - flags: { - ascent: "10", - addHashInFontUrl: true, - centerHorizontally: true, - centerVertically: true, - config: "webfont.config.js", - descent: "5", - dest: "temp/out", - destCreate: true, - destTemplate: "temp/templates", - fixedWidth: true, - fontHeight: "100", - fontId: "id", - fontName: "my-font", - fontStyle: "italic", - fontWeight: "700", - formats: '["woff2"]', - ligatures: true, - metadata: "meta", - normalize: true, - prependUnicode: true, - // meow string flag — matches CliLike.flags.round (see AGENTS.md § createCli vs createMeowCli) - round: "1", - sort: false, - startUnicode: "0xea01", - template: "css", - templateCacheString: "cache", - templateClassName: "icon", - templateFontName: "icon-font", - templateFontPath: "./fonts", - verbose: true, - }, - }), - ); - - expect(options.configFile).toContain("webfont.config.js"); - expect(options.fontName).toBe("my-font"); - expect(options.formats).toEqual(["woff2"]); - expect(options.dest).toBe("temp/out"); - expect(options.destCreate).toBe(true); - expect(options.template).toBe("css"); - expect(options.templateClassName).toBe("icon"); - expect(options.templateFontPath).toBe("./fonts"); - expect(options.templateFontName).toBe("icon-font"); - expect(options.templateCacheString).toBe("cache"); - expect(options.destTemplate).toBe("temp/templates"); - expect(options.verbose).toBe(true); - expect(options.fontId).toBe("id"); - expect(options.fontStyle).toBe("italic"); - expect(options.fontWeight).toBe("700"); - expect(options.fixedWidth).toBe(true); - expect(options.centerHorizontally).toBe(true); - expect(options.centerVertically).toBe(true); - expect(options.normalize).toBe(true); - expect(options.fontHeight).toBe("100"); - expect(options.round).toBe("1"); - expect(options.descent).toBe("5"); - expect(options.ascent).toBe("10"); - expect(options.startUnicode).toBe("0xea01"); - expect(options.prependUnicode).toBe(true); - expect(options.metadata).toBe("meta"); - expect(options.sort).toBe(false); - expect(options.ligatures).toBe(true); - expect(options.addHashInFontUrl).toBe(true); - }); - }); - - describe("ensureResultConfig", () => { - it("should throw Missing config in webfont result when config is absent", () => { - expect(() => ensureResultConfig({})).toThrow("Missing config in webfont result"); - }); - - it("should return config when present", () => { - const config = makeResultConfig({ - files: "icons/*.svg", - fontName: "webfont", - formats: ["svg"], - formatsOptions: {}, - maxConcurrency: 1, - }); - - expect(ensureResultConfig({ config })).toBe(config); - }); - }); - - describe("mergeCliDestIntoConfig", () => { - it("should throw Missing config in webfont result when merging dest options", () => { - expect(() => mergeCliDestIntoConfig({}, { dest: "temp/out" })).toThrow("Missing config in webfont result"); - }); - - it("should merge dest and destTemplate into result config", () => { - const result: Result = { - config: makeResultConfig({ - files: "icons/*.svg", - fontName: "webfont", - formats: ["svg"], - formatsOptions: {}, - maxConcurrency: 1, - }), - }; - - mergeCliDestIntoConfig(result, { - dest: "temp/out", - destTemplate: "temp/templates", - }); - - expect(result.config?.dest).toBe("temp/out"); - expect(result.config?.destTemplate).toBe("temp/templates"); - }); - }); - - describe("resolveDestTemplate", () => { - it("should resolve built-in template destination", () => { - const config = { - dest: "temp/out", - fontName: "webfont", - template: "css", - }; - - const destTemplate = resolveDestTemplate( - { - template: "css-content", - usedBuildInTemplate: true, - }, - config as never, - ); - - expect(destTemplate).toBe(path.join("temp/out", "webfont.css")); - }); - - it("should resolve the first template when template is an array (#158)", () => { - const config = { - dest: "temp/out", - fontName: "webfont", - template: ["html", "scss"], - }; - - const destTemplate = resolveDestTemplate( - { - template: "html-content", - usedBuildInTemplate: true, - }, - config as never, - ); - - expect(destTemplate).toBe(path.join("temp/out", "webfont.html")); - }); - - it("should resolve destTemplate when provided explicitly", () => { - const config = { - dest: "temp/out", - destTemplate: "temp/templates", - fontName: "webfont", - template: "css", - }; - - const destTemplate = resolveDestTemplate( - { - template: "css-content", - usedBuildInTemplate: true, - }, - config as never, - ); - - expect(destTemplate).toBe(path.join("temp/templates", "webfont.css")); - }); - - it("should return destTemplate fallback when template type is unknown", () => { - const config = { - dest: "temp/out", - fontName: "webfont", - }; - - const destTemplate = resolveDestTemplate( - { - template: "css-content", - }, - config as never, - ); - - expect(destTemplate).toBe("temp/out"); - }); - - it("should resolve custom template paths by stripping the .njk extension", () => { - const config = { - dest: "temp/out", - destTemplate: "temp/templates", - fontName: "webfont", - template: "custom/foo.njk", - }; - - const destTemplate = resolveDestTemplate( - { - template: "custom-content", - usedBuildInTemplate: false, - }, - config as never, - ); - - expect(destTemplate).toBe(path.join("temp/templates", "foo")); - }); - }); - - describe("getResultOutputPath", () => { - it("should resolve hash and font output paths", () => { - const config = { - dest: "temp/out", - fontName: "webfont", - }; - - expect(getResultOutputPath("hash", {}, config as never)).toBe(path.resolve("temp/out/webfont.hash")); - expect(getResultOutputPath("woff2", {}, config as never)).toBe(path.resolve("temp/out/webfont.woff2")); - expect(getResultOutputPath("template", {}, config as never, "temp/templates/webfont.css")).toBe( - path.resolve("temp/templates/webfont.css"), - ); - }); - }); - - describe("ensureDestExists", () => { - const destination = "temp/cli-program-ensure-dest"; - - beforeEach(async () => { - await fsPromise.rm(destination, { recursive: true, force: true }); - }); - - it("should create the destination when destCreate is enabled", async () => { - await ensureDestExists(destination, true); - await fsPromise.access(destination); - }); - - it("should reject when destination is missing and destCreate is disabled", async () => { - await expect(ensureDestExists(destination, false)).rejects.toThrow( - `Destination directory "${destination}" does not exist. Use --dest-create (-m) to create it.`, - ); - }); - }); - - describe("getDecompressedFontOutputBasename", () => { - it("should use fontName for a single decompressed font", () => { - const fonts = [{ source: "fonts/Inter.woff2", ttf: Buffer.from("ttf") }]; - - expect(getDecompressedFontOutputBasename(fonts, fonts[0], { fontName: "my-font" } as never)).toBe("my-font"); - }); - - it("should disambiguate basenames for batch decompression", () => { - const fonts = [ - { source: "src/fixtures/fonts/iconfont.woff", ttf: Buffer.from("a") }, - { source: "src/fixtures/fonts/iconfont.woff2", ttf: Buffer.from("b") }, - ]; - - expect(getDecompressedFontOutputBasename(fonts, fonts[0], { fontName: "webfont" } as never)).toBe( - "iconfont-woff", - ); - expect(getDecompressedFontOutputBasename(fonts, fonts[1], { fontName: "webfont" } as never)).toBe( - "iconfont-woff2", - ); - }); - }); - - describe("writeDecompressedFontFiles", () => { - it("should write one ttf per decompressed font", async () => { - const destination = "temp/cli-program-batch"; - await fsPromise.mkdir(destination, { recursive: true }); - - await writeDecompressedFontFiles( - [ - { source: "src/fixtures/fonts/iconfont.woff", ttf: Buffer.from("woff-ttf") }, - { source: "src/fixtures/fonts/iconfont.woff2", ttf: Buffer.from("woff2-ttf") }, - ], - { - dest: destination, - fontName: "webfont", - } as never, - destination, - ); - - expect(await fsPromise.readFile(path.join(destination, "iconfont-woff.ttf"), "utf8")).toBe("woff-ttf"); - expect(await fsPromise.readFile(path.join(destination, "iconfont-woff2.ttf"), "utf8")).toBe("woff2-ttf"); - }); - }); - - describe("writeTranscodedFontFiles", () => { - it("should write an svg font per transcoded font", async () => { - const destination = "temp/cli-program-transcoded-svg"; - await fsPromise.mkdir(destination, { recursive: true }); - - await writeTranscodedFontFiles( - [ - { source: "src/fixtures/fonts/a.ttf", svg: "a", woff2: Buffer.from("a2") }, - { source: "src/fixtures/fonts/b.ttf", svg: "b", woff2: Buffer.from("b2") }, - ], - { - dest: destination, - fontName: "webfont", - } as never, - destination, - ); - - expect(await fsPromise.readFile(path.join(destination, "a.svg"), "utf8")).toBe("a"); - expect(await fsPromise.readFile(path.join(destination, "b.svg"), "utf8")).toBe("b"); - }); - }); - - describe("writeResultFiles", () => { - const destination = "temp/cli-program"; - - beforeEach(async () => { - await fsPromise.mkdir(destination, { recursive: true }); - await fsPromise.rm(destination, { recursive: true, force: true }); - await fsPromise.mkdir(destination, { recursive: true }); - }); - - it("should write batch decompressed fonts without using fontName for every file", async () => { - const result: Result = { - config: makeResultConfig({ - dest: destination, - files: ["src/fixtures/fonts/iconfont.woff", "src/fixtures/fonts/iconfont.woff2"], - fontName: "webfont", - formats: ["ttf"], - formatsOptions: {}, - maxConcurrency: 1, - }), - decompressedFonts: [ - { source: "src/fixtures/fonts/iconfont.woff", ttf: Buffer.from("woff-ttf") }, - { source: "src/fixtures/fonts/iconfont.woff2", ttf: Buffer.from("woff2-ttf") }, - ], - }; - - await writeResultFiles(result); - - const files = await fsPromise.readdir(destination); - expect(files).toEqual(expect.arrayContaining(["iconfont-woff.ttf", "iconfont-woff2.ttf"])); - }); - - it("should write font outputs and hash files", async () => { - const result: Result = { - config: makeResultConfig({ - dest: destination, - files: "icons/*.svg", - fontName: "webfont", - formats: ["svg", "woff2"], - formatsOptions: {}, - maxConcurrency: 1, - }), - hash: "abc123", - svg: Buffer.from("svg"), - woff2: Buffer.from("woff2"), - }; - - await writeResultFiles(result); - - const files = await fsPromise.readdir(destination); - expect(files).toEqual(expect.arrayContaining(["webfont.hash", "webfont.svg", "webfont.woff2"])); - expect(await fsPromise.readFile(path.join(destination, "webfont.hash"), "utf8")).toBe("abc123"); - }); - - it("should write template files to the resolved destination", async () => { - const result: Result = { - config: makeResultConfig({ - dest: destination, - files: "icons/*.svg", - fontName: "webfont", - formats: ["svg"], - formatsOptions: {}, - maxConcurrency: 1, - template: "css", - }), - svg: Buffer.from("svg"), - template: "body { color: red; }", - usedBuildInTemplate: true, - }; - - await writeResultFiles(result); - - await fsPromise.access(path.join(destination, "webfont.css")); - expect(await fsPromise.readFile(path.join(destination, "webfont.css"), "utf8")).toBe("body { color: red; }"); - }); - - it("should write multiple template files (#158)", async () => { - const result: Result = { - config: makeResultConfig({ - dest: destination, - files: "icons/*.svg", - fontName: "webfont", - formats: ["svg"], - formatsOptions: {}, - maxConcurrency: 1, - template: ["html", "scss"], - }), - svg: Buffer.from("svg"), - template: "", - templates: [ - { template: "html", content: "", builtIn: "html" }, - { template: "scss", content: "$x: 1;", builtIn: "scss" }, - ], - usedBuildInTemplate: true, - }; - - await writeResultFiles(result); - - expect(await fsPromise.readFile(path.join(destination, "webfont.html"), "utf8")).toBe(""); - expect(await fsPromise.readFile(path.join(destination, "webfont.scss"), "utf8")).toBe("$x: 1;"); - }); - - it("should create destination when destCreate is enabled", async () => { - const nestedDestination = path.join(destination, "nested", "fonts"); - const result: Result = { - config: makeResultConfig({ - dest: nestedDestination, - destCreate: true, - files: "icons/*.svg", - fontName: "webfont", - formats: ["svg"], - formatsOptions: {}, - maxConcurrency: 1, - }), - svg: Buffer.from("svg"), - }; - - await writeResultFiles(result); - - await fsPromise.access(nestedDestination); - await fsPromise.access(path.join(nestedDestination, "webfont.svg")); - }); - - it("should reject with a clear error when destination is missing and destCreate is disabled", async () => { - const missingDestination = path.join(destination, "missing", "fonts"); - const result: Result = { - config: makeResultConfig({ - dest: missingDestination, - files: "icons/*.svg", - fontName: "webfont", - formats: ["svg"], - formatsOptions: {}, - maxConcurrency: 1, - }), - svg: Buffer.from("svg"), - }; - - await expect(writeResultFiles(result)).rejects.toThrow( - `Destination directory "${missingDestination}" does not exist. Use --dest-create (-m) to create it.`, - ); - await expect(fsPromise.access(missingDestination)).rejects.toMatchObject({ code: "ENOENT" }); - }); - - it("should not write files when destination is missing", async () => { - const missingDestination = path.join(destination, "missing-no-write"); - const writeSpy = vi.spyOn(fs.promises, "writeFile"); - const result: Result = { - config: makeResultConfig({ - dest: missingDestination, - files: "icons/*.svg", - fontName: "webfont", - formats: ["svg"], - formatsOptions: {}, - maxConcurrency: 1, - }), - svg: Buffer.from("svg"), - woff2: Buffer.from("woff2"), - }; - - await expect(writeResultFiles(result)).rejects.toThrow(/Destination directory/u); - expect(writeSpy).not.toHaveBeenCalled(); - writeSpy.mockRestore(); - }); - - it("should propagate write errors", async () => { - const writeSpy = vi.spyOn(fs.promises, "writeFile").mockRejectedValueOnce(new Error("disk full")); - const result: Result = { - config: makeResultConfig({ - dest: destination, - files: "icons/*.svg", - fontName: "webfont", - formats: ["svg"], - formatsOptions: {}, - maxConcurrency: 1, - }), - svg: Buffer.from("svg"), - }; - - await expect(writeResultFiles(result)).rejects.toThrow("disk full"); - writeSpy.mockRestore(); - }); - }); - - describe("getExitCode", () => { - it("should return numeric error code when present", () => { - expect(getExitCode({ code: 42 })).toBe(42); - }); - - it("should default to exit code 1", () => { - expect(getExitCode(new Error("boom"))).toBe(1); - }); - }); - - describe("runCli", () => { - it("should show help when no input files are provided", async () => { - mockedWebfont.mockRejectedValue(new Error("Files glob patterns specified did not match any files")); - const cli = createCli({ input: [] }); - - await expect(runCli(cli)).rejects.toThrow("Files glob patterns specified did not match any files"); - expect(cli.showHelp).toHaveBeenCalled(); - }); - - it("should throw Missing config in webfont result when webfont returns no config", async () => { - mockedWebfont.mockResolvedValue({ - svg: Buffer.from("svg"), - }); - - await expect(runCli(createCli())).rejects.toThrow("Missing config in webfont result"); - }); - - it("should invoke help and version handlers when flags are set", async () => { - mockedWebfont.mockResolvedValue({ - config: makeResultConfig({ - dest: "temp/cli-program-run", - files: "icons/*.svg", - fontName: "webfont", - formats: ["svg"], - formatsOptions: {}, - maxConcurrency: 1, - }), - svg: Buffer.from("svg"), - }); - - const cli = createCli({ - flags: { - help: true, - version: true, - }, - }); - - await runCli(cli); - - expect(cli.showHelp).toHaveBeenCalled(); - expect(cli.showVersion).toHaveBeenCalled(); - }); - - it("should run webfont and write files when config is present", async () => { - const destination = "temp/cli-program-run"; - await fsPromise.mkdir(destination, { recursive: true }); - - mockedWebfont.mockResolvedValue({ - config: makeResultConfig({ - dest: destination, - files: "icons/*.svg", - fontName: "webfont", - formats: ["svg"], - formatsOptions: {}, - maxConcurrency: 1, - }), - svg: Buffer.from("svg"), - hash: "hash-value", - }); - - const result = await runCli( - createCli({ - flags: { - dest: destination, - }, - }), - ); - - expect(mockedWebfont).toHaveBeenCalled(); - expect(result.config?.dest).toBe(destination); - expect(await fsPromise.readFile(path.join(destination, "webfont.svg"))).toBeTruthy(); - }); - - it("should fail with a clear error when destination is missing", async () => { - const missingDestination = "temp/cli-program-missing-dest"; - - mockedWebfont.mockResolvedValue({ - config: makeResultConfig({ - dest: missingDestination, - files: "icons/*.svg", - fontName: "webfont", - formats: ["svg"], - formatsOptions: {}, - maxConcurrency: 1, - }), - svg: Buffer.from("svg"), - }); - - await expect( - runCli( - createCli({ - flags: { - dest: missingDestination, - }, - }), - ), - ).rejects.toThrow( - `Destination directory "${missingDestination}" does not exist. Use --dest-create (-m) to create it.`, - ); - }); - }); - - describe("startCli", () => { - it("should exit with the resolved code when runCli fails", async () => { - const exitSpy = vi.spyOn(process, "exit").mockImplementation((() => undefined) as typeof process.exit); - const logSpy = vi.spyOn(console, "log").mockImplementation(() => undefined); - const cli = createCli(); - const error = Object.assign(new Error("Missing config in webfont result"), { code: 7 }); - - mockedWebfont.mockRejectedValue(error); - - startCli(cli); - - await new Promise((resolve) => { - const waitForExit = (): void => { - if (exitSpy.mock.calls.length > 0) { - resolve(); - return; - } - - setImmediate(waitForExit); - }; - - waitForExit(); - }); - - expect(logSpy).toHaveBeenCalledWith(expect.stringContaining("Missing config in webfont result")); - expect(exitSpy).toHaveBeenCalledWith(7); - - exitSpy.mockRestore(); - logSpy.mockRestore(); - }); - - it("should exit with code 1 and log a clear error when destination is missing", async () => { - const exitSpy = vi.spyOn(process, "exit").mockImplementation((() => undefined) as typeof process.exit); - const logSpy = vi.spyOn(console, "log").mockImplementation(() => undefined); - const missingDestination = "temp/cli-program-missing-start"; - const cli = createCli({ - flags: { - dest: missingDestination, - }, - }); - - mockedWebfont.mockResolvedValue({ - config: makeResultConfig({ - dest: missingDestination, - files: "icons/*.svg", - fontName: "webfont", - formats: ["svg"], - formatsOptions: {}, - maxConcurrency: 1, - }), - svg: Buffer.from("svg"), - }); - - startCli(cli); - - await new Promise((resolve) => { - const waitForExit = (): void => { - if (exitSpy.mock.calls.length > 0) { - resolve(); - return; - } - - setImmediate(waitForExit); - }; - - waitForExit(); - }); - - expect(logSpy).toHaveBeenCalledWith( - expect.stringContaining(`Destination directory "${missingDestination}" does not exist`), - ); - expect(logSpy).toHaveBeenCalledWith(expect.stringContaining("--dest-create")); - expect(exitSpy).toHaveBeenCalledWith(1); - - exitSpy.mockRestore(); - logSpy.mockRestore(); - }); - }); -}); diff --git a/packages/webfont/src/cli/program.ts b/packages/webfont/src/cli/program.ts deleted file mode 100644 index 411f194c..00000000 --- a/packages/webfont/src/cli/program.ts +++ /dev/null @@ -1,250 +0,0 @@ -import * as path from "path"; -import resolveFrom from "resolve-from"; -import { mergeCliDestIntoConfig, writeResultFiles } from "../node/writeResultFiles"; -import { webfont } from "../standalone"; -import type { OptionsBase } from "../types/OptionsBase"; -import type { Result } from "../types/Result"; -import { runAssistant } from "./assistant/runAssistant"; -import { buildSvgToolsFromCliFlags } from "./buildSvgToolsFromCliFlags"; -import { parseFormatsFlag } from "./parseFormatsFlag"; -import { parseTemplateFlag } from "./parseTemplateFlag"; -import { resolveCliFiles } from "./resolveCliFiles"; - -export type { ResultFileKey } from "../node/writeResultFiles"; -export { mergeCliDestIntoConfig, writeResultFiles } from "../node/writeResultFiles"; - -export type CliLike = { - flags: { - addHashInFontUrl?: boolean; - ascent?: string; - assistant?: boolean; - assistantConfig?: string; - centerHorizontally?: boolean; - centerVertically?: boolean; - config?: string; - descent?: string; - dest?: string; - destCreate?: boolean; - destTemplate?: string; - fixedWidth?: boolean; - fontHeight?: string; - fontId?: string; - fontName?: string; - fontStyle?: string; - fontWeight?: string; - formats?: string; - help?: boolean; - ligatures?: boolean; - metadata?: string; - normalize?: boolean; - optimizeSvg?: boolean; - prependUnicode?: boolean; - round?: string; - sort?: boolean; - startUnicode?: string; - templateFontLigatures?: boolean; - unicodeRange?: boolean; - template?: string; - templateCacheString?: string; - templateClassName?: string; - templateFontName?: string; - templateFontPath?: string; - verbose?: boolean; - svgDiagnose?: boolean; - version?: boolean; - }; - input: string[]; - showHelp: () => void; - showVersion: () => void; -}; - -export const buildOptionsBase = (cli: CliLike): OptionsBase => { - const optionsBase: OptionsBase = {}; - - if (typeof cli.flags.config === "string") { - optionsBase.configFile = - resolveFrom.silent(process.cwd(), cli.flags.config) || path.join(process.cwd(), cli.flags.config); - } - - if (cli.flags.fontName) { - optionsBase.fontName = cli.flags.fontName; - } - - if (cli.flags.formats) { - optionsBase.formats = parseFormatsFlag(cli.flags.formats); - } - - if (cli.flags.dest) { - optionsBase.dest = cli.flags.dest; - } - - if (cli.flags.destCreate) { - optionsBase.destCreate = cli.flags.destCreate; - } - - if (cli.flags.template) { - optionsBase.template = parseTemplateFlag(cli.flags.template); - } - - if (cli.flags.templateClassName) { - optionsBase.templateClassName = cli.flags.templateClassName; - } - - if (cli.flags.templateFontPath) { - optionsBase.templateFontPath = cli.flags.templateFontPath; - } - - if (cli.flags.templateFontName) { - optionsBase.templateFontName = cli.flags.templateFontName; - } - - if (cli.flags.templateCacheString) { - optionsBase.templateCacheString = cli.flags.templateCacheString; - } - - if (cli.flags.destTemplate) { - optionsBase.destTemplate = cli.flags.destTemplate; - } - - if (cli.flags.verbose) { - optionsBase.verbose = cli.flags.verbose; - } - - if (cli.flags.fontId) { - optionsBase.fontId = cli.flags.fontId; - } - - if (cli.flags.fontStyle) { - optionsBase.fontStyle = cli.flags.fontStyle; - } - - if (cli.flags.fontWeight) { - optionsBase.fontWeight = cli.flags.fontWeight; - } - - if (cli.flags.fixedWidth) { - optionsBase.fixedWidth = cli.flags.fixedWidth; - } - - if (cli.flags.centerHorizontally) { - optionsBase.centerHorizontally = cli.flags.centerHorizontally; - } - - if (cli.flags.centerVertically) { - optionsBase.centerVertically = cli.flags.centerVertically; - } - - if (cli.flags.normalize) { - optionsBase.normalize = cli.flags.normalize; - } - - if (cli.flags.optimizeSvg) { - optionsBase.optimizeSvg = cli.flags.optimizeSvg; - } - - if (cli.flags.fontHeight) { - optionsBase.fontHeight = cli.flags.fontHeight; - } - - if (cli.flags.round) { - optionsBase.round = cli.flags.round; - } - - if (cli.flags.descent) { - optionsBase.descent = cli.flags.descent; - } - - if (cli.flags.ascent) { - optionsBase.ascent = cli.flags.ascent; - } - - if (cli.flags.startUnicode) { - optionsBase.startUnicode = cli.flags.startUnicode; - } - - if (cli.flags.prependUnicode) { - optionsBase.prependUnicode = cli.flags.prependUnicode; - } - - if (cli.flags.metadata) { - optionsBase.metadata = cli.flags.metadata; - } - - if (cli.flags.sort === false) { - optionsBase.sort = cli.flags.sort; - } - - if (cli.flags.ligatures) { - optionsBase.ligatures = cli.flags.ligatures; - } - - if (cli.flags.unicodeRange) { - optionsBase.unicodeRange = cli.flags.unicodeRange; - } - - if (cli.flags.templateFontLigatures === false) { - optionsBase.templateFontLigatures = cli.flags.templateFontLigatures; - } - - if (cli.flags.addHashInFontUrl) { - optionsBase.addHashInFontUrl = cli.flags.addHashInFontUrl; - } - - const svgTools = buildSvgToolsFromCliFlags(cli.flags); - - if (svgTools) { - optionsBase.svgTools = svgTools; - } - - return optionsBase; -}; - -export const getExitCode = (error: unknown): number => { - if (typeof error === "object" && error !== null && "code" in error && typeof error.code === "number") { - return error.code; - } - - return 1; -}; - -export const startCli = (cli: CliLike): void => { - runCli(cli).catch((error) => { - // CLI surfaces stack traces before exiting with a non-zero code. - // biome-ignore lint/suspicious/noConsole: intentional CLI error output - console.log(error.stack); - - process.exit(getExitCode(error)); - }); -}; - -export const runCli = async (cli: CliLike): Promise => { - if (cli.flags.help) { - cli.showHelp(); - } - - if (cli.flags.version) { - cli.showVersion(); - } - - if (cli.flags.assistantConfig) { - return runAssistant({ configPath: cli.flags.assistantConfig }); - } - - if (cli.flags.assistant) { - return runAssistant(); - } - - const optionsBase = buildOptionsBase(cli); - const files = await resolveCliFiles(cli, optionsBase); - - if (files.length === 0) { - cli.showHelp(); - } - - const options = { ...optionsBase, files }; - - const result = await webfont(options); - mergeCliDestIntoConfig(result, options); - - return writeResultFiles(result); -}; diff --git a/packages/webfont/src/cli/resolveCliFiles.test.ts b/packages/webfont/src/cli/resolveCliFiles.test.ts deleted file mode 100644 index 4a3fcfb3..00000000 --- a/packages/webfont/src/cli/resolveCliFiles.test.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { loadWebfontConfig } from "../standalone"; -import type { CliLike } from "./program"; -import { resolveCliFiles } from "./resolveCliFiles"; - -vi.mock("../standalone", () => ({ - loadWebfontConfig: vi.fn(), -})); - -const mockedLoadWebfontConfig = vi.mocked(loadWebfontConfig); - -const createCli = (overrides: Partial = {}): CliLike => ({ - flags: {}, - input: [], - showHelp: vi.fn(), - showVersion: vi.fn(), - ...overrides, -}); - -describe("resolveCliFiles", () => { - beforeEach(() => { - vi.clearAllMocks(); - }); - - it("should return CLI positional input when no config files are set", async () => { - mockedLoadWebfontConfig.mockResolvedValue({}); - - const files = await resolveCliFiles(createCli({ input: ["icons/*.svg"] }), {}); - - expect(files).toEqual(["icons/*.svg"]); - }); - - it("should return files from config when CLI input is empty", async () => { - mockedLoadWebfontConfig.mockResolvedValue({ - config: { - files: ["a.svg", "b.svg"], - }, - filepath: "/tmp/webfont.config.json", - isEmpty: false, - }); - - const files = await resolveCliFiles(createCli(), { configFile: "/tmp/webfont.config.json" }); - - expect(files).toEqual(["a.svg", "b.svg"]); - }); - - it("should normalize a single config files string to an array", async () => { - mockedLoadWebfontConfig.mockResolvedValue({ - config: { - files: "icons/*.svg", - }, - filepath: "/tmp/webfont.config.json", - isEmpty: false, - }); - - const files = await resolveCliFiles(createCli(), { configFile: "/tmp/webfont.config.json" }); - - expect(files).toEqual(["icons/*.svg"]); - }); - - it("should throw when CLI input and config files are both provided", async () => { - mockedLoadWebfontConfig.mockResolvedValue({ - config: { - files: ["a.svg", "b.svg"], - }, - filepath: "/tmp/webfont.config.json", - isEmpty: false, - }); - - await expect( - resolveCliFiles(createCli({ input: ["only.svg"] }), { configFile: "/tmp/webfont.config.json" }), - ).rejects.toThrow("Cannot specify input files on the command line when `files` is set in the config file"); - }); - - it("should return an empty array when neither CLI input nor config files are set", async () => { - mockedLoadWebfontConfig.mockResolvedValue({}); - - const files = await resolveCliFiles(createCli(), {}); - - expect(files).toEqual([]); - }); -}); diff --git a/packages/webfont/src/cli/resolveCliFiles.ts b/packages/webfont/src/cli/resolveCliFiles.ts deleted file mode 100644 index fe88e6e3..00000000 --- a/packages/webfont/src/cli/resolveCliFiles.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { loadWebfontConfig } from "../standalone"; -import type { OptionsBase } from "../types/OptionsBase"; -import type { CliLike } from "./program"; - -type LoadedConfig = Awaited>; - -const getFilesFromLoadedConfig = (loaded: LoadedConfig): string[] | undefined => { - if (!("config" in loaded) || loaded.config?.files === undefined) { - return undefined; - } - - if (Array.isArray(loaded.config.files)) { - return loaded.config.files; - } - - return [loaded.config.files]; -}; - -export const resolveCliFiles = async (cli: CliLike, optionsBase: OptionsBase): Promise => { - const loaded = await loadWebfontConfig({ configFile: optionsBase.configFile }); - const configFiles = getFilesFromLoadedConfig(loaded); - - if (cli.input.length > 0 && configFiles !== undefined) { - throw new Error("Cannot specify input files on the command line when `files` is set in the config file"); - } - - if (cli.input.length > 0) { - return cli.input; - } - - if (configFiles !== undefined) { - return configFiles; - } - - return []; -}; diff --git a/packages/webfont/src/fixtures/assistant/assistant-fixture.was b/packages/webfont/src/fixtures/assistant/assistant-fixture.was deleted file mode 100644 index b92cdb59..00000000 --- a/packages/webfont/src/fixtures/assistant/assistant-fixture.was +++ /dev/null @@ -1,13 +0,0 @@ -{ - "dest": "temp/cli-assistant", - "files": "src/fixtures/svg-icons/*.svg", - "fixedWidth": true, - "fontHeight": 1000, - "fontId": "fixture-icon", - "formats": ["woff2"], - "name": "AssistantFixture", - "prefix": "fixture-icon", - "styleType": "css", - "template": "css", - "templateFontName": "AssistantFixture" -} diff --git a/packages/webfont/src/fixtures/bad-svg-icons/proto-element.svg b/packages/webfont/src/fixtures/bad-svg-icons/proto-element.svg deleted file mode 100644 index a787cf02..00000000 --- a/packages/webfont/src/fixtures/bad-svg-icons/proto-element.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - <__proto__> - polluted - - diff --git a/packages/webfont/src/fixtures/config-discovery/js-config/webfont.config.js b/packages/webfont/src/fixtures/config-discovery/js-config/webfont.config.js deleted file mode 100644 index 9b64cb5b..00000000 --- a/packages/webfont/src/fixtures/config-discovery/js-config/webfont.config.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - fontName: "config-webfont-js", - formats: ["woff2"], -}; diff --git a/packages/webfont/src/fixtures/config-discovery/js-rc/.webfontrc.js b/packages/webfont/src/fixtures/config-discovery/js-rc/.webfontrc.js deleted file mode 100644 index 58ac0a2f..00000000 --- a/packages/webfont/src/fixtures/config-discovery/js-rc/.webfontrc.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - fontName: "config-rc-js", - formats: ["woff2"], -}; diff --git a/packages/webfont/src/fixtures/config-discovery/json/.webfontrc.json b/packages/webfont/src/fixtures/config-discovery/json/.webfontrc.json deleted file mode 100644 index 2f16440b..00000000 --- a/packages/webfont/src/fixtures/config-discovery/json/.webfontrc.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "fontName": "config-json-rc", - "formats": ["woff2"] -} diff --git a/packages/webfont/src/fixtures/config-discovery/package-json/package.json b/packages/webfont/src/fixtures/config-discovery/package-json/package.json deleted file mode 100644 index 1b75b118..00000000 --- a/packages/webfont/src/fixtures/config-discovery/package-json/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "webfont-config-fixture", - "private": true, - "webfont": { - "fontName": "config-package-json", - "formats": [ - "woff2" - ] - } -} diff --git a/packages/webfont/src/fixtures/config-discovery/walkup/.webfontrc.json b/packages/webfont/src/fixtures/config-discovery/walkup/.webfontrc.json deleted file mode 100644 index cf537d33..00000000 --- a/packages/webfont/src/fixtures/config-discovery/walkup/.webfontrc.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "fontName": "config-walkup", - "formats": ["woff2"] -} diff --git a/packages/webfont/src/fixtures/config-discovery/yaml-advanced/.webfontrc.yaml b/packages/webfont/src/fixtures/config-discovery/yaml-advanced/.webfontrc.yaml deleted file mode 100644 index e10c5da6..00000000 --- a/packages/webfont/src/fixtures/config-discovery/yaml-advanced/.webfontrc.yaml +++ /dev/null @@ -1,19 +0,0 @@ -# Cosmiconfig v7 YAML parser regression fixture. -# Exercises anchors, aliases, block/flow collections, and YAML 1.1 booleans. - -fontName: &fontName config-yaml-advanced - -formats: &formats - - woff2 - -templateFontPath: './assets/fonts/' -sort: yes -ligatures: false -normalize: on -round: 2 - -displayName: *fontName -alsoFormats: *formats - -# Flow-style collection alongside block mappings. -extraFormats: [woff2] diff --git a/packages/webfont/src/fixtures/config-discovery/yaml/.webfontrc.yaml b/packages/webfont/src/fixtures/config-discovery/yaml/.webfontrc.yaml deleted file mode 100644 index b698b84b..00000000 --- a/packages/webfont/src/fixtures/config-discovery/yaml/.webfontrc.yaml +++ /dev/null @@ -1,3 +0,0 @@ -fontName: config-yaml-rc -formats: - - woff2 diff --git a/packages/webfont/src/fixtures/config-package/index.js b/packages/webfont/src/fixtures/config-package/index.js deleted file mode 100644 index 8f0152bc..00000000 --- a/packages/webfont/src/fixtures/config-package/index.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - fontName: "config-node-module", - formats: ["woff2"], -}; diff --git a/packages/webfont/src/fixtures/config-package/package.json b/packages/webfont/src/fixtures/config-package/package.json deleted file mode 100644 index 8595d794..00000000 --- a/packages/webfont/src/fixtures/config-package/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "webfont-fixture-config", - "private": true, - "main": "index.js" -} diff --git a/packages/webfont/src/fixtures/configs/.webfontrc-cli.json b/packages/webfont/src/fixtures/configs/.webfontrc-cli.json deleted file mode 100644 index 63076d47..00000000 --- a/packages/webfont/src/fixtures/configs/.webfontrc-cli.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "fontName": "cli-config-font", - "formats": ["woff2"] -} diff --git a/packages/webfont/src/fixtures/configs/.webfontrc-conversion.json b/packages/webfont/src/fixtures/configs/.webfontrc-conversion.json deleted file mode 100644 index 17e703ef..00000000 --- a/packages/webfont/src/fixtures/configs/.webfontrc-conversion.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "fontName": "conversion-config-font" -} diff --git a/packages/webfont/src/fixtures/configs/.webfontrc-files.json b/packages/webfont/src/fixtures/configs/.webfontrc-files.json deleted file mode 100644 index d724c1c5..00000000 --- a/packages/webfont/src/fixtures/configs/.webfontrc-files.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "fontName": "config-files-font", - "formats": ["woff2"], - "files": ["src/fixtures/svg-icons/envelope.svg", "src/fixtures/svg-icons/avatar.svg"] -} diff --git a/packages/webfont/src/fixtures/configs/webfont.config-cli.js b/packages/webfont/src/fixtures/configs/webfont.config-cli.js deleted file mode 100644 index 2d5ae778..00000000 --- a/packages/webfont/src/fixtures/configs/webfont.config-cli.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - fontName: "cli-config-js-font", - formats: ["woff2"], -}; diff --git a/packages/webfont/src/fixtures/extension-less-input b/packages/webfont/src/fixtures/extension-less-input deleted file mode 100644 index 74dda1ae..00000000 --- a/packages/webfont/src/fixtures/extension-less-input +++ /dev/null @@ -1 +0,0 @@ -Fixture file without a filename extension (used by integration tests). diff --git a/packages/webfont/src/fixtures/fonts/iconfont.ttf b/packages/webfont/src/fixtures/fonts/iconfont.ttf deleted file mode 100644 index 3f682629..00000000 Binary files a/packages/webfont/src/fixtures/fonts/iconfont.ttf and /dev/null differ diff --git a/packages/webfont/src/fixtures/fonts/iconfont.woff b/packages/webfont/src/fixtures/fonts/iconfont.woff deleted file mode 100644 index bc8e6a42..00000000 Binary files a/packages/webfont/src/fixtures/fonts/iconfont.woff and /dev/null differ diff --git a/packages/webfont/src/fixtures/fonts/iconfont.woff2 b/packages/webfont/src/fixtures/fonts/iconfont.woff2 deleted file mode 100644 index da96581a..00000000 Binary files a/packages/webfont/src/fixtures/fonts/iconfont.woff2 and /dev/null differ diff --git a/packages/webfont/src/fixtures/svg-evenodd/linkedin.svg b/packages/webfont/src/fixtures/svg-evenodd/linkedin.svg deleted file mode 100644 index f08dd345..00000000 --- a/packages/webfont/src/fixtures/svg-evenodd/linkedin.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/packages/webfont/src/fixtures/svg-icons-messy/triangle.svg b/packages/webfont/src/fixtures/svg-icons-messy/triangle.svg deleted file mode 100644 index e50b5119..00000000 --- a/packages/webfont/src/fixtures/svg-icons-messy/triangle.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - dummy - - diff --git a/packages/webfont/src/fixtures/svg-icons-stroke-only/wave.svg b/packages/webfont/src/fixtures/svg-icons-stroke-only/wave.svg deleted file mode 100644 index 27d3eb1d..00000000 --- a/packages/webfont/src/fixtures/svg-icons-stroke-only/wave.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/packages/webfont/src/fixtures/svg-stroke-icons/plus-filled.svg b/packages/webfont/src/fixtures/svg-stroke-icons/plus-filled.svg deleted file mode 100644 index b46ed26d..00000000 --- a/packages/webfont/src/fixtures/svg-stroke-icons/plus-filled.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/packages/webfont/src/fixtures/svg-stroke-icons/stroked-plus.svg b/packages/webfont/src/fixtures/svg-stroke-icons/stroked-plus.svg deleted file mode 100644 index 530e1ffe..00000000 --- a/packages/webfont/src/fixtures/svg-stroke-icons/stroked-plus.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/packages/webfont/src/fixtures/svg-use-icons/use-transform.svg b/packages/webfont/src/fixtures/svg-use-icons/use-transform.svg deleted file mode 100644 index 53cc2e23..00000000 --- a/packages/webfont/src/fixtures/svg-use-icons/use-transform.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/packages/webfont/src/fixtures/templates/template-fonts-base64.njk b/packages/webfont/src/fixtures/templates/template-fonts-base64.njk deleted file mode 100644 index 27cdddfd..00000000 --- a/packages/webfont/src/fixtures/templates/template-fonts-base64.njk +++ /dev/null @@ -1 +0,0 @@ -{{ fonts.woff2() }} diff --git a/packages/webfont/src/index.build-interop.test.ts b/packages/webfont/src/index.build-interop.test.ts deleted file mode 100644 index 525733e5..00000000 --- a/packages/webfont/src/index.build-interop.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { execFileSync } from "node:child_process"; -import { createRequire } from "node:module"; -import path from "node:path"; -import { fileURLToPath } from "node:url"; -import { describe, expect, it } from "vitest"; - -const __dirname = path.dirname(fileURLToPath(import.meta.url)); -const esmPath = path.resolve(__dirname, "..", "dist", "index.mjs"); -const cjsPath = path.resolve(__dirname, "..", "dist", "index.js"); - -describe("build interop (issue #618)", () => { - it("should expose webfont as a callable default export from the ESM build", () => { - const result = execFileSync("node", [ - "--input-type=module", - "-e", - `import m, { webfont as named } from ${JSON.stringify(esmPath)}; console.log(JSON.stringify({ default: typeof m, named: typeof named }));`, - ]).toString(); - const parsed = JSON.parse(result); - expect(parsed.default).toBe("function"); - expect(parsed.named).toBe("function"); - }); - - it("should keep named exports on the CJS build for require()", () => { - const require = createRequire(import.meta.url); - const cjs = require(cjsPath); - expect(typeof cjs.webfont).toBe("function"); - expect(typeof cjs.default).toBe("function"); - }); - - it("should render a built-in template from the ESM build without __dirname errors", () => { - const svgGlob = path.resolve(__dirname, "fixtures/svg-icons/*.svg"); - const result = execFileSync("node", [ - "--input-type=module", - "-e", - `import webfont from ${JSON.stringify(esmPath)}; const r = await webfont({ files: ${JSON.stringify(svgGlob)}, formats: ["woff2"], template: "css" }); console.log(typeof r.template === "string" && r.template.length > 0 ? "ok" : "fail");`, - ]).toString(); - expect(result.trim()).toBe("ok"); - }); -}); diff --git a/packages/webfont/src/index.test.ts b/packages/webfont/src/index.test.ts deleted file mode 100755 index d6a2d8dd..00000000 --- a/packages/webfont/src/index.test.ts +++ /dev/null @@ -1,21 +0,0 @@ -import index, { type Result, type ResultConfig, webfont, writeResultFiles } from "."; - -describe("index", () => { - it("should be exported", () => { - expect(typeof index === "function").toBe(true); - }); - - it("should expose webfont as both the default and a named export", () => { - expect(index).toBe(webfont); - }); - - it("should re-export the public Result and ResultConfig types", () => { - expectTypeOf().toEqualTypeOf(); - expectTypeOf().toHaveProperty("filePath"); - expectTypeOf().toEqualTypeOf(); - }); - - it("should export writeResultFiles for programmatic disk writes", () => { - expect(typeof writeResultFiles).toBe("function"); - }); -}); diff --git a/packages/webfont/src/index.ts b/packages/webfont/src/index.ts deleted file mode 100644 index d96560d0..00000000 --- a/packages/webfont/src/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { webfont } from "./standalone"; - -export { diagnoseGlyphsData, diagnoseSvgContents } from "./lib/svgDiagnostics/diagnoseSvgContents"; -export { mergeCliDestIntoConfig, writeResultFiles } from "./node/writeResultFiles"; -export { webfont } from "./standalone"; -export type { Result } from "./types/Result"; -export type { ResultConfig } from "./types/ResultConfig"; -export type { SvgDiagnosticCode, SvgGlyphDiagnostic, SvgToolsOptions } from "./types/SvgToolsOptions"; -export default webfont; diff --git a/packages/webfont/src/lib/applyOptimizeSvgToGlyphs.ts b/packages/webfont/src/lib/applyOptimizeSvgToGlyphs.ts deleted file mode 100644 index 733c5242..00000000 --- a/packages/webfont/src/lib/applyOptimizeSvgToGlyphs.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { Config } from "svgo"; -import type { GlyphData } from "../types/GlyphData"; -import { optimizeSvgContents } from "./optimizeSvgGlyphs"; - -export const applyOptimizeSvgToGlyphs = (glyphs: GlyphData[], svgoConfig?: Config): GlyphData[] => - glyphs.map((glyph) => ({ - ...glyph, - contents: optimizeSvgContents(glyph.contents, glyph.srcPath, svgoConfig), - })); diff --git a/packages/webfont/src/lib/evenoddFillRule.test.ts b/packages/webfont/src/lib/evenoddFillRule.test.ts deleted file mode 100644 index 8158e9ca..00000000 --- a/packages/webfont/src/lib/evenoddFillRule.test.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { evenoddFillRuleWarning, hasEvenoddFillRule } from "./evenoddFillRule"; - -describe("evenoddFillRule", () => { - it("should detect evenodd in inline style (#175)", () => { - expect(hasEvenoddFillRule('style="fill-rule:evenodd;clip-rule:evenodd"')).toBe(true); - }); - - it("should detect evenodd as a path attribute", () => { - expect(hasEvenoddFillRule('')).toBe(true); - }); - - it("should not flag nonzero fill rules", () => { - expect(hasEvenoddFillRule('style="fill-rule:nonzero"')).toBe(false); - }); - - it("should include troubleshooting guidance in the warning", () => { - expect(evenoddFillRuleWarning("icons/linkedin.svg")).toContain("fill-rule: evenodd"); - expect(evenoddFillRuleWarning("icons/linkedin.svg")).toContain("TROUBLESHOOTING.md"); - }); -}); diff --git a/packages/webfont/src/lib/evenoddFillRule.ts b/packages/webfont/src/lib/evenoddFillRule.ts deleted file mode 100644 index e77add85..00000000 --- a/packages/webfont/src/lib/evenoddFillRule.ts +++ /dev/null @@ -1,6 +0,0 @@ -const EVENODD_PATTERN = /fill-rule\s*:\s*evenodd|fill-rule\s*=\s*["']evenodd["']/iu; - -export const hasEvenoddFillRule = (svgContents: string): boolean => EVENODD_PATTERN.test(svgContents); - -export const evenoddFillRuleWarning = (srcPath: string): string => - `[webfont] ${srcPath} uses fill-rule: evenodd. Icon fonts render glyphs with the nonzero fill rule, so holes and counter-shapes (for example the dot on a letter) can disappear. Fix the source SVG (compound path / path direction) or preprocess with glyphContentTransformFn. See TROUBLESHOOTING.md ("Icon details missing after export").`; diff --git a/packages/webfont/src/lib/execCLI/index.test.ts b/packages/webfont/src/lib/execCLI/index.test.ts deleted file mode 100644 index cf77c5c9..00000000 --- a/packages/webfont/src/lib/execCLI/index.test.ts +++ /dev/null @@ -1,36 +0,0 @@ -const { mockExec } = vi.hoisted(() => ({ - mockExec: vi.fn(), -})); - -vi.mock("child_process", () => ({ - exec: mockExec, -})); - -import { exec } from "child_process"; -import fs from "fs"; -import { execCLI } from "./index"; - -const mockedExec = vi.mocked(exec); - -describe("execCLI", () => { - beforeEach(() => { - vi.clearAllMocks(); - }); - - it("should reject when destination readdir fails", async () => { - const readdirError = Object.assign(new Error("readdir failed"), { code: "ENOENT" }); - const readdirSpy = vi.spyOn(fs, "readdir").mockImplementation((_destination, _encoding, callback) => { - (callback as unknown as (error: NodeJS.ErrnoException | null, files: string[]) => void)(readdirError, []); - return undefined as never; - }); - - mockedExec.mockImplementation((_command, _options, callback) => { - (callback as (error: null, stdout: string, stderr: string) => void)(null, "", ""); - return undefined as never; - }); - - await expect(execCLI("", "temp/missing-cli-destination")).rejects.toThrow("readdir failed"); - - readdirSpy.mockRestore(); - }); -}); diff --git a/packages/webfont/src/lib/execCLI/index.ts b/packages/webfont/src/lib/execCLI/index.ts deleted file mode 100644 index 14dbb291..00000000 --- a/packages/webfont/src/lib/execCLI/index.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { ExecException, exec } from "child_process"; -import fs from "fs"; - -export type Output = { - code?: number; - error: ExecException | null; - files: string[]; - stderr?: string; - stdout?: string; -}; - -export type ExecCLI = (_args?: string, _destination?: string) => Promise; - -/** - * @name execCLI - * @description Execute webfont CLI commands using child_process. - * - * @param {String} args - Arguments to pass to the CLI. - * @param {String} destination - Path to read/write files - * @return {Promise.} - Contains CLI error, stdout, stderr data. - * @example - * - * execCLI("--help").then((output) => { - * console.log(output.stdout) // => Outputs usage information. - * }) - * - */ -export const execCLI: ExecCLI = (args = "", destination = "temp/cli") => - new Promise((resolve, reject) => { - const command = `node dist/cli.mjs ${args}`; - - exec(command, { encoding: "utf-8" }, (error, stdout, stderr) => { - fs.readdir(destination, { encoding: "utf-8" }, (err, files: string[]) => { - if (err) { - reject(err); - throw err; - } - - let outputCode = 0; - if (error && typeof error.code === "number") { - outputCode = error.code; - } - - const output: Output = { - code: outputCode, - error, - files, - stderr, - - /** - * Remove new line created by console.log; - */ - stdout: stdout.replace(/\n$/u, ""), - }; - - resolve(output); - }); - }); - }); diff --git a/packages/webfont/src/lib/inputSource.test.ts b/packages/webfont/src/lib/inputSource.test.ts deleted file mode 100644 index 15aa582c..00000000 --- a/packages/webfont/src/lib/inputSource.test.ts +++ /dev/null @@ -1,92 +0,0 @@ -import * as fsPromise from "node:fs/promises"; -import path from "node:path"; -import { globby } from "globby"; -import { - getInputExtension, - getWebfontSourceBasename, - isHttpUrl, - resolveDecompressedFontBasenames, - resolveInputSources, -} from "./inputSource"; - -describe("isHttpUrl", () => { - it("should detect http and https URLs", () => { - expect(isHttpUrl("https://example.com/font.woff2")).toBe(true); - expect(isHttpUrl("http://example.com/font.woff")).toBe(true); - expect(isHttpUrl("src/fixtures/fonts/iconfont.woff2")).toBe(false); - }); -}); - -describe("getInputExtension", () => { - it("should read extensions from local paths", () => { - expect(getInputExtension("src/fixtures/fonts/iconfont.woff2")).toBe(".woff2"); - expect(getInputExtension("src/fixtures/svg-icons/avatar.svg")).toBe(".svg"); - }); - - it("should ignore query strings in URLs", () => { - expect(getInputExtension("https://cdn.example/fonts/Inter.woff2?v=1")).toBe(".woff2"); - expect(getInputExtension("https://cdn.example/fonts/Inter.woff?token=abc")).toBe(".woff"); - }); - - it("should return empty for extension-less URLs", () => { - expect(getInputExtension("https://cdn.example/download")).toBe(""); - }); -}); - -describe("getWebfontSourceBasename", () => { - it("should strip webfont container extensions from filenames", () => { - expect(getWebfontSourceBasename("fonts/Inter-Medium.woff2")).toBe("Inter-Medium"); - expect(getWebfontSourceBasename("fonts/Inter-Medium.woff")).toBe("Inter-Medium"); - expect(getWebfontSourceBasename("https://cdn.example/Inter-Bold.woff2")).toBe("Inter-Bold"); - }); -}); - -describe("resolveDecompressedFontBasenames", () => { - it("should keep unique basenames unchanged", () => { - expect(resolveDecompressedFontBasenames(["fonts/Inter-Regular.woff2", "fonts/Inter-Bold.woff2"])).toEqual([ - "Inter-Regular", - "Inter-Bold", - ]); - }); - - it("should disambiguate colliding basenames using container suffixes", () => { - expect( - resolveDecompressedFontBasenames(["src/fixtures/fonts/iconfont.woff", "src/fixtures/fonts/iconfont.woff2"]), - ).toEqual(["iconfont-woff", "iconfont-woff2"]); - }); -}); - -describe("resolveInputSources", () => { - it("should expand local glob patterns to matched files", async () => { - const sources = await resolveInputSources(["src/fixtures/svg-icons/envelope.svg"]); - - expect(sources).toEqual(["src/fixtures/svg-icons/envelope.svg"]); - }); -}); - -describe("globby gitignore contract via globby 16.2.1", () => { - it.skipIf(process.platform === "win32")( - "should not ignore an entire checkout when cwd sits under an anchored gitignore ancestor path", - async () => { - // Regression for globby 16.2.0 → 16.2.1 (sindresorhus/globby#277): anchored `/tmp` must not - // prune the whole tree when the checkout lives under `/tmp/...`. - const cwd = await fsPromise.mkdtemp(path.join("/tmp", "webfont-globby-")); - const iconPath = path.join(cwd, "icon.svg"); - - try { - await fsPromise.writeFile(path.join(cwd, ".gitignore"), "/tmp\n"); - await fsPromise.writeFile(iconPath, ""); - - const matches = await globby("*.svg", { - absolute: true, - cwd, - gitignore: true, - }); - - expect(matches).toContain(iconPath); - } finally { - await fsPromise.rm(cwd, { force: true, recursive: true }); - } - }, - ); -}); diff --git a/packages/webfont/src/lib/inputSource.ts b/packages/webfont/src/lib/inputSource.ts deleted file mode 100644 index bd73522f..00000000 --- a/packages/webfont/src/lib/inputSource.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { globby } from "globby"; -import { isHttpUrl } from "./inputSourceUtils"; - -export { - getInputExtension, - getWebfontSourceBasename, - isHttpUrl, - resolveDecompressedFontBasenames, -} from "./inputSourceUtils"; - -export const resolveInputSources = async (patterns: readonly string[]): Promise => { - const resolved = await Promise.all( - patterns.map((pattern) => { - if (isHttpUrl(pattern)) { - return Promise.resolve([pattern]); - } - - return globby(pattern); - }), - ); - - return resolved.flat(); -}; diff --git a/packages/webfont/src/lib/inputSourceUtils.ts b/packages/webfont/src/lib/inputSourceUtils.ts deleted file mode 100644 index 7cb8f640..00000000 --- a/packages/webfont/src/lib/inputSourceUtils.ts +++ /dev/null @@ -1,64 +0,0 @@ -import path from "path"; - -const HTTP_URL_PATTERN = /^https?:\/\//iu; - -export const isHttpUrl = (value: string): boolean => HTTP_URL_PATTERN.test(value); - -export const getInputExtension = (source: string): string => { - if (isHttpUrl(source)) { - try { - return path.extname(new URL(source).pathname).toLowerCase(); - } catch { - return ""; - } - } - - return path.extname(source).toLowerCase(); -}; - -export const getWebfontSourceBasename = (source: string): string => { - let pathname = source; - - if (isHttpUrl(source)) { - pathname = new URL(source).pathname; - } - - const filename = path.basename(pathname); - const extension = getInputExtension(source); - - if (extension === ".woff2") { - return filename.slice(0, -".woff2".length); - } - - if (extension === ".woff") { - return filename.slice(0, -".woff".length); - } - - return filename.replace(/\.[^.]+$/u, ""); -}; - -const WEBFONT_CONTAINER_SUFFIX: Record = { - ".woff": "-woff", - ".woff2": "-woff2", -}; - -export const resolveDecompressedFontBasenames = (sources: readonly string[]): string[] => { - const stripped = sources.map((source) => getWebfontSourceBasename(source)); - const basenameCounts = new Map(); - - for (const basename of stripped) { - basenameCounts.set(basename, (basenameCounts.get(basename) ?? 0) + 1); - } - - return sources.map((source, index) => { - const basename = stripped[index]; - const isDuplicate = (basenameCounts.get(basename) ?? 0) > 1; - const extension = getInputExtension(source); - - if (!isDuplicate) { - return basename; - } - - return `${basename}${WEBFONT_CONTAINER_SUFFIX[extension] ?? `-${index + 1}`}`; - }); -}; diff --git a/packages/webfont/src/lib/largeFontLigatures.test.ts b/packages/webfont/src/lib/largeFontLigatures.test.ts deleted file mode 100644 index fb11d8d9..00000000 --- a/packages/webfont/src/lib/largeFontLigatures.test.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { - formatLargeFontLigatureWarning, - LARGE_FONT_LIGATURE_GLYPH_THRESHOLD, - shouldWarnLargeFontLigatures, -} from "./largeFontLigatures"; - -describe("largeFontLigatures", () => { - it("should warn above the glyph threshold when ligatures are enabled (#558)", () => { - expect(LARGE_FONT_LIGATURE_GLYPH_THRESHOLD).toBe(2000); - expect(shouldWarnLargeFontLigatures(2000, true)).toBe(false); - expect(shouldWarnLargeFontLigatures(2001, true)).toBe(true); - expect(shouldWarnLargeFontLigatures(7000, true)).toBe(true); - expect(shouldWarnLargeFontLigatures(7000, false)).toBe(false); - }); - - it("should format a warning that points to docs and the issue", () => { - expect(formatLargeFontLigatureWarning(5000)).toContain("5000 glyphs"); - expect(formatLargeFontLigatureWarning(5000)).toContain("--ligatures"); - expect(formatLargeFontLigatureWarning(5000)).toContain("issues/558"); - }); -}); diff --git a/packages/webfont/src/lib/largeFontLigatures.ts b/packages/webfont/src/lib/largeFontLigatures.ts deleted file mode 100644 index 22558dcc..00000000 --- a/packages/webfont/src/lib/largeFontLigatures.ts +++ /dev/null @@ -1,8 +0,0 @@ -/** Glyph count above which OpenType ligatures often hurt browser layout (Firefox / DirectWrite). */ -export const LARGE_FONT_LIGATURE_GLYPH_THRESHOLD = 2000; - -export const shouldWarnLargeFontLigatures = (glyphCount: number, ligaturesEnabled: boolean): boolean => - ligaturesEnabled && glyphCount > LARGE_FONT_LIGATURE_GLYPH_THRESHOLD; - -export const formatLargeFontLigatureWarning = (glyphCount: number): string => - `Warning: ${glyphCount} glyphs with ligatures enabled may cause severe browser slowdown or hangs (especially Firefox on Windows). Ligatures are off by default; enable only if needed: --ligatures or ligatures: true. See TROUBLESHOOTING.md and https://github.com/itgalaxy/webfont/issues/558`; diff --git a/packages/webfont/src/lib/optimizeSvgGlyphs.test.ts b/packages/webfont/src/lib/optimizeSvgGlyphs.test.ts deleted file mode 100644 index 07f167f8..00000000 --- a/packages/webfont/src/lib/optimizeSvgGlyphs.test.ts +++ /dev/null @@ -1,61 +0,0 @@ -import type { Config } from "svgo"; -import type { GlyphData } from "../types/GlyphData"; -import { applyOptimizeSvgToGlyphs } from "./applyOptimizeSvgToGlyphs"; -import { defaultWebfontSvgoConfig, optimizeSvgContents } from "./optimizeSvgGlyphs"; - -describe("optimizeSvgGlyphs", () => { - it("should expose a conservative default plugin list without preset-default", () => { - const config = defaultWebfontSvgoConfig(); - - expect(config.plugins).toEqual([ - "removeDoctype", - "removeXMLProcInst", - "removeComments", - "removeMetadata", - "removeEditorsNSData", - "removeDesc", - "cleanupAttrs", - "removeUnusedNS", - ]); - }); - - it("should remove comments and metadata from SVG contents", () => { - const input = ` - - - ignore - -`; - - const output = optimizeSvgContents(input, "icon.svg"); - - expect(output).not.toContain("editor comment"); - expect(output).not.toContain(""); - expect(output).toContain('viewBox="0 0 24 24"'); - expect(output).toContain('d="M0 0h24v24H0z"'); - }); - - it("should use caller plugins when svgoConfig.plugins is set", () => { - const input = ''; - const config: Config = { plugins: ["removeComments"] }; - - expect(optimizeSvgContents(input, "plain.svg", config)).toBe(input); - }); -}); - -describe("applyOptimizeSvgToGlyphs", () => { - it("should optimize each glyph contents in place", () => { - const glyphs: GlyphData[] = [ - { - contents: ``, - srcPath: "a.svg", - metadata: { name: "a" }, - }, - ]; - - const optimized = applyOptimizeSvgToGlyphs(glyphs); - - expect(optimized[0]?.contents).not.toContain(""); - expect(optimized[0]?.srcPath).toBe("a.svg"); - }); -}); diff --git a/packages/webfont/src/lib/optimizeSvgGlyphs.ts b/packages/webfont/src/lib/optimizeSvgGlyphs.ts deleted file mode 100644 index 348edb6b..00000000 --- a/packages/webfont/src/lib/optimizeSvgGlyphs.ts +++ /dev/null @@ -1,40 +0,0 @@ -import type { Config } from "svgo"; -import { optimize } from "svgo"; - -/** Conservative SVGO preset: cleanup cruft without rewriting paths or removing viewBox. */ -export const defaultWebfontSvgoConfig = (): Config => ({ - multipass: false, - plugins: [ - "removeDoctype", - "removeXMLProcInst", - "removeComments", - "removeMetadata", - "removeEditorsNSData", - "removeDesc", - "cleanupAttrs", - "removeUnusedNS", - ], -}); - -const resolveSvgoConfig = (userConfig?: Config): Config => { - const defaults = defaultWebfontSvgoConfig(); - - if (!userConfig) { - return defaults; - } - - return { - ...defaults, - ...userConfig, - plugins: userConfig.plugins ?? defaults.plugins, - }; -}; - -export const optimizeSvgContents = (contents: string, srcPath: string, config?: Config): string => { - const result = optimize(contents, { - ...resolveSvgoConfig(config), - path: srcPath, - }); - - return result.data; -}; diff --git a/packages/webfont/src/lib/p-limit/index.ts b/packages/webfont/src/lib/p-limit/index.ts deleted file mode 100644 index 6d646e5f..00000000 --- a/packages/webfont/src/lib/p-limit/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import pLimit from "p-limit"; - -export default pLimit; diff --git a/packages/webfont/src/lib/parseFormats.ts b/packages/webfont/src/lib/parseFormats.ts deleted file mode 100644 index 4b1a981c..00000000 --- a/packages/webfont/src/lib/parseFormats.ts +++ /dev/null @@ -1,29 +0,0 @@ -import type { Format, Formats } from "../types/Format"; - -const VALID_FORMATS = new Set(["eot", "otf", "svg", "ttf", "woff", "woff2"]); - -const VALID_FORMATS_LIST = [...VALID_FORMATS].join(", "); - -export const assertValidFormat = (value: unknown): Format => { - if (typeof value !== "string" || !VALID_FORMATS.has(value as Format)) { - throw new Error(`Invalid format "${String(value)}". Expected one of: ${VALID_FORMATS_LIST}`); - } - - return value as Format; -}; - -export const parseFormatsList = (values: readonly unknown[]): Formats => { - if (values.length === 0) { - throw new Error("formats must not be empty"); - } - - return values.map(assertValidFormat); -}; - -export const assertFormatsOption = (formats: unknown): Formats => { - if (!Array.isArray(formats)) { - throw new Error('formats must be an array of format names (e.g. ["woff2", "svg"])'); - } - - return parseFormatsList(formats); -}; diff --git a/packages/webfont/src/lib/parseTemplateOption.test.ts b/packages/webfont/src/lib/parseTemplateOption.test.ts deleted file mode 100644 index 40abe4cc..00000000 --- a/packages/webfont/src/lib/parseTemplateOption.test.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { normalizeTemplateOption } from "./parseTemplateOption"; - -describe("normalizeTemplateOption", () => { - it("should accept a single template name", () => { - expect(normalizeTemplateOption("css")).toEqual(["css"]); - }); - - it("should accept multiple template names (#158)", () => { - expect(normalizeTemplateOption(["html", "scss"])).toEqual(["html", "scss"]); - }); - - it("should reject empty template arrays", () => { - expect(() => normalizeTemplateOption([])).toThrow("template must not be empty"); - }); - - it("should reject non-string template entries", () => { - expect(() => normalizeTemplateOption(["css", 1 as never])).toThrow( - "template must be a string or an array of non-empty strings", - ); - }); -}); diff --git a/packages/webfont/src/lib/parseTemplateOption.ts b/packages/webfont/src/lib/parseTemplateOption.ts deleted file mode 100644 index 94298f47..00000000 --- a/packages/webfont/src/lib/parseTemplateOption.ts +++ /dev/null @@ -1,31 +0,0 @@ -export type TemplateOption = string | string[]; - -export const normalizeTemplateOption = (template: unknown): string[] => { - if (template === undefined || template === null) { - return []; - } - - if (typeof template === "string") { - const trimmed = template.trim(); - - if (trimmed.length === 0) { - throw new Error("template must not be empty"); - } - - return [trimmed]; - } - - if (Array.isArray(template)) { - if (template.length === 0) { - throw new Error("template must not be empty"); - } - - if (!template.every((entry) => typeof entry === "string" && entry.trim().length > 0)) { - throw new Error("template must be a string or an array of non-empty strings"); - } - - return template.map((entry) => entry.trim()); - } - - throw new Error("template must be a string or an array of strings"); -}; diff --git a/packages/webfont/src/lib/runtimeEnvironment.test.ts b/packages/webfont/src/lib/runtimeEnvironment.test.ts deleted file mode 100644 index 6b5aa34f..00000000 --- a/packages/webfont/src/lib/runtimeEnvironment.test.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { isBrowserOrWorkerRuntime, isNodeRuntime } from "./runtimeEnvironment"; - -describe("runtimeEnvironment", () => { - afterEach(() => { - vi.unstubAllGlobals(); - }); - - it("should treat Web Worker globals as non-Node even when process.versions.node is polyfilled", () => { - vi.stubGlobal("importScripts", vi.fn()); - vi.stubGlobal("process", { versions: { node: "22.0.0" } }); - - expect(isBrowserOrWorkerRuntime()).toBe(true); - expect(isNodeRuntime()).toBe(false); - }); - - it("should treat browser window as non-Node", () => { - vi.stubGlobal("window", { document: {} }); - - expect(isBrowserOrWorkerRuntime()).toBe(true); - expect(isNodeRuntime()).toBe(false); - }); - - it("should treat real Node as Node when worker and window globals are absent", () => { - expect(isNodeRuntime()).toBe(true); - }); -}); diff --git a/packages/webfont/src/lib/runtimeEnvironment.ts b/packages/webfont/src/lib/runtimeEnvironment.ts deleted file mode 100644 index f20e7108..00000000 --- a/packages/webfont/src/lib/runtimeEnvironment.ts +++ /dev/null @@ -1,24 +0,0 @@ -type BrowserLikeGlobal = typeof globalThis & { - importScripts?: (...urls: string[]) => void; - window?: { document?: unknown }; -}; - -/** True in browser tabs and Web Workers (including Vite `process` polyfills). */ -export const isBrowserOrWorkerRuntime = (): boolean => { - const globalRef = globalThis as BrowserLikeGlobal; - - if (typeof globalRef.importScripts === "function") { - return true; - } - - return typeof globalRef.window !== "undefined" && typeof globalRef.window.document !== "undefined"; -}; - -/** True only in real Node.js — not in browser tabs or Web Workers. */ -export const isNodeRuntime = (): boolean => { - if (isBrowserOrWorkerRuntime()) { - return false; - } - - return typeof process !== "undefined" && typeof process.versions?.node === "string"; -}; diff --git a/packages/webfont/src/lib/sfnt/flavor.test.ts b/packages/webfont/src/lib/sfnt/flavor.test.ts deleted file mode 100644 index eb0aa021..00000000 --- a/packages/webfont/src/lib/sfnt/flavor.test.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { getSfntFlavor } from "./flavor"; - -describe("getSfntFlavor", () => { - it("should detect TrueType sfnt with version 1.0 signature", () => { - const buffer = Buffer.alloc(4); - buffer.writeUInt32BE(0x00_01_00_00, 0); - - expect(getSfntFlavor(buffer)).toBe("ttf"); - }); - - it("should detect TrueType sfnt with true signature", () => { - const buffer = Buffer.alloc(4); - buffer.writeUInt32BE(0x74_72_75_65, 0); - - expect(getSfntFlavor(buffer)).toBe("ttf"); - }); - - it("should detect OpenType sfnt with OTTO signature", () => { - const buffer = Buffer.alloc(4); - buffer.writeUInt32BE(0x4f_54_54_4f, 0); - - expect(getSfntFlavor(buffer)).toBe("otf"); - }); - - it("should reject buffers that are too short", () => { - expect(() => getSfntFlavor(Buffer.alloc(3))).toThrow("SFNT buffer is too short to read flavor"); - }); - - it("should reject unknown sfnt signatures", () => { - const buffer = Buffer.alloc(4); - buffer.writeUInt32BE(0xdead_beef, 0); - - expect(() => getSfntFlavor(buffer)).toThrow("Unsupported SFNT flavor 0xdeadbeef"); - }); -}); diff --git a/packages/webfont/src/lib/sfnt/flavor.ts b/packages/webfont/src/lib/sfnt/flavor.ts deleted file mode 100644 index 19ca66bb..00000000 --- a/packages/webfont/src/lib/sfnt/flavor.ts +++ /dev/null @@ -1,23 +0,0 @@ -export type SfntFlavor = "otf" | "ttf"; - -const OTTO_SIGNATURE = 0x4f_54_54_4f; -const TRUE_SIGNATURE = 0x74_72_75_65; -const VERSION_1_SIGNATURE = 0x00_01_00_00; - -export const getSfntFlavor = (buffer: Buffer): SfntFlavor => { - if (buffer.length < 4) { - throw new Error("SFNT buffer is too short to read flavor"); - } - - const signature = buffer.readUInt32BE(0); - - if (signature === OTTO_SIGNATURE) { - return "otf"; - } - - if (signature === TRUE_SIGNATURE || signature === VERSION_1_SIGNATURE) { - return "ttf"; - } - - throw new Error(`Unsupported SFNT flavor 0x${signature.toString(16)}`); -}; diff --git a/packages/webfont/src/lib/svgDiagnostics/diagnoseSvgContents.test.ts b/packages/webfont/src/lib/svgDiagnostics/diagnoseSvgContents.test.ts deleted file mode 100644 index 95d6bd7f..00000000 --- a/packages/webfont/src/lib/svgDiagnostics/diagnoseSvgContents.test.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { readFileSync } from "node:fs"; -import { resolve } from "node:path"; -import { hasEvenoddFillRule } from "../evenoddFillRule"; -import { - diagnoseSvgContents, - hasStrokeOnlySvg, - hasUnsupportedSvgElements, - hasUseReference, -} from "./diagnoseSvgContents"; - -const fixturesGlob = resolve(__dirname, "../../fixtures"); - -describe("diagnoseSvgContents", () => { - it("should detect evenodd fill-rule (#175)", () => { - const svg = readFileSync(`${fixturesGlob}/svg-evenodd/linkedin.svg`, "utf8"); - - expect(hasEvenoddFillRule(svg)).toBe(true); - - const diagnostics = diagnoseSvgContents("linkedin.svg", svg); - - expect(diagnostics.some((entry) => entry.code === "evenodd-fill-rule")).toBe(true); - }); - - it("should detect stroke-only Lucide-style SVGs", () => { - const svg = readFileSync(`${fixturesGlob}/svg-stroke-icons/stroked-plus.svg`, "utf8"); - - expect(hasStrokeOnlySvg(svg)).toBe(true); - - const diagnostics = diagnoseSvgContents("stroked-plus.svg", svg); - - expect(diagnostics.some((entry) => entry.code === "stroke-only")).toBe(true); - expect(diagnostics.some((entry) => entry.code === "unsupported-element")).toBe(true); - }); - - it("should not flag filled SVGs without stroke-only patterns", () => { - const svg = readFileSync(`${fixturesGlob}/svg-stroke-icons/plus-filled.svg`, "utf8"); - - expect(hasStrokeOnlySvg(svg)).toBe(false); - expect(hasUnsupportedSvgElements(svg)).toBe(false); - expect(hasUseReference(svg)).toBe(false); - expect(diagnoseSvgContents("plus-filled.svg", svg)).toEqual([]); - }); - - it("should detect references with transform (#612)", () => { - const svg = readFileSync(`${fixturesGlob}/svg-use-icons/use-transform.svg`, "utf8"); - - expect(hasUseReference(svg)).toBe(true); - - const diagnostics = diagnoseSvgContents("use-transform.svg", svg); - - expect(diagnostics.some((entry) => entry.code === "use-reference")).toBe(true); - expect(diagnostics[0]?.message).toContain("612"); - }); -}); diff --git a/packages/webfont/src/lib/svgDiagnostics/diagnoseSvgContents.ts b/packages/webfont/src/lib/svgDiagnostics/diagnoseSvgContents.ts deleted file mode 100644 index 75c48e7f..00000000 --- a/packages/webfont/src/lib/svgDiagnostics/diagnoseSvgContents.ts +++ /dev/null @@ -1,90 +0,0 @@ -import type { SvgDiagnosticCode, SvgGlyphDiagnostic } from "../../types/SvgToolsOptions"; -import { hasEvenoddFillRule } from "../evenoddFillRule"; - -const STROKE_ATTR_PATTERN = /\bstroke\s*=|\bstroke\s*:/iu; -const FILL_NONE_PATTERN = /fill\s*=\s*["']none["']|fill\s*:\s*none/iu; -const UNSUPPORTED_ELEMENT_PATTERN = /<(line|polyline|clipPath)\b/iu; -const USE_REFERENCE_PATTERN = / { - if (!STROKE_ATTR_PATTERN.test(svgContents)) { - return false; - } - - return FILL_NONE_PATTERN.test(svgContents); -}; - -export const hasUnsupportedSvgElements = (svgContents: string): boolean => - UNSUPPORTED_ELEMENT_PATTERN.test(svgContents); - -export const hasUseReference = (svgContents: string): boolean => USE_REFERENCE_PATTERN.test(svgContents); - -const diagnosticMessage = (code: SvgDiagnosticCode, srcPath: string): string => { - switch (code) { - case "evenodd-fill-rule": - return `[webfont:diagnose] ${srcPath} uses fill-rule: evenodd. Icon fonts render glyphs with the nonzero fill rule, so holes and counter-shapes can disappear. See TROUBLESHOOTING.md ("Icon details missing after export").`; - case "stroke-only": - return `[webfont:diagnose] ${srcPath} uses stroke-based paths (fill="none"). svgicons2svgfont ignores stroke; outlines may render as solid shapes or lose detail. Preprocess with glyphContentTransformFn (for example svg-outline-stroke) before conversion. See TROUBLESHOOTING.md ("Icon details missing after export").`; - case "unsupported-element": - return `[webfont:diagnose] ${srcPath} contains , , or . These elements are poorly supported in icon fonts; results may differ from the browser preview. Convert to filled paths or preprocess with glyphContentTransformFn.`; - case "use-reference": - return `[webfont:diagnose] ${srcPath} contains (symbol/instance references). svgicons2svgfont does not resolve or apply transform on references — the glyph may be empty or wrong. Flatten to paths in your editor, or preprocess with SVGO / glyphContentTransformFn before conversion. See TROUBLESHOOTING.md ("SVG transform and references", #612).`; - default: { - const exhaustive: never = code; - return exhaustive; - } - } -}; - -export const diagnoseSvgContents = (srcPath: string, svgContents: string): SvgGlyphDiagnostic[] => { - const diagnostics: SvgGlyphDiagnostic[] = []; - - if (hasEvenoddFillRule(svgContents)) { - diagnostics.push({ - code: "evenodd-fill-rule", - message: diagnosticMessage("evenodd-fill-rule", srcPath), - srcPath, - }); - } - - if (hasStrokeOnlySvg(svgContents)) { - diagnostics.push({ - code: "stroke-only", - message: diagnosticMessage("stroke-only", srcPath), - srcPath, - }); - } - - if (hasUnsupportedSvgElements(svgContents)) { - diagnostics.push({ - code: "unsupported-element", - message: diagnosticMessage("unsupported-element", srcPath), - srcPath, - }); - } - - if (hasUseReference(svgContents)) { - diagnostics.push({ - code: "use-reference", - message: diagnosticMessage("use-reference", srcPath), - srcPath, - }); - } - - return diagnostics; -}; - -export const diagnoseGlyphsData = ( - glyphs: ReadonlyArray<{ contents: string; srcPath: string }>, -): SvgGlyphDiagnostic[] => glyphs.flatMap((glyph) => diagnoseSvgContents(glyph.srcPath, glyph.contents)); - -export const shouldLogDiagnostic = ( - diagnostic: SvgGlyphDiagnostic, - options: { diagnose?: boolean; verbose?: boolean }, -): boolean => { - if (options.diagnose) { - return true; - } - - return Boolean(options.verbose && diagnostic.code === "evenodd-fill-rule"); -}; diff --git a/packages/webfont/src/lib/svgFontOutput/emptyGlyphPaths.test.ts b/packages/webfont/src/lib/svgFontOutput/emptyGlyphPaths.test.ts deleted file mode 100644 index f4ab42dc..00000000 --- a/packages/webfont/src/lib/svgFontOutput/emptyGlyphPaths.test.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { assertNonEmptySvgFontGlyphs, findEmptySvgFontGlyphNames } from "./emptyGlyphPaths"; - -describe("emptyGlyphPaths", () => { - it("should list glyph names with empty d attributes", () => { - const svgFont = ` -`; - - expect(findEmptySvgFontGlyphNames(svgFont)).toEqual(["wave"]); - }); - - it("should ignore missing-glyph without glyph-name", () => { - const svgFont = ` -`; - - expect(findEmptySvgFontGlyphNames(svgFont)).toEqual([]); - }); - - it("should throw with src paths when SVG font glyphs have no path data (#327)", () => { - const svgFont = ``; - - expect(() => - assertNonEmptySvgFontGlyphs(svgFont, [ - { - metadata: { name: "wave", unicode: [String.fromCodePoint(0xea01)] }, - srcPath: "icons/wave.svg", - }, - ]), - ).toThrow(/Empty glyph path\(s\) in SVG font output for: wave \(icons\/wave\.svg\)/u); - }); -}); diff --git a/packages/webfont/src/lib/svgFontOutput/emptyGlyphPaths.ts b/packages/webfont/src/lib/svgFontOutput/emptyGlyphPaths.ts deleted file mode 100644 index c9f49edb..00000000 --- a/packages/webfont/src/lib/svgFontOutput/emptyGlyphPaths.ts +++ /dev/null @@ -1,85 +0,0 @@ -import type { GlyphData } from "../../types/GlyphData"; - -const GLYPH_TAG_PATTERN = //]*)(?:\/>|>)/giu; -const GLYPH_NAME_PATTERN = /\bglyph-name=["']([^"']+)["']/iu; -const GLYPH_D_PATTERN = /\bd=["']([^"']*)["']/iu; - -export const findEmptySvgFontGlyphNames = (svgFont: string): string[] => { - const emptyNames: string[] = []; - - for (const match of svgFont.matchAll(GLYPH_TAG_PATTERN)) { - const attributes = match[1] ?? ""; - const nameMatch = GLYPH_NAME_PATTERN.exec(attributes); - - if (nameMatch) { - const pathMatch = GLYPH_D_PATTERN.exec(attributes); - const pathData = pathMatch?.[1] ?? ""; - - if (pathData.trim().length === 0) { - emptyNames.push(nameMatch[1]); - } - } - } - - return emptyNames; -}; - -const resolveSrcPathForGlyphName = ( - glyphName: string, - glyphsData: ReadonlyArray>, -): string | undefined => { - for (const glyph of glyphsData) { - const name = glyph.metadata?.name; - - if (name && (glyphName === name || glyphName.startsWith(`${name}-`))) { - return glyph.srcPath; - } - } - - return undefined; -}; - -const formatEmptyGlyphLocations = ( - emptyGlyphNames: string[], - glyphsData: ReadonlyArray>, -): string => { - const seen = new Set(); - const parts: string[] = []; - - for (const glyphName of emptyGlyphNames) { - const srcPath = resolveSrcPathForGlyphName(glyphName, glyphsData); - const key = srcPath ?? glyphName; - - if (!seen.has(key)) { - seen.add(key); - - if (srcPath) { - parts.push(`${glyphName} (${srcPath})`); - } else { - parts.push(glyphName); - } - } - } - - return parts.join("; "); -}; - -export const assertNonEmptySvgFontGlyphs = ( - svgFont: string, - glyphsData: ReadonlyArray>, -): void => { - const emptyGlyphNames = findEmptySvgFontGlyphNames(svgFont); - - if (emptyGlyphNames.length === 0) { - return; - } - - const locations = formatEmptyGlyphLocations(emptyGlyphNames, glyphsData); - - throw new Error( - `Empty glyph path(s) in SVG font output for: ${locations}. ` + - 'Stroke-only SVGs (fill="none" with stroke) often produce empty glyphs because svgicons2svgfont does not convert strokes. ' + - "Convert strokes to filled paths in your design tool, preprocess with glyphContentTransformFn (for example svg-outline-stroke), " + - 'or run with --svg-diagnose for compatibility warnings. See TROUBLESHOOTING.md ("Stroke-only SVGs produce blank icons").', - ); -}; diff --git a/packages/webfont/src/lib/svgTools/applySvgDiagnostics.ts b/packages/webfont/src/lib/svgTools/applySvgDiagnostics.ts deleted file mode 100644 index f8508c18..00000000 --- a/packages/webfont/src/lib/svgTools/applySvgDiagnostics.ts +++ /dev/null @@ -1,43 +0,0 @@ -import type { GlyphData } from "../../types/GlyphData"; -import type { SvgGlyphDiagnostic } from "../../types/SvgToolsOptions"; -import { diagnoseGlyphsData, shouldLogDiagnostic } from "../svgDiagnostics/diagnoseSvgContents"; -import { normalizeSvgToolsOptions } from "./normalizeSvgToolsOptions"; - -export type SvgToolsReporter = (message: string) => void; - -export type ApplySvgDiagnosticsResult = { - diagnostics: SvgGlyphDiagnostic[]; - glyphs: GlyphData[]; -}; - -export const applySvgDiagnosticsToGlyphs = ( - glyphsData: GlyphData[], - svgToolsInput: { diagnose?: boolean } | undefined, - runtime: { reporter?: SvgToolsReporter; verbose?: boolean } = {}, -): ApplySvgDiagnosticsResult => { - const svgTools = normalizeSvgToolsOptions(svgToolsInput); - const diagnostics = diagnoseGlyphsData(glyphsData); - const { reporter, verbose = false } = runtime; - - for (const diagnostic of diagnostics) { - if ( - shouldLogDiagnostic(diagnostic, { - diagnose: svgTools?.diagnose, - verbose, - }) - ) { - reporter?.(diagnostic.message); - } - } - - let resultDiagnostics: SvgGlyphDiagnostic[] = []; - - if (svgTools?.diagnose) { - resultDiagnostics = diagnostics; - } - - return { - diagnostics: resultDiagnostics, - glyphs: glyphsData, - }; -}; diff --git a/packages/webfont/src/lib/svgTools/applySvgTools.test.ts b/packages/webfont/src/lib/svgTools/applySvgTools.test.ts deleted file mode 100644 index 633d1dd9..00000000 --- a/packages/webfont/src/lib/svgTools/applySvgTools.test.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { applySvgToolsToGlyphs } from "./applySvgTools"; - -describe("applySvgToolsToGlyphs", () => { - it("should diagnose stroke-only SVGs without mutating glyph contents", () => { - const messages: string[] = []; - - const result = applySvgToolsToGlyphs( - [ - { - contents: ``, - srcPath: "stroke.svg", - }, - ], - { diagnose: true }, - { - reporter: (message) => { - messages.push(message); - }, - }, - ); - - expect(messages.some((message) => message.includes("stroke-based paths"))).toBe(true); - expect(result.diagnostics.some((entry) => entry.code === "stroke-only")).toBe(true); - expect(result.glyphs[0]?.contents).toContain('stroke="currentColor"'); - }); -}); diff --git a/packages/webfont/src/lib/svgTools/applySvgTools.ts b/packages/webfont/src/lib/svgTools/applySvgTools.ts deleted file mode 100644 index 15243c5d..00000000 --- a/packages/webfont/src/lib/svgTools/applySvgTools.ts +++ /dev/null @@ -1,29 +0,0 @@ -import type { GlyphData } from "../../types/GlyphData"; -import type { SvgGlyphDiagnostic, SvgToolsOptions } from "../../types/SvgToolsOptions"; -import { applySvgDiagnosticsToGlyphs, type SvgToolsReporter } from "./applySvgDiagnostics"; - -export type { SvgToolsReporter } from "./applySvgDiagnostics"; - -export type ApplySvgToolsResult = { - diagnostics: SvgGlyphDiagnostic[]; - glyphs: GlyphData[]; -}; - -export type ApplySvgToolsRuntime = { - reporter?: SvgToolsReporter; - /** When true, logs evenodd diagnostics even if svgTools.diagnose is off (backward compatible with --verbose). */ - verbose?: boolean; -}; - -export const applySvgToolsToGlyphs = ( - glyphsData: GlyphData[], - svgToolsInput: SvgToolsOptions | undefined, - runtime: ApplySvgToolsRuntime = {}, -): ApplySvgToolsResult => { - const { diagnostics, glyphs } = applySvgDiagnosticsToGlyphs(glyphsData, svgToolsInput, runtime); - - return { - diagnostics, - glyphs, - }; -}; diff --git a/packages/webfont/src/lib/svgTools/normalizeSvgToolsOptions.test.ts b/packages/webfont/src/lib/svgTools/normalizeSvgToolsOptions.test.ts deleted file mode 100644 index 830a8bfb..00000000 --- a/packages/webfont/src/lib/svgTools/normalizeSvgToolsOptions.test.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { normalizeSvgToolsOptions } from "./normalizeSvgToolsOptions"; - -describe("normalizeSvgToolsOptions", () => { - it("should return undefined when diagnose is off", () => { - expect(normalizeSvgToolsOptions({ diagnose: false })).toBeUndefined(); - expect(normalizeSvgToolsOptions(undefined)).toBeUndefined(); - }); - - it("should preserve diagnose-only options", () => { - expect(normalizeSvgToolsOptions({ diagnose: true })).toEqual({ diagnose: true }); - }); - - it("should preserve onMessage when diagnose is enabled", () => { - const onMessage = vi.fn(); - - expect(normalizeSvgToolsOptions({ diagnose: true, onMessage })).toEqual({ - diagnose: true, - onMessage, - }); - }); -}); diff --git a/packages/webfont/src/lib/svgTools/normalizeSvgToolsOptions.ts b/packages/webfont/src/lib/svgTools/normalizeSvgToolsOptions.ts deleted file mode 100644 index 7ceac0dd..00000000 --- a/packages/webfont/src/lib/svgTools/normalizeSvgToolsOptions.ts +++ /dev/null @@ -1,19 +0,0 @@ -import type { SvgToolsOptions } from "../../types/SvgToolsOptions"; - -export const normalizeSvgToolsOptions = (svgTools?: SvgToolsOptions): SvgToolsOptions | undefined => { - if (!svgTools) { - return undefined; - } - - if (!svgTools.diagnose) { - return undefined; - } - - const normalized: SvgToolsOptions = { diagnose: true }; - - if (svgTools.onMessage) { - normalized.onMessage = svgTools.onMessage; - } - - return normalized; -}; diff --git a/packages/webfont/src/lib/svgicons2svgfont/index.test.ts b/packages/webfont/src/lib/svgicons2svgfont/index.test.ts deleted file mode 100644 index ff7930eb..00000000 --- a/packages/webfont/src/lib/svgicons2svgfont/index.test.ts +++ /dev/null @@ -1,71 +0,0 @@ -import type { WebfontOptions } from "../../types"; -import { getFontStreamOptions, normalizeRoundOption } from "./index"; - -describe("svgicons2svgfont helpers", () => { - describe("normalizeRoundOption", () => { - it("should return numbers unchanged", () => { - expect(normalizeRoundOption(4)).toBe(4); - }); - - it("should parse numeric strings from the CLI (#569)", () => { - expect(normalizeRoundOption("4")).toBe(4); - }); - - it("should return undefined for non-numeric strings", () => { - expect(normalizeRoundOption("not-a-number")).toBeUndefined(); - }); - - it("should return undefined for empty strings", () => { - expect(normalizeRoundOption("")).toBeUndefined(); - }); - - it("should return undefined for whitespace-only strings", () => { - expect(normalizeRoundOption(" ")).toBeUndefined(); - }); - - it("should return undefined for non-finite numbers", () => { - expect(normalizeRoundOption(Number.POSITIVE_INFINITY)).toBeUndefined(); - expect(normalizeRoundOption(Number.NaN)).toBeUndefined(); - }); - - it("should return undefined for non-finite numeric strings", () => { - expect(normalizeRoundOption("Infinity")).toBeUndefined(); - }); - - it("should return undefined for null", () => { - expect(normalizeRoundOption(null)).toBeUndefined(); - }); - }); - - describe("getFontStreamOptions", () => { - it("should pass coerced round to the font stream", () => { - const options = { - round: "4", - } as WebfontOptions; - - expect(getFontStreamOptions(options).round).toBe(4); - }); - - it("should forward centerHorizontally to the font stream", () => { - const options = { - centerHorizontally: true, - } as WebfontOptions; - - expect(getFontStreamOptions(options).centerHorizontally).toBe(true); - }); - - it("should forward centerVertically to the font stream (#576)", () => { - const options = { - centerVertically: true, - } as WebfontOptions; - - expect(getFontStreamOptions(options).centerVertically).toBe(true); - }); - - it("should not enable centerVertically by default", () => { - const options = {} as WebfontOptions; - - expect(getFontStreamOptions(options).centerVertically).toBeUndefined(); - }); - }); -}); diff --git a/packages/webfont/src/lib/svgicons2svgfont/index.ts b/packages/webfont/src/lib/svgicons2svgfont/index.ts deleted file mode 100644 index d67787b7..00000000 --- a/packages/webfont/src/lib/svgicons2svgfont/index.ts +++ /dev/null @@ -1,64 +0,0 @@ -import type { SVGIcons2SVGFontStreamOptions } from "svgicons2svgfont"; -import { fileSorter, getMetadataService, SVGIcons2SVGFontStream } from "svgicons2svgfont"; -import type { WebfontOptions } from "../../types"; - -export { fileSorter, getMetadataService, SVGIcons2SVGFontStream }; - -type MetadataServiceOptions = { - prependUnicode: boolean; - startUnicode: number; -}; - -export const getMetadataServiceOptions = (options: WebfontOptions): MetadataServiceOptions => ({ - prependUnicode: Boolean(options.prependUnicode), - startUnicode: Number(options.startUnicode), -}); - -/** - * Coerce `round` for svgicons2svgfont; accepts number or numeric string (CLI/config). - * Returns undefined for undefined/null/empty/non-numeric/non-finite inputs. - */ -export const normalizeRoundOption = (round: string | number | null | undefined): number | undefined => { - if (round === undefined || round === null) { - return undefined; - } - - if (typeof round === "number") { - if (Number.isFinite(round)) { - return round; - } - - return undefined; - } - - const trimmed = round.trim(); - - if (trimmed.length === 0) { - return undefined; - } - - const parsed = Number(trimmed); - - if (Number.isFinite(parsed)) { - return parsed; - } - - return undefined; -}; - -export const getFontStreamOptions = (options: WebfontOptions): Partial => - ({ - ascent: options.ascent, - centerHorizontally: options.centerHorizontally, - centerVertically: options.centerVertically, - descent: options.descent, - fixedWidth: options.fixedWidth, - fontHeight: options.fontHeight, - fontId: options.fontId, - fontName: options.fontName, - fontStyle: options.fontStyle, - fontWeight: options.fontWeight, - metadata: options.metadata, - normalize: options.normalize, - round: normalizeRoundOption(options.round), - }) as unknown as Partial; diff --git a/packages/webfont/src/lib/svgicons2svgfont/metadataFromSrcPath.test.ts b/packages/webfont/src/lib/svgicons2svgfont/metadataFromSrcPath.test.ts deleted file mode 100644 index c3abd805..00000000 --- a/packages/webfont/src/lib/svgicons2svgfont/metadataFromSrcPath.test.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { createMetadataFromSrcPathService } from "./metadataFromSrcPath"; - -const getMetadata = ( - srcPath: string, - options?: Parameters[0], - service = createMetadataFromSrcPathService(options), -) => - new Promise<{ name: string; unicode: string[] }>((resolve, reject) => { - service(srcPath, (error, metadata) => { - if (error || !metadata) { - reject(error ?? new Error("missing metadata")); - return; - } - - resolve({ name: metadata.name, unicode: metadata.unicode as string[] }); - }); - }); - -describe("createMetadataFromSrcPathService", () => { - it("assigns sequential unicode from filename when no prefix is present", async () => { - const service = createMetadataFromSrcPathService(); - const first = await getMetadata("icons/home.svg", undefined, service); - const second = await getMetadata("icons/user.svg", undefined, service); - - expect(first.name).toBe("home"); - expect(first.unicode[0]).toBe(String.fromCodePoint(0xea01)); - expect(second.unicode[0]).toBe(String.fromCodePoint(0xea02)); - }); - - it("reads unicode prefix from filename", async () => { - const metadata = await getMetadata("uE900-custom.svg"); - - expect(metadata.name).toBe("custom"); - expect(metadata.unicode[0]).toBe(String.fromCodePoint(0xe900)); - }); - - it("rejects prependUnicode in browser-safe mode", async () => { - await expect(getMetadata("home.svg", { prependUnicode: true, startUnicode: 0xea01 })).rejects.toThrow( - /prependUnicode/, - ); - }); -}); diff --git a/packages/webfont/src/lib/svgicons2svgfont/metadataFromSrcPath.ts b/packages/webfont/src/lib/svgicons2svgfont/metadataFromSrcPath.ts deleted file mode 100644 index 09636c91..00000000 --- a/packages/webfont/src/lib/svgicons2svgfont/metadataFromSrcPath.ts +++ /dev/null @@ -1,83 +0,0 @@ -import type { MetadataProvider } from "../../types/MetadataProvider"; - -type MetadataServiceOptions = { - prependUnicode: boolean; - startUnicode: number; -}; - -/** - * Browser-safe metadata lookup from a virtual `srcPath` (no `fs`, no file rename). - * Mirrors {@link https://github.com/nfroidure/svgicons2svgfont | svgicons2svgfont} filename rules. - */ -export const createMetadataFromSrcPathService = ( - options: Partial = {}, -): MetadataProvider => { - const usedUnicodes: string[] = []; - let startUnicode = 0xea01; - - if (typeof options.startUnicode === "number") { - startUnicode = options.startUnicode; - } - - const serviceOptions = { - prependUnicode: Boolean(options.prependUnicode), - startUnicode, - }; - - return (file, callback) => { - const fileBasename = file.split(/[/\\]/u).pop() ?? file; - const metadata = { - path: file, - name: "", - unicode: [] as string[], - renamed: false, - }; - - const matches = fileBasename.match(/^(?:((?:u[0-9a-f]{4,6},?)+)-)?(.+)\.svg$/iu); - - metadata.name = matches?.[2] ?? `icon${serviceOptions.startUnicode}`; - - if (matches?.[1]) { - metadata.unicode = matches[1].split(",").map((match) => { - const hex = match.slice(1); - - return hex - .split("u") - .map((code) => String.fromCodePoint(Number.parseInt(code, 16))) - .join(""); - }); - - if (usedUnicodes.includes(metadata.unicode[0] ?? "")) { - callback( - new Error( - `The unicode codepoint of the glyph ${metadata.name} seems to be already used by another glyph.`, - ), - ); - return; - } - - usedUnicodes.push(...metadata.unicode); - } else { - let nextUnicode = serviceOptions.startUnicode; - - do { - metadata.unicode[0] = String.fromCodePoint(nextUnicode); - nextUnicode += 1; - serviceOptions.startUnicode = nextUnicode; - } while (usedUnicodes.includes(metadata.unicode[0] ?? "")); - - usedUnicodes.push(metadata.unicode[0] ?? ""); - - if (serviceOptions.prependUnicode) { - callback( - new Error( - "prependUnicode renames files on disk and is not supported in the browser demo; disable prependUnicode or embed unicode prefixes in filenames.", - ), - ); - return; - } - } - - callback(null, metadata); - }; -}; diff --git a/packages/webfont/src/lib/templateUnicodeRange.test.ts b/packages/webfont/src/lib/templateUnicodeRange.test.ts deleted file mode 100644 index 2426215a..00000000 --- a/packages/webfont/src/lib/templateUnicodeRange.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { - collectCodePointsFromGlyphs, - computeUnicodeRangeFromGlyphs, - resolveTemplateUnicodeRange, -} from "./templateUnicodeRange"; - -describe("templateUnicodeRange", () => { - const glyphsWithLigatures = [ - { unicode: [String.fromCodePoint(0xea01), "avatar"] }, - { unicode: [String.fromCodePoint(0xea02), "envelope"] }, - { unicode: [String.fromCodePoint(0xea03), "phone_call"] }, - ]; - - it("should collect icon code points and ignore ligature names", () => { - expect(collectCodePointsFromGlyphs(glyphsWithLigatures)).toEqual([0xea01, 0xea02, 0xea03]); - }); - - it("should format a min-max unicode-range from glyphs", () => { - expect(computeUnicodeRangeFromGlyphs(glyphsWithLigatures)).toBe("U+EA01-EA03"); - }); - - it("should format a single-codepoint unicode-range", () => { - expect(computeUnicodeRangeFromGlyphs([{ unicode: [String.fromCodePoint(0xea01)] }])).toBe("U+EA01"); - }); - - it("should resolve auto unicode-range when enabled", () => { - expect(resolveTemplateUnicodeRange(undefined, glyphsWithLigatures)).toBeUndefined(); - expect(resolveTemplateUnicodeRange(true, glyphsWithLigatures)).toBe("U+EA01-EA03"); - }); - - it("should omit unicode-range when disabled or unset", () => { - expect(resolveTemplateUnicodeRange(false, glyphsWithLigatures)).toBeUndefined(); - expect(resolveTemplateUnicodeRange(undefined, glyphsWithLigatures)).toBeUndefined(); - }); - - it("should use a manual unicode-range override", () => { - expect(resolveTemplateUnicodeRange("U+EA01-EAFF", glyphsWithLigatures)).toBe("U+EA01-EAFF"); - }); -}); diff --git a/packages/webfont/src/lib/templateUnicodeRange.ts b/packages/webfont/src/lib/templateUnicodeRange.ts deleted file mode 100644 index 4d7da79e..00000000 --- a/packages/webfont/src/lib/templateUnicodeRange.ts +++ /dev/null @@ -1,80 +0,0 @@ -import type { GlyphMetadata } from "../types/GlyphMetadata"; - -const formatCodePoint = (codePoint: number): string => { - let width = 4; - - if (codePoint > 0xffff) { - width = 6; - } - - return codePoint.toString(16).toUpperCase().padStart(width, "0"); -}; - -const codePointFromUnicodeEntry = (value: string): number | undefined => { - if (value.length === 0 || value.length > 2) { - return undefined; - } - - const codePoint = value.codePointAt(0); - - if (codePoint === undefined) { - return undefined; - } - - // Ligature names are multi-code-unit ASCII identifiers (for example "avatar"). - if (value.length > 1 && codePoint < 0x80) { - return undefined; - } - - return codePoint; -}; - -export const collectCodePointsFromGlyphs = (glyphs: readonly Pick[]): number[] => { - const codePoints: number[] = []; - - for (const glyph of glyphs) { - for (const entry of glyph.unicode ?? []) { - const codePoint = codePointFromUnicodeEntry(entry); - - if (codePoint !== undefined) { - codePoints.push(codePoint); - } - } - } - - return codePoints; -}; - -export const computeUnicodeRangeFromGlyphs = ( - glyphs: readonly Pick[], -): string | undefined => { - const codePoints = collectCodePointsFromGlyphs(glyphs); - - if (codePoints.length === 0) { - return undefined; - } - - const min = Math.min(...codePoints); - const max = Math.max(...codePoints); - - if (min === max) { - return `U+${formatCodePoint(min)}`; - } - - return `U+${formatCodePoint(min)}-${formatCodePoint(max)}`; -}; - -export const resolveTemplateUnicodeRange = ( - unicodeRange: boolean | string | undefined, - glyphs: readonly Pick[], -): string | undefined => { - if (unicodeRange === false || unicodeRange === undefined) { - return undefined; - } - - if (typeof unicodeRange === "string") { - return unicodeRange; - } - - return computeUnicodeRangeFromGlyphs(glyphs); -}; diff --git a/packages/webfont/src/lib/ttf2eot/index.test.ts b/packages/webfont/src/lib/ttf2eot/index.test.ts deleted file mode 100644 index a8faa5ec..00000000 --- a/packages/webfont/src/lib/ttf2eot/index.test.ts +++ /dev/null @@ -1,47 +0,0 @@ -import assert from "node:assert"; -import crypto from "crypto"; -import isEot from "is-eot"; -import standalone from "../../standalone"; -import convertTtfToEot from "./index"; - -const fixturesGlob = "src/fixtures/svg-icons/*.svg"; - -describe("ttf2eot", () => { - it("should convert a ttf buffer to a valid eot buffer", async () => { - const { ttf } = await standalone({ - files: fixturesGlob, - formats: ["ttf"], - }); - - assert(ttf); - - const eot = convertTtfToEot(ttf); - - expect(isEot(eot)).toBe(true); - expect(eot.length).toBeGreaterThan(0); - }); - - it("should produce deterministic eot output for fixture icons", async () => { - const { ttf } = await standalone({ - files: fixturesGlob, - formats: ["ttf"], - }); - - assert(ttf); - - const hash = crypto.createHash("md5").update(convertTtfToEot(ttf)).digest("hex"); - - expect(hash).toBe("0da1e32d0196eceb273968727af10d99"); - }); - - it("should match eot from the standalone eot format pipeline", async () => { - const { ttf, eot } = await standalone({ - files: fixturesGlob, - formats: ["ttf", "eot"], - }); - - assert(ttf); - - expect(convertTtfToEot(ttf)).toEqual(eot); - }); -}); diff --git a/packages/webfont/src/lib/ttf2eot/index.ts b/packages/webfont/src/lib/ttf2eot/index.ts deleted file mode 100644 index 01cddaa1..00000000 --- a/packages/webfont/src/lib/ttf2eot/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import ttf2eot from "ttf2eot"; - -const convertTtfToEot = (ttf: Buffer): Buffer => Buffer.from(ttf2eot(ttf)); - -export default convertTtfToEot; diff --git a/packages/webfont/src/lib/ttfEncode.test.ts b/packages/webfont/src/lib/ttfEncode.test.ts deleted file mode 100644 index 1fafdeb8..00000000 --- a/packages/webfont/src/lib/ttfEncode.test.ts +++ /dev/null @@ -1,97 +0,0 @@ -import crypto from "crypto"; -import fontverter from "fontverter"; -import * as fsPromise from "fs/promises"; -import isEot from "is-eot"; -import isSvg from "is-svg"; -import isTtf from "is-ttf"; -import isWoff from "is-woff"; -import isWoff2 from "is-woff2"; -import wawoff2 from "wawoff2"; -import { encodeTtfToEot, encodeTtfToSvg, encodeTtfToWoff, encodeTtfToWoff2 } from "./ttfEncode"; - -const fixtureTtf = "src/fixtures/fonts/iconfont.ttf"; - -describe("ttfEncode", () => { - describe("encodeTtfToWoff2 (wawoff2.compress)", () => { - it("should compress a ttf buffer to a valid woff2 buffer", async () => { - const ttf = await fsPromise.readFile(fixtureTtf); - const woff2 = await encodeTtfToWoff2(ttf); - - expect(isWoff2(woff2)).toBe(true); - expect(woff2.length).toBeGreaterThan(0); - }); - - it("should produce deterministic woff2 output for fixture icons", async () => { - const ttf = await fsPromise.readFile(fixtureTtf); - const woff2 = await encodeTtfToWoff2(ttf); - const hash = crypto.createHash("md5").update(woff2).digest("hex"); - - expect(hash).toBe("2ad812a7b330c471a908eba3df6de6a2"); - }); - - it("should round-trip through wawoff2.decompress to valid ttf", async () => { - const ttf = await fsPromise.readFile(fixtureTtf); - const woff2 = await encodeTtfToWoff2(ttf); - const roundTrip = Buffer.from(await wawoff2.decompress(woff2)); - - expect(isTtf(roundTrip)).toBe(true); - }); - - it("should round-trip through fontverter (webfont WOFF2 decompress path)", async () => { - const ttf = await fsPromise.readFile(fixtureTtf); - const woff2 = await encodeTtfToWoff2(ttf); - const sfnt = Buffer.from(await fontverter.convert(woff2, "sfnt")); - - expect(isTtf(sfnt)).toBe(true); - }); - }); - - describe("encodeTtfToWoff (ttf2woff)", () => { - it("should encode a ttf buffer to a valid woff buffer", async () => { - const ttf = await fsPromise.readFile(fixtureTtf); - const woff = encodeTtfToWoff(ttf); - - expect(isWoff(woff)).toBe(true); - }); - }); - - describe("encodeTtfToEot (ttf2eot adapter)", () => { - it("should encode a ttf buffer to a valid eot buffer", async () => { - const ttf = await fsPromise.readFile(fixtureTtf); - const eot = encodeTtfToEot(ttf); - - expect(isEot(eot)).toBe(true); - }); - }); - - describe("encodeTtfToSvg (fonteditor-core)", () => { - it("should encode a ttf buffer to a valid svg font string", async () => { - const ttf = await fsPromise.readFile(fixtureTtf); - const svg = encodeTtfToSvg(ttf); - - expect(typeof svg).toBe("string"); - expect(isSvg(svg)).toBe(true); - expect(svg).toContain(" { - const ttf = await fsPromise.readFile(fixtureTtf); - const svg = encodeTtfToSvg(ttf, { metadata: "webfont-metadata-marker" }); - - expect(svg).toContain("webfont-metadata-marker"); - }); - - it("should not embed metadata when none is provided", async () => { - const ttf = await fsPromise.readFile(fixtureTtf); - const svg = encodeTtfToSvg(ttf); - - // Assert the intent ("no non-empty metadata") rather than fonteditor-core's - // exact empty-element serialization, which may vary across releases - // (``, ``, or omitted) without changing behavior. - expect(isSvg(svg)).toBe(true); - expect(svg).not.toMatch(/[^<]+<\/metadata>/u); - }); - }); -}); diff --git a/packages/webfont/src/lib/ttfEncode.ts b/packages/webfont/src/lib/ttfEncode.ts deleted file mode 100644 index 81fb9fe3..00000000 --- a/packages/webfont/src/lib/ttfEncode.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { createFont } from "fonteditor-core"; -import ttf2woff from "ttf2woff"; -import wawoff2 from "wawoff2"; -import convertTtfToEot from "./ttf2eot"; - -export const encodeTtfToEot = (buffer: Buffer): Buffer => convertTtfToEot(buffer); - -export const encodeTtfToSvg = (buffer: Buffer, options: { metadata?: string } = {}): string => - createFont(buffer, { type: "ttf" }).write({ type: "svg", metadata: options.metadata }); - -export const encodeTtfToWoff = (buffer: Buffer, options: { metadata?: string } = {}): Buffer => - Buffer.from(ttf2woff(buffer, options).buffer); - -export const encodeTtfToWoff2 = async (buffer: Buffer): Promise => - Buffer.from(await wawoff2.compress(buffer)); diff --git a/packages/webfont/src/node/writeResultFiles.ts b/packages/webfont/src/node/writeResultFiles.ts deleted file mode 100644 index aa83ed39..00000000 --- a/packages/webfont/src/node/writeResultFiles.ts +++ /dev/null @@ -1,268 +0,0 @@ -import * as fs from "fs"; -import * as path from "path"; -import { resolveDecompressedFontBasenames } from "../lib/inputSource"; -import type { DecompressedFont } from "../types/DecompressedFont"; -import type { InitialOptions } from "../types/InitialOptions"; -import type { RenderedTemplate } from "../types/RenderedTemplate"; -import type { Result } from "../types/Result"; -import type { ResultConfig } from "../types/ResultConfig"; -import type { TranscodedFont } from "../types/TranscodedFont"; - -export type ResultFileKey = "eot" | "hash" | "otf" | "svg" | "template" | "ttf" | "woff" | "woff2"; - -export const resultFileKeys: ResultFileKey[] = ["svg", "ttf", "otf", "eot", "woff", "woff2", "hash", "template"]; - -export const ensureResultConfig = (result: Result): ResultConfig => { - if (!result.config) { - throw new Error("Missing config in webfont result"); - } - - return result.config; -}; - -/** Copy `dest` / `destTemplate` from run options onto `result.config` before `writeResultFiles`. */ -export const mergeCliDestIntoConfig = ( - result: Result, - options: Pick, -): Result => { - const config = ensureResultConfig(result); - - result.config = { - ...config, - dest: options.dest, - destTemplate: options.destTemplate, - }; - - return result; -}; - -export const resolveTemplateOutputPath = ( - template: string, - config: ResultConfig, - usedBuiltIn: boolean, -): string => { - const dest = config.dest ?? process.cwd(); - let destTemplate = dest; - - if (typeof config.destTemplate === "string") { - destTemplate = config.destTemplate; - } - - if (usedBuiltIn) { - return path.join(destTemplate, `${config.fontName}.${template}`); - } - - return path.join(destTemplate, path.basename(template).replace(".njk", "")); -}; - -const getPrimaryTemplateOption = (template: ResultConfig["template"]): string | undefined => { - if (Array.isArray(template)) { - return template[0]; - } - - return template; -}; - -export const resolveDestTemplate = (result: Result, config: ResultConfig): string | undefined => { - if (!result.template) { - return undefined; - } - - const primaryTemplate = getPrimaryTemplateOption(config.template); - - if (result.usedBuildInTemplate && primaryTemplate) { - return resolveTemplateOutputPath(primaryTemplate, config, true); - } - - if (primaryTemplate) { - return resolveTemplateOutputPath(primaryTemplate, config, false); - } - - const dest = config.dest ?? process.cwd(); - - if (typeof config.destTemplate === "string") { - return config.destTemplate; - } - - return dest; -}; - -export const writeRenderedTemplates = async ( - templates: readonly RenderedTemplate[], - config: ResultConfig, -): Promise => { - await Promise.all( - templates.map(async (entry) => { - const file = path.resolve(resolveTemplateOutputPath(entry.template, config, Boolean(entry.builtIn))); - - await fs.promises.mkdir(path.dirname(file), { recursive: true }); - await fs.promises.writeFile(file, entry.content); - }), - ); -}; - -export const getResultOutputPath = ( - type: ResultFileKey, - _result: Result, - config: ResultConfig, - destTemplate?: string, -): string => { - const fontName = config.fontName; - const dest = config.dest ?? process.cwd(); - - if (type === "template") { - return path.resolve(destTemplate ?? dest); - } - - if (type === "hash") { - return path.resolve(path.join(dest, `${fontName}.hash`)); - } - - return path.resolve(path.join(dest, `${fontName}.${type}`)); -}; - -export const createMissingDestError = (dest: string): Error => - new Error(`Destination directory "${dest}" does not exist. Use --dest-create (-m) to create it.`); - -export const ensureDestExists = async (dest: string, destCreate?: boolean): Promise => { - try { - await fs.promises.access(dest, fs.constants.F_OK); - } catch { - if (destCreate) { - await fs.promises.mkdir(dest, { recursive: true }); - return; - } - - throw createMissingDestError(dest); - } -}; - -export const getDecompressedFontOutputBasename = ( - fonts: readonly { source: string }[], - font: { source: string }, - config: ResultConfig, -): string => { - if (fonts.length === 1 && config.fontName) { - return config.fontName; - } - - const basenames = resolveDecompressedFontBasenames(fonts.map((entry) => entry.source)); - const index = fonts.indexOf(font); - - return basenames[index] ?? config.fontName; -}; - -export const writeDecompressedFontFiles = async ( - fonts: readonly DecompressedFont[], - config: ResultConfig, - dest: string, -): Promise => { - await Promise.all( - fonts.flatMap((font) => { - const basename = getDecompressedFontOutputBasename(fonts, font, config); - const writes: Promise[] = []; - - if (font.ttf) { - writes.push(fs.promises.writeFile(path.resolve(path.join(dest, `${basename}.ttf`)), font.ttf)); - } - - if (font.otf) { - writes.push(fs.promises.writeFile(path.resolve(path.join(dest, `${basename}.otf`)), font.otf)); - } - - return writes; - }), - ); -}; - -export const getTranscodedFontOutputBasename = ( - fonts: readonly TranscodedFont[], - font: TranscodedFont, - config: ResultConfig, -): string => getDecompressedFontOutputBasename(fonts, font, config); - -export const writeTranscodedFontFiles = async ( - fonts: readonly TranscodedFont[], - config: ResultConfig, - dest: string, -): Promise => { - await Promise.all( - fonts.flatMap((font) => { - const basename = getTranscodedFontOutputBasename(fonts, font, config); - const writes: Promise[] = []; - - if (font.svg) { - writes.push(fs.promises.writeFile(path.resolve(path.join(dest, `${basename}.svg`)), font.svg)); - } - - if (font.ttf) { - writes.push(fs.promises.writeFile(path.resolve(path.join(dest, `${basename}.ttf`)), font.ttf)); - } - - if (font.eot) { - writes.push(fs.promises.writeFile(path.resolve(path.join(dest, `${basename}.eot`)), font.eot)); - } - - if (font.woff) { - writes.push(fs.promises.writeFile(path.resolve(path.join(dest, `${basename}.woff`)), font.woff)); - } - - if (font.woff2) { - writes.push(fs.promises.writeFile(path.resolve(path.join(dest, `${basename}.woff2`)), font.woff2)); - } - - return writes; - }), - ); -}; - -/** Write font buffers and templates from a `webfont()` result to disk (same rules as the CLI). */ -export const writeResultFiles = async (result: Result): Promise => { - const config = ensureResultConfig(result); - const dest = config.dest ?? process.cwd(); - const destTemplate = resolveDestTemplate(result, config); - - if (result.template) { - delete result.hash; - } - - await ensureDestExists(dest, config.destCreate); - - if (result.templates && result.templates.length > 0) { - await writeRenderedTemplates(result.templates, config); - } - - if (result.transcodedFonts && result.transcodedFonts.length > 1) { - await writeTranscodedFontFiles(result.transcodedFonts, config, dest); - return result; - } - - if (result.decompressedFonts && result.decompressedFonts.length > 1) { - await writeDecompressedFontFiles(result.decompressedFonts, config, dest); - return result; - } - - await Promise.all( - resultFileKeys - .filter((type) => { - if (type === "template" && result.templates && result.templates.length > 0) { - return false; - } - - return result[type] !== undefined; - }) - .map(async (type) => { - const content = result[type]; - - if (content === undefined) { - return; - } - - const file = getResultOutputPath(type, result, config, destTemplate); - - await fs.promises.writeFile(file, content); - }), - ); - - return result; -}; diff --git a/packages/webfont/src/standalone/__snapshots__/index.test.ts.snap b/packages/webfont/src/standalone/__snapshots__/index.test.ts.snap deleted file mode 100644 index df416cd7..00000000 --- a/packages/webfont/src/standalone/__snapshots__/index.test.ts.snap +++ /dev/null @@ -1,1503 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`standalone > should change unicode symbols in the result using async function 1`] = ` -"@font-face { - font-display: auto; - font-family: "webfont"; - font-style: normal; - font-weight: 400; - - src: url("./webfont.eot?test"); - src: url("./webfont.eot?#iefix") format("embedded-opentype"); -} - -.webfont { - display: inline-block; - font-family: "webfont"; - font-weight: 400; - font-style: normal; - font-variant: normal; - text-rendering: auto; - line-height: 1; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; -} - -.webfont-lg { - font-size: 1.33333em; - line-height: 0.75em; - vertical-align: -0.0667em; -} - -.webfont-xs { - font-size: 0.75em; -} - -.webfont-sm { - font-size: 0.875em; -} - -.webfont-1x { - font-size: 1em; -} - -.webfont-2x { - font-size: 2em; -} - -.webfont-3x { - font-size: 3em; -} - -.webfont-4x { - font-size: 4em; -} - -.webfont-5x { - font-size: 5em; -} - -.webfont-6x { - font-size: 6em; -} - -.webfont-7x { - font-size: 7em; -} - -.webfont-8x { - font-size: 8em; -} - -.webfont-9x { - font-size: 9em; -} - -.webfont-10x { - font-size: 10em; -} - -.webfont-fw { - text-align: center; - width: 1.25em; -} - -.webfont-border { - border: solid 0.08em #eee; - border-radius: 0.1em; - padding: 0.2em 0.25em 0.15em; -} - -.webfont-pull-left { - float: left; -} - -.webfont-pull-right { - float: right; -} - -.webfont.webfont-pull-left { - margin-right: 0.3em; -} - -.webfont.webfont-pull-right { - margin-left: 0.3em; -} - - -.webfont-avatar::before { - content: "\\1"; -} - -.webfont-envelope::before { - content: "\\1"; -} - -.webfont-phone-call::before { - content: "\\1"; -} - -" -`; - -exports[`standalone > should change unicode symbols in the result using sync function 1`] = ` -"@font-face { - font-display: auto; - font-family: "webfont"; - font-style: normal; - font-weight: 400; - - src: url("./webfont.eot?test"); - src: url("./webfont.eot?#iefix") format("embedded-opentype"); -} - -.webfont { - display: inline-block; - font-family: "webfont"; - font-weight: 400; - font-style: normal; - font-variant: normal; - text-rendering: auto; - line-height: 1; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; -} - -.webfont-lg { - font-size: 1.33333em; - line-height: 0.75em; - vertical-align: -0.0667em; -} - -.webfont-xs { - font-size: 0.75em; -} - -.webfont-sm { - font-size: 0.875em; -} - -.webfont-1x { - font-size: 1em; -} - -.webfont-2x { - font-size: 2em; -} - -.webfont-3x { - font-size: 3em; -} - -.webfont-4x { - font-size: 4em; -} - -.webfont-5x { - font-size: 5em; -} - -.webfont-6x { - font-size: 6em; -} - -.webfont-7x { - font-size: 7em; -} - -.webfont-8x { - font-size: 8em; -} - -.webfont-9x { - font-size: 9em; -} - -.webfont-10x { - font-size: 10em; -} - -.webfont-fw { - text-align: center; - width: 1.25em; -} - -.webfont-border { - border: solid 0.08em #eee; - border-radius: 0.1em; - padding: 0.2em 0.25em 0.15em; -} - -.webfont-pull-left { - float: left; -} - -.webfont-pull-right { - float: right; -} - -.webfont.webfont-pull-left { - margin-right: 0.3em; -} - -.webfont.webfont-pull-right { - margin-left: 0.3em; -} - - -.webfont-avatar::before { - content: "\\1"; -} - -.webfont-envelope::before { - content: "\\1"; -} - -.webfont-phone-call::before { - content: "\\1"; -} - -" -`; - -exports[`standalone > should create css selectors with transform titles through function 1`] = ` -"@font-face { - font-display: auto; - font-family: "webfont"; - font-style: normal; - font-weight: 400; - - src: url("./webfont.eot?test"); - src: url("./webfont.eot?#iefix") format("embedded-opentype"); -} - -.webfont { - display: inline-block; - font-family: "webfont"; - font-weight: 400; - font-style: normal; - font-variant: normal; - text-rendering: auto; - line-height: 1; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; -} - -.webfont-lg { - font-size: 1.33333em; - line-height: 0.75em; - vertical-align: -0.0667em; -} - -.webfont-xs { - font-size: 0.75em; -} - -.webfont-sm { - font-size: 0.875em; -} - -.webfont-1x { - font-size: 1em; -} - -.webfont-2x { - font-size: 2em; -} - -.webfont-3x { - font-size: 3em; -} - -.webfont-4x { - font-size: 4em; -} - -.webfont-5x { - font-size: 5em; -} - -.webfont-6x { - font-size: 6em; -} - -.webfont-7x { - font-size: 7em; -} - -.webfont-8x { - font-size: 8em; -} - -.webfont-9x { - font-size: 9em; -} - -.webfont-10x { - font-size: 10em; -} - -.webfont-fw { - text-align: center; - width: 1.25em; -} - -.webfont-border { - border: solid 0.08em #eee; - border-radius: 0.1em; - padding: 0.2em 0.25em 0.15em; -} - -.webfont-pull-left { - float: left; -} - -.webfont-pull-right { - float: right; -} - -.webfont.webfont-pull-left { - margin-right: 0.3em; -} - -.webfont.webfont-pull-right { - margin-left: 0.3em; -} - - -.webfont-avatar_transform::before { - content: "\\ea01"; -} - -.webfont-envelope_transform::before { - content: "\\ea02"; -} - -.webfont-phone-call_transform::before { - content: "\\ea03"; -} - -" -`; - -exports[`standalone > should generate all fonts with build-in template 1`] = ` -"@font-face { - font-display: auto; - font-family: "webfont"; - font-style: normal; - font-weight: 400; - - src: url("./webfont.eot?test"); - src: url("./webfont.eot?#iefix") format("embedded-opentype"), url("./webfont.woff2?test") format("woff2"), url("./webfont.woff?test") format("woff"), url("./webfont.ttf?test") format("truetype"), url("./webfont.svg?test#webfont") format("svg"); -} - -.webfont { - display: inline-block; - font-family: "webfont"; - font-weight: 400; - font-style: normal; - font-variant: normal; - text-rendering: auto; - line-height: 1; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; -} - -.webfont-lg { - font-size: 1.33333em; - line-height: 0.75em; - vertical-align: -0.0667em; -} - -.webfont-xs { - font-size: 0.75em; -} - -.webfont-sm { - font-size: 0.875em; -} - -.webfont-1x { - font-size: 1em; -} - -.webfont-2x { - font-size: 2em; -} - -.webfont-3x { - font-size: 3em; -} - -.webfont-4x { - font-size: 4em; -} - -.webfont-5x { - font-size: 5em; -} - -.webfont-6x { - font-size: 6em; -} - -.webfont-7x { - font-size: 7em; -} - -.webfont-8x { - font-size: 8em; -} - -.webfont-9x { - font-size: 9em; -} - -.webfont-10x { - font-size: 10em; -} - -.webfont-fw { - text-align: center; - width: 1.25em; -} - -.webfont-border { - border: solid 0.08em #eee; - border-radius: 0.1em; - padding: 0.2em 0.25em 0.15em; -} - -.webfont-pull-left { - float: left; -} - -.webfont-pull-right { - float: right; -} - -.webfont.webfont-pull-left { - margin-right: 0.3em; -} - -.webfont.webfont-pull-right { - margin-left: 0.3em; -} - - -.webfont-avatar::before { - content: "\\ea01"; -} - -.webfont-envelope::before { - content: "\\ea02"; -} - -.webfont-phone-call::before { - content: "\\ea03"; -} - -" -`; - -exports[`standalone > should generate all fonts with custom \`template\` with absolute path 1`] = ` -"/* custom template */ -@font-face { - font-family: webfont; - src: url("./webfont.eot?test"); - src: - url("./webfont.eot?#iefix") format("embedded-opentype"), - url("./webfont.woff2?test") format("woff2"), - url("./webfont.woff?test") format("woff"), - url("./webfont.ttf?test") format("truetype"), - url("./webfont.svg?test#webfont") format("svg"); - font-style: normal; - font-weight: 400; -} - -.webfont { - display: inline-block; - transform: translate(0, 0); - text-rendering: auto; - font: normal normal 400 14px/1 webfont; - font-size: inherit; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; -} - -.webfont-lg { - vertical-align: -15%; - line-height: 0.75em; - font-size: 1.33333333em; -} - -.webfont-2x { - font-size: 2em; -} - -.webfont-3x { - font-size: 3em; -} - -.webfont-4x { - font-size: 4em; -} - -.webfont-5x { - font-size: 5em; -} - -.webfont-fw { - width: 1.28571429em; - text-align: center; -} - -.webfont-avatar::before { - content: "\\ea01"; -} - -.webfont-envelope::before { - content: "\\ea02"; -} - -.webfont-phone-call::before { - content: "\\ea03"; -} -" -`; - -exports[`standalone > should generate all fonts with custom \`template\` with relative path 1`] = ` -"/* custom template */ -@font-face { - font-family: webfont; - src: url("./webfont.eot?test"); - src: - url("./webfont.eot?#iefix") format("embedded-opentype"), - url("./webfont.woff2?test") format("woff2"), - url("./webfont.woff?test") format("woff"), - url("./webfont.ttf?test") format("truetype"), - url("./webfont.svg?test#webfont") format("svg"); - font-style: normal; - font-weight: 400; -} - -.webfont { - display: inline-block; - transform: translate(0, 0); - text-rendering: auto; - font: normal normal 400 14px/1 webfont; - font-size: inherit; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; -} - -.webfont-lg { - vertical-align: -15%; - line-height: 0.75em; - font-size: 1.33333333em; -} - -.webfont-2x { - font-size: 2em; -} - -.webfont-3x { - font-size: 3em; -} - -.webfont-4x { - font-size: 4em; -} - -.webfont-5x { - font-size: 5em; -} - -.webfont-fw { - width: 1.28571429em; - text-align: center; -} - -.webfont-avatar::before { - content: "\\ea01"; -} - -.webfont-envelope::before { - content: "\\ea02"; -} - -.webfont-phone-call::before { - content: "\\ea03"; -} -" -`; - -exports[`standalone > should generate built-in html template 1`] = ` -" - - - - webfont - - - -

List Icons

-

Class

-
- -
-
- .webfont-avatar -
- -
-
- .webfont-envelope -
- -
-
- .webfont-phone-call -
- -
-

Ligature

-
- -
- avatar
- avatar -
- -
- envelope
- envelope -
- -
- phone_call
- phone_call -
- -
- - -" -`; - -exports[`standalone > should generate built-in json template 1`] = ` -[ - { - "id": "avatar", - "name": "Avatar", - "unicode": [ - "ea01", - ], - }, - { - "id": "envelope", - "name": "Envelope", - "unicode": [ - "ea02", - ], - }, - { - "id": "phone-call", - "name": "Phone Call", - "unicode": [ - "ea03", - ], - }, -] -`; - -exports[`standalone > should generate built-in json template 2`] = ` -"[ - { - "id": "avatar", - "name": "Avatar", - "unicode": ["ea01"] - }, -{ - "id": "envelope", - "name": "Envelope", - "unicode": ["ea02"] - }, -{ - "id": "phone-call", - "name": "Phone Call", - "unicode": ["ea03"] - } -]" -`; - -exports[`standalone > should generate built-in styl template 1`] = ` -"$webfont-avatar = "\\ea01"; -$webfont-envelope = "\\ea02"; -$webfont-phone-call = "\\ea03"; - -@font-face { - font-family: webfont; - - src: url("./webfont.eot"); - src: url("./webfont.eot?#iefix") format("embedded-opentype"), url("./webfont.woff2") format("woff2"), url("./webfont.woff") format("woff"), url("./webfont.ttf") format("truetype"), url("./webfont.svg#webfont") format("svg"); - font-display: block; - font-style: normal; - font-weight: 400; -} - -.webfont { - display: inline-block; - transform: translate(0, 0); - text-rendering: auto; - font: normal normal 400 14px/1 webfont; - font-size: inherit; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; -} - -.webfont-lg { - vertical-align: -15%; - line-height: 0.75em; - font-size: 1.33333333em; -} - -.webfont-2x { - font-size: 2em; -} - -.webfont-3x { - font-size: 3em; -} - -.webfont-4x { - font-size: 4em; -} - -.webfont-5x { - font-size: 5em; -} - -.webfont-fw { - width: 1.28571429em; - text-align: center; -} - -.webfont-avatar::before { - content: $webfont-avatar; -} - -.webfont-envelope::before { - content: $webfont-envelope; -} - -.webfont-phone-call::before { - content: $webfont-phone-call; -} -" -`; - -exports[`standalone > should generate only \`woff\` and \`woff2\` fonts with build-in template 1`] = ` -"@font-face { - font-display: auto; - font-family: "webfont"; - font-style: normal; - font-weight: 400; - - - src: url("./webfont.woff2?test") format("woff2"), url("./webfont.woff?test") format("woff"); -} - -.webfont { - display: inline-block; - font-family: "webfont"; - font-weight: 400; - font-style: normal; - font-variant: normal; - text-rendering: auto; - line-height: 1; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; -} - -.webfont-lg { - font-size: 1.33333em; - line-height: 0.75em; - vertical-align: -0.0667em; -} - -.webfont-xs { - font-size: 0.75em; -} - -.webfont-sm { - font-size: 0.875em; -} - -.webfont-1x { - font-size: 1em; -} - -.webfont-2x { - font-size: 2em; -} - -.webfont-3x { - font-size: 3em; -} - -.webfont-4x { - font-size: 4em; -} - -.webfont-5x { - font-size: 5em; -} - -.webfont-6x { - font-size: 6em; -} - -.webfont-7x { - font-size: 7em; -} - -.webfont-8x { - font-size: 8em; -} - -.webfont-9x { - font-size: 9em; -} - -.webfont-10x { - font-size: 10em; -} - -.webfont-fw { - text-align: center; - width: 1.25em; -} - -.webfont-border { - border: solid 0.08em #eee; - border-radius: 0.1em; - padding: 0.2em 0.25em 0.15em; -} - -.webfont-pull-left { - float: left; -} - -.webfont-pull-right { - float: right; -} - -.webfont.webfont-pull-left { - margin-right: 0.3em; -} - -.webfont.webfont-pull-right { - margin-left: 0.3em; -} - - -.webfont-avatar::before { - content: "\\ea01"; -} - -.webfont-envelope::before { - content: "\\ea02"; -} - -.webfont-phone-call::before { - content: "\\ea03"; -} - -" -`; - -exports[`standalone > should include font hash in template URLs when addHashInFontUrl is enabled 1`] = ` -"@font-face { - font-display: auto; - font-family: "webfont"; - font-style: normal; - font-weight: 400; - - - src: url("./webfont.woff2?test&v=ead2b6f69fc603bf1cbd00bf9f8a8a33") format("woff2"); -} - -.webfont { - display: inline-block; - font-family: "webfont"; - font-weight: 400; - font-style: normal; - font-variant: normal; - text-rendering: auto; - line-height: 1; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; -} - -.webfont-lg { - font-size: 1.33333em; - line-height: 0.75em; - vertical-align: -0.0667em; -} - -.webfont-xs { - font-size: 0.75em; -} - -.webfont-sm { - font-size: 0.875em; -} - -.webfont-1x { - font-size: 1em; -} - -.webfont-2x { - font-size: 2em; -} - -.webfont-3x { - font-size: 3em; -} - -.webfont-4x { - font-size: 4em; -} - -.webfont-5x { - font-size: 5em; -} - -.webfont-6x { - font-size: 6em; -} - -.webfont-7x { - font-size: 7em; -} - -.webfont-8x { - font-size: 8em; -} - -.webfont-9x { - font-size: 9em; -} - -.webfont-10x { - font-size: 10em; -} - -.webfont-fw { - text-align: center; - width: 1.25em; -} - -.webfont-border { - border: solid 0.08em #eee; - border-radius: 0.1em; - padding: 0.2em 0.25em 0.15em; -} - -.webfont-pull-left { - float: left; -} - -.webfont-pull-right { - float: right; -} - -.webfont.webfont-pull-left { - margin-right: 0.3em; -} - -.webfont.webfont-pull-right { - margin-left: 0.3em; -} - - -.webfont-avatar::before { - content: "\\ea01"; -} - -.webfont-envelope::before { - content: "\\ea02"; -} - -.webfont-phone-call::before { - content: "\\ea03"; -} - -" -`; - -exports[`standalone > should load config and respect \`template\` option with build-in template value 1`] = ` -" - $webfont-avatar: "\\ea01"; - - $webfont-envelope: "\\ea02"; - - $webfont-phone-call: "\\ea03"; - - -@font-face { - font-display: block; - font-family: "webfont"; - font-style: normal; - font-weight: 400; - - src: url("./webfont.eot?test"); - src: url("./webfont.eot?#iefix") format("embedded-opentype"), url("./webfont.woff2?test") format("woff2"), url("./webfont.woff?test") format("woff"), url("./webfont.ttf?test") format("truetype"), url("./webfont.svg?test#webfont") format("svg"); -} - -%webfont { -display: inline-block; - font-family: "webfont"; - font-weight: 400; - font-style: normal; - font-variant: normal; - text-rendering: auto; - line-height: 1; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; -} - -.webfont { - @extend %webfont; -} - -.webfont-lg { - font-size: 1.33333em; - line-height: 0.75em; - vertical-align: -0.0667em; -} - -.webfont-xs { - font-size: 0.75em; -} - -.webfont-sm { - font-size: 0.875em; -} - -.webfont-1x { - font-size: 1em; -} - -.webfont-2x { - font-size: 2em; -} - -.webfont-3x { - font-size: 3em; -} - -.webfont-4x { - font-size: 4em; -} - -.webfont-5x { - font-size: 5em; -} - -.webfont-6x { - font-size: 6em; -} - -.webfont-7x { - font-size: 7em; -} - -.webfont-8x { - font-size: 8em; -} - -.webfont-9x { - font-size: 9em; -} - -.webfont-10x { - font-size: 10em; -} - -.webfont-fw { - text-align: center; - width: 1.25em; -} - -.webfont-border { - border: solid 0.08em #eee; - border-radius: 0.1em; - padding: 0.2em 0.25em 0.15em; -} - -.webfont-pull-left { - float: left; -} - -.webfont-pull-right { - float: right; -} - -.webfont.webfont-pull-left { - margin-right: 0.3em; -} - -.webfont.webfont-pull-right { - margin-left: 0.3em; -} - - -.webfont-avatar::before { - content: "\\ea01"; -} - -.webfont-envelope::before { - content: "\\ea02"; -} - -.webfont-phone-call::before { - content: "\\ea03"; -} - -" -`; - -exports[`standalone > should load config and respect \`template\` option with external template value 1`] = ` -"/* custom template */ -@font-face { - font-family: webfont; - src: url("./webfont.eot?test"); - src: - url("./webfont.eot?#iefix") format("embedded-opentype"), - url("./webfont.woff2?test") format("woff2"), - url("./webfont.woff?test") format("woff"), - url("./webfont.ttf?test") format("truetype"), - url("./webfont.svg?test#webfont") format("svg"); - font-style: normal; - font-weight: 400; -} - -.webfont { - display: inline-block; - transform: translate(0, 0); - text-rendering: auto; - font: normal normal 400 14px/1 webfont; - font-size: inherit; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; -} - -.webfont-lg { - vertical-align: -15%; - line-height: 0.75em; - font-size: 1.33333333em; -} - -.webfont-2x { - font-size: 2em; -} - -.webfont-3x { - font-size: 3em; -} - -.webfont-4x { - font-size: 4em; -} - -.webfont-5x { - font-size: 5em; -} - -.webfont-fw { - width: 1.28571429em; - text-align: center; -} - -.webfont-avatar::before { - content: "\\ea01"; -} - -.webfont-envelope::before { - content: "\\ea02"; -} - -.webfont-phone-call::before { - content: "\\ea03"; -} -" -`; - -exports[`standalone > should respect \`template\` options 1`] = ` -"@font-face { - font-display: auto; - font-family: "bar"; - font-style: normal; - font-weight: 400; - - src: url("./foo-bar/webfont.eot?test"); - src: url("./foo-bar/webfont.eot?#iefix") format("embedded-opentype"), url("./foo-bar/webfont.woff2?test") format("woff2"), url("./foo-bar/webfont.woff?test") format("woff"), url("./foo-bar/webfont.ttf?test") format("truetype"), url("./foo-bar/webfont.svg?test#webfont") format("svg"); -} - -.foo { - display: inline-block; - font-family: "bar"; - font-weight: 400; - font-style: normal; - font-variant: normal; - text-rendering: auto; - line-height: 1; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; -} - -.foo-lg { - font-size: 1.33333em; - line-height: 0.75em; - vertical-align: -0.0667em; -} - -.foo-xs { - font-size: 0.75em; -} - -.foo-sm { - font-size: 0.875em; -} - -.foo-1x { - font-size: 1em; -} - -.foo-2x { - font-size: 2em; -} - -.foo-3x { - font-size: 3em; -} - -.foo-4x { - font-size: 4em; -} - -.foo-5x { - font-size: 5em; -} - -.foo-6x { - font-size: 6em; -} - -.foo-7x { - font-size: 7em; -} - -.foo-8x { - font-size: 8em; -} - -.foo-9x { - font-size: 9em; -} - -.foo-10x { - font-size: 10em; -} - -.foo-fw { - text-align: center; - width: 1.25em; -} - -.foo-border { - border: solid 0.08em #eee; - border-radius: 0.1em; - padding: 0.2em 0.25em 0.15em; -} - -.foo-pull-left { - float: left; -} - -.foo-pull-right { - float: right; -} - -.foo.foo-pull-left { - margin-right: 0.3em; -} - -.foo.foo-pull-right { - margin-left: 0.3em; -} - - -.foo-avatar::before { - content: "\\ea01"; -} - -.foo-envelope::before { - content: "\\ea02"; -} - -.foo-phone-call::before { - content: "\\ea03"; -} - -" -`; diff --git a/packages/webfont/src/standalone/convertTtfInput.test.ts b/packages/webfont/src/standalone/convertTtfInput.test.ts deleted file mode 100644 index 164c1f3d..00000000 --- a/packages/webfont/src/standalone/convertTtfInput.test.ts +++ /dev/null @@ -1,156 +0,0 @@ -import * as fsPromise from "fs/promises"; -import isSvg from "is-svg"; -import isTtf from "is-ttf"; -import isWoff2 from "is-woff2"; -import { vi } from "vitest"; -import { encodeTtfToWoff2 } from "../lib/ttfEncode"; -import type { WebfontOptions } from "../types/WebfontOptions"; -import { convertTtfInput } from "./convertTtfInput"; - -const fixtureTtf = "src/fixtures/fonts/iconfont.ttf"; - -describe("convertTtfInput", () => { - it("should reject template option", async () => { - await expect( - convertTtfInput([fixtureTtf], { - files: fixtureTtf, - formats: ["woff2"], - template: "css", - } as WebfontOptions), - ).rejects.toThrow("Templates are not supported when converting TTF input"); - }); - - it("should reject glyphTransformFn option", async () => { - await expect( - convertTtfInput([fixtureTtf], { - files: fixtureTtf, - formats: ["woff2"], - glyphTransformFn: async () => ({ name: "x", unicode: [] }), - } as unknown as WebfontOptions), - ).rejects.toThrow("glyphTransformFn is not supported when converting TTF input"); - }); - - it("should reject glyphContentTransformFn option", async () => { - await expect( - convertTtfInput([fixtureTtf], { - files: fixtureTtf, - formats: ["woff2"], - glyphContentTransformFn: async () => "", - } as unknown as WebfontOptions), - ).rejects.toThrow("glyphContentTransformFn is not supported when converting TTF input"); - }); - - it("should reject empty font file list", async () => { - await expect( - convertTtfInput([], { - files: fixtureTtf, - formats: ["woff2"], - } as WebfontOptions), - ).rejects.toThrow("No TTF files matched"); - }); - - it("should reject invalid ttf bytes", async () => { - const invalidPath = "temp/invalid.ttf"; - - await fsPromise.mkdir("temp", { recursive: true }); - await fsPromise.writeFile(invalidPath, "not a font"); - - try { - await expect( - convertTtfInput([invalidPath], { - files: invalidPath, - formats: ["woff2"], - } as WebfontOptions), - ).rejects.toThrow(`Input is not a valid TrueType font: ${invalidPath}`); - } finally { - await fsPromise.rm(invalidPath, { force: true }); - } - }); - - it("should reject remote ttf URLs with a clear error", async () => { - const remoteUrl = "https://cdn.example.com/fonts/iconfont.ttf"; - - await expect( - convertTtfInput([remoteUrl], { - files: remoteUrl, - formats: ["woff2"], - } as WebfontOptions), - ).rejects.toThrow(`Remote TTF URLs are not supported. Download the file first: ${remoteUrl}`); - }); - - it("should log verbose progress when encoding", async () => { - const logSpy = vi.spyOn(console, "log").mockImplementation(vi.fn()); - - try { - await convertTtfInput([fixtureTtf], { - files: fixtureTtf, - formats: ["woff2"], - verbose: true, - } as WebfontOptions); - - expect(logSpy).toHaveBeenCalledWith(`Encoding ${fixtureTtf}...`); - } finally { - logSpy.mockRestore(); - } - }); - - it("should mirror single-input outputs on result top level", async () => { - const result = await convertTtfInput([fixtureTtf], { - files: fixtureTtf, - formats: ["ttf", "woff2"], - } as WebfontOptions); - - expect(isTtf(result.ttf)).toBe(true); - expect(isWoff2(result.woff2)).toBe(true); - expect(result.transcodedFonts).toHaveLength(1); - }); - - it("should encode ttf input to a valid svg font when requested", async () => { - const result = await convertTtfInput([fixtureTtf], { - files: fixtureTtf, - formats: ["svg"], - } as WebfontOptions); - - expect(typeof result.svg).toBe("string"); - expect(isSvg(result.svg as string)).toBe(true); - expect(result.transcodedFonts?.[0]?.svg).toBe(result.svg); - }); - - it("should not emit svg unless it is requested", async () => { - const result = await convertTtfInput([fixtureTtf], { - files: fixtureTtf, - formats: ["woff2"], - } as WebfontOptions); - - expect(result.svg).toBeUndefined(); - expect(result.transcodedFonts?.[0]?.svg).toBeUndefined(); - }); - - it("should encode svg for every input in a batch run", async () => { - const result = await convertTtfInput([fixtureTtf, fixtureTtf], { - files: [fixtureTtf, fixtureTtf], - formats: ["svg"], - } as WebfontOptions); - - expect(result.svg).toBeUndefined(); - expect(result.transcodedFonts).toHaveLength(2); - expect(result.transcodedFonts?.every((font) => isSvg(font.svg as string))).toBe(true); - }); - - it("should not mirror top-level outputs for batch runs", async () => { - const result = await convertTtfInput([fixtureTtf, fixtureTtf], { - files: [fixtureTtf, fixtureTtf], - formats: ["woff2"], - } as WebfontOptions); - - expect(result.woff2).toBeUndefined(); - expect(result.transcodedFonts).toHaveLength(2); - }); - - it("should document shared ttf encoder output", async () => { - const ttf = await fsPromise.readFile(fixtureTtf); - const encoded = await encodeTtfToWoff2(ttf); - - expect(isWoff2(encoded)).toBe(true); - }); -}); diff --git a/packages/webfont/src/standalone/convertTtfInput.ts b/packages/webfont/src/standalone/convertTtfInput.ts deleted file mode 100644 index d3239863..00000000 --- a/packages/webfont/src/standalone/convertTtfInput.ts +++ /dev/null @@ -1,132 +0,0 @@ -import * as fsPromise from "fs/promises"; -import { isHttpUrl } from "../lib/inputSourceUtils"; -import { getSfntFlavor } from "../lib/sfnt/flavor"; -import { encodeTtfToEot, encodeTtfToSvg, encodeTtfToWoff, encodeTtfToWoff2 } from "../lib/ttfEncode"; -import type { Result } from "../types/Result"; -import type { TranscodedFont } from "../types/TranscodedFont"; -import type { WebfontOptions } from "../types/WebfontOptions"; -import { resolveTtfConversionFormats, type TtfEncodeFormat } from "./inputMode"; - -const assertNonEmptyFontFiles = (fontFiles: readonly string[]): void => { - if (fontFiles.length === 0) { - throw new Error("No TTF files matched"); - } -}; - -const assertConversionOptions = (options: WebfontOptions): void => { - if (options.template) { - throw new Error("Templates are not supported when converting TTF input"); - } - - if (options.glyphTransformFn) { - throw new Error("glyphTransformFn is not supported when converting TTF input"); - } - - if (options.glyphContentTransformFn) { - throw new Error("glyphContentTransformFn is not supported when converting TTF input"); - } -}; - -const assertValidTtfInput = (buffer: Buffer, source: string): void => { - let flavor: ReturnType; - - try { - flavor = getSfntFlavor(buffer); - } catch { - throw new Error(`Input is not a valid TrueType font: ${source}`); - } - - if (flavor !== "ttf") { - throw new Error(`OpenType (OTF) input is not supported for webfont encoding. Use a .ttf file for ${source}.`); - } -}; - -const resolveMetadata = (options: WebfontOptions): string | undefined => { - if (typeof options.metadata === "string") { - return options.metadata; - } - - return undefined; -}; - -const assignTtfOutput = async ( - transcoded: TranscodedFont, - buffer: Buffer, - format: TtfEncodeFormat, - options: WebfontOptions, -): Promise => { - if (format === "ttf") { - transcoded.ttf = buffer; - return; - } - - if (format === "svg") { - transcoded.svg = encodeTtfToSvg(buffer, { metadata: resolveMetadata(options) }); - return; - } - - if (format === "eot") { - transcoded.eot = encodeTtfToEot(buffer); - return; - } - - if (format === "woff") { - transcoded.woff = encodeTtfToWoff(buffer, { metadata: resolveMetadata(options) }); - return; - } - - transcoded.woff2 = await encodeTtfToWoff2(buffer); -}; - -const transcodeTtfSource = async ( - source: string, - formats: TtfEncodeFormat[], - options: WebfontOptions, - verbose?: boolean, -): Promise => { - if (isHttpUrl(source)) { - throw new Error(`Remote TTF URLs are not supported. Download the file first: ${source}`); - } - - if (verbose) { - // biome-ignore lint/suspicious/noConsole: verbose conversion progress - console.log(`Encoding ${source}...`); - } - - const buffer = await fsPromise.readFile(source); - - assertValidTtfInput(buffer, source); - - const transcoded: TranscodedFont = { source }; - - await Promise.all(formats.map((format) => assignTtfOutput(transcoded, buffer, format, options))); - - return transcoded; -}; - -export const convertTtfInput = async (fontFiles: readonly string[], options: WebfontOptions): Promise => { - assertConversionOptions(options); - assertNonEmptyFontFiles(fontFiles); - - const formats = resolveTtfConversionFormats(options.formats); - const transcodedFonts = await Promise.all( - fontFiles.map((source) => transcodeTtfSource(source, formats, options, options.verbose)), - ); - - const result: Result = { - config: { ...options }, - transcodedFonts, - }; - - if (transcodedFonts.length === 1) { - const [single] = transcodedFonts; - - result.svg = single.svg; - result.ttf = single.ttf; - result.eot = single.eot; - result.woff = single.woff; - result.woff2 = single.woff2; - } - - return result; -}; diff --git a/packages/webfont/src/standalone/convertWebfontInput.test.ts b/packages/webfont/src/standalone/convertWebfontInput.test.ts deleted file mode 100644 index 53d0176b..00000000 --- a/packages/webfont/src/standalone/convertWebfontInput.test.ts +++ /dev/null @@ -1,154 +0,0 @@ -vi.mock("fontverter", () => ({ - default: { - convert: vi.fn(), - }, -})); - -import fontverter from "fontverter"; -import * as fsPromise from "fs/promises"; -import isTtf from "is-ttf"; -import { getSfntFlavor } from "../lib/sfnt/flavor"; -import type { WebfontOptions } from "../types/WebfontOptions"; -import { convertWebfontInput } from "./convertWebfontInput"; -import { getOptions } from "./options"; - -const mockedConvert = vi.mocked(fontverter.convert); - -const fixtureTtf = "src/fixtures/fonts/iconfont.ttf"; -const fixtureWoff = "src/fixtures/fonts/iconfont.woff"; -const fixtureWoff2 = "src/fixtures/fonts/iconfont.woff2"; - -const getConversionOptions = (overrides: Partial = {}): WebfontOptions => ({ - ...getOptions({ files: fixtureWoff2, formats: ["ttf"] }), - ...overrides, -}); - -describe("convertWebfontInput", () => { - beforeEach(() => { - mockedConvert.mockReset(); - }); - - it("should decompress woff2 input to ttf output", async () => { - const sfnt = await fsPromise.readFile(fixtureTtf); - mockedConvert.mockResolvedValue(sfnt); - - const result = await convertWebfontInput([fixtureWoff2], getConversionOptions()); - - expect(mockedConvert).toHaveBeenCalledWith(expect.any(Buffer), "sfnt"); - expect(result.ttf).toBeDefined(); - expect(isTtf(result.ttf)).toBe(true); - expect(result.otf).toBeUndefined(); - }); - - it("should decompress woff input to ttf output", async () => { - const sfnt = await fsPromise.readFile(fixtureTtf); - mockedConvert.mockResolvedValue(sfnt); - - const result = await convertWebfontInput([fixtureWoff], getConversionOptions()); - - expect(result.ttf).toEqual(sfnt); - }); - - it("should emit otf output when the sfnt flavor is OpenType", async () => { - const otto = Buffer.alloc(8); - otto.writeUInt32BE(0x4f_54_54_4f, 0); - mockedConvert.mockResolvedValue(otto); - - const result = await convertWebfontInput([fixtureWoff2], getConversionOptions({ formats: ["otf"] })); - - expect(getSfntFlavor(otto)).toBe("otf"); - expect(result.otf).toEqual(otto); - expect(result.ttf).toBeUndefined(); - }); - - it("should reject ttf output when the sfnt flavor is OpenType", async () => { - const otto = Buffer.alloc(8); - otto.writeUInt32BE(0x4f_54_54_4f, 0); - mockedConvert.mockResolvedValue(otto); - - await expect(convertWebfontInput([fixtureWoff2], getConversionOptions({ formats: ["ttf"] }))).rejects.toThrow( - 'Input decompresses to OpenType (OTF). Request "otf" format instead of "ttf" for src/fixtures/fonts/iconfont.woff2.', - ); - }); - - it("should reject otf output when the sfnt flavor is TrueType", async () => { - const sfnt = await fsPromise.readFile(fixtureTtf); - mockedConvert.mockResolvedValue(sfnt); - - await expect(convertWebfontInput([fixtureWoff2], getConversionOptions({ formats: ["otf"] }))).rejects.toThrow( - 'Input decompresses to TrueType (TTF). Request "ttf" format instead of "otf" for src/fixtures/fonts/iconfont.woff2.', - ); - }); - - it("should reject empty font file lists", async () => { - await expect(convertWebfontInput([], getConversionOptions())).rejects.toThrow( - "No WOFF or WOFF2 files matched", - ); - }); - - it("should decompress multiple webfont files in one conversion run", async () => { - const sfnt = await fsPromise.readFile(fixtureTtf); - mockedConvert.mockResolvedValue(sfnt); - - const result = await convertWebfontInput([fixtureWoff, fixtureWoff2], getConversionOptions()); - - expect(result.decompressedFonts).toHaveLength(2); - expect(result.decompressedFonts?.[0].source).toBe(fixtureWoff); - expect(result.decompressedFonts?.[1].source).toBe(fixtureWoff2); - expect(result.decompressedFonts?.[0].ttf).toBeDefined(); - expect(result.decompressedFonts?.[1].ttf).toBeDefined(); - expect(result.ttf).toBeUndefined(); - expect(result.otf).toBeUndefined(); - }); - - it("should keep single-file ttf and otf on the result root for backward compatibility", async () => { - const sfnt = await fsPromise.readFile(fixtureTtf); - mockedConvert.mockResolvedValue(sfnt); - - const result = await convertWebfontInput([fixtureWoff2], getConversionOptions()); - - expect(result.decompressedFonts).toHaveLength(1); - expect(result.ttf).toEqual(sfnt); - }); - - it("should reject template rendering for webfont conversion", async () => { - await expect(convertWebfontInput([fixtureWoff2], getConversionOptions({ template: "css" }))).rejects.toThrow( - "Templates are not supported when converting WOFF/WOFF2 input", - ); - }); - - it("should reject glyphTransformFn for webfont conversion", async () => { - await expect( - convertWebfontInput( - [fixtureWoff2], - getConversionOptions({ - glyphTransformFn: async (metadata) => metadata, - }), - ), - ).rejects.toThrow("glyphTransformFn is not supported when converting WOFF/WOFF2 input"); - }); - - it("should reject glyphContentTransformFn for webfont conversion", async () => { - await expect( - convertWebfontInput( - [fixtureWoff2], - getConversionOptions({ - glyphContentTransformFn: async () => "", - }), - ), - ).rejects.toThrow("glyphContentTransformFn is not supported when converting WOFF/WOFF2 input"); - }); - - it("should log verbose progress when verbose is enabled", async () => { - const sfnt = await fsPromise.readFile(fixtureTtf); - mockedConvert.mockResolvedValue(sfnt); - const logSpy = vi.spyOn(console, "log").mockImplementation(() => undefined); - - try { - await convertWebfontInput([fixtureWoff2], getConversionOptions({ verbose: true })); - expect(logSpy).toHaveBeenCalledWith(expect.stringContaining("Decompressing")); - } finally { - logSpy.mockRestore(); - } - }); -}); diff --git a/packages/webfont/src/standalone/convertWebfontInput.ts b/packages/webfont/src/standalone/convertWebfontInput.ts deleted file mode 100644 index cbc57793..00000000 --- a/packages/webfont/src/standalone/convertWebfontInput.ts +++ /dev/null @@ -1,111 +0,0 @@ -import fontverter from "fontverter"; -import * as fsPromise from "fs/promises"; -import { isHttpUrl } from "../lib/inputSourceUtils"; -import { getSfntFlavor } from "../lib/sfnt/flavor"; -import type { DecompressedFont } from "../types/DecompressedFont"; -import type { Result } from "../types/Result"; -import type { WebfontOptions } from "../types/WebfontOptions"; -import { fetchWebfontFromUrl } from "./fetchWebfontUrl"; -import { type ConversionFormat, resolveWebfontConversionFormats } from "./inputMode"; - -const assertNonEmptyFontFiles = (fontFiles: readonly string[]): void => { - if (fontFiles.length === 0) { - throw new Error("No WOFF or WOFF2 files matched"); - } -}; - -const assertConversionOptions = (options: WebfontOptions): void => { - if (options.template) { - throw new Error("Templates are not supported when converting WOFF/WOFF2 input"); - } - - if (options.glyphTransformFn) { - throw new Error("glyphTransformFn is not supported when converting WOFF/WOFF2 input"); - } - - if (options.glyphContentTransformFn) { - throw new Error("glyphContentTransformFn is not supported when converting WOFF/WOFF2 input"); - } -}; - -type AssignSfntOutputOptions = { - decompressed: DecompressedFont; - sfnt: Buffer; - format: ConversionFormat; - flavor: ReturnType; - source: string; -}; - -const assignSfntOutput = (options: AssignSfntOutputOptions): void => { - const { decompressed, sfnt, format, flavor, source } = options; - - if (format === "ttf" && flavor !== "ttf") { - throw new Error(`Input decompresses to OpenType (OTF). Request "otf" format instead of "ttf" for ${source}.`); - } - - if (format === "otf" && flavor !== "otf") { - throw new Error(`Input decompresses to TrueType (TTF). Request "ttf" format instead of "otf" for ${source}.`); - } - - if (format === "ttf") { - decompressed.ttf = sfnt; - return; - } - - decompressed.otf = sfnt; -}; - -const readWebfontInput = (source: string): Promise => { - if (isHttpUrl(source)) { - return fetchWebfontFromUrl(source); - } - - return fsPromise.readFile(source); -}; - -const decompressWebfontSource = async ( - source: string, - formats: ConversionFormat[], - verbose?: boolean, -): Promise => { - if (verbose) { - // biome-ignore lint/suspicious/noConsole: verbose conversion progress - console.log(`Decompressing ${source}...`); - } - - const inputBuffer = await readWebfontInput(source); - const sfnt = Buffer.from(await fontverter.convert(inputBuffer, "sfnt")); - const flavor = getSfntFlavor(sfnt); - const decompressed: DecompressedFont = { source }; - - for (const format of formats) { - assignSfntOutput({ decompressed, sfnt, format, flavor, source }); - } - - return decompressed; -}; - -export const convertWebfontInput = async ( - fontFiles: readonly string[], - options: WebfontOptions, -): Promise => { - assertConversionOptions(options); - assertNonEmptyFontFiles(fontFiles); - - const formats = resolveWebfontConversionFormats(options.formats); - const decompressedFonts = await Promise.all( - fontFiles.map((source) => decompressWebfontSource(source, formats, options.verbose)), - ); - - const result: Result = { - config: { ...options }, - decompressedFonts, - }; - - if (decompressedFonts.length === 1) { - result.ttf = decompressedFonts[0].ttf; - result.otf = decompressedFonts[0].otf; - } - - return result; -}; diff --git a/packages/webfont/src/standalone/cosmiconfig.test.ts b/packages/webfont/src/standalone/cosmiconfig.test.ts deleted file mode 100644 index 03fb682a..00000000 --- a/packages/webfont/src/standalone/cosmiconfig.test.ts +++ /dev/null @@ -1,176 +0,0 @@ -import fs from "fs"; -import isWoff2 from "is-woff2"; -import path from "path"; -import standalone from "../standalone"; -import type { InitialOptions } from "../types"; -import type { ResultConfig } from "../types/ResultConfig"; - -type DiscoveredRcConfig = ResultConfig & { foo: string }; - -const fixturesRoot = path.join(__dirname, "../fixtures"); -const svgFiles = path.join(fixturesRoot, "svg-icons/*.svg"); -const discoveryRoot = path.join(fixturesRoot, "config-discovery"); -const configsRoot = path.join(fixturesRoot, "configs"); - -const withCwd = async (cwd: string, fn: () => Promise): Promise => { - const originalCwd = process.cwd(); - process.chdir(cwd); - - try { - return await fn(); - } finally { - process.chdir(originalCwd); - } -}; - -describe("cosmiconfig", () => { - describe("search", () => { - it("should discover .webfontrc.json in the working directory", async () => { - await withCwd(path.join(discoveryRoot, "json"), async () => { - const result = await standalone({ files: svgFiles }); - - expect(result.config?.fontName).toBe("config-json-rc"); - expect(result.config?.filePath).toMatch(/\.webfontrc\.json$/u); - expect(isWoff2(result.woff2)).toBe(true); - }); - }); - - it("should discover .webfontrc.yaml in the working directory", async () => { - await withCwd(path.join(discoveryRoot, "yaml"), async () => { - const result = await standalone({ files: svgFiles }); - - expect(result.config?.fontName).toBe("config-yaml-rc"); - expect(result.config?.filePath).toMatch(/\.webfontrc\.yaml$/u); - expect(isWoff2(result.woff2)).toBe(true); - }); - }); - - it("should discover an advanced .webfontrc.yaml and still generate fonts", async () => { - await withCwd(path.join(discoveryRoot, "yaml-advanced"), async () => { - const result = await standalone({ files: svgFiles }); - - expect(result.config?.fontName).toBe("config-yaml-advanced"); - expect(result.config?.filePath).toMatch(/\.webfontrc\.yaml$/u); - expect(result.config?.formats).toEqual(["woff2"]); - expect(result.config?.templateFontPath).toBe("./assets/fonts/"); - // cosmiconfig v7 (`yaml` package) preserves YAML 1.1 truthy scalars as strings. - expect(result.config?.sort).toBe("yes"); - expect(result.config?.ligatures).toBe(false); - expect(result.config?.normalize).toBe("on"); - expect(result.config?.round).toBe(2); - // Alias-resolved keys are carried through in the effective config but are not - // part of the static ResultConfig type; widen the view instead of suppressing. - const aliasedConfig = result.config as - | (ResultConfig & { displayName?: string; alsoFormats?: string[]; extraFormats?: string[] }) - | undefined; - expect(aliasedConfig?.displayName).toBe("config-yaml-advanced"); - expect(aliasedConfig?.alsoFormats).toEqual(["woff2"]); - expect(aliasedConfig?.extraFormats).toEqual(["woff2"]); - expect(isWoff2(result.woff2)).toBe(true); - }); - }); - - it("should discover .webfontrc.js in the working directory", async () => { - await withCwd(path.join(discoveryRoot, "js-rc"), async () => { - const result = await standalone({ files: svgFiles }); - - expect(result.config?.fontName).toBe("config-rc-js"); - expect(result.config?.filePath).toMatch(/\.webfontrc\.js$/u); - expect(isWoff2(result.woff2)).toBe(true); - }); - }); - - it("should discover webfont.config.js in the working directory", async () => { - await withCwd(path.join(discoveryRoot, "js-config"), async () => { - const result = await standalone({ files: svgFiles }); - - expect(result.config?.fontName).toBe("config-webfont-js"); - expect(result.config?.filePath).toMatch(/webfont\.config\.js$/u); - expect(isWoff2(result.woff2)).toBe(true); - }); - }); - - it("should discover the webfont key in package.json", async () => { - await withCwd(path.join(discoveryRoot, "package-json"), async () => { - const result = await standalone({ files: svgFiles }); - - expect(result.config?.fontName).toBe("config-package-json"); - expect(result.config?.filePath).toMatch(/package\.json$/u); - expect(isWoff2(result.woff2)).toBe(true); - }); - }); - - it("should discover config files in a parent directory", async () => { - const nestedDir = path.join(discoveryRoot, "walkup", "nested"); - fs.mkdirSync(nestedDir, { recursive: true }); - - try { - await withCwd(nestedDir, async () => { - const result = await standalone({ files: svgFiles }); - - expect(result.config?.fontName).toBe("config-walkup"); - expect(result.config?.filePath).toMatch(/\.webfontrc\.json$/u); - expect(isWoff2(result.woff2)).toBe(true); - }); - } finally { - fs.rmSync(nestedDir, { recursive: true, force: true }); - } - }); - - it("should not echo filePath on result when no config was discovered", async () => { - // Untyped callers (e.g. plain JS) may pass extra keys; filePath is output-only. - const input = { - files: svgFiles, - formats: ["woff2"], - filePath: "/fake/config/path.json", - } as InitialOptions; - - const result = await standalone(input); - - expect(result.config?.filePath).toBeUndefined(); - }); - - it("should run with defaults when no config is discoverable", async () => { - const emptyDir = path.join("temp", "no-webfont-config"); - fs.mkdirSync(emptyDir, { recursive: true }); - - try { - await withCwd(emptyDir, async () => { - const result = await standalone({ files: svgFiles, formats: ["woff2"] }); - - expect(result.config?.filePath).toBeUndefined(); - expect(result.config?.fontName).toBe("webfont"); - expect(isWoff2(result.woff2)).toBe(true); - }); - } finally { - fs.rmSync(emptyDir, { recursive: true, force: true }); - } - }); - }); - - describe("load via configFile", () => { - it("should export the resolved config path in result.config.filePath", async () => { - const configFile = path.join(configsRoot, ".webfontrc"); - const result = await standalone({ - configFile, - files: svgFiles, - formats: ["woff2"], - }); - - expect(result.config?.filePath).toBe(path.resolve(configFile)); - expect((result.config as DiscoveredRcConfig).foo).toBe("bar"); - }); - - it("should load webfont.config.js via configFile (#480)", async () => { - const configFile = path.join(configsRoot, "webfont.config-cli.js"); - const result = await standalone({ - configFile, - files: svgFiles, - }); - - expect(result.config?.fontName).toBe("cli-config-js-font"); - expect(result.config?.filePath).toBe(path.resolve(configFile)); - expect(isWoff2(result.woff2)).toBe(true); - }); - }); -}); diff --git a/packages/webfont/src/standalone/defaultOptions.ts b/packages/webfont/src/standalone/defaultOptions.ts deleted file mode 100644 index 9da6eb1b..00000000 --- a/packages/webfont/src/standalone/defaultOptions.ts +++ /dev/null @@ -1,34 +0,0 @@ -import type { WebfontOptions } from "../types/WebfontOptions"; - -/** Shared defaults for Node (`files`) and in-memory (`glyphs`) entry points. */ -export const defaultWebfontOptions = (): Omit => - ({ - centerHorizontally: false, - centerVertically: false, - descent: 0, - fixedWidth: false, - fontHeight: undefined, - fontId: undefined, - fontName: "webfont", - fontStyle: "", - fontWeight: "", - formats: ["svg", "ttf", "eot", "woff", "woff2"], - formatsOptions: { - ttf: { - copyright: null, - ts: null, - version: null, - }, - }, - ligatures: false, - maxConcurrency: 100, - metadata: undefined, - normalize: false, - prependUnicode: false, - round: 10e12, - sort: true, - startUnicode: 0xea01, - templateFontPath: "./", - unicodeRange: false, - verbose: false, - }) as Omit; diff --git a/packages/webfont/src/standalone/fetchWebfontUrl.test.ts b/packages/webfont/src/standalone/fetchWebfontUrl.test.ts deleted file mode 100644 index 645cf7e9..00000000 --- a/packages/webfont/src/standalone/fetchWebfontUrl.test.ts +++ /dev/null @@ -1,61 +0,0 @@ -import * as fsPromise from "fs/promises"; -import isWoff2 from "is-woff2"; -import { fetchWebfontFromUrl } from "./fetchWebfontUrl"; - -const fixtureWoff2 = "src/fixtures/fonts/iconfont.woff2"; - -describe("fetchWebfontFromUrl", () => { - afterEach(() => { - vi.unstubAllGlobals(); - }); - - it("should fetch and return a valid woff2 buffer", async () => { - const fixture = await fsPromise.readFile(fixtureWoff2); - - vi.stubGlobal( - "fetch", - vi.fn().mockResolvedValue({ - ok: true, - status: 200, - statusText: "OK", - arrayBuffer: async () => fixture.buffer.slice(fixture.byteOffset, fixture.byteOffset + fixture.byteLength), - }), - ); - - const buffer = await fetchWebfontFromUrl("https://example.com/iconfont.woff2"); - - expect(isWoff2(buffer)).toBe(true); - }); - - it("should reject non-success HTTP responses", async () => { - vi.stubGlobal( - "fetch", - vi.fn().mockResolvedValue({ - ok: false, - status: 404, - statusText: "Not Found", - arrayBuffer: async () => new ArrayBuffer(0), - }), - ); - - await expect(fetchWebfontFromUrl("https://example.com/missing.woff2")).rejects.toThrow( - "Failed to fetch font URL https://example.com/missing.woff2: HTTP 404 Not Found", - ); - }); - - it("should reject responses that are not valid webfont containers", async () => { - vi.stubGlobal( - "fetch", - vi.fn().mockResolvedValue({ - ok: true, - status: 200, - statusText: "OK", - arrayBuffer: async () => Buffer.from("not a font").buffer, - }), - ); - - await expect(fetchWebfontFromUrl("https://example.com/bad.woff2")).rejects.toThrow( - "URL did not return a valid WOFF2 font", - ); - }); -}); diff --git a/packages/webfont/src/standalone/fetchWebfontUrl.ts b/packages/webfont/src/standalone/fetchWebfontUrl.ts deleted file mode 100644 index 79311649..00000000 --- a/packages/webfont/src/standalone/fetchWebfontUrl.ts +++ /dev/null @@ -1,46 +0,0 @@ -import isWoff from "is-woff"; -import isWoff2 from "is-woff2"; -import { getInputExtension } from "../lib/inputSourceUtils"; - -const assertWebfontContainer = (buffer: Buffer, source: string): void => { - const extension = getInputExtension(source); - - if (extension === ".woff2" && !isWoff2(buffer)) { - throw new Error(`URL did not return a valid WOFF2 font: ${source}`); - } - - if (extension === ".woff" && !isWoff(buffer)) { - throw new Error(`URL did not return a valid WOFF font: ${source}`); - } - - if (buffer.length === 0) { - throw new Error(`URL returned an empty response: ${source}`); - } -}; - -export const fetchWebfontFromUrl = async (url: string): Promise => { - let response: Response; - - try { - response = await fetch(url); - } catch (error) { - let message = String(error); - - if (error instanceof Error) { - message = error.message; - } - - throw new Error(`Failed to fetch font URL ${url}: ${message}`); - } - - if (!response.ok) { - throw new Error(`Failed to fetch font URL ${url}: HTTP ${response.status} ${response.statusText}`); - } - - const arrayBuffer = await response.arrayBuffer(); - const buffer = Buffer.from(arrayBuffer); - - assertWebfontContainer(buffer, url); - - return buffer; -}; diff --git a/packages/webfont/src/standalone/generateSvgFont.ts b/packages/webfont/src/standalone/generateSvgFont.ts deleted file mode 100644 index 4190b372..00000000 --- a/packages/webfont/src/standalone/generateSvgFont.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Readable } from "stream"; -import { getFontStreamOptions, SVGIcons2SVGFontStream } from "../lib/svgicons2svgfont"; -import type { GlyphData, GlyphMetadata, WebfontOptions } from "../types"; - -type GlyphReadable = Readable & { metadata: GlyphMetadata }; - -export const generateSvgFont = (glyphsData: GlyphData[], options: WebfontOptions): Promise => { - let result = ""; - - return new Promise((resolve, reject) => { - if (options.verbose) { - // biome-ignore lint/suspicious/noConsole: verbose SVG generation progress - console.log("Generating SVG font..."); - } - - const fontStream = new SVGIcons2SVGFontStream(getFontStreamOptions(options)) - .on("finish", () => resolve(result)) - .on("data", (data) => { - result += data; - }) - .on("error", (error) => reject(error)); - - glyphsData.forEach((glyphData) => { - const glyphStream: GlyphReadable = new Readable() as GlyphReadable; - - glyphStream.push(glyphData.contents); - glyphStream.push(null); - glyphStream.metadata = glyphData.metadata ?? { name: "", unicode: [] }; - - fontStream.write(glyphStream); - }); - - fontStream.end(); - }); -}; diff --git a/packages/webfont/src/standalone/getGlyphsDataFromInputs.ts b/packages/webfont/src/standalone/getGlyphsDataFromInputs.ts deleted file mode 100644 index dee74626..00000000 --- a/packages/webfont/src/standalone/getGlyphsDataFromInputs.ts +++ /dev/null @@ -1,103 +0,0 @@ -import xml2js from "xml2js"; -import pLimit from "../lib/p-limit"; -import { fileSorter, getMetadataServiceOptions } from "../lib/svgicons2svgfont"; -import { createMetadataFromSrcPathService } from "../lib/svgicons2svgfont/metadataFromSrcPath"; -import type { GlyphData, GlyphMetadata, WebfontOptions } from "../types"; -import type { GlyphInput } from "../types/GlyphInput"; -import type { FileMetadata } from "../types/MetadataProvider"; - -const normalizeUnicode = (unicode: string | string[] | undefined): string[] => { - if (unicode === undefined) { - return []; - } - - if (Array.isArray(unicode)) { - return unicode; - } - - return [unicode]; -}; - -const toGlyphMetadata = (metadata: FileMetadata): GlyphMetadata & { unicode: string[] } => ({ - name: metadata.name, - unicode: normalizeUnicode(metadata.unicode), -}); - -const parseSvgContents = (glyphContents: string, srcPath: string): Promise => - new Promise((resolve, reject) => { - if (glyphContents.length === 0) { - reject(new Error(`Empty glyph ${srcPath}`)); - return; - } - - const xmlParser = new xml2js.Parser(); - - xmlParser.parseString(glyphContents, (error: Error | null) => { - if (error) { - reject(error); - return; - } - - resolve(); - }); - }); - -export const getGlyphsDataFromInputs = async ( - inputs: readonly GlyphInput[], - options: WebfontOptions, -): Promise => { - const metadataProvider = - options.metadataProvider || createMetadataFromSrcPathService(getMetadataServiceOptions(options)); - const throttle = pLimit(options.maxConcurrency); - - let glyphsData = await Promise.all( - inputs.map((input, index) => - throttle(async () => { - const srcPath = input.srcPath ?? `glyph-${index + 1}.svg`; - await parseSvgContents(input.contents, srcPath); - - const glyphData: GlyphData = { - contents: input.contents, - srcPath, - }; - - return glyphData; - }), - ), - ); - - if (options.sort) { - glyphsData = [...glyphsData].sort((fileA, fileB) => fileSorter(fileA.srcPath, fileB.srcPath)); - } - - const { ligatures } = options; - - return Promise.all( - glyphsData.map( - (glyphData) => - new Promise((resolve, reject) => { - metadataProvider(glyphData.srcPath, (error, metadata) => { - if (error) { - reject(error); - return; - } - - if (!metadata) { - reject(new Error(`Missing metadata for ${glyphData.srcPath}`)); - return; - } - - const glyphMetadata = toGlyphMetadata(metadata); - - if (ligatures) { - glyphMetadata.unicode.push(metadata.name.replace(/-/gu, "_")); - } - - glyphData.metadata = glyphMetadata; - - resolve(glyphData); - }); - }), - ), - ); -}; diff --git a/packages/webfont/src/standalone/glyphsData.test.ts b/packages/webfont/src/standalone/glyphsData.test.ts deleted file mode 100644 index 4780178c..00000000 --- a/packages/webfont/src/standalone/glyphsData.test.ts +++ /dev/null @@ -1,381 +0,0 @@ -import fs, { createReadStream } from "fs"; -import * as fsPromise from "fs/promises"; -import path from "path"; -import xml2js from "xml2js"; -import type { GlyphData, WebfontOptions } from "../types"; -import { getGlyphsData } from "./glyphsData"; -import { getOptions } from "./options"; - -const fsMocks = vi.hoisted(() => ({ - actualCreateReadStream: null as typeof import("fs").createReadStream | null, -})); - -vi.mock("fs", async (importOriginal) => { - const actual = await importOriginal(); - fsMocks.actualCreateReadStream = actual.createReadStream; - const createReadStreamMock = vi.fn(actual.createReadStream); - const mocked = { - ...actual, - createReadStream: createReadStreamMock, - }; - - return { - ...mocked, - default: mocked, - }; -}); - -const getActualCreateReadStream = (): typeof import("fs").createReadStream => { - if (fsMocks.actualCreateReadStream === null) { - throw new Error("fs mock not initialized"); - } - - return fsMocks.actualCreateReadStream; -}; - -const fixturesDir = path.join(__dirname, "../fixtures/svg-icons"); -const badFixturesDir = path.join(__dirname, "../fixtures/bad-svg-icons"); -const emptySvgFile = path.join(badFixturesDir, "avatar-3.svg"); -const malformedXmlFile = path.join(badFixturesDir, "avatar.svg"); -const wellFormedXmlFile = path.join(badFixturesDir, "avatar-1.svg"); -const protoElementSvgFile = path.join(badFixturesDir, "proto-element.svg"); -const pollutionMarker = "webfontXml2jsPollutionMarker"; - -const deletePollutionMarker = (): void => { - delete (Object.prototype as Record)[pollutionMarker]; -}; - -const parseWithXml2js = (input: string): Promise<{ error: Error | null; result: unknown }> => - new Promise((resolve) => { - new xml2js.Parser().parseString(input, (error, result) => { - resolve({ error, result }); - }); - }); -const svgFiles = [ - path.join(fixturesDir, "avatar.svg"), - path.join(fixturesDir, "envelope.svg"), - path.join(fixturesDir, "phone-call.svg"), -]; - -const getTestOptions = (maxConcurrency: number, overrides: Partial = {}): WebfontOptions => ({ - ...getOptions({ - files: "unused", - ligatures: false, - sort: false, - }), - maxConcurrency, - ...overrides, -}); - -describe("glyphsData", () => { - it("should load glyph contents and metadata for each svg file", async () => { - const glyphsData = (await getGlyphsData(svgFiles, getTestOptions(2))) as GlyphData[]; - - expect(glyphsData).toHaveLength(svgFiles.length); - expect(glyphsData.map((glyph) => glyph.srcPath).sort()).toEqual([...svgFiles].sort()); - - glyphsData.forEach((glyph) => { - expect(glyph.contents).toContain(" { - const maxConcurrency = 2; - let activeReads = 0; - let maxObservedConcurrency = 0; - const createReadStreamSpy = vi.mocked(createReadStream).mockImplementation((...args) => { - activeReads += 1; - maxObservedConcurrency = Math.max(maxObservedConcurrency, activeReads); - - const stream = getActualCreateReadStream().apply(fs, args); - - const release = (): void => { - activeReads -= 1; - }; - - // P-limit frees a slot when the read promise resolves on "end", not on "close". - stream.once("end", release); - stream.once("error", release); - - return stream; - }); - - try { - const glyphsData = (await getGlyphsData(svgFiles, getTestOptions(maxConcurrency))) as GlyphData[]; - - expect(glyphsData).toHaveLength(svgFiles.length); - expect(maxObservedConcurrency).toBeLessThanOrEqual(maxConcurrency); - expect(maxObservedConcurrency).toBeGreaterThan(1); - } finally { - createReadStreamSpy.mockImplementation(getActualCreateReadStream()); - } - }); - - it("should reject when createReadStream emits an error", async () => { - const readError = new Error("read failed"); - const createReadStreamSpy = vi.mocked(createReadStream).mockImplementation(() => { - const stream = getActualCreateReadStream()(emptySvgFile); - - stream.destroy(readError); - - return stream; - }); - - try { - await expect(getGlyphsData([svgFiles[0]], getTestOptions(1))).rejects.toThrow("read failed"); - } finally { - createReadStreamSpy.mockImplementation(getActualCreateReadStream()); - } - }); - - it("should process svg files sequentially when maxConcurrency is 1", async () => { - let activeReads = 0; - let maxObservedConcurrency = 0; - const createReadStreamSpy = vi.mocked(createReadStream).mockImplementation((...args) => { - activeReads += 1; - maxObservedConcurrency = Math.max(maxObservedConcurrency, activeReads); - - const stream = getActualCreateReadStream().apply(fs, args); - - const release = (): void => { - activeReads -= 1; - }; - - stream.once("end", release); - stream.once("error", release); - - return stream; - }); - - try { - const glyphsData = (await getGlyphsData(svgFiles, getTestOptions(1))) as GlyphData[]; - - expect(glyphsData).toHaveLength(svgFiles.length); - expect(maxObservedConcurrency).toBe(1); - } finally { - createReadStreamSpy.mockImplementation(getActualCreateReadStream()); - } - }); - - it("should sort glyphs when sort is enabled", async () => { - const glyphsData = (await getGlyphsData(svgFiles, getTestOptions(2, { sort: true }))) as GlyphData[]; - - expect(glyphsData.map((glyph) => path.basename(glyph.srcPath))).toEqual([ - "avatar.svg", - "envelope.svg", - "phone-call.svg", - ]); - }); - - it("should add ligature unicode when ligatures is enabled", async () => { - const glyphsData = (await getGlyphsData( - svgFiles.slice(0, 1), - getTestOptions(1, { ligatures: true }), - )) as GlyphData[]; - - expect(glyphsData[0].metadata?.unicode?.length).toBeGreaterThan(1); - expect(glyphsData[0].metadata?.unicode).toContain("avatar"); - }); - - it("should normalize string unicode values from metadata provider", async () => { - const glyphsData = (await getGlyphsData(svgFiles.slice(0, 1), { - ...getTestOptions(1), - metadataProvider: (_srcPath, callback) => { - callback(null, { name: "custom-glyph", unicode: "\u0001" }); - }, - })) as GlyphData[]; - - expect(glyphsData[0].metadata?.unicode).toEqual(["\u0001"]); - }); - - it("should normalize metadata without unicode values", async () => { - const glyphsData = (await getGlyphsData(svgFiles.slice(0, 1), { - ...getTestOptions(1), - metadataProvider: (_srcPath, callback) => { - callback(null, { name: "no-unicode-glyph" }); - }, - })) as GlyphData[]; - - expect(glyphsData[0].metadata?.unicode).toEqual([]); - }); - - it("should use a custom metadataProvider when provided", async () => { - const metadataProvider = vi.fn((_srcPath, callback) => { - callback(null, { name: "custom-glyph", unicode: ["\u0001"] }); - }); - - const glyphsData = (await getGlyphsData(svgFiles.slice(0, 1), { - ...getTestOptions(1), - metadataProvider, - })) as GlyphData[]; - - expect(metadataProvider).toHaveBeenCalled(); - expect(glyphsData[0].metadata?.name).toBe("custom-glyph"); - expect(glyphsData[0].metadata?.unicode).toEqual(["\u0001"]); - }); - - it("should reject when metadata provider returns no metadata", async () => { - await expect( - getGlyphsData(svgFiles.slice(0, 1), { - ...getTestOptions(1), - metadataProvider: (_srcPath, callback) => { - callback(null, undefined); - }, - }), - ).rejects.toThrow(`Missing metadata for ${svgFiles[0]}`); - }); - - it("should reject when metadata provider returns an error", async () => { - await expect( - getGlyphsData(svgFiles.slice(0, 1), { - ...getTestOptions(1), - metadataProvider: (_srcPath, callback) => { - callback(new Error("metadata failed"), undefined); - }, - }), - ).rejects.toThrow("metadata failed"); - }); - - it("should reject when svg file read fails", async () => { - const createReadStreamSpy = vi.mocked(createReadStream).mockImplementation((...args) => { - const stream = getActualCreateReadStream().apply(fs, args); - stream.emit("error", new Error("read failed")); - return stream; - }); - - try { - await expect(getGlyphsData(svgFiles.slice(0, 1), getTestOptions(1))).rejects.toThrow("read failed"); - } finally { - createReadStreamSpy.mockImplementation(getActualCreateReadStream()); - } - }); - - describe("svg xml validation via xml2js", () => { - it("should document that xml2js accepts empty input without error (requires explicit empty-file guard)", async () => { - const { error, result } = await parseWithXml2js(""); - - expect(error).toBeNull(); - expect(result).toBeNull(); - }); - - it("should document that xml2js rejects malformed xml", async () => { - const contents = await fsPromise.readFile(malformedXmlFile, "utf8"); - const { error } = await parseWithXml2js(contents); - - expect(error?.message).toMatch(/Unclosed root tag/u); - }); - - it("should document that xml2js accepts well-formed xml used by later pipeline errors", async () => { - const contents = await fsPromise.readFile(wellFormedXmlFile, "utf8"); - const { error, result } = await parseWithXml2js(contents); - - expect(error).toBeNull(); - expect(result).not.toBeNull(); - }); - - it("should reject empty svg files before xml2js can treat them as valid", async () => { - await expect(getGlyphsData([emptySvgFile], getTestOptions(1))).rejects.toThrow(`Empty file ${emptySvgFile}`); - }); - - it("should reject empty svg files without calling parseString", async () => { - const parseStringSpy = vi.spyOn(xml2js.Parser.prototype, "parseString"); - - try { - await expect(getGlyphsData([emptySvgFile], getTestOptions(1))).rejects.toThrow(/Empty file/u); - expect(parseStringSpy).not.toHaveBeenCalled(); - } finally { - parseStringSpy.mockRestore(); - } - }); - - it("should reject empty svg files without calling metadataProvider", async () => { - const metadataProvider = vi.fn(); - - await expect( - getGlyphsData([emptySvgFile], { - ...getTestOptions(1), - metadataProvider, - }), - ).rejects.toThrow(/Empty file/u); - expect(metadataProvider).not.toHaveBeenCalled(); - }); - - it("should reject malformed xml via xml2js parse errors", async () => { - await expect(getGlyphsData([malformedXmlFile], getTestOptions(1))).rejects.toThrow(/Unclosed root tag/u); - }); - - it("should reject malformed xml without calling metadataProvider", async () => { - const metadataProvider = vi.fn(); - - await expect( - getGlyphsData([malformedXmlFile], { - ...getTestOptions(1), - metadataProvider, - }), - ).rejects.toThrow(/Unclosed root tag/u); - expect(metadataProvider).not.toHaveBeenCalled(); - }); - }); - - describe("prototype pollution hardening (CVE-2023-0842 / SNYK-JS-XML2JS-5414874)", () => { - beforeEach(() => { - deletePollutionMarker(); - }); - - afterEach(() => { - deletePollutionMarker(); - }); - - it("should require xml2js >= 0.5.0 so assignOrPush uses defineProperty instead of obj[key] assignment", async () => { - const { version } = await vi.importActual<{ version: string }>("xml2js/package.json"); - - expect(version).not.toMatch(/^0\.4\./u); - }); - - it("should document the null-prototype PropertyDescriptor pattern that replaces direct obj[key] assignment", () => { - const target: Record = {}; - const descriptor = Object.create(null) as PropertyDescriptor & Record; - - descriptor.value = { [pollutionMarker]: "polluted" }; - descriptor.writable = true; - descriptor.enumerable = true; - descriptor.configurable = true; - - Object.defineProperty(target, "__proto__", descriptor); - - expect(Object.getPrototypeOf(descriptor)).toBeNull(); - expect(Object.hasOwn(target, "__proto__")).toBe(true); - expect(({} as Record)[pollutionMarker]).toBeUndefined(); - }); - - it("should store __proto__ elements as own properties without polluting Object.prototype when parsing xml", async () => { - const { error, result } = await parseWithXml2js( - `<__proto__><${pollutionMarker}>polluted`, - ); - - expect(error).toBeNull(); - expect(result).not.toBeNull(); - expect(Object.hasOwn((result as { root?: object })?.root ?? {}, "__proto__")).toBe(true); - expect(({} as Record)[pollutionMarker]).toBeUndefined(); - }); - - it("should not pollute Object.prototype when getGlyphsData parses svg with a __proto__ element", async () => { - await getGlyphsData([protoElementSvgFile], { - ...getTestOptions(1), - metadataProvider: (_srcPath, callback) => { - callback(null, { name: "proto-element-icon" }); - }, - }); - - expect(({} as Record)[pollutionMarker]).toBeUndefined(); - }); - - it("should not pollute Object.prototype when getGlyphsData rejects malformed xml", async () => { - await expect(getGlyphsData([malformedXmlFile], getTestOptions(1))).rejects.toThrow(/Unclosed root tag/u); - - expect(({} as Record)[pollutionMarker]).toBeUndefined(); - }); - }); -}); diff --git a/packages/webfont/src/standalone/glyphsData.ts b/packages/webfont/src/standalone/glyphsData.ts deleted file mode 100644 index d73cb864..00000000 --- a/packages/webfont/src/standalone/glyphsData.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { createReadStream } from "fs"; -import xml2js from "xml2js"; -import pLimit from "../lib/p-limit"; -import { fileSorter, getMetadataService, getMetadataServiceOptions } from "../lib/svgicons2svgfont"; -import type { GlyphData, GlyphMetadata, WebfontOptions } from "../types"; -import type { FileMetadata } from "../types/MetadataProvider"; - -const normalizeUnicode = (unicode: string | string[] | undefined): string[] => { - if (unicode === undefined) { - return []; - } - - if (Array.isArray(unicode)) { - return unicode; - } - - return [unicode]; -}; - -const toGlyphMetadata = (metadata: FileMetadata): GlyphMetadata & { unicode: string[] } => ({ - name: metadata.name, - unicode: normalizeUnicode(metadata.unicode), -}); - -type GlyphsDataGetter = (_files: Array, _options: WebfontOptions) => Promise; - -export const getGlyphsData: GlyphsDataGetter = (files, options) => { - const metadataProvider = options.metadataProvider || getMetadataService(getMetadataServiceOptions(options)); - - const xmlParser = new xml2js.Parser(); - const throttle = pLimit(options.maxConcurrency); - - return Promise.all( - files.map((srcPath: GlyphData["srcPath"]) => - throttle( - () => - new Promise((resolve, reject) => { - const glyph = createReadStream(srcPath); - let glyphContents = ""; - - glyph - .on("error", (glyphError) => reject(glyphError)) - .on("data", (data) => { - glyphContents += data.toString(); - }) - .on("end", () => { - // xml2js calls back without error for empty input (result: null). - if (glyphContents.length === 0) { - return reject(new Error(`Empty file ${srcPath}`)); - } - - return xmlParser.parseString(glyphContents, (error: Error | null) => { - if (error) { - return reject(error); - } - - const glyphData: GlyphData = { - contents: glyphContents, - srcPath, - }; - - return resolve(glyphData); - }); - }); - }), - ), - ), - ).then((glyphsData: GlyphData[]) => { - let sortedGlyphsData = glyphsData; - - if (options.sort) { - const sortCallback = (fileA: GlyphData, fileB: GlyphData) => fileSorter(fileA.srcPath, fileB.srcPath); - sortedGlyphsData = glyphsData.sort(sortCallback); - } - - const { ligatures } = options; - - return Promise.all( - sortedGlyphsData.map( - (glyphData: GlyphData) => - new Promise((resolve, reject) => { - metadataProvider(glyphData.srcPath, (error, metadata) => { - if (error) { - return reject(error); - } - - if (!metadata) { - return reject(new Error(`Missing metadata for ${glyphData.srcPath}`)); - } - - const glyphMetadata = toGlyphMetadata(metadata); - - if (ligatures) { - glyphMetadata.unicode.push(metadata.name.replace(/-/gu, "_")); - } - - glyphData.metadata = glyphMetadata; - - return resolve(glyphData); - }); - }), - ), - ); - }); -}; diff --git a/packages/webfont/src/standalone/index.test.ts b/packages/webfont/src/standalone/index.test.ts deleted file mode 100755 index f529ca0a..00000000 --- a/packages/webfont/src/standalone/index.test.ts +++ /dev/null @@ -1,806 +0,0 @@ -import assert from "node:assert"; -import crypto from "crypto"; -import * as fsPromise from "fs/promises"; -import isEot from "is-eot"; -import isSvg from "is-svg"; -import isTtf from "is-ttf"; -import isWoff from "is-woff"; -import isWoff2 from "is-woff2"; -import path from "path"; -import standalone from "../standalone"; -import type { Format, GlyphMetadata, GlyphTransformFn, TtfPostProcessContext } from "../types"; -import type { ResultConfig } from "../types/ResultConfig"; - -type DiscoveredRcConfig = ResultConfig & { foo: string }; - -const fixturesGlob = "src/fixtures"; - -describe("standalone", () => { - it("should throw error if `files` not passed", async () => { - await expect(standalone()).rejects.toThrow("You must pass webfont a `files` glob"); - }); - - it("should throw error `files glob patterns specified did not match any files` if not found files", async () => { - await expect( - standalone({ - files: `${fixturesGlob}/not-found-svg-icons/**/*`, - }), - ).rejects.toThrow("Files glob patterns specified did not match any supported files"); - }); - - it("should reject otf output when input is svg icons", async () => { - await expect( - standalone({ - files: `${fixturesGlob}/svg-icons/**/*`, - formats: ["otf"], - }), - ).rejects.toThrow( - 'OTF output is only supported when converting WOFF/WOFF2 input. Request "ttf" for SVG icons, or pass a .woff/.woff2 file.', - ); - }); - - it("should reject unknown format names before running the pipeline (#133)", async () => { - await expect( - standalone({ - files: `${fixturesGlob}/svg-icons/**/*`, - formats: ["icon"] as unknown as Format[], - }), - ).rejects.toThrow('Invalid format "icon". Expected one of: eot, otf, svg, ttf, woff, woff2'); - }); - - it("should generate all fonts", async () => { - const result = await standalone({ - files: `${fixturesGlob}/svg-icons/**/*`, - }); - - expect(isSvg(result.svg as string)).toBe(true); - expect(isTtf(result.ttf)).toBe(true); - expect(isEot(result.eot)).toBe(true); - expect(isWoff(result.woff)).toBe(true); - expect(isWoff2(result.woff2)).toBe(true); - }); - - // Need search better way to test `fs` delay - it("should generate all fonts and will be deterministic", async () => { - const result = await standalone({ - files: `${fixturesGlob}/svg-icons/**/*`, - }); - - expect(isSvg(result.svg as string)).toBe(true); - expect(isTtf(result.ttf)).toBe(true); - expect(isEot(result.eot)).toBe(true); - expect(isWoff(result.woff)).toBe(true); - expect(isWoff2(result.woff2)).toBe(true); - - assert(result.svg); - assert(result.ttf); - assert(result.eot); - assert(result.woff); - assert(result.woff2); - - const svgHash = crypto.createHash("md5").update(result.svg).digest("hex"); - const ttfHash = crypto.createHash("md5").update(result.ttf).digest("hex"); - const eotHash = crypto.createHash("md5").update(result.eot).digest("hex"); - const woffHash = crypto.createHash("md5").update(result.woff).digest("hex"); - const woff2Hash = crypto.createHash("md5").update(result.woff2).digest("hex"); - - expect(svgHash).toBe("ead2b6f69fc603bf1cbd00bf9f8a8a33"); - expect(ttfHash).toBe("d1517f20c3988b9e084047462dd28787"); - expect(eotHash).toBe("0da1e32d0196eceb273968727af10d99"); - expect(woffHash).toBe("1f0b1b8f7e8388c272cf707dd8385dbe"); - expect(woff2Hash).toBe("8e2a267f9568852e245fc41b6afdb009"); - }); - - it("should generate only `svg`, `ttf` and `eot` fonts", async () => { - const result = await standalone({ - files: `${fixturesGlob}/svg-icons/**/*`, - formats: ["svg", "ttf", "eot"], - }); - - expect(isSvg(result.svg as string)).toBe(true); - expect(isTtf(result.ttf)).toBe(true); - expect(isEot(result.eot)).toBe(true); - expect(result.woff).toBeUndefined(); - expect(result.woff2).toBeUndefined(); - }); - - it("should generate only `woff2` font", async () => { - const result = await standalone({ - files: `${fixturesGlob}/svg-icons/**/*`, - formats: ["woff2"], - }); - - expect(result.svg).toBeUndefined(); - expect(result.ttf).toBeUndefined(); - expect(result.eot).toBeUndefined(); - expect(result.woff).toBeUndefined(); - expect(isWoff2(result.woff2)).toBe(true); - }); - - it("should generate all fonts with build-in template", async () => { - const result = await standalone({ - files: `${fixturesGlob}/svg-icons/**/*`, - template: "css", - templateCacheString: "test", - }); - - expect(isSvg(result.svg as string)).toBe(true); - expect(isTtf(result.ttf)).toBe(true); - expect(isEot(result.eot)).toBe(true); - expect(isWoff(result.woff)).toBe(true); - expect(isWoff2(result.woff2)).toBe(true); - expect(result.template).toMatchSnapshot(); - }); - - it("should generate only `woff` and `woff2` fonts with build-in template", async () => { - const result = await standalone({ - files: `${fixturesGlob}/svg-icons/**/*`, - formats: ["woff", "woff2"], - template: "css", - templateCacheString: "test", - }); - - expect(result.svg).toBeUndefined(); - expect(result.ttf).toBeUndefined(); - expect(result.eot).toBeUndefined(); - expect(isWoff(result.woff)).toBe(true); - expect(isWoff2(result.woff2)).toBe(true); - expect(result.template).toMatchSnapshot(); - }); - - it("should generate all fonts with custom `template` with absolute path", async () => { - const result = await standalone({ - files: `${fixturesGlob}/svg-icons/**/*`, - template: path.join(fixturesGlob, "templates/template.css"), - templateCacheString: "test", - }); - - expect(isSvg(result.svg as string)).toBe(true); - expect(isTtf(result.ttf)).toBe(true); - expect(isEot(result.eot)).toBe(true); - expect(isWoff(result.woff)).toBe(true); - expect(isWoff2(result.woff2)).toBe(true); - expect(result.template).toMatchSnapshot(); - }); - - it("should generate all fonts with custom `template` with relative path", async () => { - const result = await standalone({ - files: `${fixturesGlob}/svg-icons/**/*`, - template: "src/fixtures/templates/template.css", - templateCacheString: "test", - }); - - expect(isSvg(result.svg as string)).toBe(true); - expect(isTtf(result.ttf)).toBe(true); - expect(isEot(result.eot)).toBe(true); - expect(isWoff(result.woff)).toBe(true); - expect(isWoff2(result.woff2)).toBe(true); - expect(result.template).toMatchSnapshot(); - }); - - it("should load config and export file path in result", async () => { - const configFile = path.join(fixturesGlob, "configs/.webfontrc"); - const result = await standalone({ - configFile, - files: `${fixturesGlob}/svg-icons/**/*`, - }); - - expect(isSvg(result.svg as string)).toBe(true); - expect(isTtf(result.ttf)).toBe(true); - expect(isEot(result.eot)).toBe(true); - expect(isWoff(result.woff)).toBe(true); - expect(isWoff2(result.woff2)).toBe(true); - assert(result.config); - expect((result.config as DiscoveredRcConfig).foo).toBe("bar"); - expect(result.config.filePath).toBe(path.resolve(configFile)); - }); - - it("should load config and respect `template` option with build-in template value", async () => { - const configFile = path.join(fixturesGlob, "configs/.webfontrc-with-build-in-template"); - - const result = await standalone({ - configFile, - files: `${fixturesGlob}/svg-icons/**/*`, - templateCacheString: "test", - }); - - expect(isSvg(result.svg as string)).toBe(true); - expect(isTtf(result.ttf)).toBe(true); - expect(isEot(result.eot)).toBe(true); - expect(isWoff(result.woff)).toBe(true); - expect(isWoff2(result.woff2)).toBe(true); - assert(result.config); - expect(result.config.template).toBe("scss"); - expect(result.template).toMatchSnapshot(); - }); - - it("should load config and respect `template` option with external template value", async () => { - const configFile = path.join(fixturesGlob, "configs/.webfontrc-with-external-template"); - const result = await standalone({ - configFile, - files: `${fixturesGlob}/svg-icons/**/*`, - }); - - expect(isSvg(result.svg as string)).toBe(true); - expect(isTtf(result.ttf)).toBe(true); - expect(isEot(result.eot)).toBe(true); - expect(isWoff(result.woff)).toBe(true); - expect(isWoff2(result.woff2)).toBe(true); - assert(result.config); - expect(result.config.template).toBe("src/fixtures/templates/template.css"); - expect(result.template).toMatchSnapshot(); - }); - - it("should load config and respect `formats` option", async () => { - const configFile = path.join(fixturesGlob, "configs/.webfontrc-with-custom-formats"); - const result = await standalone({ - configFile, - files: `${fixturesGlob}/svg-icons/**/*`, - }); - - expect(result.svg).toBeUndefined(); - expect(result.ttf).toBeUndefined(); - expect(result.eot).toBeUndefined(); - expect(result.woff).toBeUndefined(); - expect(isWoff2(result.woff2)).toBe(true); - }); - - it("should generate the ordered output source in the same order of entry", async () => { - expect.assertions(1); - - const templateOutput = ` - .webfont-envelope::before { - content: "\\ea01"; - } - .webfont-avatar::before { - content: "\\ea02"; - } - `; - const result = await standalone({ - files: [`${fixturesGlob}/svg-icons/envelope.svg`, `${fixturesGlob}/svg-icons/avatar.svg`], - sort: false, - template: path.join(fixturesGlob, "templates/template-ordered.css"), - }); - - const actual = templateOutput.replace(/\s/gu, ""); - assert(result.template); - - const expected = result.template.replace(/\s/gu, ""); - - expect(actual).toBe(expected); - }); - - it("should throw error on bad svg images - `Unclosed root tag`", async () => { - const configFile = path.join(fixturesGlob, "configs/.webfontrc"); - - await expect( - standalone({ - configFile, - files: `${fixturesGlob}/bad-svg-icons/avatar.svg`, - }), - ).rejects.toThrow(/Unclosed root tag/u); - }); - - it("should throw error on bad svg images - `Unterminated command at index`", async () => { - const configFile = path.join(fixturesGlob, "configs/.webfontrc"); - - await expect( - standalone({ - configFile, - files: `${fixturesGlob}/bad-svg-icons/avatar-1.svg`, - }), - ).rejects.toThrow(/Unterminated command at index/u); - }); - - it('should throw error on bad svg images - `Unexpected character "N"`', async () => { - const configFile = path.join(fixturesGlob, "configs/.webfontrc"); - - await expect( - standalone({ - configFile, - files: `${fixturesGlob}/bad-svg-icons/avatar-2.svg`, - }), - ).rejects.toThrow(/Unexpected character "N"/u); - }); - - it("should throw error on bad svg images - empty file", async () => { - const configFile = path.join(fixturesGlob, "configs/.webfontrc"); - - await expect( - standalone({ - configFile, - files: `${fixturesGlob}/bad-svg-icons/avatar-3.svg`, - }), - ).rejects.toThrow(/Empty file/u); - }); - - it("should throw error of config file not found", async () => { - const configFile = path.join(fixturesGlob, "configs/.not-exist-webfontrc"); - - await expect( - standalone({ - configFile, - files: `${fixturesGlob}/svg-icons/**/*`, - }), - ).rejects.toMatchObject({ code: "ENOENT" }); - }); - - it("should transform SVG glyph contents before font generation (#144)", async () => { - const strokedPath = `${fixturesGlob}/svg-stroke-icons/stroked-plus.svg`; - const filledPath = `${fixturesGlob}/svg-stroke-icons/plus-filled.svg`; - const filledContents = await fsPromise.readFile(filledPath, "utf8"); - - await expect( - standalone({ - files: strokedPath, - formats: ["ttf"], - fontName: "plus", - }), - ).rejects.toThrow(/Empty glyph path/u); - - const withTransform = await standalone({ - files: strokedPath, - formats: ["ttf"], - fontName: "plus", - glyphContentTransformFn: () => filledContents, - }); - - assert(withTransform.glyphsData); - assert(withTransform.ttf); - expect(withTransform.glyphsData[0]?.contents).toBe(filledContents); - expect(withTransform.ttf.length).toBeGreaterThan(1400); - expect(isTtf(withTransform.ttf)).toBe(true); - }); - - it("should warn about evenodd fill-rule when verbose (#175)", async () => { - const logSpy = vi.spyOn(console, "log").mockImplementation(() => undefined); - - try { - await standalone({ - files: `${fixturesGlob}/svg-evenodd/linkedin.svg`, - formats: ["svg"], - verbose: true, - }); - - expect(logSpy).toHaveBeenCalledWith(expect.stringContaining("fill-rule: evenodd")); - } finally { - logSpy.mockRestore(); - } - }); - - it("should diagnose stroke-only SVGs when svgTools.diagnose is enabled", async () => { - const logSpy = vi.spyOn(console, "log").mockImplementation(() => undefined); - - try { - await expect( - standalone({ - files: `${fixturesGlob}/svg-stroke-icons/stroked-plus.svg`, - formats: ["ttf"], - svgTools: { diagnose: true }, - }), - ).rejects.toThrow(/Empty glyph path/u); - - expect(logSpy).toHaveBeenCalledWith(expect.stringContaining("stroke-based paths")); - } finally { - logSpy.mockRestore(); - } - }); - - it("should reject stroke-only SVGs that produce empty glyph paths (#327)", async () => { - await expect( - standalone({ - files: `${fixturesGlob}/svg-icons-stroke-only/*.svg`, - formats: ["woff2"], - }), - ).rejects.toThrow(/Empty glyph path\(s\) in SVG font output/u); - }); - - it("should optimize messy SVGs when optimizeSvg is enabled (#724)", async () => { - const result = await standalone({ - files: `${fixturesGlob}/svg-icons-messy/*.svg`, - formats: ["woff2"], - optimizeSvg: true, - }); - - assert(result.glyphsData); - expect(result.glyphsData[0]?.contents).not.toContain("Inkscape export cruft"); - expect(result.glyphsData[0]?.contents).not.toContain(""); - expect(isWoff2(result.woff2)).toBe(true); - }); - - it("should still reject stroke-only SVGs when optimizeSvg is enabled (#327)", async () => { - await expect( - standalone({ - files: `${fixturesGlob}/svg-icons-stroke-only/*.svg`, - formats: ["woff2"], - optimizeSvg: true, - }), - ).rejects.toThrow(/Empty glyph path\(s\) in SVG font output/u); - }); - - it("should create css selectors with transform titles through function", async () => { - const glyphTransformFn: GlyphTransformFn = (obj) => { - obj.name += "_transform"; - - return obj; - }; - - const result = await standalone({ - files: `${fixturesGlob}/svg-icons/**/*`, - formats: ["eot"], - glyphTransformFn, - template: "css", - templateCacheString: "test", - }); - - expect(result.template).toMatchSnapshot(); - }); - - it("should change unicode symbols in the result using sync function", async () => { - const { template } = await standalone({ - files: `${fixturesGlob}/svg-icons/**/*`, - formats: ["eot"], - glyphTransformFn: (obj: GlyphMetadata) => { - obj.unicode = ["\u0001"]; - - return obj; - }, - template: "css", - templateCacheString: "test", - }); - expect(template).toMatchSnapshot(); - }); - - it("should change unicode symbols in the result using async function", async () => { - const { template } = await standalone({ - files: `${fixturesGlob}/svg-icons/**/*`, - formats: ["eot"], - glyphTransformFn: (obj: GlyphMetadata) => { - obj.unicode = ["\u0001"]; - - return Promise.resolve(obj); - }, - template: "css", - templateCacheString: "test", - }); - expect(template).toMatchSnapshot(); - }); - - it("should handle errors properly", async () => { - try { - await standalone({ - files: `${fixturesGlob}/svg-icons/**/*`, - formats: ["eot"], - glyphTransformFn: () => { - throw new Error("Name is invalid"); - }, - template: "css", - }); - } catch (error) { - expect((error as Error).message).toMatch("Name is invalid"); - } - }); - - describe("ttfPostProcess", () => { - it("should call ttfPostProcess with the generated ttf and context", async () => { - let calls = 0; - let receivedTtf: Buffer | undefined; - let receivedContext: TtfPostProcessContext | undefined; - - const result = await standalone({ - files: `${fixturesGlob}/svg-icons/**/*`, - fontName: "hinted-font", - formats: ["ttf"], - ttfPostProcess: (ttf, context) => { - calls += 1; - receivedTtf = ttf; - receivedContext = context; - - return ttf; - }, - }); - - expect(calls).toBe(1); - expect(isTtf(receivedTtf)).toBe(true); - expect(receivedContext?.fontName).toBe("hinted-font"); - expect(receivedContext?.formats).toEqual(["ttf"]); - expect(isTtf(result.ttf)).toBe(true); - }); - - it("should use the ttfPostProcess return value as result.ttf", async () => { - const sentinel = Buffer.from("post-processed-ttf-bytes"); - - const result = await standalone({ - files: `${fixturesGlob}/svg-icons/**/*`, - formats: ["ttf"], - ttfPostProcess: () => sentinel, - }); - - expect(result.ttf?.equals(sentinel)).toBe(true); - }); - - it("should derive woff2 from the post-processed ttf", async () => { - let receivedTtf: Buffer | undefined; - - const result = await standalone({ - files: `${fixturesGlob}/svg-icons/**/*`, - formats: ["ttf", "woff2"], - ttfPostProcess: (ttf) => { - receivedTtf = ttf; - - return Buffer.from(ttf); - }, - }); - - expect(isTtf(receivedTtf)).toBe(true); - expect(isWoff2(result.woff2)).toBe(true); - }); - - it("should support an async ttfPostProcess", async () => { - const result = await standalone({ - files: `${fixturesGlob}/svg-icons/**/*`, - formats: ["ttf"], - ttfPostProcess: (ttf) => Promise.resolve(ttf), - }); - - expect(isTtf(result.ttf)).toBe(true); - }); - }); - - it("should respect `template` options", async () => { - const result = await standalone({ - files: `${fixturesGlob}/svg-icons/**/*`, - template: "css", - templateCacheString: "test", - templateClassName: "foo", - templateFontName: "bar", - templateFontPath: "./foo-bar", - }); - - expect(isSvg(result.svg as string)).toBe(true); - expect(isTtf(result.ttf)).toBe(true); - expect(isEot(result.eot)).toBe(true); - expect(isWoff(result.woff)).toBe(true); - expect(isWoff2(result.woff2)).toBe(true); - assert(result.config); - expect(result.config.template).toBe("css"); - expect(result.usedBuildInTemplate).toBe(true); - expect(result.template).toMatchSnapshot(); - }); - - it("should use fontName for file URLs and templateFontName for font-family (#331)", async () => { - const result = await standalone({ - files: `${fixturesGlob}/svg-icons/**/*`, - template: "css", - fontName: "icons-a", - templateFontName: "icons", - templateCacheString: "test", - formats: ["woff2"], - }); - - expect(result.template).toContain('font-family: "icons"'); - expect(result.template).toContain('url("./icons-a.woff2?test")'); - expect(result.template).not.toContain('url("./icons.woff2'); - }); - - it("should generate multiple built-in templates (#158)", async () => { - const result = await standalone({ - files: `${fixturesGlob}/svg-icons/**/*`, - formats: ["woff2"], - template: ["html", "scss"], - templateCacheString: "test", - }); - - expect(result.templates).toHaveLength(2); - expect(result.templates?.[0]?.builtIn).toBe("html"); - expect(result.templates?.[1]?.builtIn).toBe("scss"); - expect(result.template).toBe(result.templates?.[0]?.content); - expect(result.templates?.[0]?.content).toContain(""); - expect(result.templates?.[1]?.content).toContain("$webfont-"); - }); - - it("should generate built-in html template", async () => { - const result = await standalone({ - files: `${fixturesGlob}/svg-icons/**/*`, - template: "html", - templateCacheString: "test", - ligatures: true, - }); - - expect(result.usedBuildInTemplate).toBe(true); - expect(result.template).toContain(""); - expect(result.template).toContain('font-feature-settings: "liga" 1'); - expect(result.template).toContain("#icon-ligatures"); - expect(result.template).not.toContain("unicode-range:"); - expect(result.template).toMatchSnapshot(); - }); - - it("should include unicode-range in html template when templateFontLigatures is false and unicodeRange is enabled", async () => { - const result = await standalone({ - files: `${fixturesGlob}/svg-icons/**/*`, - template: "html", - templateCacheString: "test", - templateFontLigatures: false, - unicodeRange: true, - }); - - expect(result.template).toContain("unicode-range: U+EA01-EA03;"); - expect(result.template).not.toContain('font-feature-settings: "liga"'); - }); - it("should generate built-in json template", async () => { - const result = await standalone({ - files: `${fixturesGlob}/svg-icons/**/*`, - template: "json", - templateCacheString: "test", - }); - - expect(result.usedBuildInTemplate).toBe(true); - assert(result.template); - expect(JSON.parse(result.template)).toMatchSnapshot(); - expect(result.template).toMatchSnapshot(); - }); - - it("should generate built-in styl template", async () => { - const result = await standalone({ - files: `${fixturesGlob}/svg-icons/**/*`, - template: "styl", - templateCacheString: "test", - }); - - expect(result.usedBuildInTemplate).toBe(true); - expect(result.template).toMatchSnapshot(); - }); - - it("should include font hash in template URLs when addHashInFontUrl is enabled", async () => { - const result = await standalone({ - files: `${fixturesGlob}/svg-icons/**/*`, - template: "css", - templateCacheString: "test", - addHashInFontUrl: true, - formats: ["woff2"], - }); - - expect(result.hash).toBeTruthy(); - expect(result.template).toContain(`&v=${result.hash}`); - expect(result.template).toMatchSnapshot(); - }); - - it("should include unicode-range in built-in templates when unicodeRange is true (#322)", async () => { - const result = await standalone({ - files: `${fixturesGlob}/svg-icons/**/*`, - template: "css", - templateCacheString: "test", - formats: ["woff2"], - unicodeRange: true, - }); - - expect(result.template).toContain("unicode-range: U+EA01-EA03;"); - }); - - it("should omit unicode-range in built-in templates by default", async () => { - const result = await standalone({ - files: `${fixturesGlob}/svg-icons/**/*`, - template: "css", - templateCacheString: "test", - formats: ["woff2"], - }); - - expect(result.template).not.toContain("unicode-range:"); - }); - - it("should omit unicode-range when unicodeRange is false", async () => { - const result = await standalone({ - files: `${fixturesGlob}/svg-icons/**/*`, - template: "css", - templateCacheString: "test", - formats: ["woff2"], - unicodeRange: false, - }); - - expect(result.template).not.toContain("unicode-range:"); - }); - - it("should use a manual unicode-range override", async () => { - const result = await standalone({ - files: `${fixturesGlob}/svg-icons/**/*`, - template: "css", - templateCacheString: "test", - formats: ["woff2"], - unicodeRange: "U+EA01-EAFF", - }); - - expect(result.template).toContain("unicode-range: U+EA01-EAFF;"); - }); - - it("should export `glyphsData` in `result`", async () => { - const result = await standalone({ - files: `${fixturesGlob}/svg-icons/**/*`, - template: "css", - }); - - assert(result.glyphsData); - expect(Array.isArray(result.glyphsData)).toBe(true); - expect(result.glyphsData.length > 0).toBe(true); - }); - - it("should remove ligature unicode when `ligatures` set to `false`", async () => { - const result = await standalone({ - files: `${fixturesGlob}/svg-icons/**/*`, - ligatures: false, - template: "css", - }); - - assert(result.glyphsData); - expect(Array.isArray(result.glyphsData)).toBe(true); - expect(result.glyphsData.length > 0).toBe(true); - - result.glyphsData.forEach((glyph) => { - expect(glyph.metadata?.unicode).toHaveLength(1); - }); - }); - - it("should export `hash` in `result`", () => { - expect.assertions(1); - - return standalone({ - files: `${fixturesGlob}/svg-icons/**/*`, - }).then((result) => { - expect(result.hash).toBe("ead2b6f69fc603bf1cbd00bf9f8a8a33"); - - return result; - }); - }); - - it("should accept files as a single glob string", async () => { - const result = await standalone({ - files: `${fixturesGlob}/svg-icons/avatar.svg`, - }); - - expect(isSvg(result.svg as string)).toBe(true); - expect(result.glyphsData).toHaveLength(1); - }); - - it("should log progress when verbose is enabled", async () => { - const logSpy = vi.spyOn(console, "log").mockImplementation(() => undefined); - - await standalone({ - files: `${fixturesGlob}/svg-icons/avatar.svg`, - verbose: true, - }); - - expect(logSpy).toHaveBeenCalledWith("Generating SVG font..."); - logSpy.mockRestore(); - }); - - it("should pass string metadata to woff generation", async () => { - const result = await standalone({ - files: `${fixturesGlob}/svg-icons/avatar.svg`, - formats: ["woff"], - metadata: "custom-metadata", - }); - - expect(Buffer.isBuffer(result.woff)).toBe(true); - expect(result.woff?.length).toBeGreaterThan(0); - expect(result.svg).toBeUndefined(); - }); - - it("should render templates using embedded font buffers", async () => { - const result = await standalone({ - files: `${fixturesGlob}/svg-icons/avatar.svg`, - formats: ["woff2"], - template: `${fixturesGlob}/templates/template-fonts-base64.njk`, - }); - - assert(result.template); - expect(result.template.length).toBeGreaterThan(0); - expect(Buffer.from(result.template, "base64").length).toBeGreaterThan(0); - }); - - it("should throw when template rendering requests a missing font buffer", async () => { - const { getTemplateFontBase64 } = await import("./templateFonts"); - - expect(() => getTemplateFontBase64("eot", { woff2: Buffer.from("x") })).toThrow( - "Missing eot buffer for template rendering", - ); - }); -}); diff --git a/packages/webfont/src/standalone/index.ts b/packages/webfont/src/standalone/index.ts deleted file mode 100644 index 57ee662c..00000000 --- a/packages/webfont/src/standalone/index.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { cosmiconfig } from "cosmiconfig"; -import deepmerge from "deepmerge"; -import path from "path"; -import { resolveInputSources } from "../lib/inputSource"; -import type { InitialOptions } from "../types"; -import type { Result } from "../types/Result"; -import type { ResultConfig } from "../types/ResultConfig"; -import { convertTtfInput } from "./convertTtfInput"; -import { convertWebfontInput } from "./convertWebfontInput"; -import { getGlyphsData } from "./glyphsData"; -import { assertSvgPipelineFormats, classifyInputFiles, filterInputFilesByMode } from "./inputMode"; -import { getOptions } from "./options"; -import { runSvgPipeline } from "./runSvgPipeline"; -import { validateWebfontOptions } from "./validateWebfontOptions"; - -type CosmiconfigLoaded = NonNullable["search"]>>>; - -const isCosmiconfigLoaded = (value: CosmiconfigLoaded | Record): value is CosmiconfigLoaded => - "filepath" in value; - -const buildConfig = async (options: { - configFile?: string; -}): Promise> => { - const configExplorer = cosmiconfig("webfont", { - searchStrategy: "global", - }); - - if (options.configFile) { - const configPath = path.resolve(process.cwd(), options.configFile); - const config = await configExplorer.load(configPath); - - return config ?? {}; - } - - const config = await configExplorer.search(process.cwd()); - - return config ?? {}; -}; - -export const loadWebfontConfig = buildConfig; - -type Webfont = (_initialOptions?: InitialOptions) => Promise; - -export const webfont: Webfont = async (initialOptions) => { - let options = getOptions(initialOptions); - delete (options as Partial).filePath; - - const config = await buildConfig({ - configFile: options.configFile, - }); - - let discoveredConfigPath: string | undefined; - - if (isCosmiconfigLoaded(config)) { - options = deepmerge(options, config.config, { - arrayMerge: (_destinationArray, sourceArray) => sourceArray, - }); - discoveredConfigPath = config.filepath; - } - - options = validateWebfontOptions(options); - - let filePatterns: string[]; - - if (Array.isArray(options.files)) { - filePatterns = options.files; - } else { - filePatterns = [options.files]; - } - - const foundFiles = await resolveInputSources(filePatterns); - const inputMode = classifyInputFiles(foundFiles); - - if (inputMode === "mixed") { - throw new Error("Cannot mix SVG icons, TTF fonts, and WOFF/WOFF2 files in the same run"); - } - - if (inputMode === "empty") { - throw new Error("Files glob patterns specified did not match any supported files"); - } - - if (inputMode === "webfont") { - const fontFiles = filterInputFilesByMode(foundFiles, inputMode); - const result = await convertWebfontInput(fontFiles, options); - - if (discoveredConfigPath) { - result.config = { ...options, filePath: discoveredConfigPath }; - } - - return result; - } - - if (inputMode === "ttf") { - const fontFiles = filterInputFilesByMode(foundFiles, inputMode); - const result = await convertTtfInput(fontFiles, options); - - if (discoveredConfigPath) { - result.config = { ...options, filePath: discoveredConfigPath }; - } - - return result; - } - - assertSvgPipelineFormats(options.formats); - - const filteredFiles = filterInputFilesByMode(foundFiles, "svg"); - - const glyphsData = await getGlyphsData(filteredFiles, options); - - const result = await runSvgPipeline(glyphsData, options); - - if (discoveredConfigPath) { - result.config = { ...options, filePath: discoveredConfigPath }; - } else { - result.config = options; - } - - return result; -}; - -export default webfont; diff --git a/packages/webfont/src/standalone/inputMode.test.ts b/packages/webfont/src/standalone/inputMode.test.ts deleted file mode 100644 index b4d5a822..00000000 --- a/packages/webfont/src/standalone/inputMode.test.ts +++ /dev/null @@ -1,157 +0,0 @@ -import { - assertSvgPipelineFormats, - classifyInputFiles, - filterInputFilesByMode, - resolveTtfConversionFormats, - resolveWebfontConversionFormats, -} from "./inputMode"; - -describe("classifyInputFiles", () => { - it("should return empty when no files are provided", () => { - expect(classifyInputFiles([])).toBe("empty"); - }); - - it("should classify svg-only globs as svg mode", () => { - expect(classifyInputFiles(["src/fixtures/svg-icons/avatar.svg"])).toBe("svg"); - }); - - it("should classify woff-only globs as webfont mode", () => { - expect(classifyInputFiles(["src/fixtures/fonts/iconfont.woff"])).toBe("webfont"); - }); - - it("should classify woff2-only globs as webfont mode", () => { - expect(classifyInputFiles(["src/fixtures/fonts/iconfont.woff2"])).toBe("webfont"); - }); - - it("should classify mixed woff and woff2 as webfont mode", () => { - expect(classifyInputFiles(["src/fixtures/fonts/iconfont.woff", "src/fixtures/fonts/iconfont.woff2"])).toBe( - "webfont", - ); - }); - - it("should classify ttf-only globs as ttf mode", () => { - expect(classifyInputFiles(["src/fixtures/fonts/iconfont.ttf"])).toBe("ttf"); - }); - - it("should reject mixed svg and ttf inputs", () => { - expect(classifyInputFiles(["src/fixtures/svg-icons/avatar.svg", "src/fixtures/fonts/iconfont.ttf"])).toBe( - "mixed", - ); - }); - - it("should reject mixed ttf and webfont inputs", () => { - expect(classifyInputFiles(["src/fixtures/fonts/iconfont.ttf", "src/fixtures/fonts/iconfont.woff2"])).toBe( - "mixed", - ); - }); - - it("should reject mixed svg and webfont inputs", () => { - expect(classifyInputFiles(["src/fixtures/svg-icons/avatar.svg", "src/fixtures/fonts/iconfont.woff2"])).toBe( - "mixed", - ); - }); - - it("should return empty for unsupported extensions", () => { - expect(classifyInputFiles(["readme.txt"])).toBe("empty"); - }); - - it("should return empty when extension-less files are mixed with webfont inputs", () => { - expect(classifyInputFiles(["LICENSE", "src/fixtures/fonts/iconfont.woff2"])).toBe("empty"); - expect(classifyInputFiles([".webfontrc", "src/fixtures/fonts/iconfont.woff2"])).toBe("empty"); - }); - - it("should return empty for extension-less files only", () => { - expect(classifyInputFiles(["LICENSE", ".webfontrc"])).toBe("empty"); - }); -}); - -describe("assertSvgPipelineFormats", () => { - it("should reject otf output requests in the svg pipeline", () => { - expect(() => assertSvgPipelineFormats(["otf"])).toThrow( - 'OTF output is only supported when converting WOFF/WOFF2 input. Request "ttf" for SVG icons, or pass a .woff/.woff2 file.', - ); - expect(() => assertSvgPipelineFormats(["svg", "otf", "woff2"])).toThrow( - 'OTF output is only supported when converting WOFF/WOFF2 input. Request "ttf" for SVG icons, or pass a .woff/.woff2 file.', - ); - }); - - it("should allow svg pipeline formats without otf", () => { - expect(() => assertSvgPipelineFormats(["svg", "ttf", "eot", "woff", "woff2"])).not.toThrow(); - expect(() => assertSvgPipelineFormats(["woff2"])).not.toThrow(); - }); -}); - -describe("filterInputFilesByMode", () => { - it("should filter svg files in svg mode", () => { - expect(filterInputFilesByMode(["src/fixtures/svg-icons/avatar.svg", "ignored.woff"], "svg")).toEqual([ - "src/fixtures/svg-icons/avatar.svg", - ]); - }); - - it("should filter webfont files in webfont mode", () => { - expect( - filterInputFilesByMode( - ["src/fixtures/fonts/iconfont.woff2", "src/fixtures/svg-icons/avatar.svg"], - "webfont", - ), - ).toEqual(["src/fixtures/fonts/iconfont.woff2"]); - }); - - it("should filter ttf files in ttf mode", () => { - expect( - filterInputFilesByMode(["src/fixtures/fonts/iconfont.ttf", "src/fixtures/fonts/iconfont.woff2"], "ttf"), - ).toEqual(["src/fixtures/fonts/iconfont.ttf"]); - }); - - it("should return an empty list for unsupported modes", () => { - expect(filterInputFilesByMode(["src/fixtures/fonts/iconfont.woff2"], "empty")).toEqual([]); - }); -}); - -describe("resolveWebfontConversionFormats", () => { - it("should default to ttf when svg pipeline formats are still configured", () => { - expect(resolveWebfontConversionFormats(["svg", "ttf", "eot", "woff", "woff2"])).toEqual(["ttf"]); - }); - - it("should keep explicit ttf or otf requests when svg pipeline formats are present", () => { - expect(resolveWebfontConversionFormats(["svg", "otf", "woff2"])).toEqual(["otf"]); - }); - - it("should deduplicate explicit conversion formats", () => { - expect(resolveWebfontConversionFormats(["ttf", "ttf", "otf"])).toEqual(["ttf", "otf"]); - }); - - it("should reject conversion runs without ttf or otf output formats", () => { - expect(() => resolveWebfontConversionFormats(["woff2"])).toThrow( - 'formats must include "ttf" and/or "otf" when converting WOFF/WOFF2 input', - ); - }); -}); - -describe("resolveTtfConversionFormats", () => { - it("should default to woff and woff2 when svg pipeline formats are still configured", () => { - expect(resolveTtfConversionFormats(["svg", "ttf", "eot", "woff", "woff2"])).toEqual(["woff", "woff2"]); - }); - - it("should keep explicit webfont output requests", () => { - expect(resolveTtfConversionFormats(["ttf", "woff2"])).toEqual(["ttf", "woff2"]); - }); - - it("should keep an explicit svg output request", () => { - expect(resolveTtfConversionFormats(["svg"])).toEqual(["svg"]); - }); - - it("should keep svg alongside webfont output requests", () => { - expect(resolveTtfConversionFormats(["svg", "woff2"])).toEqual(["svg", "woff2"]); - }); - - it("should deduplicate explicit encode formats", () => { - expect(resolveTtfConversionFormats(["woff2", "woff2", "woff"])).toEqual(["woff2", "woff"]); - }); - - it("should reject ttf runs without any encoder output format", () => { - expect(() => resolveTtfConversionFormats(["otf"])).toThrow( - 'formats must include at least one of "svg", "ttf", "eot", "woff", or "woff2" when converting TTF input', - ); - }); -}); diff --git a/packages/webfont/src/standalone/inputMode.ts b/packages/webfont/src/standalone/inputMode.ts deleted file mode 100644 index 60f1ce74..00000000 --- a/packages/webfont/src/standalone/inputMode.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { getInputExtension } from "../lib/inputSourceUtils"; -import type { Format } from "../types/Format"; - -export type InputMode = "empty" | "mixed" | "svg" | "ttf" | "webfont"; - -const WEBFONT_EXTENSIONS = new Set([".woff", ".woff2"]); -const SVG_EXTENSION = ".svg"; -const TTF_EXTENSION = ".ttf"; -const SVG_PIPELINE_DEFAULT: Format[] = ["svg", "ttf", "eot", "woff", "woff2"]; - -const isSvgExtension = (extension: string): boolean => extension === SVG_EXTENSION; -const isTtfExtension = (extension: string): boolean => extension === TTF_EXTENSION; -const isWebfontExtension = (extension: string): boolean => WEBFONT_EXTENSIONS.has(extension); -const isSupportedInputExtension = (extension: string): boolean => - isSvgExtension(extension) || isWebfontExtension(extension) || isTtfExtension(extension); - -export const classifyInputFiles = (filePaths: readonly string[]): InputMode => { - if (filePaths.length === 0) { - return "empty"; - } - - const extensions = filePaths.map((filePath) => getInputExtension(filePath)); - - if (!extensions.every(isSupportedInputExtension)) { - return "empty"; - } - - const hasSvg = extensions.some(isSvgExtension); - const hasWebfont = extensions.some(isWebfontExtension); - const hasTtf = extensions.some(isTtfExtension); - const modeKinds = [hasSvg, hasWebfont, hasTtf].filter(Boolean).length; - - if (modeKinds > 1) { - return "mixed"; - } - - if (hasWebfont) { - return "webfont"; - } - - if (hasTtf) { - return "ttf"; - } - - if (hasSvg) { - return "svg"; - } - - return "empty"; -}; - -export const assertSvgPipelineFormats = (formats: readonly Format[]): void => { - if (formats.includes("otf")) { - throw new Error( - 'OTF output is only supported when converting WOFF/WOFF2 input. Request "ttf" for SVG icons, or pass a .woff/.woff2 file.', - ); - } -}; - -export const filterInputFilesByMode = (filePaths: readonly string[], mode: InputMode): string[] => { - if (mode === "svg") { - return filePaths.filter((filePath) => getInputExtension(filePath) === SVG_EXTENSION); - } - - if (mode === "webfont") { - return filePaths.filter((filePath) => WEBFONT_EXTENSIONS.has(getInputExtension(filePath))); - } - - if (mode === "ttf") { - return filePaths.filter((filePath) => getInputExtension(filePath) === TTF_EXTENSION); - } - - return []; -}; - -export type ConversionFormat = "otf" | "ttf"; - -export type TtfEncodeFormat = "eot" | "svg" | "ttf" | "woff" | "woff2"; - -const TTF_ENCODE_FORMATS = new Set(["ttf", "svg", "eot", "woff", "woff2"]); - -export const resolveTtfConversionFormats = (formats: readonly Format[]): TtfEncodeFormat[] => { - const encodeFormats = formats.filter((format): format is TtfEncodeFormat => TTF_ENCODE_FORMATS.has(format)); - const isFullSvgDefault = - formats.length === SVG_PIPELINE_DEFAULT.length && - SVG_PIPELINE_DEFAULT.every((format) => formats.includes(format)); - - if (isFullSvgDefault) { - return ["woff", "woff2"]; - } - - if (encodeFormats.length === 0) { - throw new Error( - 'formats must include at least one of "svg", "ttf", "eot", "woff", or "woff2" when converting TTF input', - ); - } - - return [...new Set(encodeFormats)]; -}; - -export const resolveWebfontConversionFormats = (formats: readonly Format[]): ConversionFormat[] => { - const ttfOrOtf = formats.filter((format): format is "otf" | "ttf" => format === "ttf" || format === "otf"); - const isFullSvgDefault = - formats.length === SVG_PIPELINE_DEFAULT.length && - SVG_PIPELINE_DEFAULT.every((format) => formats.includes(format)); - - if (isFullSvgDefault) { - return ["ttf"]; - } - - if (ttfOrOtf.length === 0) { - throw new Error('formats must include "ttf" and/or "otf" when converting WOFF/WOFF2 input'); - } - - return [...new Set(ttfOrOtf)]; -}; diff --git a/packages/webfont/src/standalone/isSvgOutput.test.ts b/packages/webfont/src/standalone/isSvgOutput.test.ts deleted file mode 100644 index 1c57d49d..00000000 --- a/packages/webfont/src/standalone/isSvgOutput.test.ts +++ /dev/null @@ -1,107 +0,0 @@ -import fs from "fs"; -import isSvg from "is-svg"; -import path from "path"; -import standalone from "../standalone"; - -const fixturesGlob = "src/fixtures/svg-icons"; - -describe("is-svg output validation", () => { - describe("is-svg library contract (dev dependency)", () => { - it("should document that is-svg throws TypeError for non-string input", () => { - expect(() => isSvg(null as unknown as string)).toThrow(TypeError); - expect(() => isSvg(undefined as unknown as string)).toThrow(TypeError); - expect(() => isSvg(Buffer.from("") as unknown as string)).toThrow(TypeError); - }); - - it("should document that is-svg returns false for empty string input", () => { - expect(isSvg("")).toBe(false); - expect(isSvg(" ")).toBe(false); - }); - - it("should document that is-svg returns false for non-xml text", () => { - expect(isSvg("not xml")).toBe(false); - }); - - it("should document that is-svg returns false for well-formed xml without an svg root element", () => { - expect(isSvg("")).toBe(false); - expect(isSvg("page")).toBe(false); - }); - - it("should document that is-svg returns false for malformed xml", () => { - expect(isSvg("")).toBe(false); - }); - - it("should document that is-svg returns true when the parsed document has an svg root element", () => { - expect(isSvg('')).toBe(true); - }); - - it("should document that is-svg depends on @file-type/xml for validate and parse", () => { - const isSvgPackage = JSON.parse( - fs.readFileSync(path.join(path.dirname(require.resolve("is-svg")), "package.json"), "utf8"), - ) as { dependencies: Record }; - - expect(isSvgPackage.dependencies["@file-type/xml"]).toBeDefined(); - }); - - it("should throw when given binary font buffers instead of svg strings", async () => { - const { woff2 } = await standalone({ - files: `${fixturesGlob}/avatar.svg`, - formats: ["woff2"], - }); - - expect(woff2).toBeDefined(); - expect(() => isSvg(woff2 as unknown as string)).toThrow(TypeError); - }); - }); - - describe("webfont result.svg validation", () => { - it("should accept svg font output from standalone as valid svg", async () => { - const result = await standalone({ - files: `${fixturesGlob}/avatar.svg`, - formats: ["svg"], - }); - - expect(result.svg).toBeDefined(); - expect(isSvg(result.svg as string)).toBe(true); - }); - - it("should not emit result.svg when only woff2 is requested", async () => { - const result = await standalone({ - files: `${fixturesGlob}/avatar.svg`, - formats: ["woff2"], - }); - - expect(result.svg).toBeUndefined(); - expect(result.woff2).toBeDefined(); - }); - - it("should not emit result.svg when only woff and woff2 are requested", async () => { - const result = await standalone({ - files: `${fixturesGlob}/avatar.svg`, - formats: ["woff", "woff2"], - }); - - expect(result.svg).toBeUndefined(); - expect(result.woff).toBeDefined(); - expect(result.woff2).toBeDefined(); - }); - - it("should not emit result.svg when template output is generated without svg format", async () => { - const result = await standalone({ - files: `${fixturesGlob}/avatar.svg`, - formats: ["woff2"], - template: "css", - templateCacheString: "test", - }); - - expect(result.svg).toBeUndefined(); - expect(result.template).toBeDefined(); - }); - - it("should document that absent result.svg must be asserted with toBeUndefined, not is-svg", () => { - // is-svg 6 throws on undefined; callers must check result.svg before validating. - expect(() => isSvg(undefined as unknown as string)).toThrow(TypeError); - expect(undefined).toBeUndefined(); - }); - }); -}); diff --git a/packages/webfont/src/standalone/options.test.ts b/packages/webfont/src/standalone/options.test.ts deleted file mode 100644 index 5fa2397a..00000000 --- a/packages/webfont/src/standalone/options.test.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { getOptions } from "./options"; - -describe("options", () => { - it("should throw when files is not passed", () => { - expect(() => getOptions()).toThrow("You must pass webfont a `files` glob"); - expect(() => getOptions({} as never)).toThrow("You must pass webfont a `files` glob"); - }); - - it("should return default webfont options", () => { - const options = getOptions({ files: "icons/*.svg" }); - - expect(options.files).toBe("icons/*.svg"); - expect(options.fontName).toBe("webfont"); - expect(options.formats).toEqual(["svg", "ttf", "eot", "woff", "woff2"]); - expect(options.maxConcurrency).toBe(100); - expect(options.templateFontPath).toBe("./"); - expect(options.ligatures).toBe(false); - expect(options.sort).toBe(true); - expect(options.unicodeRange).toBe(false); - expect(options.verbose).toBe(false); - expect(options.fontHeight).toBeUndefined(); - expect(options.template).toBeUndefined(); - }); - - it("should merge initial options over defaults", () => { - const options = getOptions({ - files: ["a.svg"], - fontName: "custom", - formats: ["woff2"], - ligatures: false, - template: "css", - verbose: true, - metadata: "test-meta", - }); - - expect(options.files).toEqual(["a.svg"]); - expect(options.fontName).toBe("custom"); - expect(options.formats).toEqual(["woff2"]); - expect(options.ligatures).toBe(false); - expect(options.template).toBe("css"); - expect(options.verbose).toBe(true); - expect(options.metadata).toBe("test-meta"); - }); - - it("should accept a custom metadataProvider", () => { - const metadataProvider = vi.fn(); - const options = getOptions({ - files: "icons/*.svg", - metadataProvider, - }); - - expect(options.metadataProvider).toBe(metadataProvider); - }); -}); diff --git a/packages/webfont/src/standalone/options.ts b/packages/webfont/src/standalone/options.ts deleted file mode 100644 index 79fe2dc6..00000000 --- a/packages/webfont/src/standalone/options.ts +++ /dev/null @@ -1,16 +0,0 @@ -import type { InitialOptions } from "../types/InitialOptions"; -import type { WebfontOptions } from "../types/WebfontOptions"; -import { defaultWebfontOptions } from "./defaultOptions"; - -type OptionsGetter = (_initialOptions?: InitialOptions) => WebfontOptions; - -export const getOptions: OptionsGetter = (initialOptions) => { - if (!initialOptions?.files) { - throw new Error("You must pass webfont a `files` glob"); - } - - return { - ...defaultWebfontOptions(), - ...initialOptions, - } as WebfontOptions; -}; diff --git a/packages/webfont/src/standalone/optionsFromGlyphs.ts b/packages/webfont/src/standalone/optionsFromGlyphs.ts deleted file mode 100644 index 03b59c6f..00000000 --- a/packages/webfont/src/standalone/optionsFromGlyphs.ts +++ /dev/null @@ -1,17 +0,0 @@ -import type { WebfontFromGlyphsOptions } from "../types/WebfontFromGlyphsOptions"; -import type { WebfontOptions } from "../types/WebfontOptions"; -import { defaultWebfontOptions } from "./defaultOptions"; - -export const getOptionsFromGlyphs = (initialOptions: WebfontFromGlyphsOptions): WebfontOptions => { - if (!initialOptions.glyphs?.length) { - throw new Error("You must pass webfont at least one SVG glyph"); - } - - const { glyphs: _glyphs, ...rest } = initialOptions; - - return { - ...defaultWebfontOptions(), - ...rest, - files: initialOptions.glyphs.map((glyph, index) => glyph.srcPath ?? `glyph-${index + 1}.svg`), - } as WebfontOptions; -}; diff --git a/packages/webfont/src/standalone/renderTemplates.ts b/packages/webfont/src/standalone/renderTemplates.ts deleted file mode 100644 index b8a48a87..00000000 --- a/packages/webfont/src/standalone/renderTemplates.ts +++ /dev/null @@ -1,98 +0,0 @@ -import deepmerge from "deepmerge"; -import nunjucks from "nunjucks"; -import path from "path"; -import { getBuiltInTemplates, getTemplateFilePath } from "../../templates"; -import { normalizeTemplateOption } from "../lib/parseTemplateOption"; -import { resolveTemplateUnicodeRange } from "../lib/templateUnicodeRange"; -import type { Format } from "../types/Format"; -import type { GlyphData } from "../types/GlyphData"; -import type { GlyphMetadata } from "../types/GlyphMetadata"; -import type { RenderedTemplate } from "../types/RenderedTemplate"; -import type { Result } from "../types/Result"; -import type { WebfontOptions } from "../types/WebfontOptions"; -import { getTemplateFontBase64 } from "./templateFonts"; - -type RenderTemplatesResult = { - templates: RenderedTemplate[]; - usedBuildInTemplate: boolean; -}; - -export const renderTemplates = ( - options: WebfontOptions, - result: Pick & Partial, - formats: readonly Format[], -): RenderTemplatesResult => { - const templateNames = normalizeTemplateOption(options.template); - - if (templateNames.length === 0) { - return { templates: [], usedBuildInTemplate: false }; - } - - const builtInTemplates = getBuiltInTemplates(); - const renderedTemplates: RenderedTemplate[] = []; - let usedBuildInTemplate = false; - - let hashOption = {}; - - if (options.addHashInFontUrl) { - hashOption = { hash: result.hash }; - } - - const glyphs = - result.glyphsData - ?.map((glyph: GlyphData) => glyph.metadata) - .filter((metadata): metadata is GlyphMetadata => metadata !== undefined) ?? []; - - const nunjucksBaseOptions = deepmerge.all([ - { - glyphs, - }, - options, - { - cacheString: options.templateCacheString || Date.now(), - className: options.templateClassName || options.fontName, - fontFamily: options.templateFontName || options.fontName, - fontPath: options.templateFontPath.replace(/\/?$/u, "/"), - svgFontId: options.fontId || options.fontName, - }, - hashOption, - { - fonts: Object.fromEntries( - new Map(formats.map((format: Format) => [format, () => getTemplateFontBase64(format, result)])), - ), - }, - { - unicodeRange: resolveTemplateUnicodeRange(options.unicodeRange, glyphs), - }, - { - templateFontLigatures: options.templateFontLigatures !== false, - }, - ]); - - for (const templateName of templateNames) { - let templateFilePath: string; - let builtIn: string | undefined; - - if (Object.keys(builtInTemplates).includes(templateName)) { - usedBuildInTemplate = true; - builtIn = templateName; - - const builtInPath = path.resolve(__dirname, "../.."); - nunjucks.configure(builtInPath); - templateFilePath = getTemplateFilePath(templateName); - } else { - const resolvedTemplateFilePath = path.resolve(templateName); - - nunjucks.configure(path.dirname(resolvedTemplateFilePath)); - templateFilePath = path.resolve(resolvedTemplateFilePath); - } - - renderedTemplates.push({ - template: templateName, - content: nunjucks.render(templateFilePath, nunjucksBaseOptions), - builtIn, - }); - } - - return { templates: renderedTemplates, usedBuildInTemplate }; -}; diff --git a/packages/webfont/src/standalone/runSvgPipeline.ts b/packages/webfont/src/standalone/runSvgPipeline.ts deleted file mode 100644 index a1dc82b1..00000000 --- a/packages/webfont/src/standalone/runSvgPipeline.ts +++ /dev/null @@ -1,156 +0,0 @@ -import crypto from "crypto"; -import { applyOptimizeSvgToGlyphs } from "../lib/applyOptimizeSvgToGlyphs"; -import { formatLargeFontLigatureWarning, shouldWarnLargeFontLigatures } from "../lib/largeFontLigatures"; -import { assertNonEmptySvgFontGlyphs } from "../lib/svgFontOutput/emptyGlyphPaths"; -import { applySvgToolsToGlyphs } from "../lib/svgTools/applySvgTools"; -import { encodeTtfToEot, encodeTtfToWoff, encodeTtfToWoff2 } from "../lib/ttfEncode"; -import type { GlyphData, WebfontOptions } from "../types"; -import type { Result } from "../types/Result"; -import { generateSvgFont } from "./generateSvgFont"; -import toTtf from "./toTtf"; - -const toEot = (buffer: Buffer) => encodeTtfToEot(buffer); - -const toWoff = (buffer: Buffer, options: { metadata?: string }) => encodeTtfToWoff(buffer, options); - -const toWoff2 = (buffer: Buffer) => encodeTtfToWoff2(buffer); - -export const runSvgPipeline = async (glyphsData: GlyphData[], options: WebfontOptions): Promise => { - const reporter = (message: string): void => { - if (options.svgTools?.onMessage) { - options.svgTools.onMessage(message); - return; - } - - if (options.svgTools?.diagnose || options.verbose) { - // biome-ignore lint/suspicious/noConsole: svgTools / verbose diagnostics - console.log(message); - } - }; - - const shouldReport = Boolean(options.svgTools?.onMessage || options.svgTools?.diagnose || options.verbose); - let pipelineReporter: typeof reporter | undefined; - - if (shouldReport) { - pipelineReporter = reporter; - } - - const { diagnostics, glyphs: diagnosedGlyphs } = applySvgToolsToGlyphs(glyphsData, options.svgTools, { - reporter: pipelineReporter, - verbose: options.verbose, - }); - - let pipelineGlyphs = diagnosedGlyphs; - - if (options.optimizeSvg) { - pipelineGlyphs = applyOptimizeSvgToGlyphs(pipelineGlyphs, options.svgoConfig); - } - - if (options.glyphContentTransformFn) { - const glyphContentTransformFn = options.glyphContentTransformFn; - pipelineGlyphs = await Promise.all( - pipelineGlyphs.map(async (glyphData) => { - const contents = await glyphContentTransformFn(glyphData); - - return { - ...glyphData, - contents, - }; - }), - ); - } - - if (options.glyphTransformFn) { - const glyphTransformFn = options.glyphTransformFn; - pipelineGlyphs = await Promise.all( - pipelineGlyphs.map(async (glyphData) => { - const metadata = await glyphTransformFn(glyphData.metadata ?? { name: "", unicode: [] }); - - return { - ...glyphData, - metadata, - }; - }), - ); - } - - if (shouldWarnLargeFontLigatures(pipelineGlyphs.length, options.ligatures)) { - // biome-ignore lint/suspicious/noConsole: user-facing performance warning (#558) - console.log(formatLargeFontLigatureWarning(pipelineGlyphs.length)); - } - - let ttfOptions = {}; - - if (options.formatsOptions?.ttf) { - ttfOptions = options.formatsOptions.ttf; - } - - const svg = await generateSvgFont(pipelineGlyphs, options); - assertNonEmptySvgFontGlyphs(svg, pipelineGlyphs); - let ttf = toTtf(svg, ttfOptions); - - if (options.ttfPostProcess) { - const processed = await options.ttfPostProcess(ttf, { - fontName: options.fontName, - formats: options.formats, - }); - ttf = Buffer.from(processed); - } - - const result: Result = { - config: options, - glyphsData: pipelineGlyphs, - hash: crypto.createHash("md5").update(svg).digest("hex"), - svg, - ttf, - }; - - if (diagnostics.length > 0) { - result.svgDiagnostics = diagnostics; - } - - const { formats } = options; - - if (formats.includes("eot")) { - result.eot = toEot(ttf); - } - - if (formats.includes("woff")) { - let metadata: string | undefined; - - if (typeof options.metadata === "string") { - metadata = options.metadata; - } - - result.woff = toWoff(ttf, { metadata }); - } - - if (formats.includes("woff2")) { - result.woff2 = Buffer.from(await toWoff2(ttf)); - } - - if (options.template) { - const { renderTemplates } = await import("./renderTemplates"); - const { templates, usedBuildInTemplate } = renderTemplates(options, result, formats); - - if (templates.length > 0) { - result.templates = templates; - result.template = templates[0]?.content; - result.usedBuildInTemplate = usedBuildInTemplate; - } - } - - if (!formats.includes("svg")) { - delete result.svg; - } - - if (!formats.includes("ttf")) { - delete result.ttf; - } - - if (!formats.includes("otf")) { - delete result.otf; - } - - return result; -}; diff --git a/packages/webfont/src/standalone/svg2ttfOutput.test.ts b/packages/webfont/src/standalone/svg2ttfOutput.test.ts deleted file mode 100644 index d2e42859..00000000 --- a/packages/webfont/src/standalone/svg2ttfOutput.test.ts +++ /dev/null @@ -1,168 +0,0 @@ -vi.mock("svg2ttf", async (importOriginal) => { - const actual = await importOriginal<{ default: typeof import("svg2ttf") }>(); - return { - default: vi.fn(actual.default), - }; -}); - -import isTtf from "is-ttf"; -import isWoff2 from "is-woff2"; -import svg2ttf from "svg2ttf"; -import standalone from "../standalone"; - -const mockedSvg2ttf = vi.mocked(svg2ttf); - -const fixturesGlob = "src/fixtures"; -const svgIconsGlob = `${fixturesGlob}/svg-icons`; -const badSvgFile = `${fixturesGlob}/bad-svg-icons/avatar.svg`; - -const getSvgFontString = async (): Promise => { - const result = await standalone({ - files: `${svgIconsGlob}/avatar.svg`, - formats: ["svg"], - }); - - if (!result.svg) { - throw new Error("Expected svg font output from standalone"); - } - - return result.svg.toString(); -}; - -describe("svg2ttf output validation", () => { - beforeEach(async () => { - mockedSvg2ttf.mockClear(); - const actual = await vi.importActual<{ default: typeof import("svg2ttf") }>("svg2ttf"); - mockedSvg2ttf.mockImplementation(actual.default); - }); - - describe("svg2ttf library contract (production dependency)", () => { - let consoleErrorSpy: ReturnType; - - beforeEach(() => { - // @xmldom/xmldom logs fatal parse errors before svg2ttf throws; suppress Vitest noise. - consoleErrorSpy = vi.spyOn(console, "error").mockImplementation(() => undefined); - }); - - afterEach(() => { - consoleErrorSpy.mockRestore(); - }); - - it("should document that svg2ttf depends on @xmldom/xmldom for svg font parsing", async () => { - const svg2ttfPackage = await vi.importActual<{ dependencies: Record }>( - "svg2ttf/package.json", - ); - - expect(svg2ttfPackage.dependencies["@xmldom/xmldom"]).toBeDefined(); - }); - - it("should document that svg2ttf rejects empty svg font input", () => { - expect(() => svg2ttf("", {})).toThrow(); - }); - - it("should document that svg2ttf rejects regular svg images without a font element", () => { - expect(() => svg2ttf('', {})).toThrow( - /Can't find tag/u, - ); - }); - - it("should document that svg2ttf rejects malformed svg font markup", () => { - expect(() => svg2ttf("", {})).toThrow(); - }); - - it("should document that svg2ttf rejects non-string version options", async () => { - const svgFont = await getSvgFontString(); - - expect(() => svg2ttf(svgFont, { version: 1 as unknown as string })).toThrow( - /version option should be a string/u, - ); - }); - - it("should document that svg2ttf rejects invalid version strings", async () => { - const svgFont = await getSvgFontString(); - - expect(() => svg2ttf(svgFont, { version: "bad" })).toThrow(/invalid option, version/u); - }); - - it("should accept a webfont-generated svg font and returns a ttf buffer", async () => { - const svgFont = await getSvgFontString(); - const ttf = svg2ttf(svgFont, { version: "1.0" }); - - expect(ttf.buffer.byteLength).toBeGreaterThan(0); - expect(isTtf(Buffer.from(ttf.buffer))).toBe(true); - }); - }); - - describe("webfont result.ttf validation", () => { - it("should accept ttf font output from standalone as valid ttf", async () => { - const result = await standalone({ - files: `${svgIconsGlob}/avatar.svg`, - formats: ["ttf"], - }); - - expect(result.ttf).toBeDefined(); - expect(isTtf(result.ttf)).toBe(true); - expect(mockedSvg2ttf).toHaveBeenCalled(); - }); - - it("should forward every formatsOptions.ttf field to svg2ttf", async () => { - const ttfOptions = { - copyright: "test copyright", - description: "test description", - ts: 1457357570, - url: "https://example.com/fonts", - version: "2.0", - }; - - await standalone({ - files: `${svgIconsGlob}/avatar.svg`, - formats: ["ttf"], - formatsOptions: { - ttf: ttfOptions, - }, - }); - - expect(mockedSvg2ttf).toHaveBeenCalledWith(expect.any(String), ttfOptions); - }); - - it("should run svg2ttf internally even when ttf is omitted from formats", async () => { - const result = await standalone({ - files: `${svgIconsGlob}/avatar.svg`, - formats: ["woff2"], - }); - - expect(result.ttf).toBeUndefined(); - expect(result.woff2).toBeDefined(); - expect(isWoff2(result.woff2)).toBe(true); - expect(mockedSvg2ttf).toHaveBeenCalled(); - }); - - it("should not emit result.ttf when only woff and woff2 are requested", async () => { - const result = await standalone({ - files: `${svgIconsGlob}/avatar.svg`, - formats: ["woff", "woff2"], - }); - - expect(result.ttf).toBeUndefined(); - expect(result.woff).toBeDefined(); - expect(result.woff2).toBeDefined(); - expect(mockedSvg2ttf).toHaveBeenCalled(); - }); - - it("should document that absent result.ttf must be asserted with toBeUndefined, not is-ttf", () => { - // is-ttf coerces missing values to false, which cannot distinguish "not generated" from "invalid". - expect(isTtf(undefined)).toBe(false); - expect(undefined).toBeUndefined(); - }); - - it("should reject invalid input svg before svg2ttf is called", async () => { - await expect( - standalone({ - files: badSvgFile, - }), - ).rejects.toThrow(/Unclosed root tag/u); - - expect(mockedSvg2ttf).not.toHaveBeenCalled(); - }); - }); -}); diff --git a/packages/webfont/src/standalone/templateFonts.test.ts b/packages/webfont/src/standalone/templateFonts.test.ts deleted file mode 100644 index f6142efa..00000000 --- a/packages/webfont/src/standalone/templateFonts.test.ts +++ /dev/null @@ -1,30 +0,0 @@ -import type { Result } from "../types/Result"; -import { getTemplateFontBase64 } from "./templateFonts"; - -describe("templateFonts", () => { - const sampleBuffer = Buffer.from("font-data"); - - it("should encode woff2 buffer as base64", () => { - const result: Result = { - woff2: sampleBuffer, - }; - - expect(getTemplateFontBase64("woff2", result)).toBe(sampleBuffer.toString("base64")); - }); - - it("should throw when woff2 buffer is missing", () => { - expect(() => getTemplateFontBase64("woff2", {})).toThrow("Missing woff2 buffer for template rendering"); - }); - - it("should encode svg buffer as base64", () => { - const result: Result = { - svg: sampleBuffer, - }; - - expect(getTemplateFontBase64("svg", result)).toBe(sampleBuffer.toString("base64")); - }); - - it.each(["svg", "ttf", "eot", "woff"] as const)("should throw when %s buffer is missing", (format) => { - expect(() => getTemplateFontBase64(format, {})).toThrow(`Missing ${format} buffer for template rendering`); - }); -}); diff --git a/packages/webfont/src/standalone/templateFonts.ts b/packages/webfont/src/standalone/templateFonts.ts deleted file mode 100644 index bf148b45..00000000 --- a/packages/webfont/src/standalone/templateFonts.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { Format } from "../types/Format"; -import type { Result } from "../types/Result"; - -export const getTemplateFontBase64 = (format: Format, result: Result): string => { - if (format === "woff2") { - if (!result.woff2) { - throw new Error(`Missing woff2 buffer for template rendering`); - } - - return Buffer.from(result.woff2).toString("base64"); - } - - const fontBuffer = result[format]; - - if (!fontBuffer) { - throw new Error(`Missing ${format} buffer for template rendering`); - } - - return fontBuffer.toString("base64"); -}; diff --git a/packages/webfont/src/standalone/toTtf.test.ts b/packages/webfont/src/standalone/toTtf.test.ts deleted file mode 100644 index ac9746c8..00000000 --- a/packages/webfont/src/standalone/toTtf.test.ts +++ /dev/null @@ -1,72 +0,0 @@ -vi.mock("svg2ttf", () => ({ - default: vi.fn(() => ({ buffer: new Uint8Array([0x74, 0x74, 0x66]) })), -})); - -import svg2ttf from "svg2ttf"; -import toTtf from "./toTtf"; - -const mockedSvg2ttf = vi.mocked(svg2ttf); - -const sampleSvgFont = ''; -const sampleTtfBytes = new Uint8Array([0x74, 0x74, 0x66]); - -describe("toTtf", () => { - beforeEach(() => { - mockedSvg2ttf.mockClear(); - mockedSvg2ttf.mockReturnValue({ buffer: sampleTtfBytes }); - }); - - it("should call svg2ttf with the svg font string and default options", () => { - const result = toTtf(sampleSvgFont); - - expect(mockedSvg2ttf).toHaveBeenCalledTimes(1); - expect(mockedSvg2ttf).toHaveBeenCalledWith(sampleSvgFont, {}); - expect(result).toEqual(Buffer.from(sampleTtfBytes)); - }); - - it("should return a Buffer copy of the svg2ttf micro buffer", () => { - const returnedBuffer = new Uint8Array([1, 2, 3]); - mockedSvg2ttf.mockReturnValueOnce({ buffer: returnedBuffer }); - - const result = toTtf(sampleSvgFont); - - expect(result).toEqual(Buffer.from(returnedBuffer)); - expect(result).not.toBe(returnedBuffer); - }); - - describe("formatsOptions.ttf forwarding", () => { - it.each([ - ["copyright", { copyright: "© Example Corp" }], - ["description", { description: "Icon font" }], - ["ts", { ts: 1457357570 }], - ["url", { url: "https://example.com/fonts" }], - ["version", { version: "Version 2.0" }], - ] as const)("should forward %s to svg2ttf", (_name, option) => { - toTtf(sampleSvgFont, option); - - expect(mockedSvg2ttf).toHaveBeenCalledWith(sampleSvgFont, option); - }); - - it("should forward every formatsOptions.ttf field to svg2ttf together", () => { - const ttfOptions = { - copyright: "© Example Corp", - description: "Icon font", - ts: 1457357570, - url: "https://example.com/fonts", - version: "Version 2.0", - }; - - toTtf(sampleSvgFont, ttfOptions); - - expect(mockedSvg2ttf).toHaveBeenCalledWith(sampleSvgFont, ttfOptions); - }); - }); - - it("should propagate svg2ttf conversion errors", () => { - mockedSvg2ttf.mockImplementation(() => { - throw new Error("svg2ttf failed"); - }); - - expect(() => toTtf(sampleSvgFont)).toThrow("svg2ttf failed"); - }); -}); diff --git a/packages/webfont/src/standalone/toTtf.ts b/packages/webfont/src/standalone/toTtf.ts deleted file mode 100644 index cf87e696..00000000 --- a/packages/webfont/src/standalone/toTtf.ts +++ /dev/null @@ -1,8 +0,0 @@ -import svg2ttf from "svg2ttf"; - -export type ToTtfOptions = Parameters[1]; - -const toTtf = (svgFontString: string, options: ToTtfOptions = {}): Buffer => - Buffer.from(svg2ttf(svgFontString, options).buffer); - -export default toTtf; diff --git a/packages/webfont/src/standalone/ttfConversion.integration.test.ts b/packages/webfont/src/standalone/ttfConversion.integration.test.ts deleted file mode 100644 index f7cddef6..00000000 --- a/packages/webfont/src/standalone/ttfConversion.integration.test.ts +++ /dev/null @@ -1,143 +0,0 @@ -import * as fsPromise from "fs/promises"; -import isEot from "is-eot"; -import isSvg from "is-svg"; -import isTtf from "is-ttf"; -import isWoff from "is-woff"; -import isWoff2 from "is-woff2"; -import standalone from "../standalone"; - -const fixtureTtf = "src/fixtures/fonts/iconfont.ttf"; -const fixtureWoff2 = "src/fixtures/fonts/iconfont.woff2"; - -describe("TTF to webfont conversion", () => { - it("should encode ttf input to woff and woff2 output", async () => { - const result = await standalone({ - files: fixtureTtf, - formats: ["woff", "woff2"], - }); - - expect(result.woff).toBeDefined(); - expect(result.woff2).toBeDefined(); - expect(isWoff(result.woff)).toBe(true); - expect(isWoff2(result.woff2)).toBe(true); - expect(result.svg).toBeUndefined(); - expect(result.glyphsData).toBeUndefined(); - }); - - it("should default to woff and woff2 when svg pipeline formats are still configured", async () => { - const result = await standalone({ - files: fixtureTtf, - }); - - expect(result.woff).toBeDefined(); - expect(result.woff2).toBeDefined(); - expect(isWoff(result.woff)).toBe(true); - expect(isWoff2(result.woff2)).toBe(true); - expect(result.ttf).toBeUndefined(); - }); - - it("should pass through ttf and encode eot when requested", async () => { - const result = await standalone({ - files: fixtureTtf, - formats: ["ttf", "eot", "woff"], - }); - - expect(isTtf(result.ttf)).toBe(true); - expect(isEot(result.eot)).toBe(true); - expect(isWoff(result.woff)).toBe(true); - expect(result.woff2).toBeUndefined(); - }); - - it("should reject mixed svg and ttf inputs", async () => { - await expect( - standalone({ - files: ["src/fixtures/svg-icons/avatar.svg", fixtureTtf], - formats: ["woff2"], - }), - ).rejects.toThrow("Cannot mix SVG icons, TTF fonts, and WOFF/WOFF2 files"); - }); - - it("should reject mixed ttf and webfont inputs", async () => { - await expect( - standalone({ - files: [fixtureTtf, fixtureWoff2], - formats: ["woff2"], - }), - ).rejects.toThrow("Cannot mix SVG icons, TTF fonts, and WOFF/WOFF2 files"); - }); - - it("should reject remote ttf URLs with a clear error", async () => { - const remoteUrl = "https://cdn.example.com/fonts/iconfont.ttf"; - - await expect( - standalone({ - files: remoteUrl, - formats: ["woff2"], - }), - ).rejects.toThrow(`Remote TTF URLs are not supported. Download the file first: ${remoteUrl}`); - }); - - it("should reject template option in ttf mode", async () => { - await expect( - standalone({ - files: fixtureTtf, - formats: ["woff2"], - template: "css", - }), - ).rejects.toThrow("Templates are not supported when converting TTF input"); - }); - - it("should encode ttf input to a valid svg font when requested", async () => { - const result = await standalone({ - files: fixtureTtf, - formats: ["svg"], - }); - - expect(typeof result.svg).toBe("string"); - expect(isSvg(result.svg as string)).toBe(true); - expect(result.woff).toBeUndefined(); - expect(result.glyphsData).toBeUndefined(); - }); - - it("should reject formats without any ttf encoder output", async () => { - await expect( - standalone({ - files: fixtureTtf, - formats: ["otf"], - }), - ).rejects.toThrow( - 'formats must include at least one of "svg", "ttf", "eot", "woff", or "woff2" when converting TTF input', - ); - }); - - it("should produce woff2 that decompresses back to valid ttf", async () => { - const encoded = await standalone({ files: fixtureTtf, formats: ["woff2"] }); - const tempWoff2 = "temp/ttf-roundtrip.woff2"; - - await fsPromise.mkdir("temp", { recursive: true }); - await fsPromise.writeFile(tempWoff2, encoded.woff2 as Buffer); - - try { - const decompressed = await standalone({ - files: tempWoff2, - formats: ["ttf"], - }); - - expect(isWoff2(encoded.woff2)).toBe(true); - expect(isTtf(decompressed.ttf)).toBe(true); - } finally { - await fsPromise.rm(tempWoff2, { force: true }); - } - }); - - it("should transcode multiple ttf files in one run", async () => { - const result = await standalone({ - files: [fixtureTtf, fixtureTtf], - formats: ["woff2"], - }); - - expect(result.transcodedFonts).toHaveLength(2); - expect(result.woff2).toBeUndefined(); - expect(result.transcodedFonts?.every((font) => isWoff2(font.woff2))).toBe(true); - }); -}); diff --git a/packages/webfont/src/standalone/validateWebfontOptions.test.ts b/packages/webfont/src/standalone/validateWebfontOptions.test.ts deleted file mode 100644 index bb3eb4e2..00000000 --- a/packages/webfont/src/standalone/validateWebfontOptions.test.ts +++ /dev/null @@ -1,119 +0,0 @@ -import type { WebfontOptions } from "../types/WebfontOptions"; -import { validateWebfontOptions } from "./validateWebfontOptions"; - -const baseOptions = (): WebfontOptions => - ({ - files: "icons/*.svg", - fontName: "webfont", - formats: ["woff2"], - centerHorizontally: false, - centerVertically: false, - descent: 0, - fixedWidth: false, - fontStyle: "normal", - fontWeight: "normal", - formatsOptions: {}, - ligatures: true, - maxConcurrency: 100, - metadata: {}, - normalize: true, - prependUnicode: false, - round: 0, - sort: true, - templateFontPath: "./", - verbose: false, - }) as WebfontOptions; - -describe("validateWebfontOptions", () => { - it("should accept valid merged options", () => { - expect(validateWebfontOptions(baseOptions()).formats).toEqual(["woff2"]); - }); - - it("should reject unknown format names from config or API (#133)", () => { - expect(() => - validateWebfontOptions({ - ...baseOptions(), - formats: ["icon"] as unknown as WebfontOptions["formats"], - }), - ).toThrow('Invalid format "icon". Expected one of: eot, otf, svg, ttf, woff, woff2'); - }); - - it("should reject formats that are not an array", () => { - expect(() => - validateWebfontOptions({ - ...baseOptions(), - formats: "woff2" as never, - }), - ).toThrow('formats must be an array of format names (e.g. ["woff2", "svg"])'); - }); - - it("should reject empty formats", () => { - expect(() => - validateWebfontOptions({ - ...baseOptions(), - formats: [], - }), - ).toThrow("formats must not be empty"); - }); - - it("should reject empty files", () => { - expect(() => - validateWebfontOptions({ - ...baseOptions(), - files: "", - }), - ).toThrow("files must not be empty"); - }); - - it("should reject non-string fontName", () => { - expect(() => - validateWebfontOptions({ - ...baseOptions(), - fontName: 42 as never, - }), - ).toThrow("fontName must be a string"); - }); - - it("should reject invalid unicodeRange option types", () => { - expect(() => - validateWebfontOptions({ - ...baseOptions(), - unicodeRange: 123 as never, - }), - ).toThrow("unicodeRange must be a boolean or string"); - }); - - it("should reject invalid optimizeSvg and svgoConfig option types", () => { - expect(() => - validateWebfontOptions({ - ...baseOptions(), - optimizeSvg: "yes" as never, - }), - ).toThrow("optimizeSvg must be a boolean"); - - expect(() => - validateWebfontOptions({ - ...baseOptions(), - svgoConfig: "invalid" as never, - }), - ).toThrow("svgoConfig must be an object"); - }); - - it("should reject invalid templateFontLigatures option types", () => { - expect(() => - validateWebfontOptions({ - ...baseOptions(), - templateFontLigatures: "yes" as never, - }), - ).toThrow("templateFontLigatures must be a boolean"); - }); - - it("should accept template as an array (#158)", () => { - expect( - validateWebfontOptions({ - ...baseOptions(), - template: ["html", "scss"], - }).template, - ).toEqual(["html", "scss"]); - }); -}); diff --git a/packages/webfont/src/standalone/validateWebfontOptions.ts b/packages/webfont/src/standalone/validateWebfontOptions.ts deleted file mode 100644 index be7d9b19..00000000 --- a/packages/webfont/src/standalone/validateWebfontOptions.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { assertFormatsOption } from "../lib/parseFormats"; -import { normalizeTemplateOption } from "../lib/parseTemplateOption"; -import type { WebfontOptions } from "../types/WebfontOptions"; - -const assertStringOption = (name: string, value: unknown): void => { - if (value !== undefined && typeof value !== "string") { - throw new Error(`${name} must be a string`); - } -}; - -const assertBooleanOrStringOption = (name: string, value: unknown): void => { - if (value !== undefined && typeof value !== "boolean" && typeof value !== "string") { - throw new Error(`${name} must be a boolean or string`); - } -}; - -const assertBooleanOption = (name: string, value: unknown): void => { - if (value !== undefined && typeof value !== "boolean") { - throw new Error(`${name} must be a boolean`); - } -}; - -const assertObjectOption = (name: string, value: unknown): void => { - if (value !== undefined && (typeof value !== "object" || value === null || Array.isArray(value))) { - throw new Error(`${name} must be an object`); - } -}; - -const assertFilesOption = (files: unknown): void => { - if (typeof files === "string") { - if (files.length === 0) { - throw new Error("files must not be empty"); - } - - return; - } - - if (Array.isArray(files)) { - if (files.length === 0) { - throw new Error("files must not be empty"); - } - - if (!files.every((entry) => typeof entry === "string")) { - throw new Error("files must be a string or an array of strings"); - } - - return; - } - - throw new Error("files must be a string or an array of strings"); -}; - -/** - * Runtime validation for merged webfont options (API, cosmiconfig, CLI). - * Rejects mis-typed or unknown format names before running a pipeline (#133). - */ -export const validateWebfontOptions = (options: WebfontOptions): WebfontOptions => { - assertFilesOption(options.files); - options.formats = assertFormatsOption(options.formats); - assertStringOption("fontName", options.fontName); - assertBooleanOrStringOption("unicodeRange", options.unicodeRange); - assertBooleanOption("optimizeSvg", options.optimizeSvg); - assertObjectOption("svgoConfig", options.svgoConfig); - assertBooleanOption("templateFontLigatures", options.templateFontLigatures); - if (options.template !== undefined) { - normalizeTemplateOption(options.template); - } - assertStringOption("templateFontPath", options.templateFontPath); - - return options; -}; diff --git a/packages/webfont/src/standalone/webfontConversion.integration.test.ts b/packages/webfont/src/standalone/webfontConversion.integration.test.ts deleted file mode 100644 index 408ac732..00000000 --- a/packages/webfont/src/standalone/webfontConversion.integration.test.ts +++ /dev/null @@ -1,154 +0,0 @@ -import * as fs from "fs"; -import isTtf from "is-ttf"; -import isWoff from "is-woff"; -import isWoff2 from "is-woff2"; -import standalone from "../standalone"; - -const fixtureWoff = "src/fixtures/fonts/iconfont.woff"; -const fixtureWoff2 = "src/fixtures/fonts/iconfont.woff2"; - -describe("webfont WOFF/WOFF2 conversion", () => { - it("should convert woff2 input to ttf output", async () => { - const result = await standalone({ - files: fixtureWoff2, - formats: ["ttf"], - }); - - expect(result.ttf).toBeDefined(); - expect(isTtf(result.ttf)).toBe(true); - expect(result.woff2).toBeUndefined(); - expect(result.svg).toBeUndefined(); - expect(result.glyphsData).toBeUndefined(); - }); - - it("should convert woff input to ttf output", async () => { - const result = await standalone({ - files: fixtureWoff, - formats: ["ttf"], - }); - - expect(result.ttf).toBeDefined(); - expect(isTtf(result.ttf)).toBe(true); - }); - - it("should default to ttf output when svg pipeline formats are still configured", async () => { - const result = await standalone({ - files: fixtureWoff2, - }); - - expect(result.ttf).toBeDefined(); - expect(isTtf(result.ttf)).toBe(true); - expect(result.woff).toBeUndefined(); - expect(result.woff2).toBeUndefined(); - }); - - it("should produce a valid ttf when round-tripping woff2 input", async () => { - const converted = await standalone({ files: fixtureWoff2, formats: ["ttf"] }); - - expect(isTtf(converted.ttf)).toBe(true); - expect(converted.hash).toBeUndefined(); - }); - - it("should produce a valid ttf when round-tripping woff input", async () => { - const converted = await standalone({ files: fixtureWoff, formats: ["ttf"] }); - - expect(isTtf(converted.ttf)).toBe(true); - expect(converted.hash).toBeUndefined(); - }); - - it("should reject mixed svg and webfont inputs", async () => { - await expect( - standalone({ - files: ["src/fixtures/svg-icons/avatar.svg", fixtureWoff2], - formats: ["ttf"], - }), - ).rejects.toThrow("Cannot mix SVG icons, TTF fonts, and WOFF/WOFF2 files"); - }); - - it("should reject unsupported input extensions", async () => { - await expect( - standalone({ - files: "package.json", - formats: ["ttf"], - }), - ).rejects.toThrow("did not match any supported files"); - }); - - it("should reject extension-less files mixed with webfont inputs", async () => { - await expect( - standalone({ - files: ["src/fixtures/extension-less-input", fixtureWoff2], - formats: ["ttf"], - }), - ).rejects.toThrow("did not match any supported files"); - }); - - it("should decompress multiple webfont files in one run", async () => { - const result = await standalone({ - files: [fixtureWoff, fixtureWoff2], - formats: ["ttf"], - }); - - expect(result.decompressedFonts).toHaveLength(2); - expect(result.ttf).toBeUndefined(); - expect(result.decompressedFonts?.every((font) => isTtf(font.ttf))).toBe(true); - }); - - it("should decompress a webfont from an https URL", async () => { - const fixture = fs.readFileSync(fixtureWoff2); - - vi.stubGlobal( - "fetch", - vi.fn().mockResolvedValue({ - ok: true, - status: 200, - statusText: "OK", - arrayBuffer: async () => fixture.buffer.slice(fixture.byteOffset, fixture.byteOffset + fixture.byteLength), - }), - ); - - try { - const result = await standalone({ - files: "https://cdn.example.com/iconfont.woff2", - formats: ["ttf"], - }); - - expect(result.ttf).toBeDefined(); - expect(isTtf(result.ttf)).toBe(true); - expect(result.decompressedFonts?.[0].source).toBe("https://cdn.example.com/iconfont.woff2"); - } finally { - vi.unstubAllGlobals(); - } - }); - - it("should attach discovered config filePath when converting woff2 input", async () => { - const result = await standalone({ - configFile: "src/fixtures/configs/.webfontrc-conversion.json", - files: fixtureWoff2, - formats: ["ttf"], - }); - - expect(result.config?.filePath).toContain(".webfontrc-conversion.json"); - expect(result.config?.fontName).toBe("conversion-config-font"); - expect(result.ttf).toBeDefined(); - }); - - it("should reject requesting both ttf and otf when the sfnt flavor is TrueType only", async () => { - await expect( - standalone({ - files: fixtureWoff2, - formats: ["ttf", "otf"], - }), - ).rejects.toThrow( - 'Input decompresses to TrueType (TTF). Request "ttf" format instead of "otf" for src/fixtures/fonts/iconfont.woff2.', - ); - }); - - it("should document that input fixtures are valid webfont containers", () => { - const woff = fs.readFileSync(fixtureWoff); - const woff2 = fs.readFileSync(fixtureWoff2); - - expect(isWoff(woff)).toBe(true); - expect(isWoff2(woff2)).toBe(true); - }); -}); diff --git a/packages/webfont/src/standalone/webfontFromGlyphs.test.ts b/packages/webfont/src/standalone/webfontFromGlyphs.test.ts deleted file mode 100644 index 2c5300fa..00000000 --- a/packages/webfont/src/standalone/webfontFromGlyphs.test.ts +++ /dev/null @@ -1,28 +0,0 @@ -import isWoff2 from "is-woff2"; -import standalone from "../standalone"; -import { webfontFromGlyphs } from "./webfontFromGlyphs"; - -const fixturesGlob = "src/fixtures"; - -describe("webfontFromGlyphs", () => { - it("should generate woff2 from in-memory SVG glyphs", async () => { - const fromFiles = await standalone({ - files: `${fixturesGlob}/svg-icons/**/*`, - formats: ["woff2"], - }); - - expect(fromFiles.glyphsData).toBeDefined(); - - const fromGlyphs = await webfontFromGlyphs({ - glyphs: - fromFiles.glyphsData?.map((glyph) => ({ - contents: glyph.contents, - srcPath: glyph.srcPath, - })) ?? [], - formats: ["woff2"], - }); - - expect(isWoff2(fromGlyphs.woff2)).toBe(true); - expect(fromGlyphs.hash).toBe(fromFiles.hash); - }); -}); diff --git a/packages/webfont/src/standalone/webfontFromGlyphs.ts b/packages/webfont/src/standalone/webfontFromGlyphs.ts deleted file mode 100644 index 760890d7..00000000 --- a/packages/webfont/src/standalone/webfontFromGlyphs.ts +++ /dev/null @@ -1,18 +0,0 @@ -import type { Result } from "../types/Result"; -import type { WebfontFromGlyphsOptions } from "../types/WebfontFromGlyphsOptions"; -import { getGlyphsDataFromInputs } from "./getGlyphsDataFromInputs"; -import { assertSvgPipelineFormats } from "./inputMode"; -import { getOptionsFromGlyphs } from "./optionsFromGlyphs"; -import { runSvgPipeline } from "./runSvgPipeline"; -import { validateWebfontOptions } from "./validateWebfontOptions"; - -export const webfontFromGlyphs = async (initialOptions: WebfontFromGlyphsOptions): Promise => { - let options = getOptionsFromGlyphs(initialOptions); - options = validateWebfontOptions(options); - - assertSvgPipelineFormats(options.formats); - - const glyphsData = await getGlyphsDataFromInputs(initialOptions.glyphs, options); - - return runSvgPipeline(glyphsData, options); -}; diff --git a/packages/webfont/src/types/DecompressedFont.ts b/packages/webfont/src/types/DecompressedFont.ts deleted file mode 100644 index 7fae6279..00000000 --- a/packages/webfont/src/types/DecompressedFont.ts +++ /dev/null @@ -1,5 +0,0 @@ -export type DecompressedFont = { - source: string; - ttf?: Buffer; - otf?: Buffer; -}; diff --git a/packages/webfont/src/types/Format.ts b/packages/webfont/src/types/Format.ts deleted file mode 100644 index 1c615a56..00000000 --- a/packages/webfont/src/types/Format.ts +++ /dev/null @@ -1,13 +0,0 @@ -export type Format = "eot" | "otf" | "woff" | "woff2" | "svg" | "ttf"; -export type Formats = Array; -// Mirrors svg2ttf's FontOptions (the only format currently consuming these -// options). Fields are optional and accept `null` because webfont's defaults -// seed them as `null` ("let svg2ttf pick"), while callers pass concrete values. -type FormatOption = { - copyright?: string | null; - description?: string | null; - ts?: number | null; - url?: string | null; - version?: string | null; -}; -export type FormatsOptions = Partial>; diff --git a/packages/webfont/src/types/GlyphContentTransformFn.ts b/packages/webfont/src/types/GlyphContentTransformFn.ts deleted file mode 100644 index 09b148f6..00000000 --- a/packages/webfont/src/types/GlyphContentTransformFn.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { GlyphData } from "./GlyphData"; - -export type GlyphContentTransformFn = (_glyph: GlyphData) => string | Promise; diff --git a/packages/webfont/src/types/GlyphInput.ts b/packages/webfont/src/types/GlyphInput.ts deleted file mode 100644 index bb1a43da..00000000 --- a/packages/webfont/src/types/GlyphInput.ts +++ /dev/null @@ -1,6 +0,0 @@ -export type GlyphInput = { - /** SVG source text. */ - contents: string; - /** Logical path or filename used for metadata (defaults to `icon.svg`). */ - srcPath?: string; -}; diff --git a/packages/webfont/src/types/GlyphTransformFn.ts b/packages/webfont/src/types/GlyphTransformFn.ts deleted file mode 100644 index a9b842a6..00000000 --- a/packages/webfont/src/types/GlyphTransformFn.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { GlyphMetadata } from "./GlyphMetadata"; - -export type GlyphTransformFn = (_obj: GlyphMetadata) => GlyphMetadata | Promise; diff --git a/packages/webfont/src/types/InitialOptions.ts b/packages/webfont/src/types/InitialOptions.ts deleted file mode 100644 index 926d6fb8..00000000 --- a/packages/webfont/src/types/InitialOptions.ts +++ /dev/null @@ -1,13 +0,0 @@ -import type { GlyphContentTransformFn } from "./GlyphContentTransformFn"; -import type { GlyphTransformFn } from "./GlyphTransformFn"; -import type { MetadataProvider } from "./MetadataProvider"; -import type { OptionsBase } from "./OptionsBase"; -import type { TtfPostProcessFn } from "./TtfPostProcessFn"; - -export type InitialOptions = OptionsBase & { - files: string | Array; - glyphContentTransformFn?: GlyphContentTransformFn; - glyphTransformFn?: GlyphTransformFn; - metadataProvider?: MetadataProvider; - ttfPostProcess?: TtfPostProcessFn; -}; diff --git a/packages/webfont/src/types/MetadataProvider.ts b/packages/webfont/src/types/MetadataProvider.ts deleted file mode 100644 index c83e18ca..00000000 --- a/packages/webfont/src/types/MetadataProvider.ts +++ /dev/null @@ -1,9 +0,0 @@ -export type FileMetadata = { - name: string; - unicode?: string | string[]; -}; - -export type MetadataProvider = ( - srcPath: string, - callback: (error: Error | null, metadata?: FileMetadata) => void, -) => void; diff --git a/packages/webfont/src/types/RenderedTemplate.ts b/packages/webfont/src/types/RenderedTemplate.ts deleted file mode 100644 index 49991dd3..00000000 --- a/packages/webfont/src/types/RenderedTemplate.ts +++ /dev/null @@ -1,7 +0,0 @@ -export type RenderedTemplate = { - /** Original template option (built-in name or custom path). */ - template: string; - content: string; - /** Built-in template id when applicable (css, html, scss, …). */ - builtIn?: string; -}; diff --git a/packages/webfont/src/types/Result.ts b/packages/webfont/src/types/Result.ts deleted file mode 100644 index bafa7359..00000000 --- a/packages/webfont/src/types/Result.ts +++ /dev/null @@ -1,28 +0,0 @@ -import type { DecompressedFont } from "./DecompressedFont"; -import type { GlyphData } from "./GlyphData"; -import type { RenderedTemplate } from "./RenderedTemplate"; -import type { ResultConfig } from "./ResultConfig"; -import type { SvgGlyphDiagnostic } from "./SvgToolsOptions"; -import type { TranscodedFont } from "./TranscodedFont"; - -export type { DecompressedFont } from "./DecompressedFont"; -export type { TranscodedFont } from "./TranscodedFont"; - -export type Result = { - config?: ResultConfig; - decompressedFonts?: DecompressedFont[]; - transcodedFonts?: TranscodedFont[]; - eot?: Buffer; - glyphsData?: Array; - hash?: string; - otf?: Buffer; - svg?: string | Buffer; - template?: string; - templates?: RenderedTemplate[]; - ttf?: Buffer; - usedBuildInTemplate?: boolean; - woff?: Buffer; - woff2?: Buffer; - /** Alpha. Populated when `svgTools.diagnose` is enabled. */ - svgDiagnostics?: SvgGlyphDiagnostic[]; -}; diff --git a/packages/webfont/src/types/ResultConfig.ts b/packages/webfont/src/types/ResultConfig.ts deleted file mode 100644 index 9fb4f3b0..00000000 --- a/packages/webfont/src/types/ResultConfig.ts +++ /dev/null @@ -1,5 +0,0 @@ -import type { WebfontOptions } from "./WebfontOptions"; - -export type ResultConfig = WebfontOptions & { - filePath?: string; -}; diff --git a/packages/webfont/src/types/SvgToolsOptions.ts b/packages/webfont/src/types/SvgToolsOptions.ts deleted file mode 100644 index b8325605..00000000 --- a/packages/webfont/src/types/SvgToolsOptions.ts +++ /dev/null @@ -1,15 +0,0 @@ -export type SvgDiagnosticCode = "evenodd-fill-rule" | "stroke-only" | "unsupported-element" | "use-reference"; - -export type SvgGlyphDiagnostic = { - code: SvgDiagnosticCode; - message: string; - srcPath: string; -}; - -/** Alpha. SVG diagnostics for the icon-font pipeline (see ADR 0011 — no bundled stroke-to-fill fixes). */ -export type SvgToolsOptions = { - /** Scan source SVGs for known icon-font incompatibilities and report warnings. */ - diagnose?: boolean; - /** Optional sink for diagnostic log lines (for example a web worker or test spy). */ - onMessage?: (message: string) => void; -}; diff --git a/packages/webfont/src/types/TranscodedFont.ts b/packages/webfont/src/types/TranscodedFont.ts deleted file mode 100644 index f282c6e4..00000000 --- a/packages/webfont/src/types/TranscodedFont.ts +++ /dev/null @@ -1,8 +0,0 @@ -export type TranscodedFont = { - source: string; - eot?: Buffer; - svg?: string; - ttf?: Buffer; - woff?: Buffer; - woff2?: Buffer; -}; diff --git a/packages/webfont/src/types/TtfPostProcessFn.ts b/packages/webfont/src/types/TtfPostProcessFn.ts deleted file mode 100644 index 8cd9187b..00000000 --- a/packages/webfont/src/types/TtfPostProcessFn.ts +++ /dev/null @@ -1,17 +0,0 @@ -import type { Formats } from "./Format"; - -export type TtfPostProcessContext = { - fontName: string; - formats: Formats; -}; - -/** - * Post-process the generated TTF buffer before webfont derives WOFF/WOFF2/EOT - * from it. Runs only in the SVG pipeline. Return the (possibly rewritten) font - * bytes. Enables optional, caller-owned steps such as autohinting without the - * core taking a native dependency (see ADR 0011 for the analogous stroke case). - */ -export type TtfPostProcessFn = ( - _ttf: Buffer, - _context: TtfPostProcessContext, -) => Buffer | Uint8Array | Promise; diff --git a/packages/webfont/src/types/WebfontFromGlyphsOptions.ts b/packages/webfont/src/types/WebfontFromGlyphsOptions.ts deleted file mode 100644 index 733b15ee..00000000 --- a/packages/webfont/src/types/WebfontFromGlyphsOptions.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { GlyphContentTransformFn } from "./GlyphContentTransformFn"; -import type { GlyphInput } from "./GlyphInput"; -import type { GlyphTransformFn } from "./GlyphTransformFn"; -import type { MetadataProvider } from "./MetadataProvider"; -import type { OptionsBase } from "./OptionsBase"; - -export type WebfontFromGlyphsOptions = OptionsBase & { - glyphs: GlyphInput[]; - glyphContentTransformFn?: GlyphContentTransformFn; - glyphTransformFn?: GlyphTransformFn; - metadataProvider?: MetadataProvider; -}; diff --git a/packages/webfont/src/types/WebfontOptions.ts b/packages/webfont/src/types/WebfontOptions.ts deleted file mode 100644 index e503b724..00000000 --- a/packages/webfont/src/types/WebfontOptions.ts +++ /dev/null @@ -1,45 +0,0 @@ -import type { Config as SvgoConfig } from "svgo"; -import type { TemplateOption } from "../lib/parseTemplateOption"; -import type { Formats, FormatsOptions } from "./Format"; -import type { GlyphContentTransformFn } from "./GlyphContentTransformFn"; -import type { GlyphTransformFn } from "./GlyphTransformFn"; -import type { InitialOptions } from "./InitialOptions"; -import type { MetadataProvider } from "./MetadataProvider"; -import type { SvgToolsOptions } from "./SvgToolsOptions"; - -export interface WebfontOptions extends InitialOptions { - centerHorizontally: boolean; - centerVertically: boolean; - descent: number; - fixedWidth: boolean; - fontHeight: unknown; - fontId: unknown; - fontName: string; - fontStyle: string; - fontWeight: string; - formats: Formats; - formatsOptions: FormatsOptions; - glyphTransformFn?: GlyphTransformFn; - glyphContentTransformFn?: GlyphContentTransformFn; - ligatures: boolean; - maxConcurrency: number; - metadata: unknown; - metadataProvider?: MetadataProvider; - normalize: boolean; - prependUnicode: boolean; - round: string | number; - sort: boolean; - startUnicode: number; - template?: TemplateOption; - templateCacheString?: unknown; - templateClassName?: unknown; - templateFontName?: unknown; - templateFontPath: string; - verbose: boolean; - addHashInFontUrl?: boolean; - unicodeRange?: boolean | string; - optimizeSvg?: boolean; - svgoConfig?: SvgoConfig; - templateFontLigatures?: boolean; - svgTools?: SvgToolsOptions; -} diff --git a/packages/webfont/src/types/index.ts b/packages/webfont/src/types/index.ts deleted file mode 100644 index 0d0e8749..00000000 --- a/packages/webfont/src/types/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -export type { Format, FormatsOptions } from "../types/Format"; -export type { GlyphContentTransformFn } from "./GlyphContentTransformFn"; -export type { GlyphData } from "./GlyphData"; -export type { GlyphMetadata } from "./GlyphMetadata"; -export type { GlyphTransformFn } from "./GlyphTransformFn"; -export type { InitialOptions } from "./InitialOptions"; -export type { MetadataProvider } from "./MetadataProvider"; -export type { TtfPostProcessContext, TtfPostProcessFn } from "./TtfPostProcessFn"; -export type { WebfontOptions } from "./WebfontOptions"; diff --git a/packages/webfont/tsconfig.build.json b/packages/webfont/tsconfig.build.json deleted file mode 100644 index 6c8122fd..00000000 --- a/packages/webfont/tsconfig.build.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "lib": ["ES2020"], - "module": "commonjs", - "noEmit": false, - "outDir": "dist", - "rootDir": ".", - "target": "ES2020" - }, - "include": ["src/**/*", "types/**/*"], - "exclude": ["src/**/*.test.ts", "src/**/__mocks__/**", "src/**/*.js", "src/cli/**"] -} diff --git a/packages/webfont/tsconfig.json b/packages/webfont/tsconfig.json deleted file mode 100644 index d8717078..00000000 --- a/packages/webfont/tsconfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "compilerOptions": { - "esModuleInterop": true, - "lib": ["ES2023"], - "module": "esnext", - "moduleResolution": "bundler", - "noEmit": true, - "noImplicitAny": true, - "resolveJsonModule": true, - "rootDir": ".", - "skipLibCheck": false, - "strictNullChecks": true, - "target": "ES2022", - "types": ["node", "vitest/globals"] - }, - "include": ["src/**/*", "templates/**/*", "types/**/*"] -} diff --git a/packages/webfont/types/font-format-modules.d.ts b/packages/webfont/types/font-format-modules.d.ts deleted file mode 100644 index 087bcd99..00000000 --- a/packages/webfont/types/font-format-modules.d.ts +++ /dev/null @@ -1,30 +0,0 @@ -// Ambient type declarations for the untyped font-format detectors used in tests. -// These packages ship no types and have no @types/* on DefinitelyTyped. -// -// Each detector guards falsy/short input at runtime and returns `false` for it -// (see the `if (!buf || buf.length < N) return false;` guard in every package), -// so accepting `undefined | null` is the accurate contract — callers can pass an -// optional `Result` font field (e.g. `result.woff2`) directly. - -declare module "is-ttf" { - const isTtf: ( - buffer: Buffer | Uint8Array | ArrayBuffer | string | undefined | null, - opts?: { tables?: string[] }, - ) => boolean; - export default isTtf; -} - -declare module "is-woff" { - const isWoff: (buffer: Buffer | Uint8Array | undefined | null) => boolean; - export default isWoff; -} - -declare module "is-woff2" { - const isWoff2: (buffer: Buffer | Uint8Array | undefined | null) => boolean; - export default isWoff2; -} - -declare module "is-eot" { - const isEot: (buffer: Buffer | Uint8Array | undefined | null) => boolean; - export default isEot; -} diff --git a/packages/webfont/types/fonteditor-core.d.ts b/packages/webfont/types/fonteditor-core.d.ts deleted file mode 100644 index b77bb059..00000000 --- a/packages/webfont/types/fonteditor-core.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -// fonteditor-core's bundled type declarations list the DOM `Document` global as -// an accepted parse input (FontInput = ArrayBuffer | Buffer | string | Document) -// for reading SVG fonts from a parsed document. webfont only uses the -// Buffer-based TTF -> SVG path in Node and deliberately keeps the DOM lib out of -// tsconfig (Node-only runtime plus a browser stub). This minimal ambient shim -// satisfies the reference without pulling in the full DOM lib or flipping -// skipLibCheck, and merges harmlessly if the DOM lib is ever added. -declare type Document = unknown; diff --git a/packages/webfont/types/fontverter.d.ts b/packages/webfont/types/fontverter.d.ts deleted file mode 100644 index 1f5eb5ff..00000000 --- a/packages/webfont/types/fontverter.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -declare module "fontverter" { - export type FontFormat = "sfnt" | "woff" | "woff2"; - - export function detectFormat(buffer: Buffer): FontFormat; - - export function convert(buffer: Buffer, toFormat: FontFormat, fromFormat?: FontFormat): Promise; -} diff --git a/packages/webfont/vite.config.ts b/packages/webfont/vite.config.ts deleted file mode 100644 index 31bd5b11..00000000 --- a/packages/webfont/vite.config.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { builtinModules } from "node:module"; -import { resolve } from "node:path"; -import { defineConfig, type PluginOption } from "vite"; -import checker from "vite-plugin-checker"; -import dts from "vite-plugin-dts"; -import { dependencies } from "./package.json"; - -const nodeBuiltins = [...builtinModules, ...builtinModules.map((moduleName) => `node:${moduleName}`)]; - -const external = [...Object.keys(dependencies), ...nodeBuiltins, "crypto", "fs", "os", "path", "stream", "util"]; - -const libraryEntry = resolve(__dirname, "src/index.ts"); -const browserEntry = resolve(__dirname, "src/browser.ts"); -const cliEntry = resolve(__dirname, "src/cli/index.ts"); - -const libraryPlugins: PluginOption[] = [ - checker({ - enableBuild: true, - typescript: { - tsconfigPath: "tsconfig.build.json", - }, - }), - dts({ - entryRoot: ".", - outDirs: "dist", - strictOutput: true, - tsconfigPath: "tsconfig.build.json", - }), -]; - -export default defineConfig(({ mode }) => { - const isCliBuild = mode === "cli"; - const isBrowserBuild = mode === "browser"; - const isLibraryEsmBuild = mode === "library-esm"; - let entry = libraryEntry; - let outputFileName = "index.js"; - let banner: string | undefined; - let outputFormat: "cjs" | "es" = "cjs"; - - if (isLibraryEsmBuild) { - outputFileName = "index.mjs"; - outputFormat = "es"; - banner = `import { fileURLToPath as __webfontFileURLToPath } from "node:url"; -const __filename = __webfontFileURLToPath(import.meta.url); -const __dirname = __webfontFileURLToPath(new URL(".", import.meta.url)); -`; - } - - if (isBrowserBuild) { - entry = browserEntry; - outputFileName = "browser.js"; - outputFormat = "es"; - } - - if (isCliBuild) { - entry = cliEntry; - outputFileName = "cli.mjs"; - banner = `#!/usr/bin/env node -import { fileURLToPath as __webfontFileURLToPath } from "node:url"; -const __filename = __webfontFileURLToPath(import.meta.url); -const __dirname = __webfontFileURLToPath(new URL(".", import.meta.url)); -`; - outputFormat = "es"; - } - - let plugins: PluginOption[] = libraryPlugins; - - if (isCliBuild || isBrowserBuild || isLibraryEsmBuild) { - plugins = []; - } - - return { - // The repo root holds a public/ folder used only by the VitePress docs site. - // Disable Vite's public-dir copying so the library build never bundles it. - publicDir: false, - build: { - emptyOutDir: !isCliBuild && !isBrowserBuild && !isLibraryEsmBuild, - lib: { - entry, - fileName: () => outputFileName, - formats: [outputFormat], - }, - outDir: "dist", - rolldownOptions: { - external, - output: { - banner, - exports: "named", - }, - }, - target: "es2020", - }, - plugins, - }; -}); diff --git a/packages/webfont/vitest.config.ts b/packages/webfont/vitest.config.ts deleted file mode 100644 index 09622885..00000000 --- a/packages/webfont/vitest.config.ts +++ /dev/null @@ -1,45 +0,0 @@ -import path from "node:path"; -import { defineConfig } from "vitest/config"; - -const esmNodeModules = [ - "globby", - "meow", - "p-limit", - "svgicons2svgfont", - "svg-pathdata", - "transformation-matrix", - "yerror", - "yocto-queue", - "is-svg", - "@file-type/xml", - "strtok3", - "peek-readable", - "@tokenizer/token", -]; - -export default defineConfig({ - resolve: { - alias: { - "@file-type/xml": path.resolve(__dirname, "../../node_modules/@file-type/xml/lib/index.js"), - }, - }, - test: { - coverage: { - enabled: true, - provider: "v8", - reporter: ["json"], - reportsDirectory: "coverage", - }, - environment: "node", - exclude: ["**/node_modules/**", "**/.github/**", "**/coverage/**", "**/dist/**", "**/temp/**"], - globals: true, - include: ["src/**/*.test.ts"], - name: "Webfont", - server: { - deps: { - inline: esmNodeModules, - }, - }, - testTimeout: 10_000, - }, -}); diff --git a/packages/webfont/vitest.write-docs.config.ts b/packages/webfont/vitest.write-docs.config.ts deleted file mode 100644 index e6de9b4d..00000000 --- a/packages/webfont/vitest.write-docs.config.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { defineConfig } from "vitest/config"; - -export default defineConfig({ - test: { - environment: "node", - globals: true, - include: ["scripts/write-cli-docs.vitest.ts"], - name: "write-cli-docs", - }, -}); diff --git a/release-please-config.json b/release-please-config.json deleted file mode 100644 index c4b153fe..00000000 --- a/release-please-config.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", - "include-component-in-tag": false, - "packages": { - "packages/webfont": { - "release-type": "node", - "package-name": "webfont" - } - } -} diff --git a/rollup.config.js b/rollup.config.js new file mode 100644 index 00000000..75959de4 --- /dev/null +++ b/rollup.config.js @@ -0,0 +1,43 @@ +import commonjs from "@rollup/plugin-commonjs"; +import {dependencies} from "./package.json"; +import typescript from "@rollup/plugin-typescript"; + +const dir = "dist"; + +const external = [ + ...Object.keys(dependencies), + "crypto", + "fs", + "os", + "path", + "stream", + "util", +]; + +const plugins = [ + typescript(), + commonjs(), +]; + +module.exports = [ + { + external, + input: "src/cli/index.ts", + output: { + banner: "#!/usr/bin/env node\n", + file: `${dir}/cli.js`, + format: "cjs", + }, + plugins, + }, + { + external, + input: "src/index.ts", + output: { + dir, + exports: "named", + format: "cjs", + }, + plugins, + }, +]; diff --git a/scripts/check-no-suppressions.mjs b/scripts/check-no-suppressions.mjs deleted file mode 100644 index 134d5337..00000000 --- a/scripts/check-no-suppressions.mjs +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/env node -// Fails when banned lint/type suppressions appear in tracked source files. -// Rationale: this repo uses Biome (not ESLint) and forbids silencing the -// type checker — see AGENTS.md "Lint and type hygiene" and ADR 0001. -// -// The forbidden tokens are assembled from fragments on purpose so this checker -// never matches itself (and neither does the AGENTS.md `rg` hygiene command). - -import { execFileSync } from "node:child_process"; -import { readFileSync } from "node:fs"; - -const SELF = "scripts/check-no-suppressions.mjs"; - -const BANNED = [ - { label: "eslint-" + "disable", re: /eslint-disable/u, hint: "ESLint is not used; delete stale suppressions (ADR 0001)." }, - { label: "@ts-" + "ignore", re: /@ts-ignore\b/u, hint: "Resolve the type instead of ignoring it (AGENTS.md)." }, - { label: "@ts-" + "expect-error", re: /@ts-expect-error\b/u, hint: "Use a typed cast/helper; prefer rejects.toThrow for async (AGENTS.md)." }, - { label: "@ts-" + "nocheck", re: /@ts-nocheck\b/u, hint: "Do not disable type checking for a whole file." }, - { label: "ignore" + "Deprecations", re: /ignoreDeprecations/u, hint: "Migrate deprecated compiler options instead of silencing them (AGENTS.md)." }, -]; - -const CODE_EXTENSIONS = [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs"]; - -const isScannable = (file) => { - if (file === SELF) { - return false; - } - - if (/(^|\/)tsconfig[^/]*\.json$/u.test(file)) { - return true; - } - - return CODE_EXTENSIONS.some((ext) => file.endsWith(ext)); -}; - -const trackedFiles = execFileSync("git", ["ls-files"], { encoding: "utf8" }) - .split("\n") - .filter(Boolean) - .filter(isScannable); - -const violations = []; - -for (const file of trackedFiles) { - const lines = readFileSync(file, "utf8").split("\n"); - - lines.forEach((line, index) => { - for (const rule of BANNED) { - if (rule.re.test(line)) { - violations.push({ file, line: index + 1, rule }); - } - } - }); -} - -if (violations.length > 0) { - console.error(`Found ${violations.length} banned lint/type suppression(s):\n`); - - for (const { file, line, rule } of violations) { - console.error(` ${file}:${line} ${rule.label}\n → ${rule.hint}`); - } - - console.error("\nSee AGENTS.md § 'Lint and type hygiene'. Use biome-ignore only when unavoidable."); - process.exit(1); -} - -console.log(`No banned suppressions in ${trackedFiles.length} tracked source files.`); diff --git a/scripts/grunt-recipe-smoke.vitest.ts b/scripts/grunt-recipe-smoke.vitest.ts deleted file mode 100644 index 9ac37573..00000000 --- a/scripts/grunt-recipe-smoke.vitest.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { execFile } from "node:child_process"; -import { access, readFile, rm } from "node:fs/promises"; -import { join } from "node:path"; -import { fileURLToPath } from "node:url"; -import { promisify } from "node:util"; -import { describe, expect, it } from "vitest"; - -const execFileAsync = promisify(execFile); -const REPO_ROOT = join(fileURLToPath(new URL(".", import.meta.url)), ".."); -const RECIPE_DIR = join(REPO_ROOT, "packages/grunt-webfont-recipe"); -const OUTPUT_DIR = join(RECIPE_DIR, "dist/fonts"); -const WOFF2_OUTPUT = join(OUTPUT_DIR, "icons.woff2"); -const CSS_OUTPUT = join(OUTPUT_DIR, "icons.css"); - -const runNpm = (args: string[], cwd: string) => - execFileAsync("npm", args, { - cwd, - env: { ...process.env, npm_config_loglevel: "error" }, - }); - -describe("grunt-webfont recipe smoke", () => { - it("should generate woff2 and css when grunt runs the custom webfont task", async () => { - await runNpm(["install", "--no-fund", "--no-audit"], RECIPE_DIR); - await runNpm(["run", "build", "-w", "webfont"], REPO_ROOT); - - await rm(join(RECIPE_DIR, "dist"), { recursive: true, force: true }); - - await execFileAsync("npx", ["grunt", "webfont", "--force"], { - cwd: RECIPE_DIR, - env: { ...process.env, npm_config_loglevel: "error" }, - }); - - await expect(access(WOFF2_OUTPUT)).resolves.toBeUndefined(); - await expect(access(CSS_OUTPUT)).resolves.toBeUndefined(); - - const woff2 = await readFile(WOFF2_OUTPUT); - expect(woff2.subarray(0, 4).toString("ascii")).toBe("wOF2"); - expect(woff2.length).toBeGreaterThan(100); - - const css = await readFile(CSS_OUTPUT, "utf8"); - expect(css).toMatch(/@font-face/u); - expect(css).toMatch(/icons\.woff2/u); - }, 120_000); -}); diff --git a/scripts/render-homebrew-core-formula.mjs b/scripts/render-homebrew-core-formula.mjs deleted file mode 100644 index c37aa14e..00000000 --- a/scripts/render-homebrew-core-formula.mjs +++ /dev/null @@ -1,93 +0,0 @@ -#!/usr/bin/env node -/** - * Render a homebrew-core Formula/w/webfont.rb from HomebrewFormula/webfont.rb. - * - * Usage: - * node scripts/render-homebrew-core-formula.mjs # stdout - * node scripts/render-homebrew-core-formula.mjs > webfont.rb # save for core PR - */ -import { readFileSync } from "node:fs"; -import { dirname, join } from "node:path"; -import { fileURLToPath } from "node:url"; - -const REPO_ROOT = join(dirname(fileURLToPath(import.meta.url)), ".."); -const TAP_FORMULA = join(REPO_ROOT, "HomebrewFormula/webfont.rb"); - -/** @param {{ url: string; sha256: string }} fields */ -export function renderHomebrewCoreFormula({ url, sha256 }) { - return `class Webfont < Formula - desc "Generator of fonts from SVG icons, with TTF encoding and WOFF/WOFF2 decoding" - homepage "https://webfont.js.org/" - url "${url}" - sha256 "${sha256}" - license "MIT" - - depends_on "node" - - def install - system "npm", "install", *std_npm_args - bin.install_symlink libexec.glob("bin/*") - end - - test do - (testpath/"icon.svg").write <<~SVG - - SVG - - system bin/"webfont", testpath/"icon.svg", "-d", testpath, "-f", "woff2" - assert_path_exists testpath/"webfont.woff2" - assert_match version.to_s, shell_output("#{bin}/webfont --version") - end -end -`; -} - -/** @param {string} content */ -export function extractFormulaFields(content) { - const urlMatch = content.match(/^ url "(.+)"$/m); - const shaMatch = content.match(/^ sha256 "(.+)"$/m); - - if (!urlMatch || !shaMatch) { - throw new Error("Could not extract url/sha256 from formula"); - } - - return { - url: urlMatch[1], - sha256: shaMatch[1], - }; -} - -/** @param {string} tapFormula @param {string} coreFormula */ -export function assertFormulasInSync(tapFormula, coreFormula) { - const tap = extractFormulaFields(tapFormula); - const core = extractFormulaFields(coreFormula); - - if (tap.url !== core.url || tap.sha256 !== core.sha256) { - throw new Error( - `Tap/core url/sha256 mismatch:\n tap: ${tap.url}\n core: ${core.url}`, - ); - } - - for (const block of ["def install", "test do", 'libexec.glob("bin/*")', "woff2"]) { - if (!tapFormula.includes(block) || !coreFormula.includes(block)) { - throw new Error(`Missing expected Homebrew block: ${block}`); - } - } -} - -/** @param {string} [tapFormulaPath] */ -export function renderHomebrewCoreFromTap(tapFormulaPath = TAP_FORMULA) { - const tapFormula = readFileSync(tapFormulaPath, "utf8"); - const fields = extractFormulaFields(tapFormula); - const coreFormula = renderHomebrewCoreFormula(fields); - assertFormulasInSync(tapFormula, coreFormula); - return coreFormula; -} - -const isMain = - process.argv[1] !== undefined && - fileURLToPath(import.meta.url) === process.argv[1]; - -if (isMain) { - process.stdout.write(renderHomebrewCoreFromTap()); -} diff --git a/scripts/render-homebrew-core-formula.vitest.ts b/scripts/render-homebrew-core-formula.vitest.ts deleted file mode 100644 index 90f7f547..00000000 --- a/scripts/render-homebrew-core-formula.vitest.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { readFileSync } from "node:fs"; -import { join } from "node:path"; -import { describe, expect, it } from "vitest"; -import { - assertFormulasInSync, - extractFormulaFields, - renderHomebrewCoreFormula, - renderHomebrewCoreFromTap, -} from "./render-homebrew-core-formula.mjs"; - -const TAP_SAMPLE = `# typed: strict -class Webfont < Formula - url "https://registry.npmjs.org/webfont/-/webfont-1.0.0.tgz" - sha256 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - def install - system "npm", "install", *std_npm_args - bin.install_symlink libexec.glob("bin/*") - end - test do - system bin/"webfont", testpath/"icon.svg", "-d", testpath, "-f", "woff2" - assert_path_exists testpath/"webfont.woff2" - end -end -`; - -describe("renderHomebrewCoreFormula", () => { - it("should render a homebrew-core formula with npm url and sha256", () => { - const rendered = renderHomebrewCoreFormula({ - url: "https://registry.npmjs.org/webfont/-/webfont-2.0.0.tgz", - sha256: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - }); - - expect(rendered).toContain('url "https://registry.npmjs.org/webfont/-/webfont-2.0.0.tgz"'); - expect(rendered).toContain('sha256 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"'); - expect(rendered).toContain('homepage "https://webfont.js.org/"'); - expect(rendered).toContain('libexec.glob("bin/*")'); - expect(rendered).toContain('shell_output("#{bin}/webfont --version")'); - expect(rendered).not.toContain("brew tap"); - }); -}); - -describe("assertFormulasInSync", () => { - it("should accept tap and core formulas with matching url and sha256", () => { - const core = renderHomebrewCoreFormula({ - url: "https://registry.npmjs.org/webfont/-/webfont-1.0.0.tgz", - sha256: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - }); - - expect(() => assertFormulasInSync(TAP_SAMPLE, core)).not.toThrow(); - }); - - it("should reject formulas when url or sha256 differ", () => { - const core = renderHomebrewCoreFormula({ - url: "https://registry.npmjs.org/webfont/-/webfont-9.9.9.tgz", - sha256: "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", - }); - - expect(() => assertFormulasInSync(TAP_SAMPLE, core)).toThrow(/mismatch/u); - }); -}); - -describe("renderHomebrewCoreFromTap", () => { - it("should render homebrew-core output from HomebrewFormula/webfont.rb", () => { - const tapPath = join(process.cwd(), "HomebrewFormula/webfont.rb"); - const core = renderHomebrewCoreFromTap(tapPath); - - assertFormulasInSync(readFileSync(tapPath, "utf8"), core); - - const fields = extractFormulaFields(core); - expect(fields.url).toMatch(/^https:\/\/registry\.npmjs\.org\/webfont\/-/u); - }); -}); diff --git a/scripts/sync-homebrew-formula.mjs b/scripts/sync-homebrew-formula.mjs deleted file mode 100644 index 63866d1d..00000000 --- a/scripts/sync-homebrew-formula.mjs +++ /dev/null @@ -1,204 +0,0 @@ -#!/usr/bin/env node -/** - * Bump HomebrewFormula/webfont.rb url/sha256 from the npm registry. - */ -import { createHash } from "node:crypto"; -import { - appendFileSync, - lstatSync, - mkdirSync, - readFileSync, - readlinkSync, - symlinkSync, - unlinkSync, - writeFileSync, -} from "node:fs"; -import { dirname, join } from "node:path"; -import { fileURLToPath } from "node:url"; - -const REPO_ROOT = join(dirname(fileURLToPath(import.meta.url)), ".."); - -export const PATHS = { - formula: join(REPO_ROOT, "HomebrewFormula/webfont.rb"), - alias: join(REPO_ROOT, "Aliases/webfonts"), - packageJson: join(REPO_ROOT, "packages/webfont/package.json"), -}; - -/** @param {string} content @param {{ url: string; sha256: string }} fields */ -export function patchFormulaUrlAndSha256(content, { url, sha256 }) { - const nextUrl = content.replace(/^ url ".+"$/m, ` url "${url}"`); - if (nextUrl === content) { - throw new Error("Could not patch formula url line"); - } - - const next = nextUrl.replace(/^ sha256 ".+"$/m, ` sha256 "${sha256}"`); - if (next === nextUrl) { - throw new Error("Could not patch formula sha256 line"); - } - - return next; -} - -/** @param {string} version */ -export async function resolveNpmTarballUrl(version) { - const response = await fetch(`https://registry.npmjs.org/webfont/${version}`); - if (!response.ok) { - throw new Error(`npm registry returned ${response.status} for webfont@${version}`); - } - - const metadata = await response.json(); - const tarball = metadata?.dist?.tarball; - if (typeof tarball !== "string" || tarball.length === 0) { - throw new Error(`npm metadata for webfont@${version} has no dist.tarball`); - } - - return tarball; -} - -/** @param {string} url */ -export async function fetchTarballSha256(url) { - const response = await fetch(url); - if (!response.ok) { - throw new Error(`Failed to download tarball (${response.status}): ${url}`); - } - - const bytes = Buffer.from(await response.arrayBuffer()); - return createHash("sha256").update(bytes).digest("hex"); -} - -/** - * @param {string} linkPath - * @param {string} targetRelative - */ -export function ensureSymlink(linkPath, targetRelative) { - mkdirSync(dirname(linkPath), { recursive: true }); - - try { - const stat = lstatSync(linkPath); - if (stat.isSymbolicLink() && readlinkSync(linkPath) === targetRelative) { - return; - } - - unlinkSync(linkPath); - } catch (error) { - if (/** @type {NodeJS.ErrnoException} */ (error).code !== "ENOENT") { - throw error; - } - } - - symlinkSync(targetRelative, linkPath); -} - -/** @param {unknown} version */ -export function assertValidVersion(version) { - if (typeof version !== "string" || version.trim().length === 0) { - throw new Error("Expected a non-empty npm version string"); - } - - return version; -} - -/** @param {string} version */ -export async function resolveNpmReleaseForVersion(version) { - assertValidVersion(version); - - const url = await resolveNpmTarballUrl(version); - const sha256 = await fetchTarballSha256(url); - - return { version, url, sha256 }; -} - -/** - * @param {{ version?: string; repoRoot?: string }} [options] - */ -export async function syncHomebrewFormula(options = {}) { - const repoRoot = options.repoRoot ?? REPO_ROOT; - const paths = { - formula: join(repoRoot, "HomebrewFormula/webfont.rb"), - alias: join(repoRoot, "Aliases/webfonts"), - packageJson: join(repoRoot, "packages/webfont/package.json"), - }; - - let version = options.version; - if (!version) { - const packageJson = JSON.parse(readFileSync(paths.packageJson, "utf8")); - version = packageJson.version; - } - - assertValidVersion(version); - - const { url, sha256 } = await resolveNpmReleaseForVersion(version); - - const current = readFileSync(paths.formula, "utf8"); - const updated = patchFormulaUrlAndSha256(current, { url, sha256 }); - writeFileSync(paths.formula, updated); - - ensureSymlink(paths.alias, "../HomebrewFormula/webfont.rb"); - - return { version, url, sha256 }; -} - -function readVersionArg(argv) { - const flagIndex = argv.indexOf("--version"); - if (flagIndex === -1) { - return undefined; - } - - const value = argv[flagIndex + 1]; - if (!value || value.startsWith("-")) { - throw new Error("Missing value for --version"); - } - - return value; -} - -/** @param {Record} entries */ -export function writeGithubOutput(entries) { - const outputPath = process.env.GITHUB_OUTPUT; - if (!outputPath) { - throw new Error("GITHUB_OUTPUT is not set"); - } - - for (const [key, value] of Object.entries(entries)) { - if (key.includes("\n") || value.includes("\n")) { - throw new Error( - `GITHUB_OUTPUT entry "${key}" must be a single line (use the heredoc format for multiline values)`, - ); - } - - appendFileSync(outputPath, `${key}=${value}\n`); - } -} - -const isMain = - process.argv[1] !== undefined && - fileURLToPath(import.meta.url) === process.argv[1]; - -if (isMain) { - const version = readVersionArg(process.argv); - const githubOutput = process.argv.includes("--github-output"); - - if (githubOutput) { - const result = await resolveNpmReleaseForVersion( - version ?? JSON.parse(readFileSync(PATHS.packageJson, "utf8")).version, - ); - writeGithubOutput({ - version: result.version, - url: result.url, - sha256: result.sha256, - }); - process.stdout.write( - `Resolved npm release for webfont@${result.version}\n` + - ` url: ${result.url}\n` + - ` sha256: ${result.sha256}\n`, - ); - process.exit(0); - } - - const result = await syncHomebrewFormula({ version }); - process.stdout.write( - `Synced Homebrew formula to webfont@${result.version}\n` + - ` url: ${result.url}\n` + - ` sha256: ${result.sha256}\n`, - ); -} diff --git a/scripts/sync-homebrew-formula.vitest.ts b/scripts/sync-homebrew-formula.vitest.ts deleted file mode 100644 index ca993860..00000000 --- a/scripts/sync-homebrew-formula.vitest.ts +++ /dev/null @@ -1,230 +0,0 @@ -import { - lstatSync, - mkdirSync, - mkdtempSync, - readFileSync, - readlinkSync, - symlinkSync, - writeFileSync, -} from "node:fs"; -import { rm } from "node:fs/promises"; -import { tmpdir } from "node:os"; -import { join } from "node:path"; -import { afterEach, describe, expect, it, vi } from "vitest"; -import { - assertValidVersion, - ensureSymlink, - PATHS, - patchFormulaUrlAndSha256, - resolveNpmReleaseForVersion, - syncHomebrewFormula, - writeGithubOutput, -} from "./sync-homebrew-formula.mjs"; - -const SAMPLE_FORMULA = `# typed: strict -# frozen_string_literal: true -class Webfont < Formula - url "https://registry.npmjs.org/webfont/-/webfont-1.0.0.tgz" - sha256 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - license "MIT" - depends_on "node" - def install - system "npm", "install", *std_npm_args - bin.install_symlink libexec.glob("bin/*") - end - test do - system bin/"webfont", testpath/"icon.svg", "-d", testpath, "-f", "woff2" - assert_path_exists testpath/"webfont.woff2" - end -end -`; - -const tempDirs: string[] = []; - -afterEach(async () => { - vi.unstubAllGlobals(); - await Promise.all(tempDirs.splice(0).map((dir) => rm(dir, { recursive: true, force: true }))); -}); - -describe("assertValidVersion", () => { - it("should reject missing or empty version strings", () => { - expect(() => assertValidVersion(undefined)).toThrow(/non-empty npm version string/u); - expect(() => assertValidVersion("")).toThrow(/non-empty npm version string/u); - expect(() => assertValidVersion(" ")).toThrow(/non-empty npm version string/u); - }); - - it("should return a valid version string unchanged", () => { - expect(assertValidVersion("12.4.1")).toBe("12.4.1"); - }); -}); - -describe("patchFormulaUrlAndSha256", () => { - it("should replace url and sha256 lines in a formula", () => { - const next = patchFormulaUrlAndSha256(SAMPLE_FORMULA, { - url: "https://registry.npmjs.org/webfont/-/webfont-2.0.0.tgz", - sha256: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - }); - - expect(next).toContain('url "https://registry.npmjs.org/webfont/-/webfont-2.0.0.tgz"'); - expect(next).toContain('sha256 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"'); - }); - - it("should throw when the formula has no url line to patch", () => { - expect(() => - patchFormulaUrlAndSha256("class Webfont < Formula\nend\n", { - url: "https://example.test/pkg.tgz", - sha256: "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", - }), - ).toThrow(/Could not patch formula url line/u); - }); -}); - -describe("ensureSymlink", () => { - it("should create a relative symlink when the alias is missing", () => { - const root = mkdtempSync(join(tmpdir(), "webfont-homebrew-")); - tempDirs.push(root); - const aliasPath = join(root, "Aliases/webfonts"); - const targetPath = join(root, "HomebrewFormula/webfont.rb"); - - mkdirSync(join(root, "HomebrewFormula"), { recursive: true }); - writeFileSync(targetPath, SAMPLE_FORMULA); - - ensureSymlink(aliasPath, "../HomebrewFormula/webfont.rb"); - - expect(lstatSync(aliasPath).isSymbolicLink()).toBe(true); - expect(readlinkSync(aliasPath)).toBe("../HomebrewFormula/webfont.rb"); - expect(readFileSync(targetPath, "utf8")).toBe(SAMPLE_FORMULA); - }); - - it("should not recreate a symlink that already points at the target", () => { - const root = mkdtempSync(join(tmpdir(), "webfont-homebrew-")); - tempDirs.push(root); - const aliasPath = join(root, "Aliases/webfonts"); - - mkdirSync(join(root, "Aliases"), { recursive: true }); - symlinkSync("../HomebrewFormula/webfont.rb", aliasPath); - - ensureSymlink(aliasPath, "../HomebrewFormula/webfont.rb"); - - expect(readlinkSync(aliasPath)).toBe("../HomebrewFormula/webfont.rb"); - }); -}); - -describe("resolveNpmReleaseForVersion", () => { - it("should resolve npm tarball url and sha256 without writing formula files", async () => { - const formulaBefore = readFileSync(PATHS.formula, "utf8"); - - vi.stubGlobal( - "fetch", - vi.fn((input: string | URL | Request) => { - const url = String(input); - if (url.endsWith("/webfont/3.2.1")) { - return new Response( - JSON.stringify({ - dist: { tarball: "https://registry.npmjs.org/webfont/-/webfont-3.2.1.tgz" }, - }), - { status: 200 }, - ); - } - - if (url.endsWith("webfont-3.2.1.tgz")) { - return new Response(Buffer.from("fake-tarball"), { status: 200 }); - } - - return new Response("not found", { status: 404 }); - }), - ); - - const result = await resolveNpmReleaseForVersion("3.2.1"); - - expect(result.version).toBe("3.2.1"); - expect(result.url).toBe("https://registry.npmjs.org/webfont/-/webfont-3.2.1.tgz"); - expect(result.sha256).toMatch(/^[a-f0-9]{64}$/u); - expect(readFileSync(PATHS.formula, "utf8")).toBe(formulaBefore); - }); -}); - -describe("writeGithubOutput", () => { - it("should append key=value lines to GITHUB_OUTPUT", () => { - const root = mkdtempSync(join(tmpdir(), "webfont-gh-output-")); - tempDirs.push(root); - const outputPath = join(root, "output.txt"); - - const previous = process.env.GITHUB_OUTPUT; - process.env.GITHUB_OUTPUT = outputPath; - - try { - writeGithubOutput({ url: "https://example.test/pkg.tgz", sha256: "abc" }); - expect(readFileSync(outputPath, "utf8")).toBe("url=https://example.test/pkg.tgz\nsha256=abc\n"); - } finally { - if (previous === undefined) { - delete process.env.GITHUB_OUTPUT; - } else { - process.env.GITHUB_OUTPUT = previous; - } - } - }); - - it("should reject multiline GITHUB_OUTPUT values", () => { - const root = mkdtempSync(join(tmpdir(), "webfont-gh-output-")); - tempDirs.push(root); - const outputPath = join(root, "output.txt"); - - const previous = process.env.GITHUB_OUTPUT; - process.env.GITHUB_OUTPUT = outputPath; - - try { - expect(() => writeGithubOutput({ url: "https://example.test/a\nb.tgz" })).toThrow(/single line/u); - } finally { - if (previous === undefined) { - delete process.env.GITHUB_OUTPUT; - } else { - process.env.GITHUB_OUTPUT = previous; - } - } - }); -}); - -describe("syncHomebrewFormula", () => { - it("should patch HomebrewFormula/webfont.rb using mocked npm metadata", async () => { - const root = mkdtempSync(join(tmpdir(), "webfont-homebrew-sync-")); - tempDirs.push(root); - - const formulaDir = join(root, "HomebrewFormula"); - mkdirSync(formulaDir, { recursive: true }); - writeFileSync(join(formulaDir, "webfont.rb"), SAMPLE_FORMULA); - mkdirSync(join(root, "packages/webfont"), { recursive: true }); - writeFileSync(join(root, "packages/webfont/package.json"), JSON.stringify({ version: "9.9.9" })); - - vi.stubGlobal( - "fetch", - vi.fn((input: string | URL | Request) => { - const url = String(input); - if (url.endsWith("/webfont/9.9.9")) { - return new Response( - JSON.stringify({ - dist: { tarball: "https://registry.npmjs.org/webfont/-/webfont-9.9.9.tgz" }, - }), - { status: 200 }, - ); - } - - if (url.endsWith("webfont-9.9.9.tgz")) { - return new Response(Buffer.from("fake-tarball"), { status: 200 }); - } - - return new Response("not found", { status: 404 }); - }), - ); - - const result = await syncHomebrewFormula({ version: "9.9.9", repoRoot: root }); - - expect(result.version).toBe("9.9.9"); - expect(result.url).toBe("https://registry.npmjs.org/webfont/-/webfont-9.9.9.tgz"); - - const formula = readFileSync(join(root, "HomebrewFormula/webfont.rb"), "utf8"); - - expect(formula).toContain("webfont-9.9.9.tgz"); - expect(readlinkSync(join(root, "Aliases/webfonts"))).toBe("../HomebrewFormula/webfont.rb"); - }); -}); diff --git a/packages/webfont/src/.gitkeep b/src/.gitkeep similarity index 100% rename from packages/webfont/src/.gitkeep rename to src/.gitkeep diff --git a/src/cli/__snapshots__/index.test.ts.snap b/src/cli/__snapshots__/index.test.ts.snap new file mode 100644 index 00000000..44c3f764 --- /dev/null +++ b/src/cli/__snapshots__/index.test.ts.snap @@ -0,0 +1,275 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`cli should generate all fonts with build-in template 1`] = ` +"@font-face { + font-display: auto; + font-family: \\"webfont\\"; + font-style: normal; + font-weight: 400; + src: url(\\"./webfont.eot?test\\"); + src: url(\\"./webfont.eot?#iefix\\") format(\\"embedded-opentype\\"), url(\\"./webfont.woff2?test\\") format(\\"woff2\\"), url(\\"./webfont.woff?test\\") format(\\"woff\\"), url(\\"./webfont.ttf?test\\") format(\\"truetype\\"), url(\\"./webfont.svg?test#webfont\\") format(\\"svg\\"); +} + +.webfont { + display: inline-block; + font-family: \\"webfont\\"; + font-weight: 400; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; +} + +.webfont-lg { + font-size: 1.33333em; + line-height: 0.75em; + vertical-align: -0.0667em; +} + +.webfont-xs { + font-size: 0.75em; +} + +.webfont-sm { + font-size: 0.875em; +} + +.webfont-1x { + font-size: 1em; +} + +.webfont-2x { + font-size: 2em; +} + +.webfont-3x { + font-size: 3em; +} + +.webfont-4x { + font-size: 4em; +} + +.webfont-5x { + font-size: 5em; +} + +.webfont-6x { + font-size: 6em; +} + +.webfont-7x { + font-size: 7em; +} + +.webfont-8x { + font-size: 8em; +} + +.webfont-9x { + font-size: 9em; +} + +.webfont-10x { + font-size: 10em; +} + +.webfont-fw { + text-align: center; + width: 1.25em; +} + +.webfont-border { + border: solid 0.08em #eee; + border-radius: 0.1em; + padding: 0.2em 0.25em 0.15em; +} + +.webfont-pull-left { + float: left; +} + +.webfont-pull-right { + float: right; +} + +.webfont.webfont-pull-left { + margin-right: 0.3em; +} + +.webfont.webfont-pull-right { + margin-left: 0.3em; +} + + +.webfont-avatar::before { + content: \\"\\\\ea01\\"; +} + +.webfont-envelope::before { + content: \\"\\\\ea02\\"; +} + +.webfont-phone-call::before { + content: \\"\\\\ea03\\"; +} + +" +`; + +exports[`cli should respect \`font\` options 1`] = ` +" + + + + + + + + + + + + + + + +" +`; + +exports[`cli should respect \`template\` options 1`] = ` +"@font-face { + font-display: auto; + font-family: \\"testname\\"; + font-style: normal; + font-weight: 400; + src: url(\\"test/path/testname.eot?test\\"); + src: url(\\"test/path/testname.eot?#iefix\\") format(\\"embedded-opentype\\"), url(\\"test/path/testname.woff2?test\\") format(\\"woff2\\"), url(\\"test/path/testname.woff?test\\") format(\\"woff\\"), url(\\"test/path/testname.ttf?test\\") format(\\"truetype\\"), url(\\"test/path/testname.svg?test#testname\\") format(\\"svg\\"); +} + +.foo { + display: inline-block; + font-family: \\"testname\\"; + font-weight: 400; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; +} + +.foo-lg { + font-size: 1.33333em; + line-height: 0.75em; + vertical-align: -0.0667em; +} + +.foo-xs { + font-size: 0.75em; +} + +.foo-sm { + font-size: 0.875em; +} + +.foo-1x { + font-size: 1em; +} + +.foo-2x { + font-size: 2em; +} + +.foo-3x { + font-size: 3em; +} + +.foo-4x { + font-size: 4em; +} + +.foo-5x { + font-size: 5em; +} + +.foo-6x { + font-size: 6em; +} + +.foo-7x { + font-size: 7em; +} + +.foo-8x { + font-size: 8em; +} + +.foo-9x { + font-size: 9em; +} + +.foo-10x { + font-size: 10em; +} + +.foo-fw { + text-align: center; + width: 1.25em; +} + +.foo-border { + border: solid 0.08em #eee; + border-radius: 0.1em; + padding: 0.2em 0.25em 0.15em; +} + +.foo-pull-left { + float: left; +} + +.foo-pull-right { + float: right; +} + +.foo.foo-pull-left { + margin-right: 0.3em; +} + +.foo.foo-pull-right { + margin-left: 0.3em; +} + + +.foo-avatar::before { + content: \\"\\\\ea01\\"; +} + +.foo-envelope::before { + content: \\"\\\\ea02\\"; +} + +.foo-phone-call::before { + content: \\"\\\\ea03\\"; +} + +" +`; diff --git a/src/cli/index.test.ts b/src/cli/index.test.ts new file mode 100755 index 00000000..30798c2e --- /dev/null +++ b/src/cli/index.test.ts @@ -0,0 +1,264 @@ +import * as fsPromise from "fs/promises"; +import cli from "./meow"; +import {execCLI} from "../lib/execCLI"; +import fs from "fs"; +import rimraf from "rimraf"; + +const timeout = 10000; +jest.mock("./meow"); +jest.setTimeout(timeout); + +const destination = "temp/cli"; +const fixturesGlob = "src/fixtures"; +const source = `${fixturesGlob}/svg-icons`; + +describe("cli", () => { + + beforeAll(() => new Promise((resolve, reject) => { + + fs.mkdir(destination, {recursive: true}, (err) => { + + if (err) { + + return reject(err); + + } + + return resolve(err); + + }); + + })); + + + beforeEach(() => new Promise((resolve, reject) => { + + rimraf(`${destination}/*`, (err) => { + + if (err) { + + return reject(err); + + } + + return fs.readdir(destination, (fileReadError, files) => { + + if (files.length !== 0) { + + throw new Error(`${destination} did not empty before the test.`); + + } + + resolve(fileReadError); + + }); + + }); + + })); + + it("exits with code 2 and displays --help if no argument parameters are passed", async () => { + + const output = await execCLI(); + + expect(output.code).toBe(2); + expect(output.stdout).toBe(cli.showHelp()); + expect(output.stderr).toBe(""); + + }); + + it("can show help", async () => { + + const output = await execCLI("--help"); + + expect(output.code).toBe(2); + expect(output.stdout).toBe(cli.showHelp()); + expect(output.stderr).toBe(""); + + }); + + it("can show version with --version", async () => { + + const output = await execCLI("--version"); + + expect(output.code).toBe(0); + expect(output.stdout).toBe(cli.showVersion()); + expect(output.stderr).toBe(""); + + }); + + it("should throw error `files glob patterns specified did not match any files` if not found files", async () => { + + // eslint-disable-next-line max-len + const output = await execCLI(`${fixturesGlob}/not-found-svg-icons/**/* -d ${destination}`); + + expect(output.code).toBe(1); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + expect(output.stdout).toContain(cli.error()); + expect(output.stderr).toBe(""); + + }); + + it("should generate all fonts", async () => { + + const output = await execCLI(`${source} -d ${destination}`); + + expect(output.files).toEqual([ + "webfont.eot", + "webfont.hash", + "webfont.svg", + "webfont.ttf", + "webfont.woff", + "webfont.woff2", + ]); + expect(output.code).toBe(0); + expect(output.stderr).toBe(""); + + }); + + it("should generate only `woff2` font", async () => { + + const output = await execCLI(`${source} -d ${destination} --formats ["woff2"]`); + + expect(output.files).toEqual([ + "webfont.hash", + "webfont.woff", + "webfont.woff2", + ]); + expect(output.code).toBe(0); + expect(output.stderr).toBe(""); + + }); + + it("should generate all fonts with build-in template", async () => { + + // eslint-disable-next-line max-len + const output = await execCLI(`${source} -d ${destination} --template css --templateCacheString test`); + + expect(output.files).toEqual([ + "webfont.css", + "webfont.eot", + "webfont.svg", + "webfont.ttf", + "webfont.woff", + "webfont.woff2", + ]); + expect(output.code).toBe(0); + expect(output.stderr).toBe(""); + const data = await fsPromise.readFile(`${destination}/webfont.css`, {encoding: "utf-8"}); + expect(data).toMatchSnapshot(); + }); + + it("should respect `template` options", async () => { + + // eslint-disable-next-line max-len + const output = await execCLI(`${source} -d ${destination} --template css --templateClassName foo --templateCacheString test --templateFontPath test/path --templateFontName testname`); + + expect(output.files).toEqual([ + "webfont.css", + "webfont.eot", + "webfont.svg", + "webfont.ttf", + "webfont.woff", + "webfont.woff2", + ]); + expect(output.code).toBe(0); + expect(output.stderr).toBe(""); + const data = await fsPromise.readFile(`${destination}/webfont.css`, {encoding: "utf-8"}); + expect(data).toMatchSnapshot(); + }); + + it("can set font name", async () => { + + const output = await execCLI(`${source} -d ${destination} --fontName foobar`); + + expect(output.files).toEqual([ + "foobar.eot", + "foobar.hash", + "foobar.svg", + "foobar.ttf", + "foobar.woff", + "foobar.woff2", + ]); + expect(output.code).toBe(0); + expect(output.stderr).toBe(""); + + }); + + it("should respect `font` options", async () => { + + // eslint-disable-next-line max-len + const output = await execCLI(`${source} -d ${destination} --fontId testId --fontStyle italic --fontWeight 500 --fontHeight 15`); + + expect(output.files).toEqual([ + "webfont.eot", + "webfont.hash", + "webfont.svg", + "webfont.ttf", + "webfont.woff", + "webfont.woff2", + ]); + expect(output.code).toBe(0); + expect(output.stderr).toBe(""); + const data = await fsPromise.readFile(`${destination}/webfont.svg`, {encoding: "utf-8"}); + expect(data).toMatchSnapshot(); + }); + + it("can be verbose", async () => { + + // eslint-disable-next-line max-lines + const output = await execCLI(`${source} -d ${destination} --verbose`); + + expect(output.files).toEqual([ + "webfont.eot", + "webfont.hash", + "webfont.svg", + "webfont.ttf", + "webfont.woff", + "webfont.woff2", + ]); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + expect(output.stdout).toBe(cli.verbose()); + expect(output.code).toBe(0); + expect(output.stderr).toBe(""); + + }); + + it("should create dest directory if it does not exist and --dest-create flag is provided", async () => { + const nonExistentDestination = `${destination}/that/does/not/exist`; + const output = await execCLI(`${source} -d ${nonExistentDestination} --dest-create`); + + await fsPromise.access(nonExistentDestination, fs.constants.F_OK); + + const files = await fsPromise.readdir(nonExistentDestination, { encoding: "utf-8" }); + + output.files = files.filter((file) => file !== "that"); + + expect(output.files).toEqual(files); + }); + + it("should not create dest directory if it does not exist", async () => { + const nonExistentDestination = `${destination}/that/does/not/exist`; + + await execCLI(`${source} -d ${nonExistentDestination}`); + + let destinationWasCreated = true; + try { + await fsPromise.access(nonExistentDestination, fs.constants.F_OK); + } catch (exception) { + destinationWasCreated = false; + } + expect(destinationWasCreated).toBe(false); + + let error: Record = {}; + try { + await fsPromise.readdir(nonExistentDestination, { encoding: "utf-8" }); + } catch (readdirError) { + error = readdirError; + } + expect(error.message).toContain("ENOENT: no such file or directory, scandir"); + }); + +}); diff --git a/src/cli/index.ts b/src/cli/index.ts new file mode 100755 index 00000000..be713f2c --- /dev/null +++ b/src/cli/index.ts @@ -0,0 +1,299 @@ +import * as fs from "fs"; +import * as path from "path"; +import type {Formats} from "../types/Format"; +import type {OptionsBase} from "../types/OptionsBase"; +import type {Result} from "../types/Result"; +import cli from "./meow"; +import resolveFrom from "resolve-from"; +import {webfont} from "../standalone"; + +const optionsBase : OptionsBase = {}; + +if (typeof cli.flags.config === "string") { + + + /* + * Should check these possibilities: + * a. name of a node_module + * b. absolute path + * c. relative path relative to `process.cwd()`. + * If none of the above work, we'll try a relative path starting + * in `process.cwd()`. + */ + optionsBase.configFile = + resolveFrom(process.cwd(), cli.flags.config) || + path.join(process.cwd(), cli.flags.config); + +} + +if (cli.flags.fontName) { + + optionsBase.fontName = cli.flags.fontName; + +} + +if (cli.flags.formats) { + + optionsBase.formats = cli.flags.formats as Formats; + +} + +if (cli.flags.dest) { + optionsBase.dest = cli.flags.dest; +} + +if (cli.flags.destCreate) { + optionsBase.destCreate = cli.flags.destCreate; +} + +if (cli.flags.template) { + + optionsBase.template = cli.flags.template; + +} + +if (cli.flags.templateClassName) { + + optionsBase.templateClassName = cli.flags.templateClassName; + +} + +if (cli.flags.templateFontPath) { + + optionsBase.templateFontPath = cli.flags.templateFontPath; + +} + +if (cli.flags.templateFontName) { + + optionsBase.templateFontName = cli.flags.templateFontName; + +} + +if (cli.flags.templateCacheString) { + + optionsBase.templateCacheString = cli.flags.templateCacheString; + +} + +if (cli.flags.destTemplate) { + + optionsBase.destTemplate = cli.flags.destTemplate; + +} + +if (cli.flags.verbose) { + + optionsBase.verbose = cli.flags.verbose; + +} + +if (cli.flags.fontId) { + + optionsBase.fontId = cli.flags.fontId; + +} + +if (cli.flags.fontStyle) { + + optionsBase.fontStyle = cli.flags.fontStyle; + +} + +if (cli.flags.fontWeight) { + + optionsBase.fontWeight = cli.flags.fontWeight; + +} + +if (cli.flags.fixedWidth) { + + optionsBase.fixedWidth = cli.flags.fixedWidth; + +} + +if (cli.flags.centerHorizontally) { + + optionsBase.centerHorizontally = cli.flags.centerHorizontally; + +} + +if (cli.flags.normalize) { + + optionsBase.normalize = cli.flags.normalize; + +} + +if (cli.flags.fontHeight) { + + optionsBase.fontHeight = cli.flags.fontHeight; + +} + +if (cli.flags.round) { + + optionsBase.round = cli.flags.round; + +} + +if (cli.flags.descent) { + + optionsBase.descent = cli.flags.descent; + +} + +if (cli.flags.ascent) { + + optionsBase.ascent = cli.flags.ascent; + +} + +if (cli.flags.startUnicode) { + + optionsBase.startUnicode = cli.flags.startUnicode; + +} + +if (cli.flags.prependUnicode) { + + optionsBase.prependUnicode = cli.flags.prependUnicode; + +} + +if (cli.flags.metadata) { + + optionsBase.metadata = cli.flags.metadata; + +} + +if (cli.flags.sort === false) { + + optionsBase.sort = cli.flags.sort; + +} + +if (cli.flags.ligatures === false) { + + optionsBase.ligatures = cli.flags.ligatures; + +} + +if (cli.flags.addHashInFontUrl) { + + optionsBase.addHashInFontUrl = cli.flags.addHashInFontUrl; + +} + +if (cli.flags.help || cli.flags.h) { + + cli.showHelp(); + +} + +if (cli.flags.version || cli.flags.v) { + + cli.showVersion(); + +} + +Promise.resolve(). + then(() => { + + const options = {...optionsBase, + files: cli.input}; + + if (options.files.length === 0) { + + cli.showHelp(); + + } + + return webfont(options).then((result) => { + + result.config = { + + dest: options.dest, + destTemplate: options.destTemplate, + ...result.config, + }; + + return result; + + }); + + }). + then((result: Result) => { + + const {fontName, dest, destCreate} = result.config; + + let destTemplate = null; + + if (result.template) { + + ({destTemplate} = result.config); + + if (!destTemplate) { + + destTemplate = dest; + + } + + if (result.usedBuildInTemplate) { + + destTemplate = path.join(destTemplate, `${result.config.fontName}.${result.config.template}`); + + } else { + + destTemplate = path.join(destTemplate, path.basename(result.config.template).replace(".njk", "")); + + } + + delete result.hash; + + } + + return Promise.resolve(). + then(() => new Promise((resolve, reject) => { + fs.access(dest, fs.constants.F_OK, (err) => reject(err)); + })). + catch((error) => { + if (error && destCreate) { + return new Promise((resolve) => { + fs.mkdir(dest, { recursive: true }, () => resolve(destCreate)); + }); + } + return error; + }). + finally(() => Promise.all(Object.keys(result).map((type) => { + if (type === "config" || type === "usedBuildInTemplate" || type === "glyphsData") { + return null; + } + const content = result[type]; + // eslint-disable-next-line init-declarations + let file; + if (type === "template") { + file = path.resolve(destTemplate); + } else { + file = path.resolve(path.join(dest, `${fontName}.${type}`)); + } + return fs.writeFile(file, content, () => { + Function.prototype(); + }); + }))). + then(() => Promise.resolve(result)); + + }). + catch((error) => { + + // eslint-disable-next-line no-console + console.log(error.stack); + + let exitCode = 1; + + if (typeof error.code === "number") { + exitCode = error.code; + } + + process.exit(exitCode); + + }); diff --git a/src/cli/meow/__mocks__/index.ts b/src/cli/meow/__mocks__/index.ts new file mode 100644 index 00000000..1945ec65 --- /dev/null +++ b/src/cli/meow/__mocks__/index.ts @@ -0,0 +1,158 @@ +/* eslint-disable max-len, max-lines-per-function */ +import {version} from "../../../../package.json"; + +const meowMock = Object.create(null); + +meowMock.verbose = () => `The provided icons do not have the same heights. This could lead to unexpected results. Using the normalize option may help. +A fontHeight of at least than 1000 is recommended, otherwise further steps (rounding in svg2ttf) could lead to ugly results. Use the fontHeight option to scale icons. +Font created`; + +meowMock.error = () => "Error: Files glob patterns specified did not match any files"; + +meowMock.showVersion = () => version; + +meowMock.showHelp = () => ` + Generator of fonts from svg icons, svg icons to svg font, svg font to ttf, ttf to eot, ttf to woff, ttf to woff2 + + Usage: webfont [input] [options] + + Input: File(s) or glob(s). + + If an input argument is wrapped in quotation marks, it will be passed to "fast-glob" + for cross-platform glob support. + + Options: + + --config + + Path to a specific configuration file (JSON, YAML, or CommonJS) + or the name of a module in \`node_modules\` that points to one. + If no \`--config\` argument is provided, webfont will search for + configuration files in the following places, in this order: + - a \`webfont\` property in \`package.json\` + - a \`.webfontrc\` file (with or without filename extension: + \`.json\`, \`.yaml\`, and \`.js\` are available) + - a \`webfont.config.js\` file exporting a JS object + The search will begin in the working directory and move up the + directory tree until a configuration file is found. + + -f, --fontName + + The font family name you want, default: "webfont". + + -h, --help + + Output usage information. + + -v, --version + + Output the version number. + + -r, --formats + + Only this formats generate. + + -d, --dest + + Destination for generated fonts. + + -m, --dest-create + + Create destination directory if it does not exist. + + -t, --template + + Type of template ('css', 'scss', 'styl') or path to custom template. + + -s, --destTemplate + + Destination for generated template. If not passed used \`dest\` argument value. + + -c, --templateClassName + + Class name in css template. + + -p, --templateFontPath + + Font path in css template. + + -n, --templateFontName + + Font name in css template. + + --templateCacheString + + Specify cache string in scss/css template. + + --no-sort + + Keeps the files in the same order of entry + + --no-ligatures + + Prevents adding ligature unicode + + --verbose + + Tell me everything!. + + For "svgicons2svgfont": + + --fontId + + The font id you want, default as "--fontName". + + --fontStyle + + The font style you want. + + --fontWeight + + The font weight you want. + + --fixedWidth + + Creates a monospace font of the width of the largest input icon. + + --centerHorizontally + + Calculate the bounds of a glyph and center it horizontally. + + --normalize + + Normalize icons by scaling them to the height of the highest icon. + + --fontHeight + + The outputted font height [MAX(icons.height)]. + + --round + + Setup the SVG path rounding [10e12]. + + --descent + + The font descent [0]. + + --ascent + + The font ascent [height - descent]. + + --startUnicode + + The start unicode codepoint for files without prefix [0xEA01]. + + --prependUnicode + + Prefix files with their automatically allocated unicode codepoint. + + --metadata + + Content of the metadata tag. + + --addHashInFontUrl + + Generated font url will be : [webfont].[ext]?v=[hash] +`; + +export default meowMock; diff --git a/src/cli/meow/index.ts b/src/cli/meow/index.ts new file mode 100644 index 00000000..9226df41 --- /dev/null +++ b/src/cli/meow/index.ts @@ -0,0 +1,255 @@ +/* eslint-disable max-len, sort-keys */ +import meow from "meow"; + +const meowCLI = meow(` + Usage: webfont [input] [options] + + Input: File(s) or glob(s). + + If an input argument is wrapped in quotation marks, it will be passed to "fast-glob" + for cross-platform glob support. + + Options: + + --config + + Path to a specific configuration file (JSON, YAML, or CommonJS) + or the name of a module in \`node_modules\` that points to one. + If no \`--config\` argument is provided, webfont will search for + configuration files in the following places, in this order: + - a \`webfont\` property in \`package.json\` + - a \`.webfontrc\` file (with or without filename extension: + \`.json\`, \`.yaml\`, and \`.js\` are available) + - a \`webfont.config.js\` file exporting a JS object + The search will begin in the working directory and move up the + directory tree until a configuration file is found. + + -f, --fontName + + The font family name you want, default: "webfont". + + -h, --help + + Output usage information. + + -v, --version + + Output the version number. + + -r, --formats + + Only this formats generate. + + -d, --dest + + Destination for generated fonts. + + -m, --dest-create + + Create destination directory if it does not exist. + + -t, --template + + Type of template ('css', 'scss', 'styl') or path to custom template. + + -s, --destTemplate + + Destination for generated template. If not passed used \`dest\` argument value. + + -c, --templateClassName + + Class name in css template. + + -p, --templateFontPath + + Font path in css template. + + -n, --templateFontName + + Font name in css template. + + --templateCacheString + + Specify cache string in scss/css template. + + --no-sort + + Keeps the files in the same order of entry + + --no-ligatures + + Prevents adding ligature unicode + + --verbose + + Tell me everything!. + + For "svgicons2svgfont": + + --fontId + + The font id you want, default as "--fontName". + + --fontStyle + + The font style you want. + + --fontWeight + + The font weight you want. + + --fixedWidth + + Creates a monospace font of the width of the largest input icon. + + --centerHorizontally + + Calculate the bounds of a glyph and center it horizontally. + + --normalize + + Normalize icons by scaling them to the height of the highest icon. + + --fontHeight + + The outputted font height [MAX(icons.height)]. + + --round + + Setup the SVG path rounding [10e12]. + + --descent + + The font descent [0]. + + --ascent + + The font ascent [height - descent]. + + --startUnicode + + The start unicode codepoint for files without prefix [0xEA01]. + + --prependUnicode + + Prefix files with their automatically allocated unicode codepoint. + + --metadata + + Content of the metadata tag. + + --addHashInFontUrl + + Generated font url will be : [webfont].[ext]?v=[hash] +`, { + autoHelp: false, + autoVersion: false, + flags: { + ascent: { + type: "string", + }, + centerHorizontally: { + type: "boolean", + }, + config: { + default: null, + }, + descent: { + type: "string", + }, + dest: { + alias: "d", + default: process.cwd(), + type: "string", + }, + destCreate: { + alias: "m", + default: false, + type: "boolean", + }, + destTemplate: { + alias: "s", + type: "string", + }, + fixedWidth: { + type: "boolean", + }, + fontHeight: { + type: "string", + }, + fontId: { + type: "string", + }, + fontName: { + alias: "u", + type: "string", + }, + fontStyle: { + type: "string", + }, + fontWeight: { + type: "string", + }, + formats: { + alias: "f", + }, + help: { + alias: "h", + type: "boolean", + }, + ligatures: { + default: true, + type: "boolean", + }, + normalize: { + type: "boolean", + }, + prependUnicode: { + type: "boolean", + }, + round: { + type: "string", + }, + sort: { + default: true, + type: "boolean", + }, + startUnicode: { + type: "string", + }, + template: { + alias: "t", + type: "string", + }, + templateClassName: { + alias: "c", + type: "string", + }, + templateFontName: { + alias: "n", + type: "string", + }, + addHashInFontUrl: { + default: false, + type: "boolean", + }, + templateFontPath: { + alias: "p", + type: "string", + }, + templateCacheString: { + default: "", + type: "string", + }, + verbose: { + default: false, + type: "boolean", + }, + version: { + alias: "v", + type: "boolean", + }, + }, +}); + +export default meowCLI; diff --git a/packages/webfont/src/fixtures/bad-svg-icons/avatar-1.svg b/src/fixtures/bad-svg-icons/avatar-1.svg similarity index 100% rename from packages/webfont/src/fixtures/bad-svg-icons/avatar-1.svg rename to src/fixtures/bad-svg-icons/avatar-1.svg diff --git a/packages/webfont/src/fixtures/bad-svg-icons/avatar-2.svg b/src/fixtures/bad-svg-icons/avatar-2.svg similarity index 100% rename from packages/webfont/src/fixtures/bad-svg-icons/avatar-2.svg rename to src/fixtures/bad-svg-icons/avatar-2.svg diff --git a/packages/webfont/src/fixtures/bad-svg-icons/avatar-3.svg b/src/fixtures/bad-svg-icons/avatar-3.svg similarity index 100% rename from packages/webfont/src/fixtures/bad-svg-icons/avatar-3.svg rename to src/fixtures/bad-svg-icons/avatar-3.svg diff --git a/packages/webfont/src/fixtures/bad-svg-icons/avatar.svg b/src/fixtures/bad-svg-icons/avatar.svg similarity index 100% rename from packages/webfont/src/fixtures/bad-svg-icons/avatar.svg rename to src/fixtures/bad-svg-icons/avatar.svg diff --git a/packages/webfont/src/fixtures/configs/.webfontrc b/src/fixtures/configs/.webfontrc similarity index 100% rename from packages/webfont/src/fixtures/configs/.webfontrc rename to src/fixtures/configs/.webfontrc diff --git a/packages/webfont/src/fixtures/configs/.webfontrc-with-build-in-template b/src/fixtures/configs/.webfontrc-with-build-in-template similarity index 100% rename from packages/webfont/src/fixtures/configs/.webfontrc-with-build-in-template rename to src/fixtures/configs/.webfontrc-with-build-in-template diff --git a/packages/webfont/src/fixtures/configs/.webfontrc-with-custom-formats b/src/fixtures/configs/.webfontrc-with-custom-formats similarity index 100% rename from packages/webfont/src/fixtures/configs/.webfontrc-with-custom-formats rename to src/fixtures/configs/.webfontrc-with-custom-formats diff --git a/packages/webfont/src/fixtures/configs/.webfontrc-with-external-template b/src/fixtures/configs/.webfontrc-with-external-template similarity index 100% rename from packages/webfont/src/fixtures/configs/.webfontrc-with-external-template rename to src/fixtures/configs/.webfontrc-with-external-template diff --git a/packages/webfont/src/fixtures/svg-icons/.webfontrc b/src/fixtures/svg-icons/.webfontrc similarity index 100% rename from packages/webfont/src/fixtures/svg-icons/.webfontrc rename to src/fixtures/svg-icons/.webfontrc diff --git a/packages/webfont/src/fixtures/svg-icons/avatar.svg b/src/fixtures/svg-icons/avatar.svg similarity index 100% rename from packages/webfont/src/fixtures/svg-icons/avatar.svg rename to src/fixtures/svg-icons/avatar.svg diff --git a/packages/webfont/src/fixtures/svg-icons/envelope.svg b/src/fixtures/svg-icons/envelope.svg similarity index 100% rename from packages/webfont/src/fixtures/svg-icons/envelope.svg rename to src/fixtures/svg-icons/envelope.svg diff --git a/packages/webfont/src/fixtures/svg-icons/phone-call.svg b/src/fixtures/svg-icons/phone-call.svg similarity index 100% rename from packages/webfont/src/fixtures/svg-icons/phone-call.svg rename to src/fixtures/svg-icons/phone-call.svg diff --git a/packages/webfont/src/fixtures/templates/template-ordered.css b/src/fixtures/templates/template-ordered.css similarity index 100% rename from packages/webfont/src/fixtures/templates/template-ordered.css rename to src/fixtures/templates/template-ordered.css diff --git a/packages/webfont/src/fixtures/templates/template.css b/src/fixtures/templates/template.css similarity index 100% rename from packages/webfont/src/fixtures/templates/template.css rename to src/fixtures/templates/template.css diff --git a/src/index.test.ts b/src/index.test.ts new file mode 100755 index 00000000..87031f10 --- /dev/null +++ b/src/index.test.ts @@ -0,0 +1,7 @@ +import index from "."; + +describe("index", () => { + it("should be exported", () => { + expect(typeof index === "function").toBe(true); + }); +}); diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/lib/execCLI/index.ts b/src/lib/execCLI/index.ts new file mode 100644 index 00000000..ec140878 --- /dev/null +++ b/src/lib/execCLI/index.ts @@ -0,0 +1,62 @@ +import {ExecException, exec} from "child_process"; +import fs from "fs"; + +export type Output = { + code?: number; + error: ExecException | null; + files: string[]; + stderr?: string; + stdout?: string; +} + +// eslint-disable-next-line no-unused-vars +export type ExecCLI = (args?: string, destination?: string) => Promise; + +/** + * @name execCLI + * @description Execute webfont CLI commands using child_process. + * + * @param {String} args - Arguments to pass to the CLI. + * @param {String} destination - Path to read/write files + * @return {Promise.} - Contains CLI error, stdout, stderr data. + * @example + * + * execCLI("--help").then((output) => { + * console.log(output.stdout) // => Outputs usage information. + * }) + * + */ +export const execCLI : ExecCLI = ( + args = "", + destination = "temp/cli", +) => new Promise((resolve, reject) => { + const command = `node dist/cli.js ${args}`; + + exec(command, {encoding: "utf-8"}, (error, stdout, stderr) => { + fs.readdir(destination, {encoding: "utf-8"}, (err, files: string[]) => { + if (err) { + reject(err); + throw err; + } + + let outputCode = 0; + if (error && error.code) { + outputCode = error.code; + } + + const output : Output = { + code: outputCode, + error, + files, + stderr, + + /** + * Remove new line created by console.log; + */ + stdout: stdout.replace(/\n$/u, ""), + }; + + resolve(output); + }); + }); +}); diff --git a/src/lib/lib/index.ts b/src/lib/lib/index.ts new file mode 100644 index 00000000..12d47e6d --- /dev/null +++ b/src/lib/lib/index.ts @@ -0,0 +1,208 @@ +import type {Format, GlyphData, InitialOptions} from "./types"; +import {getBuiltInTemplates, getTemplateFilePath} from "../../templates"; +import {Readable} from "stream"; +import type {Result} from "../types/Result"; +import SVGIcons2SVGFontStream from "svgicons2svgfont"; +import cosmiconfig from "cosmiconfig"; +import crypto from "crypto"; +import deepmerge from "deepmerge"; +import {getGlyphsData} from "./glyphsData"; +import {getOptions} from "./options"; +import {globby} from "globby"; +import nunjucks from "nunjucks"; +import path from "path"; +import svg2ttf from "svg2ttf"; +import ttf2eot from "ttf2eot"; +import ttf2woff from "ttf2woff"; +import wawoff2 from "wawoff2"; + +const toSvg = (glyphsData, options) => { + let result = ""; + + return new Promise((resolve, reject) => { + + let log = () => { + Function.prototype(); + }; + + if (options.verbose) { + + log = console.log.bind(console); + } + + const fontStream = new SVGIcons2SVGFontStream({ + ascent: options.ascent, + centerHorizontally: options.centerHorizontally, + descent: options.descent, + fixedWidth: options.fixedWidth, + fontHeight: options.fontHeight, + fontId: options.fontId, + fontName: options.fontName, + fontStyle: options.fontStyle, + fontWeight: options.fontWeight, + log, + metadata: options.metadata, + normalize: options.normalize, + round: options.round, + }). + on("finish", () => resolve(result)). + on("data", (data) => { + result += data; + }). + on("error", (error) => reject(error)); + + glyphsData.forEach((glyphData) => { + const glyphStream: Readable = new Readable(); + + glyphStream.push(glyphData.contents); + glyphStream.push(null); + glyphStream.metadata = glyphData.metadata; + + fontStream.write(glyphStream); + }); + + fontStream.end(); + }); +}; + +const toTtf = (buffer, options) => Buffer.from(svg2ttf(buffer, options).buffer); + +const toEot = (buffer) => Buffer.from(ttf2eot(buffer).buffer); + +const toWoff = (buffer, options) => Buffer.from(ttf2woff(buffer, options).buffer); + +const toWoff2 = (buffer: Buffer | Uint8Array) => wawoff2.compress(buffer); + +type Webfont = (initialOptions?: InitialOptions) => Promise; + +export const webfont : Webfont = async (initialOptions) => { + + const config = await buildConfig({ + configFile: options.configFile, + }); + + if (Object.keys(config).length > 0) { + options = deepmerge(options, config.config, { + arrayMerge: (_destinationArray, sourceArray) => sourceArray, + }); + options.filePath = config.filepath; + } + + const foundFiles = await globby([].concat(options.files)); + const filteredFiles = foundFiles.filter((foundFile) => path.extname(foundFile) === ".svg"); + + if (filteredFiles.length === 0) { + throw new Error("Files glob patterns specified did not match any files"); + } + + let glyphsData = await getGlyphsData(filteredFiles, options) as GlyphData[]; + + if (options.glyphTransformFn && typeof options.glyphTransformFn === "function") { + const transformedGlyphs = glyphsData.map(async (glyphData: GlyphData) => { + const metadata = await options.glyphTransformFn(glyphData.metadata); + + return { + ...glyphData, + metadata, + }; + }); + glyphsData = await Promise.all(transformedGlyphs); + } + + let ttfOptions = {}; + + if (options.formatsOptions && options.formatsOptions.ttf) { + ttfOptions = options.formatsOptions.ttf; + } + + const svg = await toSvg(glyphsData, options) as Result["svg"]; + const ttf = toTtf(svg, ttfOptions); + + const result : Result = { + glyphsData, + hash: crypto.createHash("md5").update(svg). + digest("hex"), + svg, + ttf, + }; + + if (options.formats.includes("eot")) { + result.eot = toEot(ttf); + } + + if (options.formats.includes("woff")) { + result.woff = toWoff(ttf, {metadata: options.metadata}); + } + + if (options.formats.includes("woff2")) { + result.woff2 = await toWoff2(ttf); + } + + if (options.template) { + + const builtInTemplates = getBuiltInTemplates(); + + + let templateFilePath; + + if (Object.keys(builtInTemplates).includes(options.template)) { + result.usedBuildInTemplate = true; + + const builtInPath = path.resolve(__dirname, "../.."); + nunjucks.configure(builtInPath); + templateFilePath = getTemplateFilePath(options.template); + + } else { + const resolvedTemplateFilePath = path.resolve(options.template); + + nunjucks.configure(path.dirname(resolvedTemplateFilePath)); + templateFilePath = path.resolve(resolvedTemplateFilePath); + } + + let hashOption = {}; + + if (options.addHashInFontUrl) { + hashOption = {hash: result.hash}; + } + + const nunjucksOptions = deepmerge.all([ + { + glyphs: result.glyphsData.map((glyph: GlyphData) => glyph.metadata), + }, + options, + { + cacheString: options.templateCacheString || Date.now(), + className: options.templateClassName || options.fontName, + fontName: options.templateFontName || options.fontName, + fontPath: options.templateFontPath.replace(/\/?$/u, "/"), + }, + hashOption, + { + fonts: Object.fromEntries(new Map(options.formats.map((format: Format) => [ + format, () => { + if (format === "woff2") { + return Buffer.from(result.woff2).toString("base64"); + } + return result[format].toString("base64"); + }, + ]))), + }, + ]); + + result.template = nunjucks.render(templateFilePath, nunjucksOptions); + } + + if (!options.formats.includes("svg")) { + delete result.svg; + } + + if (!options.formats.includes("ttf")) { + delete result.ttf; + } + + result.config = options; + + return result; +}; + +export default webfont; diff --git a/src/lib/lib/options.ts b/src/lib/lib/options.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/lib/lib/types/Format.ts b/src/lib/lib/types/Format.ts new file mode 100644 index 00000000..dc2ac3eb --- /dev/null +++ b/src/lib/lib/types/Format.ts @@ -0,0 +1,8 @@ +export type Format = "eot" | "woff" | "woff2" | "svg" | "ttf"; +export type Formats = Array; +type FormatOption = { + copyright: null, + ts: null, + version: null +} +export type FormatsOptions = Partial>; diff --git a/packages/webfont/src/types/GlyphData.ts b/src/lib/lib/types/GlyphData.ts similarity index 62% rename from packages/webfont/src/types/GlyphData.ts rename to src/lib/lib/types/GlyphData.ts index 16a03d65..3b55f73d 100644 --- a/packages/webfont/src/types/GlyphData.ts +++ b/src/lib/lib/types/GlyphData.ts @@ -1,7 +1,7 @@ -import type { GlyphMetadata } from "./GlyphMetadata"; +import {GlyphMetadata} from "./GlyphMetadata"; export type GlyphData = { contents: string; metadata?: GlyphMetadata; srcPath: string; -}; +} diff --git a/packages/webfont/src/types/GlyphMetadata.ts b/src/lib/lib/types/GlyphMetadata.ts similarity index 97% rename from packages/webfont/src/types/GlyphMetadata.ts rename to src/lib/lib/types/GlyphMetadata.ts index 6b6f50f9..f7112de7 100644 --- a/packages/webfont/src/types/GlyphMetadata.ts +++ b/src/lib/lib/types/GlyphMetadata.ts @@ -8,4 +8,4 @@ export type GlyphMetadata = { * ``` */ unicode?: string[]; -}; +} diff --git a/src/lib/lib/types/GlyphTransformFn.ts b/src/lib/lib/types/GlyphTransformFn.ts new file mode 100644 index 00000000..e8a59374 --- /dev/null +++ b/src/lib/lib/types/GlyphTransformFn.ts @@ -0,0 +1,4 @@ +import {GlyphMetadata} from "./GlyphMetadata"; + +// eslint-disable-next-line no-unused-vars +export type GlyphTransformFn = (obj: GlyphMetadata) => GlyphMetadata | Promise; diff --git a/src/lib/lib/types/InitialOptions.ts b/src/lib/lib/types/InitialOptions.ts new file mode 100644 index 00000000..7188d5e2 --- /dev/null +++ b/src/lib/lib/types/InitialOptions.ts @@ -0,0 +1,8 @@ +import {GlyphTransformFn} from "./GlyphTransformFn"; +import {OptionsBase} from "./OptionsBase"; + +export type InitialOptions = OptionsBase & { + filePath?: string; + files: string | Array; + glyphTransformFn?: GlyphTransformFn | null; +}; diff --git a/packages/webfont/src/types/OptionsBase.ts b/src/lib/lib/types/OptionsBase.ts similarity index 60% rename from packages/webfont/src/types/OptionsBase.ts rename to src/lib/lib/types/OptionsBase.ts index 6b921bac..766630ac 100644 --- a/packages/webfont/src/types/OptionsBase.ts +++ b/src/lib/lib/types/OptionsBase.ts @@ -1,6 +1,4 @@ -import type { TemplateOption } from "../lib/parseTemplateOption"; -import type { Formats, FormatsOptions } from "./Format"; -import type { SvgToolsOptions } from "./SvgToolsOptions"; +import {Formats} from "./Format"; export type OptionsBase = { configFile?: string; @@ -8,8 +6,7 @@ export type OptionsBase = { destCreate?: boolean; fontName?: string | unknown; formats?: Formats; - formatsOptions?: FormatsOptions; - template?: TemplateOption; + template?: "css" | string | null; templateClassName?: string | unknown; templateFontPath?: string; templateFontName?: string | unknown; @@ -21,7 +18,6 @@ export type OptionsBase = { fontWeight?: string | unknown; fixedWidth?: string | unknown; centerHorizontally?: boolean | unknown; - centerVertically?: boolean | unknown; normalize?: boolean; fontHeight?: string | unknown; round?: string | number; @@ -33,10 +29,4 @@ export type OptionsBase = { sort?: boolean; ligatures?: boolean; addHashInFontUrl?: boolean | unknown; - unicodeRange?: boolean | string | unknown; - optimizeSvg?: boolean | unknown; - svgoConfig?: unknown; - templateFontLigatures?: boolean | unknown; - /** Alpha. SVG diagnostics and optional pre-conversion fixes. */ - svgTools?: SvgToolsOptions; }; diff --git a/src/lib/lib/types/Result.ts b/src/lib/lib/types/Result.ts new file mode 100644 index 00000000..3ce6c158 --- /dev/null +++ b/src/lib/lib/types/Result.ts @@ -0,0 +1,15 @@ +import {GlyphData} from "./GlyphData"; +import {OptionsBase} from "./OptionsBase"; + +export interface Result { + config?: OptionsBase; + eot?: Buffer; + glyphsData?: Array; + hash?: string; + svg?: string | Buffer; + template?: string; + ttf?: Buffer; + usedBuildInTemplate?: boolean; + woff?: Buffer; + woff2?: Buffer; +} diff --git a/src/lib/lib/types/WebfontOptions.ts b/src/lib/lib/types/WebfontOptions.ts new file mode 100644 index 00000000..f5f47544 --- /dev/null +++ b/src/lib/lib/types/WebfontOptions.ts @@ -0,0 +1,8 @@ +import type {FormatsOptions} from "./Format"; +import type {InitialOptions} from "./InitialOptions"; + +export interface WebfontOptions extends InitialOptions { + formatsOptions: FormatsOptions, + maxConcurrency: number, + metadataProvider: null, +} diff --git a/src/lib/lib/types/index.ts b/src/lib/lib/types/index.ts new file mode 100644 index 00000000..ddd87517 --- /dev/null +++ b/src/lib/lib/types/index.ts @@ -0,0 +1,7 @@ +export type { Format } from "../types/Format"; +export type { GlyphMetadata } from "./GlyphMetadata"; +export type { GlyphTransformFn } from "./GlyphTransformFn"; +export type { GlyphData } from "./GlyphData"; +export type { InitialOptions } from "./InitialOptions"; +export type { Result } from "../types/Result"; +export type { WebfontOptions } from "./WebfontOptions"; diff --git a/src/standalone/__snapshots__/index.test.ts.snap b/src/standalone/__snapshots__/index.test.ts.snap new file mode 100644 index 00000000..cd64e579 --- /dev/null +++ b/src/standalone/__snapshots__/index.test.ts.snap @@ -0,0 +1,1044 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`standalone should change unicode symbols in the result using async function 1`] = ` +"@font-face { + font-display: auto; + font-family: \\"webfont\\"; + font-style: normal; + font-weight: 400; + src: url(\\"./webfont.eot?test\\"); + src: url(\\"./webfont.eot?#iefix\\") format(\\"embedded-opentype\\"); +} + +.webfont { + display: inline-block; + font-family: \\"webfont\\"; + font-weight: 400; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; +} + +.webfont-lg { + font-size: 1.33333em; + line-height: 0.75em; + vertical-align: -0.0667em; +} + +.webfont-xs { + font-size: 0.75em; +} + +.webfont-sm { + font-size: 0.875em; +} + +.webfont-1x { + font-size: 1em; +} + +.webfont-2x { + font-size: 2em; +} + +.webfont-3x { + font-size: 3em; +} + +.webfont-4x { + font-size: 4em; +} + +.webfont-5x { + font-size: 5em; +} + +.webfont-6x { + font-size: 6em; +} + +.webfont-7x { + font-size: 7em; +} + +.webfont-8x { + font-size: 8em; +} + +.webfont-9x { + font-size: 9em; +} + +.webfont-10x { + font-size: 10em; +} + +.webfont-fw { + text-align: center; + width: 1.25em; +} + +.webfont-border { + border: solid 0.08em #eee; + border-radius: 0.1em; + padding: 0.2em 0.25em 0.15em; +} + +.webfont-pull-left { + float: left; +} + +.webfont-pull-right { + float: right; +} + +.webfont.webfont-pull-left { + margin-right: 0.3em; +} + +.webfont.webfont-pull-right { + margin-left: 0.3em; +} + + +.webfont-avatar::before { + content: \\"\\\\1\\"; +} + +.webfont-envelope::before { + content: \\"\\\\1\\"; +} + +.webfont-phone-call::before { + content: \\"\\\\1\\"; +} + +" +`; + +exports[`standalone should change unicode symbols in the result using sync function 1`] = ` +"@font-face { + font-display: auto; + font-family: \\"webfont\\"; + font-style: normal; + font-weight: 400; + src: url(\\"./webfont.eot?test\\"); + src: url(\\"./webfont.eot?#iefix\\") format(\\"embedded-opentype\\"); +} + +.webfont { + display: inline-block; + font-family: \\"webfont\\"; + font-weight: 400; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; +} + +.webfont-lg { + font-size: 1.33333em; + line-height: 0.75em; + vertical-align: -0.0667em; +} + +.webfont-xs { + font-size: 0.75em; +} + +.webfont-sm { + font-size: 0.875em; +} + +.webfont-1x { + font-size: 1em; +} + +.webfont-2x { + font-size: 2em; +} + +.webfont-3x { + font-size: 3em; +} + +.webfont-4x { + font-size: 4em; +} + +.webfont-5x { + font-size: 5em; +} + +.webfont-6x { + font-size: 6em; +} + +.webfont-7x { + font-size: 7em; +} + +.webfont-8x { + font-size: 8em; +} + +.webfont-9x { + font-size: 9em; +} + +.webfont-10x { + font-size: 10em; +} + +.webfont-fw { + text-align: center; + width: 1.25em; +} + +.webfont-border { + border: solid 0.08em #eee; + border-radius: 0.1em; + padding: 0.2em 0.25em 0.15em; +} + +.webfont-pull-left { + float: left; +} + +.webfont-pull-right { + float: right; +} + +.webfont.webfont-pull-left { + margin-right: 0.3em; +} + +.webfont.webfont-pull-right { + margin-left: 0.3em; +} + + +.webfont-avatar::before { + content: \\"\\\\1\\"; +} + +.webfont-envelope::before { + content: \\"\\\\1\\"; +} + +.webfont-phone-call::before { + content: \\"\\\\1\\"; +} + +" +`; + +exports[`standalone should create css selectors with transform titles through function 1`] = ` +"@font-face { + font-display: auto; + font-family: \\"webfont\\"; + font-style: normal; + font-weight: 400; + src: url(\\"./webfont.eot?test\\"); + src: url(\\"./webfont.eot?#iefix\\") format(\\"embedded-opentype\\"); +} + +.webfont { + display: inline-block; + font-family: \\"webfont\\"; + font-weight: 400; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; +} + +.webfont-lg { + font-size: 1.33333em; + line-height: 0.75em; + vertical-align: -0.0667em; +} + +.webfont-xs { + font-size: 0.75em; +} + +.webfont-sm { + font-size: 0.875em; +} + +.webfont-1x { + font-size: 1em; +} + +.webfont-2x { + font-size: 2em; +} + +.webfont-3x { + font-size: 3em; +} + +.webfont-4x { + font-size: 4em; +} + +.webfont-5x { + font-size: 5em; +} + +.webfont-6x { + font-size: 6em; +} + +.webfont-7x { + font-size: 7em; +} + +.webfont-8x { + font-size: 8em; +} + +.webfont-9x { + font-size: 9em; +} + +.webfont-10x { + font-size: 10em; +} + +.webfont-fw { + text-align: center; + width: 1.25em; +} + +.webfont-border { + border: solid 0.08em #eee; + border-radius: 0.1em; + padding: 0.2em 0.25em 0.15em; +} + +.webfont-pull-left { + float: left; +} + +.webfont-pull-right { + float: right; +} + +.webfont.webfont-pull-left { + margin-right: 0.3em; +} + +.webfont.webfont-pull-right { + margin-left: 0.3em; +} + + +.webfont-avatar_transform::before { + content: \\"\\\\ea01\\"; +} + +.webfont-envelope_transform::before { + content: \\"\\\\ea02\\"; +} + +.webfont-phone-call_transform::before { + content: \\"\\\\ea03\\"; +} + +" +`; + +exports[`standalone should generate all fonts with build-in template 1`] = ` +"@font-face { + font-display: auto; + font-family: \\"webfont\\"; + font-style: normal; + font-weight: 400; + src: url(\\"./webfont.eot?test\\"); + src: url(\\"./webfont.eot?#iefix\\") format(\\"embedded-opentype\\"), url(\\"./webfont.woff2?test\\") format(\\"woff2\\"), url(\\"./webfont.woff?test\\") format(\\"woff\\"), url(\\"./webfont.ttf?test\\") format(\\"truetype\\"), url(\\"./webfont.svg?test#webfont\\") format(\\"svg\\"); +} + +.webfont { + display: inline-block; + font-family: \\"webfont\\"; + font-weight: 400; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; +} + +.webfont-lg { + font-size: 1.33333em; + line-height: 0.75em; + vertical-align: -0.0667em; +} + +.webfont-xs { + font-size: 0.75em; +} + +.webfont-sm { + font-size: 0.875em; +} + +.webfont-1x { + font-size: 1em; +} + +.webfont-2x { + font-size: 2em; +} + +.webfont-3x { + font-size: 3em; +} + +.webfont-4x { + font-size: 4em; +} + +.webfont-5x { + font-size: 5em; +} + +.webfont-6x { + font-size: 6em; +} + +.webfont-7x { + font-size: 7em; +} + +.webfont-8x { + font-size: 8em; +} + +.webfont-9x { + font-size: 9em; +} + +.webfont-10x { + font-size: 10em; +} + +.webfont-fw { + text-align: center; + width: 1.25em; +} + +.webfont-border { + border: solid 0.08em #eee; + border-radius: 0.1em; + padding: 0.2em 0.25em 0.15em; +} + +.webfont-pull-left { + float: left; +} + +.webfont-pull-right { + float: right; +} + +.webfont.webfont-pull-left { + margin-right: 0.3em; +} + +.webfont.webfont-pull-right { + margin-left: 0.3em; +} + + +.webfont-avatar::before { + content: \\"\\\\ea01\\"; +} + +.webfont-envelope::before { + content: \\"\\\\ea02\\"; +} + +.webfont-phone-call::before { + content: \\"\\\\ea03\\"; +} + +" +`; + +exports[`standalone should generate all fonts with custom \`template\` with absolute path 1`] = ` +"/* custom template */ +@font-face { + font-family: webfont; + src: url(\\"./webfont.eot?test\\"); + src: + url(\\"./webfont.eot?#iefix\\") format(\\"embedded-opentype\\"), + url(\\"./webfont.woff2?test\\") format(\\"woff2\\"), + url(\\"./webfont.woff?test\\") format(\\"woff\\"), + url(\\"./webfont.ttf?test\\") format(\\"truetype\\"), + url(\\"./webfont.svg?test#webfont\\") format(\\"svg\\"); + font-style: normal; + font-weight: 400; +} + +.webfont { + display: inline-block; + transform: translate(0, 0); + text-rendering: auto; + font: normal normal 400 14px/1 webfont; + font-size: inherit; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; +} + +.webfont-lg { + vertical-align: -15%; + line-height: 0.75em; + font-size: 1.33333333em; +} + +.webfont-2x { + font-size: 2em; +} + +.webfont-3x { + font-size: 3em; +} + +.webfont-4x { + font-size: 4em; +} + +.webfont-5x { + font-size: 5em; +} + +.webfont-fw { + width: 1.28571429em; + text-align: center; +} + +.webfont-avatar::before { + content: \\"\\\\ea01\\"; +} + +.webfont-envelope::before { + content: \\"\\\\ea02\\"; +} + +.webfont-phone-call::before { + content: \\"\\\\ea03\\"; +} +" +`; + +exports[`standalone should generate all fonts with custom \`template\` with relative path 1`] = ` +"/* custom template */ +@font-face { + font-family: webfont; + src: url(\\"./webfont.eot?test\\"); + src: + url(\\"./webfont.eot?#iefix\\") format(\\"embedded-opentype\\"), + url(\\"./webfont.woff2?test\\") format(\\"woff2\\"), + url(\\"./webfont.woff?test\\") format(\\"woff\\"), + url(\\"./webfont.ttf?test\\") format(\\"truetype\\"), + url(\\"./webfont.svg?test#webfont\\") format(\\"svg\\"); + font-style: normal; + font-weight: 400; +} + +.webfont { + display: inline-block; + transform: translate(0, 0); + text-rendering: auto; + font: normal normal 400 14px/1 webfont; + font-size: inherit; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; +} + +.webfont-lg { + vertical-align: -15%; + line-height: 0.75em; + font-size: 1.33333333em; +} + +.webfont-2x { + font-size: 2em; +} + +.webfont-3x { + font-size: 3em; +} + +.webfont-4x { + font-size: 4em; +} + +.webfont-5x { + font-size: 5em; +} + +.webfont-fw { + width: 1.28571429em; + text-align: center; +} + +.webfont-avatar::before { + content: \\"\\\\ea01\\"; +} + +.webfont-envelope::before { + content: \\"\\\\ea02\\"; +} + +.webfont-phone-call::before { + content: \\"\\\\ea03\\"; +} +" +`; + +exports[`standalone should generate only \`woff\` and \`woff2\` fonts with build-in template 1`] = ` +"@font-face { + font-display: auto; + font-family: \\"webfont\\"; + font-style: normal; + font-weight: 400; + + src: url(\\"./webfont.woff2?test\\") format(\\"woff2\\"), url(\\"./webfont.woff?test\\") format(\\"woff\\"); +} + +.webfont { + display: inline-block; + font-family: \\"webfont\\"; + font-weight: 400; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; +} + +.webfont-lg { + font-size: 1.33333em; + line-height: 0.75em; + vertical-align: -0.0667em; +} + +.webfont-xs { + font-size: 0.75em; +} + +.webfont-sm { + font-size: 0.875em; +} + +.webfont-1x { + font-size: 1em; +} + +.webfont-2x { + font-size: 2em; +} + +.webfont-3x { + font-size: 3em; +} + +.webfont-4x { + font-size: 4em; +} + +.webfont-5x { + font-size: 5em; +} + +.webfont-6x { + font-size: 6em; +} + +.webfont-7x { + font-size: 7em; +} + +.webfont-8x { + font-size: 8em; +} + +.webfont-9x { + font-size: 9em; +} + +.webfont-10x { + font-size: 10em; +} + +.webfont-fw { + text-align: center; + width: 1.25em; +} + +.webfont-border { + border: solid 0.08em #eee; + border-radius: 0.1em; + padding: 0.2em 0.25em 0.15em; +} + +.webfont-pull-left { + float: left; +} + +.webfont-pull-right { + float: right; +} + +.webfont.webfont-pull-left { + margin-right: 0.3em; +} + +.webfont.webfont-pull-right { + margin-left: 0.3em; +} + + +.webfont-avatar::before { + content: \\"\\\\ea01\\"; +} + +.webfont-envelope::before { + content: \\"\\\\ea02\\"; +} + +.webfont-phone-call::before { + content: \\"\\\\ea03\\"; +} + +" +`; + +exports[`standalone should load config and respect \`template\` option with build-in template value 1`] = ` +" + $webfont-avatar: \\"\\\\ea01\\"; + + $webfont-envelope: \\"\\\\ea02\\"; + + $webfont-phone-call: \\"\\\\ea03\\"; + + +@font-face { + font-display: block; + font-family: \\"webfont\\"; + font-style: normal; + font-weight: 400; + src: url(\\"./webfont.eot?test\\"); + src: url(\\"./webfont.eot?#iefix\\") format(\\"embedded-opentype\\"), url(\\"./webfont.woff2?test\\") format(\\"woff2\\"), url(\\"./webfont.woff?test\\") format(\\"woff\\"), url(\\"./webfont.ttf?test\\") format(\\"truetype\\"), url(\\"./webfont.svg?test#webfont\\") format(\\"svg\\"); +} + +%webfont { +display: inline-block; + font-family: \\"webfont\\"; + font-weight: 400; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; +} + +.webfont { + @extend %webfont; +} + +.webfont-lg { + font-size: 1.33333em; + line-height: 0.75em; + vertical-align: -0.0667em; +} + +.webfont-xs { + font-size: 0.75em; +} + +.webfont-sm { + font-size: 0.875em; +} + +.webfont-1x { + font-size: 1em; +} + +.webfont-2x { + font-size: 2em; +} + +.webfont-3x { + font-size: 3em; +} + +.webfont-4x { + font-size: 4em; +} + +.webfont-5x { + font-size: 5em; +} + +.webfont-6x { + font-size: 6em; +} + +.webfont-7x { + font-size: 7em; +} + +.webfont-8x { + font-size: 8em; +} + +.webfont-9x { + font-size: 9em; +} + +.webfont-10x { + font-size: 10em; +} + +.webfont-fw { + text-align: center; + width: 1.25em; +} + +.webfont-border { + border: solid 0.08em #eee; + border-radius: 0.1em; + padding: 0.2em 0.25em 0.15em; +} + +.webfont-pull-left { + float: left; +} + +.webfont-pull-right { + float: right; +} + +.webfont.webfont-pull-left { + margin-right: 0.3em; +} + +.webfont.webfont-pull-right { + margin-left: 0.3em; +} + + +.webfont-avatar::before { + content: \\"\\\\ea01\\"; +} + +.webfont-envelope::before { + content: \\"\\\\ea02\\"; +} + +.webfont-phone-call::before { + content: \\"\\\\ea03\\"; +} + +" +`; + +exports[`standalone should load config and respect \`template\` option with external template value 1`] = ` +"/* custom template */ +@font-face { + font-family: webfont; + src: url(\\"./webfont.eot?test\\"); + src: + url(\\"./webfont.eot?#iefix\\") format(\\"embedded-opentype\\"), + url(\\"./webfont.woff2?test\\") format(\\"woff2\\"), + url(\\"./webfont.woff?test\\") format(\\"woff\\"), + url(\\"./webfont.ttf?test\\") format(\\"truetype\\"), + url(\\"./webfont.svg?test#webfont\\") format(\\"svg\\"); + font-style: normal; + font-weight: 400; +} + +.webfont { + display: inline-block; + transform: translate(0, 0); + text-rendering: auto; + font: normal normal 400 14px/1 webfont; + font-size: inherit; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; +} + +.webfont-lg { + vertical-align: -15%; + line-height: 0.75em; + font-size: 1.33333333em; +} + +.webfont-2x { + font-size: 2em; +} + +.webfont-3x { + font-size: 3em; +} + +.webfont-4x { + font-size: 4em; +} + +.webfont-5x { + font-size: 5em; +} + +.webfont-fw { + width: 1.28571429em; + text-align: center; +} + +.webfont-avatar::before { + content: \\"\\\\ea01\\"; +} + +.webfont-envelope::before { + content: \\"\\\\ea02\\"; +} + +.webfont-phone-call::before { + content: \\"\\\\ea03\\"; +} +" +`; + +exports[`standalone should respect \`template\` options 1`] = ` +"@font-face { + font-display: auto; + font-family: \\"bar\\"; + font-style: normal; + font-weight: 400; + src: url(\\"./foo-bar/bar.eot?test\\"); + src: url(\\"./foo-bar/bar.eot?#iefix\\") format(\\"embedded-opentype\\"), url(\\"./foo-bar/bar.woff2?test\\") format(\\"woff2\\"), url(\\"./foo-bar/bar.woff?test\\") format(\\"woff\\"), url(\\"./foo-bar/bar.ttf?test\\") format(\\"truetype\\"), url(\\"./foo-bar/bar.svg?test#bar\\") format(\\"svg\\"); +} + +.foo { + display: inline-block; + font-family: \\"bar\\"; + font-weight: 400; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; +} + +.foo-lg { + font-size: 1.33333em; + line-height: 0.75em; + vertical-align: -0.0667em; +} + +.foo-xs { + font-size: 0.75em; +} + +.foo-sm { + font-size: 0.875em; +} + +.foo-1x { + font-size: 1em; +} + +.foo-2x { + font-size: 2em; +} + +.foo-3x { + font-size: 3em; +} + +.foo-4x { + font-size: 4em; +} + +.foo-5x { + font-size: 5em; +} + +.foo-6x { + font-size: 6em; +} + +.foo-7x { + font-size: 7em; +} + +.foo-8x { + font-size: 8em; +} + +.foo-9x { + font-size: 9em; +} + +.foo-10x { + font-size: 10em; +} + +.foo-fw { + text-align: center; + width: 1.25em; +} + +.foo-border { + border: solid 0.08em #eee; + border-radius: 0.1em; + padding: 0.2em 0.25em 0.15em; +} + +.foo-pull-left { + float: left; +} + +.foo-pull-right { + float: right; +} + +.foo.foo-pull-left { + margin-right: 0.3em; +} + +.foo.foo-pull-right { + margin-left: 0.3em; +} + + +.foo-avatar::before { + content: \\"\\\\ea01\\"; +} + +.foo-envelope::before { + content: \\"\\\\ea02\\"; +} + +.foo-phone-call::before { + content: \\"\\\\ea03\\"; +} + +" +`; diff --git a/src/standalone/glyphsData.ts b/src/standalone/glyphsData.ts new file mode 100644 index 00000000..0f3f427f --- /dev/null +++ b/src/standalone/glyphsData.ts @@ -0,0 +1,78 @@ +import type {GlyphData, WebfontOptions} from "../types"; +import { createReadStream } from "fs"; +import fileSorter from "svgicons2svgfont/src/filesorter"; +import getMetadataService from "svgicons2svgfont/src/metadata"; +import pLimit from "p-limit"; +import xml2js from "xml2js"; + +// eslint-disable-next-line no-unused-vars +type GlyphsDataGetter = (files: Array, options: WebfontOptions) => unknown; + +export const getGlyphsData : GlyphsDataGetter = (files, options) => { + const metadataProvider = + options.metadataProvider || + getMetadataService({ + prependUnicode: options.prependUnicode, + startUnicode: options.startUnicode, + }); + + const xmlParser = new xml2js.Parser(); + const throttle = pLimit(options.maxConcurrency); + + return Promise.all(files.map((srcPath: GlyphData["srcPath"]) => throttle(() => new Promise((resolve, reject) => { + const glyph = createReadStream(srcPath); + let glyphContents = ""; + + // eslint-disable-next-line no-promise-executor-return + return glyph. + on("error", (glyphError) => reject(glyphError)). + on("data", (data) => { + glyphContents += data.toString(); + }). + on("end", () => { + // Maybe bug in xml2js + if (glyphContents.length === 0) { + return reject(new Error(`Empty file ${srcPath}`)); + } + + return xmlParser.parseString(glyphContents, (error) => { + if (error) { + return reject(error); + } + + const glyphData: GlyphData = { + contents: glyphContents, + srcPath, + }; + + return resolve(glyphData); + }); + }); + })))).then((glyphsData) => { + + let sortedGlyphsData = glyphsData; + + if (options.sort) { + const sortCallback = (fileA: GlyphData, fileB: GlyphData) => fileSorter(fileA.srcPath, fileB.srcPath); + sortedGlyphsData = glyphsData.sort(sortCallback); + } + + const { ligatures } = options; + + return Promise.all(sortedGlyphsData.map((glyphData: GlyphData) => new Promise((resolve, reject) => { + metadataProvider(glyphData.srcPath, (error, metadata) => { + if (error) { + return reject(error); + } + + if (ligatures) { + metadata.unicode.push(metadata.name.replace(/-/gu, "_")); + } + + glyphData.metadata = metadata; + + return resolve(glyphData); + }); + }))); + }); +}; diff --git a/src/standalone/index.test.ts b/src/standalone/index.test.ts new file mode 100755 index 00000000..79d3700f --- /dev/null +++ b/src/standalone/index.test.ts @@ -0,0 +1,461 @@ +import type {GlyphMetadata, GlyphTransformFn} from "../types"; +import crypto from "crypto"; +import isEot from "is-eot"; +import isSvg from "is-svg"; +import isTtf from "is-ttf"; +import isWoff from "is-woff"; +import isWoff2 from "is-woff2"; +import path from "path"; +import standalone from "../standalone"; + +const fixturesGlob = "src/fixtures"; + +describe("standalone", () => { + it("should throw error if `files` not passed", async () => { + try { + await standalone(); + } catch (error) { + expect(error.message).toMatch("You must pass webfont a `files` glob"); + } + }); + + it("should throw error `files glob patterns specified did not match any files` if not found files", async () => { + expect.assertions(1); + + try { + await standalone({ + files: `${fixturesGlob}/not-found-svg-icons/**/*`, + }); + } catch (error) { + // eslint-disable-next-line jest/no-conditional-expect + expect(error.message).toMatch("Files glob patterns specified did not match any files"); + } + }); + + it("should generate all fonts", async () => { + const result = await standalone({ + files: `${fixturesGlob}/svg-icons/**/*`, + }); + + expect(isSvg(result.svg)).toBe(true); + expect(isTtf(result.ttf)).toBe(true); + expect(isEot(result.eot)).toBe(true); + expect(isWoff(result.woff)).toBe(true); + expect(isWoff2(result.woff2)).toBe(true); + }); + + // Need search better way to test `fs` delay + it("should generate all fonts and will be deterministic", async () => { + const result = await standalone({ + files: `${fixturesGlob}/svg-icons/**/*`, + }); + + expect(isSvg(result.svg)).toBe(true); + expect(isTtf(result.ttf)).toBe(true); + expect(isEot(result.eot)).toBe(true); + expect(isWoff(result.woff)).toBe(true); + expect(isWoff2(result.woff2)).toBe(true); + + const svgHash = crypto.createHash("md5").update(result.svg). + digest("hex"); + const ttfHash = crypto.createHash("md5").update(result.ttf). + digest("hex"); + const eotHash = crypto.createHash("md5").update(result.eot). + digest("hex"); + const woffHash = crypto.createHash("md5").update(result.woff). + digest("hex"); + const woff2Hash = crypto. + createHash("md5"). + update(result.woff2). + digest("hex"); + + expect(svgHash).toBe("1154313a3843c5f5ec70890715e8a527"); + expect(ttfHash).toBe("a78de3c54fa46d77540c2c96c4194f16"); + expect(eotHash).toBe("90ed04c53c7534b2e66979f6c0a94afe"); + expect(woffHash).toBe("20d0a901f75c638e7be9df714a93d5a0"); + expect(woff2Hash).toBe("60fe7d6d658fef07b9e8af362e4b8f36"); + }); + + it("should generate only `svg`, `ttf` and `eot` fonts", async () => { + const result = await standalone({ + files: `${fixturesGlob}/svg-icons/**/*`, + formats: ["svg", "ttf", "eot"], + }); + + expect(isSvg(result.svg)).toBe(true); + expect(isTtf(result.ttf)).toBe(true); + expect(isEot(result.eot)).toBe(true); + expect(result.woff).toBeUndefined(); + expect(result.woff2).toBeUndefined(); + }); + + it("should generate only `woff2` font", async () => { + const result = await standalone({ + files: `${fixturesGlob}/svg-icons/**/*`, + formats: ["woff2"], + }); + + expect(result.svg).toBeUndefined(); + expect(result.ttf).toBeUndefined(); + expect(result.eot).toBeUndefined(); + expect(result.woff).toBeUndefined(); + expect(isWoff2(result.woff2)).toBe(true); + }); + + it("should generate all fonts with build-in template", async () => { + const result = await standalone({ + files: `${fixturesGlob}/svg-icons/**/*`, + template: "css", + templateCacheString: "test", + }); + + expect(isSvg(result.svg)).toBe(true); + expect(isTtf(result.ttf)).toBe(true); + expect(isEot(result.eot)).toBe(true); + expect(isWoff(result.woff)).toBe(true); + expect(isWoff2(result.woff2)).toBe(true); + expect(result.template).toMatchSnapshot(); + }); + + + it("should generate only `woff` and `woff2` fonts with build-in template", async () => { + const result = await standalone({ + files: `${fixturesGlob}/svg-icons/**/*`, + formats: ["woff", "woff2"], + template: "css", + templateCacheString: "test", + }); + + expect(result.svg).toBeUndefined(); + expect(result.ttf).toBeUndefined(); + expect(result.eot).toBeUndefined(); + expect(isWoff(result.woff)).toBe(true); + expect(isWoff2(result.woff2)).toBe(true); + expect(result.template).toMatchSnapshot(); + }); + + it("should generate all fonts with custom `template` with absolute path", async () => { + const result = await standalone({ + files: `${fixturesGlob}/svg-icons/**/*`, + template: path.join(fixturesGlob, "templates/template.css"), + templateCacheString: "test", + }); + + expect(isSvg(result.svg)).toBe(true); + expect(isTtf(result.ttf)).toBe(true); + expect(isEot(result.eot)).toBe(true); + expect(isWoff(result.woff)).toBe(true); + expect(isWoff2(result.woff2)).toBe(true); + expect(result.template).toMatchSnapshot(); + }); + + it("should generate all fonts with custom `template` with relative path", async () => { + const result = await standalone({ + files: `${fixturesGlob}/svg-icons/**/*`, + template: "src/fixtures/templates/template.css", + templateCacheString: "test", + }); + + expect(isSvg(result.svg)).toBe(true); + expect(isTtf(result.ttf)).toBe(true); + expect(isEot(result.eot)).toBe(true); + expect(isWoff(result.woff)).toBe(true); + expect(isWoff2(result.woff2)).toBe(true); + expect(result.template).toMatchSnapshot(); + }); + + it("should load config and export file path in result", async () => { + const configFile = path.join(fixturesGlob, "configs/.webfontrc"); + const result = await standalone({ + configFile, + files: `${fixturesGlob}/svg-icons/**/*`, + }); + + expect(isSvg(result.svg)).toBe(true); + expect(isTtf(result.ttf)).toBe(true); + expect(isEot(result.eot)).toBe(true); + expect(isWoff(result.woff)).toBe(true); + expect(isWoff2(result.woff2)).toBe(true); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + expect(result.config.foo).toBe("bar"); + }); + + it("should load config and respect `template` option with build-in template value", async () => { + const configFile = path.join(fixturesGlob, "configs/.webfontrc-with-build-in-template"); + + const result = await standalone({ + configFile, + files: `${fixturesGlob}/svg-icons/**/*`, + templateCacheString: "test", + }); + + expect(isSvg(result.svg)).toBe(true); + expect(isTtf(result.ttf)).toBe(true); + expect(isEot(result.eot)).toBe(true); + expect(isWoff(result.woff)).toBe(true); + expect(isWoff2(result.woff2)).toBe(true); + expect(result.config.template).toBe("scss"); + expect(result.template).toMatchSnapshot(); + }); + + it("should load config and respect `template` option with external template value", async () => { + const configFile = path.join(fixturesGlob, "configs/.webfontrc-with-external-template"); + const result = await standalone({ + configFile, + files: `${fixturesGlob}/svg-icons/**/*`, + }); + + expect(isSvg(result.svg)).toBe(true); + expect(isTtf(result.ttf)).toBe(true); + expect(isEot(result.eot)).toBe(true); + expect(isWoff(result.woff)).toBe(true); + expect(isWoff2(result.woff2)).toBe(true); + expect(result.config.template).toBe("src/fixtures/templates/template.css"); + expect(result.template).toMatchSnapshot(); + }); + + it("should load config and respect `formats` option", async () => { + const configFile = path.join(fixturesGlob, "configs/.webfontrc-with-custom-formats"); + const result = await standalone({ + configFile, + files: `${fixturesGlob}/svg-icons/**/*`, + }); + + expect(result.svg).toBeUndefined(); + expect(result.ttf).toBeUndefined(); + expect(result.eot).toBeUndefined(); + expect(result.woff).toBeUndefined(); + expect(isWoff2(result.woff2)).toBe(true); + }); + + it("should generate the ordered output source in the same order of entry", async () => { + expect.assertions(1); + + const templateOutput = ` + .webfont-envelope::before { + content: "\\ea01"; + } + .webfont-avatar::before { + content: "\\ea02"; + } + `; + const result = await standalone({ + files: [ + `${fixturesGlob}/svg-icons/envelope.svg`, + `${fixturesGlob}/svg-icons/avatar.svg`, + ], + sort: false, + template: path.join(fixturesGlob, "templates/template-ordered.css"), + }); + + // eslint-disable-next-line prefer-named-capture-group + const actual = templateOutput.replace(/(\s)/gu, ""); + // eslint-disable-next-line prefer-named-capture-group + const expected = result.template.replace(/(\s)/gu, ""); + + expect(actual).toBe(expected); + }); + + it("should throw error on bad svg images - `Unclosed root tag`", async () => { + expect.assertions(1); + + const configFile = path.join(fixturesGlob, "configs/.webfontrc"); + + try { + await standalone({ + configFile, + files: `${fixturesGlob}/bad-svg-icons/avatar.svg`, + }); + } catch (error) { + // eslint-disable-next-line jest/no-conditional-expect + expect(error.message).toMatch(/Unclosed root tag/u); + } + }); + + it("should throw error on bad svg images - `Unterminated command at index`", async () => { + expect.assertions(1); + + const configFile = path.join(fixturesGlob, "configs/.webfontrc"); + + try { + await standalone({ + configFile, + files: `${fixturesGlob}/bad-svg-icons/avatar-1.svg`, + }); + } catch (error) { + // eslint-disable-next-line jest/no-conditional-expect + expect(error.message).toMatch(/Unterminated command at index/u); + } + }); + + it("should throw error on bad svg images - `Unexpected character \"N\"`", async () => { + expect.assertions(1); + + const configFile = path.join(fixturesGlob, "configs/.webfontrc"); + + try { + await standalone({ + configFile, + files: `${fixturesGlob}/bad-svg-icons/avatar-2.svg`, + }); + } catch (error) { + // eslint-disable-next-line jest/no-conditional-expect + expect(error.message).toMatch(/Unexpected character "N"/u); + } + }); + + it("should throw error on bad svg images - empty file", async () => { + expect.assertions(1); + + const configFile = path.join(fixturesGlob, "configs/.webfontrc"); + + try { + await standalone({ + configFile, + files: `${fixturesGlob}/bad-svg-icons/avatar-3.svg`, + }); + } catch (error) { + // eslint-disable-next-line jest/no-conditional-expect + expect(error.message).toMatch(/Empty file/u); + } + }); + + it("should throw error of config file not found", async () => { + expect.assertions(1); + + const configFile = path.join(fixturesGlob, "configs/.not-exist-webfontrc"); + + try { + await standalone({ + configFile, + files: `${fixturesGlob}/svg-icons/**/*`, + }); + } catch (error) { + // eslint-disable-next-line jest/no-conditional-expect + expect(error.code).toBe("ENOENT"); + } + }); + + it("should create css selectors with transform titles through function", async () => { + + const glyphTransformFn : GlyphTransformFn = (obj) => { + obj.name += "_transform"; + + return obj; + }; + + const result = await standalone({ + files: `${fixturesGlob}/svg-icons/**/*`, + formats: ["eot"], + glyphTransformFn, + template: "css", + templateCacheString: "test", + }); + + expect(result.template).toMatchSnapshot(); + }); + + + it("should change unicode symbols in the result using sync function", async () => { + const { template } = await standalone({ + files: `${fixturesGlob}/svg-icons/**/*`, + formats: ["eot"], + glyphTransformFn: (obj: GlyphMetadata) => { + obj.unicode = ["\u0001"]; + + return obj; + }, + template: "css", + templateCacheString: "test", + }); + expect(template).toMatchSnapshot(); + }); + + it("should change unicode symbols in the result using async function", async () => { + const { template } = await standalone({ + files: `${fixturesGlob}/svg-icons/**/*`, + formats: ["eot"], + glyphTransformFn: (obj: GlyphMetadata) => { + obj.unicode = ["\u0001"]; + + return Promise.resolve(obj); + }, + template: "css", + templateCacheString: "test", + }); + expect(template).toMatchSnapshot(); + }); + + it("should handle errors properly", async () => { + try { + await standalone({ + files: `${fixturesGlob}/svg-icons/**/*`, + formats: ["eot"], + glyphTransformFn: () => { + throw new Error("Name is invalid"); + }, + template: "css", + }); + } catch (error) { + expect(error.message).toMatch("Name is invalid"); + } + }); + + it("should respect `template` options", async () => { + const result = await standalone({ + files: `${fixturesGlob}/svg-icons/**/*`, + template: "css", + templateCacheString: "test", + templateClassName: "foo", + templateFontName: "bar", + templateFontPath: "./foo-bar", + }); + + expect(isSvg(result.svg)).toBe(true); + expect(isTtf(result.ttf)).toBe(true); + expect(isEot(result.eot)).toBe(true); + expect(isWoff(result.woff)).toBe(true); + expect(isWoff2(result.woff2)).toBe(true); + expect(result.config.template).toBe("css"); + expect(result.usedBuildInTemplate).toBe(true); + expect(result.template).toMatchSnapshot(); + }); + + it("should export `glyphsData` in `result`", async () => { + const result = await standalone({ + files: `${fixturesGlob}/svg-icons/**/*`, + template: "css", + }); + + expect(Array.isArray(result.glyphsData)).toBe(true); + expect(result.glyphsData.length > 0).toBe(true); + }); + + it("should remove ligature unicode when `ligatures` set to `false`", async () => { + const result = await standalone({ + files: `${fixturesGlob}/svg-icons/**/*`, + ligatures: false, + template: "css", + }); + + expect(Array.isArray(result.glyphsData)).toBe(true); + expect(result.glyphsData.length > 0).toBe(true); + + result.glyphsData.forEach((glyph) => { + expect(glyph.metadata?.unicode).toHaveLength(1); + }); + }); + + it("should export `hash` in `result`", () => { + expect.assertions(1); + + return standalone({ + files: `${fixturesGlob}/svg-icons/**/*`, + }).then((result) => { + expect(result.hash).toBe("1154313a3843c5f5ec70890715e8a527"); + + return result; + }); + }); +}); diff --git a/src/standalone/index.ts b/src/standalone/index.ts new file mode 100644 index 00000000..e69de29b diff --git a/packages/webfont/templates/index.d.ts b/templates/index.d.ts similarity index 100% rename from packages/webfont/templates/index.d.ts rename to templates/index.d.ts diff --git a/packages/webfont/templates/index.ts b/templates/index.ts similarity index 100% rename from packages/webfont/templates/index.ts rename to templates/index.ts diff --git a/packages/webfont/templates/template.css.njk b/templates/template.css.njk similarity index 93% rename from packages/webfont/templates/template.css.njk rename to templates/template.css.njk index 4f8d4f9b..b9e1a076 100644 --- a/packages/webfont/templates/template.css.njk +++ b/templates/template.css.njk @@ -1,11 +1,8 @@ @font-face { font-display: auto; - font-family: "{{ fontFamily }}"; + font-family: "{{ fontName }}"; font-style: normal; font-weight: 400; - {% if unicodeRange %} - unicode-range: {{ unicodeRange }}; - {% endif %} {% if formats.indexOf('eot')>-1 -%} src: url("{{ fontPath }}{{ fontName }}.eot?{{ cacheString }}{% if hash %}&v={{ hash }}{% endif %}"); {%- endif %} @@ -35,13 +32,13 @@ {%- if formats.length != 0 -%}, {% else -%}; {% endif -%} {%- endif -%} {%- if svgIndex != -1 -%} - url("{{ fontPath }}{{ fontName }}.svg?{{ cacheString }}{% if hash %}&v={{ hash }}{% endif %}#{{ svgFontId }}") format("svg"); + url("{{ fontPath }}{{ fontName }}.svg?{{ cacheString }}{% if hash %}&v={{ hash }}{% endif %}#{{ fontName }}") format("svg"); {%- endif %} } .{{ className }} { display: inline-block; - font-family: "{{ fontFamily }}"; + font-family: "{{ fontName }}"; font-weight: 400; font-style: normal; font-variant: normal; diff --git a/packages/webfont/templates/template.html.njk b/templates/template.html.njk similarity index 89% rename from packages/webfont/templates/template.html.njk rename to templates/template.html.njk index d9f7e32c..b55dfe99 100644 --- a/packages/webfont/templates/template.html.njk +++ b/templates/template.html.njk @@ -2,7 +2,7 @@ - {{ fontFamily }} + {{ fontName }}