diff --git a/.bun-version b/.bun-version new file mode 100644 index 0000000..d0149fe --- /dev/null +++ b/.bun-version @@ -0,0 +1 @@ +1.3.4 diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 828d42c..0000000 --- a/.eslintignore +++ /dev/null @@ -1,9 +0,0 @@ -temp -cache -dist -_site -coverage -!.vitepress -config.mjs.timestamp-*.mjs -plugins/* -!plugins/test diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 635beae..0000000 --- a/.eslintrc.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "env": { - "node": true, - "mocha": true, - "es2021": true - }, - "parser": "@babel/eslint-parser", - "parserOptions": { - "sourceType": "module", - "ecmaVersion": 8, - "requireConfigFile": false - }, - "extends": [ - "eslint:recommended", - "google" - ], - "rules": { - "arrow-parens": ["error", - "as-needed" - ], - "max-len": ["error", { - "code": 140, - "ignoreComments": true - }], - "no-empty": ["error", { - "allowEmptyCatch": true - }], - "no-unused-vars": ["error", { - "vars": "all", - "args": "after-used", - "ignoreRestSiblings": false - }], - - "require-jsdoc": ["error", { - "require": { - "FunctionDeclaration": true, - "MethodDefinition": false, - "ClassDeclaration": false, - "ArrowFunctionExpression": false, - "FunctionExpression": false - } - }] - } -} diff --git a/.github/workflows/deploy-npm.yml b/.github/workflows/deploy-npm.yml index f020d5a..a65fc89 100644 --- a/.github/workflows/deploy-npm.yml +++ b/.github/workflows/deploy-npm.yml @@ -2,18 +2,12 @@ name: Deploy npm on: workflow_call: - inputs: - node-version: - default: "20" - description: The node version to use - required: false - type: string secrets: github-token: - description: "The github token" + description: 'The github token' required: true npm-token: - description: "The npm deploy token" + description: 'The npm deploy token' required: true jobs: @@ -24,19 +18,25 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v6 - - name: Install node ${{ inputs.node-version }} + + - name: Install node uses: actions/setup-node@v6 with: - node-version: ${{ inputs.node-version }} + node-version: '24' registry-url: https://registry.npmjs.org cache: npm + - name: Install bun + uses: oven-sh/setup-bun@v2 + with: + bun-version-file: .bun-version - name: Install dependencies - run: npm clean-install --prefer-offline --frozen-lockfile + run: bun install --frozen-lockfile + - name: Lint code - run: npm run lint + run: bun run lint - name: Run unit tests - run: npm run test:unit + run: bun run test:unit - name: Update edge release alias shell: bash diff --git a/.github/workflows/dev-release.yml b/.github/workflows/dev-release.yml index 5d0313e..5831807 100644 --- a/.github/workflows/dev-release.yml +++ b/.github/workflows/dev-release.yml @@ -25,7 +25,6 @@ jobs: arch: ${{ matrix.arch }} edge: true filename: lando-${{ matrix.os }}-${{ matrix.arch }}-${{ github.sha }} - node-version: "20" os: ${{ matrix.os }} version: dev diff --git a/.github/workflows/pkg-binary.yml b/.github/workflows/pkg-binary.yml index 87bc09d..036406f 100644 --- a/.github/workflows/pkg-binary.yml +++ b/.github/workflows/pkg-binary.yml @@ -18,11 +18,6 @@ on: description: The name of the resulting binary required: false type: string - node-version: - default: "20" - description: The node version to build for eg 16 | 18 | 20 - required: true - type: string os: default: linux description: The os to build for eg linux | macos | win @@ -44,15 +39,16 @@ jobs: uses: actions/checkout@v6 with: fetch-depth: 0 - - name: Install node ${{ inputs.node-version }} - uses: actions/setup-node@v6 + - name: Install bun + uses: oven-sh/setup-bun@v2 with: - node-version: ${{ inputs.node-version }} - cache: npm + bun-version-file: .bun-version + - name: Install dependencies - run: npm clean-install --prefer-offline --frozen-lockfile --production + run: bun install --frozen-lockfile --production - name: Install plugins run: scripts/install-plugins.sh --lando bin/lando ${{ inputs.edge == true && '--edge' || '' }} + - name: Switch to edge channel if: inputs.edge == true run: | @@ -63,16 +59,18 @@ jobs: with: version: ${{ inputs.version }} sync: false - - name: Package into binary - uses: lando/pkg-action@v6 - with: - entrypoint: bin/lando - filename: ${{ inputs.filename }} - node-version: ${{ inputs.node-version }} - os: ${{ inputs.os }} - options: --options dns-result-order=ipv4first - pkg: "@yao-pkg/pkg@5.16.1" - upload-key: "packaged-${{ inputs.filename }}-${{ inputs.os }}-${{ inputs.arch }}-${{ github.sha }}" + + # @TODO: switch this to bun build + # - name: Package into binary + # uses: lando/pkg-action@v6 + # with: + # entrypoint: bin/lando + # filename: ${{ inputs.filename }} + # os: ${{ inputs.os }} + # options: --options dns-result-order=ipv4first + # pkg: '@yao-pkg/pkg@5.16.1' + # upload-key: 'packaged-${{ inputs.filename }}-${{ inputs.os }}-${{ inputs.arch }}-${{ github.sha }}' + - name: Ensure version if: (inputs.os == 'linux' && runner.os == 'Linux') || (inputs.os == 'macos' && runner.os == 'macOS') run: ./dist/${{ inputs.filename }} version --all diff --git a/.github/workflows/pr-core-protected-tests.yml b/.github/workflows/pr-core-protected-tests.yml index ee2bfe2..5b61c28 100644 --- a/.github/workflows/pr-core-protected-tests.yml +++ b/.github/workflows/pr-core-protected-tests.yml @@ -17,8 +17,6 @@ jobs: # - init-remote # - private-plugins - yaml - node-version: - - "20" os: # - macos-14 - ubuntu-24.04 @@ -29,12 +27,11 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v6 - - name: Install node ${{ matrix.node-version }} - uses: actions/setup-node@v6 + + - name: Install bun + uses: oven-sh/setup-bun@v2 with: - node-version: ${{ matrix.node-version }} - registry-url: https://registry.npmjs.org - cache: npm + bun-version-file: .bun-version - name: Bundle Deps uses: lando/prepare-release-action@v3 with: @@ -42,30 +39,42 @@ jobs: version: dev sync: false - name: Install pkg dependencies - run: npm clean-install --prefer-offline --frozen-lockfile --production - - name: Package into node binary - uses: lando/pkg-action@v6 - id: pkg-action - with: - entrypoint: bin/lando - filename: lando - node-version: ${{ matrix.node-version }} - options: --options dns-result-order=ipv4first - upload: false - pkg: "@yao-pkg/pkg@5.16.1" - - name: Install full deps - run: npm clean-install --prefer-offline --frozen-lockfile - - name: Setup lando ${{ steps.pkg-action.outputs.file }} + run: bun install --frozen-lockfile --production + + # - name: Package into node binary + # uses: lando/pkg-action@v6 + # id: pkg-action + # with: + # entrypoint: bin/lando + # filename: lando + # node-version: ${{ matrix.node-version }} + # options: --options dns-result-order=ipv4first + # upload: false + # pkg: '@yao-pkg/pkg@5.16.1' + # - name: Install full deps + # run: npm clean-install --prefer-offline --frozen-lockfile + # - name: Setup lando ${{ steps.pkg-action.outputs.file }} + # uses: lando/setup-lando@v3 + # with: + # lando-version: ${{ steps.pkg-action.outputs.file }} + # telemetry: false + # config: | + # setup.skipCommonPlugins=true + + - name: Setup lando uses: lando/setup-lando@v3 + id: setup-lando with: - lando-version: ${{ steps.pkg-action.outputs.file }} + lando-version: 3 telemetry: false config: | setup.skipCommonPlugins=true + - name: Replace with lando from source + run: sudo ln -sf ${{ github.workspace }}/bin/lando ${{ steps.setup-lando.outputs.lando-path }} + - name: Run Leia Tests - uses: lando/run-leia-action@v2 - with: - leia-test: "./examples/${{ matrix.leia-test }}/README.md" - cleanup-header: "Destroy tests" - shell: ${{ matrix.shell }} - stdin: true + run: | + bunx @lando/leia './examples/${{ matrix.leia-test }}/README.md' \ + --cleanup-header="Destroy tests" \ + --shell="${{ matrix.shell }}" \ + --stdin ${RUNNER_DEBUG:+--debug} diff --git a/.github/workflows/pr-core-tests.yml b/.github/workflows/pr-core-tests.yml index 61538e0..aee980d 100644 --- a/.github/workflows/pr-core-tests.yml +++ b/.github/workflows/pr-core-tests.yml @@ -13,55 +13,53 @@ jobs: matrix: leia-test: - badname - - build - - c,o,m,m,a - - cache - - certs - - command - - config - - debug - - envfile - - entrypoint + # - build + # - c,o,m,m,a + # - cache + # - certs + # - command + # - config + # - debug + # - envfile + # - entrypoint # - environment - - events - - excludes - - exec - - experimental - - healthcheck - - host + # - events + # - excludes + # - exec + # - experimental + # - healthcheck + # - host # - hostnames - - info - - keys - - l337 + # - info + # - keys + # - l337 # - lando-v4 - - landofile - - landofile-custom - - list - - logs - - long-name - - mounts - - networking - - no-services - - orchestrator - - plugins - - proxy - - rebuild - - renderer - - recipes - - release-channel - - restart - - scanner - - security - - sluggy - - sql-helpers - - ssh + # - landofile + # - landofile-custom + # - list + # - logs + # - long-name + # - mounts + # - networking + # - no-services + # - orchestrator + # - plugins + # - proxy + # - rebuild + # - renderer + # - recipes + # - release-channel + # - restart + # - scanner + # - security + # - sluggy + # - sql-helpers + # - ssh # - storage - - tooling - - update - - version - - yaml - node-version: - - "20" + # - tooling + # - update + # - version + # - yaml os: # - macos-14 - ubuntu-24.04 @@ -72,12 +70,11 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v6 - - name: Install node ${{ matrix.node-version }} - uses: actions/setup-node@v6 + + - name: Install bun + uses: oven-sh/setup-bun@v2 with: - node-version: ${{ matrix.node-version }} - registry-url: https://registry.npmjs.org - cache: npm + bun-version-file: .bun-version - name: Bundle Deps uses: lando/prepare-release-action@v3 with: @@ -85,30 +82,42 @@ jobs: version: dev sync: false - name: Install pkg dependencies - run: npm clean-install --prefer-offline --frozen-lockfile --production - - name: Package into node binary - uses: lando/pkg-action@v6 - id: pkg-action - with: - entrypoint: bin/lando - filename: lando - node-version: ${{ matrix.node-version }} - options: --options dns-result-order=ipv4first - upload: false - pkg: "@yao-pkg/pkg@5.16.1" - - name: Install full deps - run: npm clean-install --prefer-offline --frozen-lockfile - - name: Setup lando ${{ steps.pkg-action.outputs.file }} + run: bun install --frozen-lockfile --production + + # - name: Package into node binary + # uses: lando/pkg-action@v6 + # id: pkg-action + # with: + # entrypoint: bin/lando + # filename: lando + # node-version: ${{ matrix.node-version }} + # options: --options dns-result-order=ipv4first + # upload: false + # pkg: '@yao-pkg/pkg@5.16.1' + # - name: Install full deps + # run: bun install --frozen-lockfile --production + # - name: Setup lando ${{ steps.pkg-action.outputs.file }} + # uses: lando/setup-lando@v3 + # with: + # lando-version: ${{ steps.pkg-action.outputs.file }} + # telemetry: false + # config: | + # setup.skipCommonPlugins=true + + - name: Setup lando uses: lando/setup-lando@v3 + id: setup-lando with: - lando-version: ${{ steps.pkg-action.outputs.file }} + lando-version: 3 telemetry: false config: | setup.skipCommonPlugins=true + - name: Replace with lando from source + run: sudo ln -sf ${{ github.workspace }}/bin/lando ${{ steps.setup-lando.outputs.lando-path }} + - name: Run Leia Tests - uses: lando/run-leia-action@v2 - with: - leia-test: "./examples/${{ matrix.leia-test }}/README.md" - cleanup-header: "Destroy tests" - shell: ${{ matrix.shell }} - stdin: true + run: | + bunx @lando/leia './examples/${{ matrix.leia-test }}/README.md' \ + --cleanup-header="Destroy tests" \ + --shell="${{ matrix.shell }}" \ + --stdin ${RUNNER_DEBUG:+--debug} diff --git a/.github/workflows/pr-docs-tests.yml b/.github/workflows/pr-docs-tests.yml index b7cfcaa..1287d3f 100644 --- a/.github/workflows/pr-docs-tests.yml +++ b/.github/workflows/pr-docs-tests.yml @@ -12,8 +12,6 @@ jobs: matrix: os: - ubuntu-24.04 - node-version: - - "20" steps: - name: Checkout code uses: actions/checkout@v6 @@ -22,41 +20,40 @@ jobs: with: key: lando-mvb-docs path: docs/.vitepress/cache/@lando/mvb - - name: Install node ${{ matrix.node-version }} - uses: actions/setup-node@v6 + + - name: Bundle Deps + uses: lando/prepare-release-action@v3 with: - node-version: ${{ matrix.node-version }} - cache: npm - - name: Install dependencies - run: npm clean-install --prefer-offline --frozen-lockfile + lando-plugin: true + version: dev + sync: false + - name: Install pkg dependencies + run: bun install --frozen-lockfile - # Run tests - name: Run linter - run: npm run lint + run: bun run lint - name: Test mvb - run: npm run docs:mvb + run: bun run docs:mvb - name: Test build - run: npm run docs:build + run: bun run docs:build lando-docs-tests: runs-on: ${{ matrix.os }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - DEBUG: "@lando/*" + DEBUG: '@lando/*' strategy: matrix: os: - ubuntu-24.04 - node-version: - - "20" steps: - name: Checkout code uses: actions/checkout@v6 - - name: Install node ${{ matrix.node-version }} - uses: actions/setup-node@v6 + + - name: Install bun + uses: oven-sh/setup-bun@v2 with: - node-version: ${{ matrix.node-version }} - cache: npm + bun-version-file: .bun-version - name: Bundle Deps uses: lando/prepare-release-action@v3 with: @@ -64,27 +61,40 @@ jobs: version: dev sync: false - name: Install pkg dependencies - run: npm clean-install --prefer-offline --frozen-lockfile --production - - name: Package into node binary - uses: lando/pkg-action@v6 - id: pkg-action - with: - entrypoint: bin/lando - filename: lando - node-version: ${{ matrix.node-version }} - options: --options dns-result-order=ipv4first - upload: false - pkg: "@yao-pkg/pkg@5.16.1" + run: bun install --frozen-lockfile --production + + # - name: Package into node binary + # uses: lando/pkg-action@v6 + # id: pkg-action + # with: + # entrypoint: bin/lando + # filename: lando + # node-version: ${{ matrix.node-version }} + # options: --options dns-result-order=ipv4first + # upload: false + # pkg: '@yao-pkg/pkg@5.16.1' - name: Install full deps - run: npm clean-install --prefer-offline --frozen-lockfile - - name: Setup lando ${{ steps.pkg-action.outputs.file }} + run: bun install --frozen-lockfile --production + # - name: Setup lando ${{ steps.pkg-action.outputs.file }} + # uses: lando/setup-lando@v3 + # with: + # lando-version: ${{ steps.pkg-action.outputs.file }} + # telemetry: false + # config: | + # setup.skipCommonPlugins=true + + - name: Setup lando uses: lando/setup-lando@v3 + id: setup-lando with: - lando-version: ${{ steps.pkg-action.outputs.file }} + lando-version: 3 telemetry: false config: | setup.skipCommonPlugins=true + - name: Replace with lando from source + run: sudo ln -sf ${{ github.workspace }}/bin/lando ${{ steps.setup-lando.outputs.lando-path }} - name: Lando tests run: | - lando start - lando vitepress build docs + lando version + # lando start + # lando vitepress build docs diff --git a/.github/workflows/pr-license-check.yml b/.github/workflows/pr-license-check.yml index c8e8ebe..a7e0c18 100644 --- a/.github/workflows/pr-license-check.yml +++ b/.github/workflows/pr-license-check.yml @@ -10,19 +10,14 @@ jobs: matrix: os: - ubuntu-24.04 - node-version: - - "20" steps: - name: Checkout code uses: actions/checkout@v6 - - name: Install node ${{ matrix.node-version }} - uses: actions/setup-node@v6 + - name: Install bun + uses: oven-sh/setup-bun@v2 with: - node-version: ${{ matrix.node-version }} - cache: npm + bun-version-file: .bun-version - name: Install dependencies - run: npm clean-install --prefer-offline --frozen-lockfile + run: bun install --frozen-lockfile - name: Run license cehck - run: | - npm install --global license-checker - npx license-checker --production --summary + run: bunx license-checker --production --summary diff --git a/.github/workflows/pr-linter.yml b/.github/workflows/pr-linter.yml index 013be17..91b0bd7 100644 --- a/.github/workflows/pr-linter.yml +++ b/.github/workflows/pr-linter.yml @@ -10,20 +10,14 @@ jobs: matrix: os: - ubuntu-24.04 - node-version: - - "20" steps: - # Install deps and cache - name: Checkout code uses: actions/checkout@v6 - - name: Install node ${{ matrix.node-version }} - uses: actions/setup-node@v6 + - name: Install bun + uses: oven-sh/setup-bun@v2 with: - node-version: ${{ matrix.node-version }} - cache: npm + bun-version-file: .bun-version - name: Install dependencies - run: npm clean-install --prefer-offline --frozen-lockfile - - # Run the linter + run: bun install --frozen-lockfile - name: Run code linter - run: npm run lint + run: bun run lint diff --git a/.github/workflows/pr-release-tests.yml b/.github/workflows/pr-release-tests.yml index 8096c69..ef4b15b 100644 --- a/.github/workflows/pr-release-tests.yml +++ b/.github/workflows/pr-release-tests.yml @@ -19,7 +19,6 @@ jobs: with: arch: ${{ matrix.arch }} filename: lando-${{ matrix.os }}-${{ matrix.arch }}-${{ github.sha }} - node-version: "20" os: ${{ matrix.os }} version: dev @@ -58,30 +57,37 @@ jobs: - release env: TERM: xterm - strategy: - matrix: - node-version: - - '20' steps: - name: Checkout code uses: actions/checkout@v6 - - name: Install node ${{ matrix.node-version }} + + - name: Install node uses: actions/setup-node@v6 with: - node-version: ${{ matrix.node-version }} + node-version: '24' registry-url: https://registry.npmjs.org cache: npm + - name: Install bun + uses: oven-sh/setup-bun@v2 + with: + bun-version-file: .bun-version + - name: Install dependencies - run: npm clean-install --prefer-offline --frozen-lockfile + run: bun install --frozen-lockfile + - name: Lint code - run: npm run lint + run: bun run lint - name: Run unit tests - run: npm run test:unit + run: bun run test:unit + - name: Prepare Release uses: lando/prepare-release-action@v3 with: version: dev sync: false lando-plugin: true + - name: Publish to npm dryrun - run: npm publish --access public --dry-run + run: npm publish --access public --tag next --dry-run + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_DEPLOY_TOKEN }} diff --git a/.github/workflows/pr-setup-linux-tests.yml b/.github/workflows/pr-setup-linux-tests.yml index 4400b63..c5b0c41 100644 --- a/.github/workflows/pr-setup-linux-tests.yml +++ b/.github/workflows/pr-setup-linux-tests.yml @@ -1,7 +1,10 @@ name: Setup Linux Tests on: - pull_request: + # pull_request: + push: + branches: + - NOTRIGHTNOW jobs: leia-tests: @@ -14,7 +17,7 @@ jobs: leia-test: - setup-linux node-version: - - "20" + - '20' os: - ubuntu-24.04 @@ -44,7 +47,7 @@ jobs: node-version: ${{ matrix.node-version }} options: --options dns-result-order=ipv4first upload: false - pkg: "@yao-pkg/pkg@5.16.1" + pkg: '@yao-pkg/pkg@5.16.1' - name: Install full deps run: npm clean-install --prefer-offline --frozen-lockfile - name: Setup lando ${{ steps.pkg-action.outputs.file }} @@ -56,7 +59,7 @@ jobs: - name: Run Leia Tests uses: lando/run-leia-action@v2 with: - leia-test: "./examples/${{ matrix.leia-test }}/README.md" - cleanup-header: "Destroy tests" + leia-test: './examples/${{ matrix.leia-test }}/README.md' + cleanup-header: 'Destroy tests' shell: bash stdin: true diff --git a/.github/workflows/pr-setup-macos-tests.yml b/.github/workflows/pr-setup-macos-tests.yml index 4c1f87a..e857eda 100644 --- a/.github/workflows/pr-setup-macos-tests.yml +++ b/.github/workflows/pr-setup-macos-tests.yml @@ -17,7 +17,7 @@ jobs: leia-test: - setup-macos node-version: - - "20" + - '20' os: - macos-15 @@ -47,7 +47,7 @@ jobs: node-version: ${{ matrix.node-version }} options: --options dns-result-order=ipv4first upload: false - pkg: "@yao-pkg/pkg@5.16.1" + pkg: '@yao-pkg/pkg@5.16.1' - name: Install full deps run: npm clean-install --prefer-offline --frozen-lockfile - name: Setup lando ${{ steps.pkg-action.outputs.file }} @@ -59,7 +59,7 @@ jobs: - name: Run Leia Tests uses: lando/run-leia-action@v2 with: - leia-test: "./examples/${{ matrix.leia-test }}/README.md" - cleanup-header: "Destroy tests" + leia-test: './examples/${{ matrix.leia-test }}/README.md' + cleanup-header: 'Destroy tests' shell: bash stdin: true diff --git a/.github/workflows/pr-setup-windows-tests.yml b/.github/workflows/pr-setup-windows-tests.yml index bcc17e8..29b54f2 100644 --- a/.github/workflows/pr-setup-windows-tests.yml +++ b/.github/workflows/pr-setup-windows-tests.yml @@ -1,7 +1,10 @@ name: Setup Windows Tests on: - pull_request: + # pull_request: + push: + branches: + - NOTRIGHTNOW jobs: leia-tests: @@ -14,7 +17,7 @@ jobs: leia-test: - setup-windows node-version: - - "20" + - '20' os: - windows-2022 steps: @@ -43,7 +46,7 @@ jobs: node-version: ${{ matrix.node-version }} options: --options dns-result-order=ipv4first upload: false - pkg: "@yao-pkg/pkg@5.16.1" + pkg: '@yao-pkg/pkg@5.16.1' - name: Install full deps run: npm clean-install --prefer-offline --frozen-lockfile - name: Setup lando ${{ steps.pkg-action.outputs.file }} @@ -55,8 +58,8 @@ jobs: - name: Run Leia Tests uses: lando/run-leia-action@v2 with: - leia-test: "./examples/${{ matrix.leia-test }}/README.md" - cleanup-header: "Destroy tests" + leia-test: './examples/${{ matrix.leia-test }}/README.md' + cleanup-header: 'Destroy tests' shell: powershell stdin: true debug: true diff --git a/.github/workflows/pr-unit-tests.yml b/.github/workflows/pr-unit-tests.yml index 1308db8..88c2907 100644 --- a/.github/workflows/pr-unit-tests.yml +++ b/.github/workflows/pr-unit-tests.yml @@ -13,20 +13,14 @@ jobs: - macos-15 - ubuntu-24.04 - windows-2022 - node-version: - - "20" steps: - # Install deps and cache - name: Checkout code uses: actions/checkout@v6 - - name: Install node ${{ matrix.node-version }} - uses: actions/setup-node@v6 + - name: Install bun + uses: oven-sh/setup-bun@v2 with: - node-version: ${{ matrix.node-version }} - cache: npm + bun-version-file: .bun-version - name: Install dependencies - run: npm clean-install --prefer-offline --frozen-lockfile - - # Run unit tests + run: bun install --frozen-lockfile - name: Run unit tests - run: npm run test:unit + run: bun run test:unit diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index eb66fca..5397f54 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -23,7 +23,6 @@ jobs: arch: ${{ matrix.arch }} edge: ${{ github.event.release.prerelease }} filename: lando-${{ matrix.os }}-${{ matrix.arch }}-${{ github.ref_name }} - node-version: "20" os: ${{ matrix.os }} version: ${{ github.event.release.tag_name }} diff --git a/.gitignore b/.gitignore index 29a8319..80e8f7c 100644 --- a/.gitignore +++ b/.gitignore @@ -41,6 +41,7 @@ checksums.txt plugins/* FATCORE !plugins/.gitkeep +!plugins/test # docs .temp diff --git a/.node-version b/.node-version deleted file mode 100644 index 209e3ef..0000000 --- a/.node-version +++ /dev/null @@ -1 +0,0 @@ -20 diff --git a/.npmignore b/.npmignore index 4697cbc..b8bca8d 100644 --- a/.npmignore +++ b/.npmignore @@ -1,8 +1,26 @@ -.github -.nyc_output -coverage -dist -docs -examples -guides -test +.github/ +.nyc_output/ +.vscode/ +bin/ +commands/ +components/ +config/ +coverage/ +docs/ +examples/ +guides/ +hooks/ +lib/ +plugins/ +release-aliases/ +tasks/ +test/ +utils/ + +*.test.ts +*.spec.ts +*.map +.eslintrc.* +.prettierrc* +tsconfig.json +tsconfig.*.json diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..fc80315 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,9 @@ +{ + "endOfLine": "auto", + "printWidth": 140, + "quoteProps": "consistent", + "semi": true, + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "all" +} diff --git a/.tool-versions b/.tool-versions deleted file mode 100644 index 3e51109..0000000 --- a/.tool-versions +++ /dev/null @@ -1 +0,0 @@ -nodejs 20 diff --git a/CHANGELOG.md b/CHANGELOG.md index 269c404..59d8b81 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,25 +1,27 @@ ## {{ UNRELEASED_VERSION }} - [{{ UNRELEASED_DATE }}]({{ UNRELEASED_LINK }}) +- Switched to `bun` as runtime, packager and bundler + ## v4.0.0-unstable.8 - [December 9, 2025](https://github.com/lando/core-next/releases/tag/v4.0.0-unstable.8) -* Updated to prep for `bunification` part 2 +- Updated to prep for `bunification` part 2 ## v4.0.0-unstable.7 - [December 9, 2025](https://github.com/lando/core-next/releases/tag/v4.0.0-unstable.7) -* Updated to prep for `bunification` +- Updated to prep for `bunification` ## v4.0.0-unstable.4 - [December 5, 2023](https://github.com/lando/core-next/releases/tag/v4.0.0-unstable.3) -* SYNCING FOR NEW UPDATE FLOWS +- SYNCING FOR NEW UPDATE FLOWS ## v4.0.0-unstable.3 - [December 10, 2022](https://github.com/lando/core-next/releases/tag/v4.0.0-unstable.3) -* DEPLOY TEST 2 +- DEPLOY TEST 2 ## v4.0.0-unstable.2 - [December 10, 2022](https://github.com/lando/core-next/releases/tag/v4.0.0-unstable.2) -* DEPLOY TEST +- DEPLOY TEST ## v4.0.0-unstable.1 - [December 6, 2022](https://github.com/lando/core-next/releases/tag/v4.0.0-unstable.1) -* Tagging a release for docs and prepping for decoupling +- Tagging a release for docs and prepping for decoupling diff --git a/_new/components/file-storage.js b/_new/components/file-storage.js new file mode 100644 index 0000000..8ebb800 --- /dev/null +++ b/_new/components/file-storage.js @@ -0,0 +1,214 @@ +import fs from 'node:fs'; +import os from 'node:os'; +import path from 'node:path'; + +import NodeCache from 'node-cache'; +import merge from 'lodash-es/merge.js'; + +import createDebug from '../lib/debug.js'; +import id2key from '../utils/normalize-id2key.js'; +import read from '../utils/read-file.js'; +import size from '../utils/get-size.js'; +import write from '../utils/write-file.js'; + +/* + * Creates a new Cache instance. + */ +class FileStorage extends NodeCache { + static name = 'file-storage'; + static cspace = 'file-storage'; + static debug = createDebug('@lando/devtool:file-storage'); + static config = { + dir: os.tmpdir(), + delimiter: '.', + }; + + // @TBD: helper to get key from an id + static getKey = (id, delimiter = FileStorage.config.delimiter) => id2key(id, delimiter); + + // helper to wipe a storage directory + static flush(dir, debug = FileStorage.debug) { + // @TODO: error handle dir? + fs.rmSync(dir, { recursive: true }); + fs.mkdirSync(dir, { recursive: true }); + debug('flushed file storage at %o', dir); + } + + constructor({ debug = FileStorage.debug, delimiter = FileStorage.config.delimiter, dir = FileStorage.config.dir } = {}) { + // Get the nodecache opts + super(); + + // Set some things + this.debug = debug; + this.delimiter = delimiter; + this.dir = dir; + + // Ensure the cache dir exists + fs.mkdirSync(this.dir, { recursive: true }); + } + + // wipes all keys + flush() { + // clear out memcache + super.flushAll(); + this.debug('flushed mem storage at'); + + // clear out file cache + FileStorage.flush(this.dir, this.debug); + this.debug('flushed file storage at %o', this.dir); + } + + /** + * Gets an item in the cache + * + * @since 3.0.0 + * @alias lando.cache.get + * @param {String} id The name of the key to retrieve the data. + * @return {Any} The data stored in the cache if applicable. + * @example + * // Get the data stored with key mykey + * const data = lando.cache.get('mykey'); + */ + get(id) { + // get key + const key = FileStorage.getKey(id); + + // Get from cache + const memResult = this.__get(key); + + // Return result if its in memcache + if (memResult) { + this.debug('retrieved %o items from mem at key %o', size(memResult), key); + return memResult; + + // otherwise try to get from file storage + } else { + try { + const data = read(path.join(this.dir, key), { extension: 'json' }); + this.debug('retrieved %o items from file storage at %o', size(data), path.join(this.dir, key)); + this.__set(key, data, 0); + return data; + } catch { + this.debug('file storage cache miss with key %o', key); + } + } + } + + // TBD + has(id) { + // get key + const key = FileStorage.getKey(id); + // return true if its in the memcache + if (this.__get(key)) return true; + // otherwise look for it in file storage + try { + return read(path.join(this.dir, key), { extension: 'json' }) ? true : false; + } catch { + return false; + } + } + + /** + * Manually remove an item from the cache. + * + * @since 3.0.0 + * @alias lando.cache.remove + * @param {String} id The name of the key to remove the data. + * @example + * // Remove the data stored with key mykey + * lando.cache.remove('mykey'); + */ + remove(id) { + // get key + const key = FileStorage.getKey(id); + + // Remove from memcace + this.__del(key); + + // Also remove file if applicable + try { + this.debug('removed key %o from memory and file storage', key); + fs.unlinkSync(path.join(this.dir, key)); + } catch { + this.debug('no file storage with key %o', key); + } + } + + /** + * Sets an item in the cache + * + * @since 3.0.0 + * @alias lando.cache.set + * @param {String} id The name of the key to store the data with. + * @param {Any} data The data to store in the cache. + * @param {Object} [opts] Options to pass into the cache + * @param {Boolean} [opts.persist=false] Whether this cache data should persist between processes. Eg in a file instead of memory + * @param {Integer} [opts.ttl=0] Seconds the cache should live. 0 mean forever. + * @example + * // Add a string to the cache + * lando.cache.set('mykey', 'mystring'); + * + * // Add an object to persist in the file cache + * lando.cache.set('mykey', data, {persist: true}); + * + * // Add an object to the cache for five seconds + * lando.cache.set('mykey', data, {ttl: 5}); + */ + set(id, data, { persist = true, ttl = 0 } = {}) { + // get key + const key = FileStorage.getKey(id); + + // Unsafe cache key patterns + const patterns = { + controlRe: /[\x00-\x1f\x80-\x9f]/g, // eslint-disable-line no-control-regex + illegalRe: /[\/\?<>\\:\*\|":]/g, // eslint-disable-line no-useless-escape + reservedRe: /^\.+$/, + windowsReservedRe: /^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i, + windowsTrailingRe: /[\. ]+$/, // eslint-disable-line no-useless-escape + }; + for (const pattern of Object.values(patterns)) { + if (key.match(pattern)) throw new Error(`Invalid file-storage key: ${key}`); + } + + // Try to set cache + if (this.__set(key, data, ttl)) { + this.debug('set %o items into mem and file storage at %o', size(data), path.join(this.dir, key)); + } else { + this.debug('failed to set %o items at key %o', size(data), key); + } + + // And add to file if we have persistence + if (persist) write(path.join(this.dir, key), data, { extension: 'json' }); + } + + // @TBD + update(id, value) { + // get key + const key = FileStorage.getKey(id); + + // if its an object then merge and set, otherwise just replace + if (typeof data === 'object') this.set(key, merge({}, this.get(key), value)); + // otherwise just replace it + else this.set(key, value); + } +} + +/* + * Stores the old get method. + */ +FileStorage.prototype.__get = NodeCache.prototype.get; + +/* + * Stores the old set method. + */ +FileStorage.prototype.__set = NodeCache.prototype.set; + +/* + * Stores the old del method. + */ +FileStorage.prototype.__del = NodeCache.prototype.del; + +/* + * Return the class + */ +export default FileStorage; diff --git a/_new/components/no-storage.js b/_new/components/no-storage.js new file mode 100644 index 0000000..903794a --- /dev/null +++ b/_new/components/no-storage.js @@ -0,0 +1,55 @@ +import createDebug from '../lib/debug.js'; +import id2key from '../utils/normalize-id2key.js'; + +/* + * Return the class + */ +export default class NoStorage { + static name = 'no-storage'; + static cspace = 'no-storage'; + static debug = createDebug('@lando/devtool:no-storage'); + static config = { + delimiter: '.', + }; + + // @TBD: helper to get key from an id + static getKey = (id, delimiter = NoStorage.config.delimiter) => id2key(id, delimiter); + + // helper to wipe a storage directory + static flush() {} + + constructor({ debug = NoStorage.debug } = {}) { + this.debug = debug; + } + + /* + * Gets an item in the cache + */ + get(key) { + this.debug('caching disabled and/or using no storage backend so did not get key %o', id2key(key)); + } + + /* + * Manually remove an item from the cache. + */ + remove(key) { + this.debug('caching disabled and/or using no storage backend so did not remove key %o', id2key(key)); + } + + // @TDB + has() { + return false; + } + + /* + * Sets an item in the cache + */ + set(key) { + this.debug('caching disabled and/or using no storage backend so did not set key %o', id2key(key)); + } + + // @TBD + update(key) { + this.debug('caching disabled and/or using no storage backend so did not update key %o', id2key(key)); + } +} diff --git a/_new/config/build-env.js b/_new/config/build-env.js new file mode 100644 index 0000000..a785823 --- /dev/null +++ b/_new/config/build-env.js @@ -0,0 +1,24 @@ +import path from 'node:path'; +import url from 'node:url'; + +import getCommitHash from '../utils/get-commit-hash.js'; +import isDevVersion from '../utils/is-dev-version.js'; + +import { version } from '../../package.json'; + +const __dirname = path.dirname(url.fileURLToPath(import.meta.url)); + +/* eslint-disable no-undef */ +export const BUILD_IS_COMPILED = typeof __BUILD_IS_COMPILED__ !== 'undefined' ? __BUILD_IS_COMPILED__ : false; + +export const BUILD_COMMIT = + typeof __BUILD_COMMIT__ !== 'undefined' ? __BUILD_COMMIT__ : getCommitHash(path.resolve(__dirname, '..', '..'), { short: true }); + +export const BUILD_DEV = typeof __BUILD_DEV__ !== 'undefined' ? __BUILD_DEV__ : isDevVersion(version); + +export const BUILD_TIME = typeof __BUILD_TIME__ !== 'undefined' ? __BUILD_TIME__ : new Date().toISOString(); + +export const BUILD_VERSION = typeof __BUILD_VERSION__ !== 'undefined' ? __BUILD_VERSION__ : version; +/* eslint-enable no-undef */ + +export default { BUILD_IS_COMPILED, BUILD_COMMIT, BUILD_DEV, BUILD_TIME, BUILD_VERSION }; diff --git a/_new/config/managed.js b/_new/config/managed.js new file mode 100644 index 0000000..9bf6e4d --- /dev/null +++ b/_new/config/managed.js @@ -0,0 +1,130 @@ +import fs from 'node:fs'; +import os from 'node:os'; +import path from 'node:path'; + +import isInteractive from 'is-interactive'; +import which from 'which'; + +// import isDevVersion from '../utils/is-dev-version.js'; + +export default function managedConfigTemplate(options) { + // 0 0 0 destruct 0 + const { + bin, + binPath, + cache, + cacheDir, + commit, + configDir, + coreDir, + dataDir, + entrypoint, + env, + errlog, + fromSource, + id, + isCompiled, + isDevVersion, + name, + root, + shell, + time, + version, + } = options; + + // get other stuff + const logsDir = path.join(dataDir, 'logs'); + const syscacheDir = path.resolve(cacheDir, '..', `${id}.system`); + + // create dirs + fs.mkdirSync(path.dirname(logsDir), { recursive: true }); + + // return the CLI system config + return { + cli: { + bin, + binPath, + entrypoint, + isCompiled, + }, + core: { + app: 'lando-app', + appfile: '.lando', + appfiles: ['base', 'dist', 'recipe', 'upstream', '', 'local', 'user'], + caching: cache, + }, + plugin: { + dirs: [ + { + id: 'cli', + dir: path.resolve(__dirname, '..'), + depth: 0, + weight: -100, + }, + ], + }, + system: { + buildCommit: commit, + buildDev: isDevVersion, + buildTime: time, + cacheDir, + configDir, + coreDir, + dataDir, + env, + errlog, + fromSource, + id, + interface: 'cli', + isInteractive: isInteractive(), + leia: Object.hasOwn(process.env, 'LEIA_PARSER_RUNNING'), + logsDir, + mode: 'cli', + name, + packaged: isCompiled, + root, + shell: which.sync(shell, { nothrow: true }), + syscacheDir, + version, + userAgent: `${name}/${version} ${os.platform()}-${os.arch()} bun-${process.versions.bun}`, + }, + updates: { + notify: true, + }, + // dockerDesktop: { + // required: '>=3.6.5 && <=5.0.0', + // scripts: path.resolve(root, 'scripts', 'docker-desktop'), + // server: { + // socketPath: (platform === 'win32') ? '//./pipe/docker_engine' : '/var/run/docker.sock', + // // host: '192.168.1.10', + // // port: process.env.DOCKER_PORT || 2375, + // // ca: fs.readFileSync('ca.pem'), + // // cert: fs.readFileSync('cert.pem'), + // // key: fs.readFileSync('key.pem'), + // // version: 'v1.25', + // }, + // supported: '>=3.6.5 && <=4.10.5', + // // npmrc: '//npm.pkg.github.com/:_authToken=GH_ACCESS_TOKEN\n@namespace:registry=https://npm.pkg.github.com', + // }, + // dockerEngine: { + // required: '>=3.6.5 && <=5.0.0', + // scripts: path.resolve(root, 'scripts', 'docker-desktop'), + // server: { + // socketPath: (platform === 'win32') ? '//./pipe/docker_engine' : '/var/run/docker.sock', + // // host: '192.168.1.10', + // // port: process.env.DOCKER_PORT || 2375, + // // ca: fs.readFileSync('ca.pem'), + // // cert: fs.readFileSync('cert.pem'), + // // key: fs.readFileSync('key.pem'), + // // version: 'v1.25', + // }, + // supported: '>=3.6.5 && <=4.10.5', + // }, + // dockerPluginInstaller: { + // image: 'node:16-alpine', + // }, + // Allows you to pass env value to Docker, Docker Compose, etc. + // @TODO: figure out how to implement this exactly + // env: {}, + }; +} diff --git a/_new/config/test.yaml b/_new/config/test.yaml new file mode 100644 index 0000000..041b520 --- /dev/null +++ b/_new/config/test.yaml @@ -0,0 +1,2 @@ +core: + telemetry: OMG diff --git a/_new/config/user.yaml-bun-asset b/_new/config/user.yaml-bun-asset new file mode 100644 index 0000000..ab5e849 --- /dev/null +++ b/_new/config/user.yaml-bun-asset @@ -0,0 +1,48 @@ +core: + # debug: false + # engine: docker-desktop + # id: hyperdrive + # lando: lando-cli + # product: hyperdrive + # telemetry: true + release-channel: stable +# # this will force hyperdrive to use updated config from lando on every run. normally hyperdrive will use a +# # cached config that is generated on every lando run for version/plugin/config information. +# # you can use the hidden `lando --hyperdrive` command to regenerate this file. +# # +# # GENERALLY THIS IS FINE FOR MOST USE CASES. +# # +# # However, if you are running lando from source and modifying config that +# # hyperdrive uses, core plugin, etc it might make sense to enable this setting. Note that it comes with a ~10-20ms +# # performance hit and will override any app/pluginDir config you've set in hyperdrive +# auto-sync: false + +# registry: +# engine: +# # @TODO: how does this work loading wise? we need a way to translate these to absolute paths? +# docker-colima: hyperdrive://core/docker-colima +# docker-desktop: hyperdrive://core/docker-desktop +# docker-engine: hyperdrive://core/docker-engine +# lando: +# lando-cli: hyperdrive://core/lando-cli + +# docker-desktop: +# required-version: ">=3.6.5 && <=5.0.0" +# supported-version: ">=3.6.5 && <=4.10.5" + +# # @TODO: need to bump these to 3.6.6 once we release a lando with `lando hyperdrive` +# lando-cli: +# bin: lando +# install-default: "3.6.5" # @TODO: need to bump this once we release a lando with `lando hyperdrive` +# # @NOTE: below uses the satisfies syntax from https://www.npmjs.com/package/semver +# required-version: ">=3.6.5" # @TODO: need to bump this once we release a lando with `lando hyperdrive` + +# npm: + +# # @TODO: what goes in here? +# plugins: + +# updates: +# notify: true +# hello: there +# hello: diff --git a/_new/hooks/cache-rebuild.js b/_new/hooks/cache-rebuild.js new file mode 100644 index 0000000..a61ab66 --- /dev/null +++ b/_new/hooks/cache-rebuild.js @@ -0,0 +1,26 @@ +export default async function cacheRebuild({ cli, debug }) { + const { app, context, product } = cli; + + // reinit product syscache if caching is on + if (product.config.get('core.caching')) { + debug('reinitializing %o syscache!', product.id); + product.reinit(); + debug('reinitialized %o syscache!', product.id); + } + + // ditto for app + if (context.app && app.config.get('core.caching')) { + debug('reinitializing %o syscache!', app.name); + app.reinit(); + debug('reinitialized %o syscache!', app.name); + } + + // ditto for CLI + if (cli.cache) { + debug('reinitializing %o syscache!', 'cli'); + cli.reinit(); + cli.getHelp(cli.getTasks(context.app ? app : product), [product, cli]); + cli.getHooks(context.app ? app : product); + debug('reinitialized %o cache!', 'cli'); + } +} diff --git a/_new/hooks/checks.js b/_new/hooks/checks.js new file mode 100644 index 0000000..cd2af8f --- /dev/null +++ b/_new/hooks/checks.js @@ -0,0 +1,78 @@ +import fs from 'node:fs'; +import path from 'node:path'; + +import isDocker from 'is-docker'; +import isRoot from 'is-root'; + +export default async function preFlightChecks({ cli, debug }) { + // get the main things + const { arch, bin, cacheDir, platform } = cli.product.config.get('system'); + const uid = process.getuid ? process.getuid() : '-1'; + const env = process.pkg ? 'prod' : 'dev'; + + // for performance purposes save a hash of arch/platform/user and only reevaluate if the hash does not exist + // if the hash does exist then it means we are good + const compatFile = path.join(cacheDir, 'compat.json'); + const compatKey = Buffer.from(`${arch}:${platform}:${uid}:${env}`, 'utf8').toString('base64'); + + // if we have a compatfile then lets try to load it up so we can skip the checks + if (fs.existsSync(compatFile)) { + try { + const compatMap = require(compatFile); + if (compatMap[compatKey] === true) { + debug('compat hash match. skipping compat checks.'); + return; + } + } catch (error) { + debug('could not load %o with error %o, unlinking...', compatFile, error); + fs.unlinkSync(compatFile); + } + } + + // check arch + const supportedArchs = ['amd64', 'arm64', 'aarch64', 'x64']; + if (!supportedArchs.includes(arch)) { + const error = new Error(`${arch} is not a supported architecture!`); + error.code = 'LUNARCH'; + error.ref = 'https://docs.lando.dev/requirements'; + error.suggestions = [ + `Run ${bin} on one of the following architectures: ${supportedArchs.join('|')}`, + 'Read https://docs.lando.dev/hyperdrive/requirements', + ]; + throw error; + } + + // check platform + const supportedPlatforms = ['darwin', 'linux', 'win32', 'wsl']; + if (!supportedPlatforms.includes(platform)) { + const error = new Error(`${platform} is not a supported platform!`); + error.code = 'LUNPLAT'; + error.ref = 'https://docs.lando.dev/requirements'; + error.suggestions = [ + `Run ${bin} on one of the following platforms: ${supportedPlatforms.join('|')}`, + 'Read https://docs.lando.dev/hyperdrive/requirements', + ]; + throw error; + } + + // check user + if (isRoot() && !isDocker()) { + const error = new Error(`${bin} cannot be run as root!`); + error.code = 'LNOROOT'; + error.ref = 'https://docs.lando.dev/requirements'; + error.suggestions = [`Run ${bin} as a non-root user eg uid != 0`, 'Read https://docs.lando.dev/requirements']; + throw error; + } + + // @TODO: error if running with admin perms on windows? + // not 100% sure if this matters but worth investigating? + + // if we get here we can write the compat hashmap + try { + const data = fs.existsSync(compatFile) ? JSON.parse(fs.existsSync(compatFile)) : {}; + data[compatKey] = true; + fs.writeFileSync(compatFile, JSON.stringify(data)); + } catch (error) { + debug('something went wrong saving the compat hashmap, not critical so just ignoring. error was %o', error); + } +} diff --git a/_new/hooks/init.js b/_new/hooks/init.js new file mode 100644 index 0000000..155310d --- /dev/null +++ b/_new/hooks/init.js @@ -0,0 +1,19 @@ +export default async function init({ id, argv, cli }) { + // hook for preflight checks + await cli.runHook('init-preflight'); + + // hook to mod the product + await cli.runHook('init-product', { product: cli.product, [cli.product.id]: cli.product }); + await cli.runHook(`init-product-${cli.product.id}`, { product: cli.product, [cli.product.id]: cli.product }); + + // hook to mod the app if applicable + if (cli.context.app) await cli.runHook('init-app', { app: cli.app }); + if (cli.context.app) await cli.runHook(`init-app-${cli.app.name}`, { app: cli.app }); + + // hook to modify the config @NOTE: this will be the config for whatever the context is + await cli.runHook('init-config', { config: cli.config }); + // if we do the above then we should have what we need in lando.registry or app.registry + await cli.runHook('init-tasks', { id, argv, tasks: cli.tasks }); + // final hook to do stuff to the init + await cli.runHook('init-final'); +} diff --git a/_new/hooks/postrun.js b/_new/hooks/postrun.js new file mode 100644 index 0000000..2a56b18 --- /dev/null +++ b/_new/hooks/postrun.js @@ -0,0 +1,6 @@ +export default async function postRun({ id, cli, result }) { + await cli.runHook('posttask', { id, cli, result }); + await cli.runHook(`posttask-${id}`, { id, cli, result }); + await cli.runHook('done', { cli }); + await cli.runHook(`done-${id}`, { cli }); +} diff --git a/_new/hooks/prerun.js b/_new/hooks/prerun.js new file mode 100644 index 0000000..a2511fe --- /dev/null +++ b/_new/hooks/prerun.js @@ -0,0 +1,12 @@ +export default async function preRun({ id, data, cli, debug, task }) { + await cli.runHook('pretask', { id, data, cli }); + await cli.runHook(`pretask-${id}`, { data, task, cli }); + + // run the interactive prompts + debug('attempting interactive prompts...'); + // @TODO: i think we mightneed to implement our own thing here? + // @TODO: formatters.handleInteractive is too deeply lando 3 + // @TODO: we need to replace these with stuff from new handle interactive ^? + + await cli.runHook(id, { id, data }); +} diff --git a/_new/hooks/test.cjs b/_new/hooks/test.cjs new file mode 100644 index 0000000..81e030f --- /dev/null +++ b/_new/hooks/test.cjs @@ -0,0 +1,8 @@ +/* eslint-disable import/no-commonjs */ +// const formatters = require('./../lib/formatters'); + +'use strict'; + +module.exports = async function test1(thing) { + thing.debug('test cjs.'); +}; diff --git a/_new/hooks/test.js b/_new/hooks/test.js new file mode 100644 index 0000000..23901f9 --- /dev/null +++ b/_new/hooks/test.js @@ -0,0 +1,3 @@ +export default async function test2({ debug }) { + debug('strig func'); +} diff --git a/_new/hooks/test2.js b/_new/hooks/test2.js new file mode 100644 index 0000000..c6af652 --- /dev/null +++ b/_new/hooks/test2.js @@ -0,0 +1,3 @@ +export default async function test3({ debug }) { + debug('hello there2!'); +} diff --git a/_new/lib/cli.js b/_new/lib/cli.js new file mode 100644 index 0000000..67a181e --- /dev/null +++ b/_new/lib/cli.js @@ -0,0 +1,452 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import url from 'node:url'; + +import Debug from 'debug'; +import isObject from 'lodash-es/isPlainObject.js'; +import get from 'lodash-es/get.js'; + +import Config from '../lib/config.js'; +import Templator from '../lib/templator.js'; +import Product from '../lib/product.js'; + +import createDebug from '../lib/debug.js'; +import getCacheDir from '../utils/get-cache-dir.js'; +import getDefaultConfig from '../utils/get-default-config.js'; +import getObjectSizes from '../utils/get-object-sizes.js'; +import getSize from '../utils/get-size.js'; +import getSystemDataDir from '../utils/get-system-data-dir.js'; +import loadComponent from '../utils/load-component.js'; +import normalizeManifestPaths from '../utils/normalize-manifest-paths.js'; +import runHook from '../utils/run-hook.js'; +import write from '../utils/write-file.js'; + +// oclif +import { CLIError } from '@oclif/core/errors'; +import { Config as OConfig } from '@oclif/core/config'; +import { Flags, flush, handle } from '@oclif/core'; +import { normalizeArgv } from '@oclif/core/help'; +import { parse } from '@oclif/core/parser'; + +// build envs +import { BUILD_IS_COMPILED, BUILD_COMMIT, BUILD_DEV, BUILD_TIME, BUILD_VERSION } from '../config/build-env.js'; + +// pjson +import packageJson from '../../package.json'; + +// get __dirname +const __dirname = path.dirname(url.fileURLToPath(import.meta.url)); + +/* + * swallows stdout epipe errors + * this occurs when stdout closes such as when piping to head + */ +process.stdout.on('error', (err) => { + if (err && err.code === 'EPIPE') return; + throw err; +}); + +/* + * Construct the CLI + */ +export default class Cli { + static id = 'lando:cli'; + + static getRoot() { + return BUILD_IS_COMPILED ? path.resolve(__dirname) : path.resolve(__dirname, '../..'); + } + + #_cache; + #_oclif; + + constructor({ + id = Cli.id, + cache = true, + cacheDir = getCacheDir(Cli.id), + configTemplates = {}, + debug = createDebug(Cli.id), + enableDebugger = false, + hooks = {}, + pjson = packageJson, + plugins = [], + product = Product, + root = Cli.getRoot(), + } = {}) { + // id + this.id = id; + + // other propz + this.cache = cache; + this.cacheDir = cacheDir; + this.configTemplates = configTemplates; + this.debug = debug; + this.hooks = hooks; + this.pjson = pjson; + this.plugins = plugins; + this.root = root; + + this.Product = product; + + // enable debug if needed + if (enableDebugger !== false) this.enableDebugger(enableDebugger); + + // some debugging about what happened + this.debug('instantiated cli %o with %O', this.id, { + cache: this.cache, + cacheDir: this.cacheDir, + configTempltes: this.configTemplates, + hooks: this.hooks, + plugins: this.plugins, + root: this.root, + }); + + // @TODO: other stuff eg version? + } + + async #generateConfigTemplates(templates = [], genOpts = {}) { + // filter out stuff so we only end up with stuff we actually need to template + templates = templates.filter(([source, dest, options = {}]) => { + // if there is no source at all + if (source === undefined || source === null) return false; + // if source is not a file that exists or a function or an object + if (!fs.existsSync(source) && typeof source !== 'function' && typeof source !== 'object') return false; + // if we are not overwriting and the dest already exists + if (options.overwrite !== true && fs.existsSync(dest)) return false; + // templator + return true; + }); + + if (templates.length > 0) { + for (const [source, dest, options] of templates) { + const templator = new Templator(source, dest, { debug: this.debug.contract().extend('templator'), ...options }); + templator.generate(genOpts); + } + } + } + + #getGlobalFlags(id = this.id) { + return { + 'clear': Flags.boolean({ hidden: true }), + 'config-file': Flags.string({ + char: 'c', + description: 'use configuration from specified file', + env: `${id.toUpperCase()}_CONFIG_FILE`, + default: undefined, + hidden: true, + helpGroup: 'GLOBAL', + }), + 'debug': Flags.boolean({ hidden: false }), + 'no-cache': Flags.boolean({ hidden: false }), + }; + } + + async #getStorageBackend(cache = this.cache) { + // @IDEA: get this from core plugin manifest? + const backends = { + 'file-storage': async () => await import('../components/file-storage.js'), + 'no-storage': async () => await import('../components/no-storage.js'), + }; + + const { default: StorageBackend } = await backends[cache === true ? 'file-storage' : 'no-storage'](); + + return StorageBackend; + } + + enableDebugger(namespace) { + // normalize namespace to a string + namespace = typeof namespace === 'string' ? namespace : `${this.id}*`; + // activate + Debug.enable(namespace); + } + + async execute() { + if (!this.root) { + throw new CLIError('root is required.'); + } + + return this.run(this.args ?? process.argv.slice(2)) + .catch(async (error) => handle(error)) + .finally(async () => flush()); + } + + async loadOConfig() { + // we need to dump the package.json to cache and load oclif from there because we cannot embed a + // a virtual fs embedded/loadable package.json in the compiled bun binary + write(path.join(this.cacheDir, 'package.json'), this.pjson); + + // get the oclif config + const oclif = await OConfig.load(this.cacheDir); + + // build envs + oclif.isCompiled = BUILD_IS_COMPILED; + oclif.isDevVersion = BUILD_DEV; + oclif.version = BUILD_VERSION; + oclif.commit = BUILD_COMMIT; + oclif.time = BUILD_TIME; + oclif.fromSource = fs.existsSync(path.resolve(__dirname, '..', '..', '.git', 'HEAD')); + + // augment with additional properties + oclif.binPath = oclif.isCompiled ? process.execPath : process.argv[1]; + oclif.cache = this.cache; + oclif.configCache = path.join(oclif.cacheDir, `${this.id}-config.json`); + oclif.coreDir = this.root; + oclif.debuggerEnabled = this.debug.enabled; + oclif.entrypoint = path.resolve(get(process, 'env._', oclif.binPath)); + oclif.env = this.id.toUpperCase(); + oclif.id = this.id; + oclif.logger = this.debug; + oclif.sysdataDir = getSystemDataDir(this.id); + + // add in some config info + oclif.sysConfigFile = path.join(oclif.sysdataDir, 'config.json'); + oclif.managedConfigFile = path.join(oclif.dataDir, 'config.json'); + oclif.userConfigFile = path.join(oclif.configDir, 'config.yaml'); + + // return + return oclif; + } + + // @TODO: add support for options.args? + async parse(argv = process.argv.slice(2), options = {}) { + // NOTE: we are only interested in parsing and normalizing so its ok for validation to fail + try { + options._parsed = await parse(argv, { strict: false, flags: this.#getGlobalFlags(this.id), ...options }); + } catch (error) { + options._parsed = error.parse.output; + } + + // return the same as oclif for compatibility + return options._parsed; + } + + /* + * Run the CLI + */ + async run(argv = process.argv.slice(2), options = {}) { + this.debug('running cli %o with argv %o and options %o', this.id, argv, options); + + // get oclif config first + this.#_oclif = await this.loadOConfig(); + + // select correct storage backend and setup cache + const StorageBackend = await this.#getStorageBackend(); + this.#_cache = new StorageBackend({ debug: this.debug.extend('#cache'), dir: this.cacheDir }); + this.debug('caching %o with %o %o', this.cache, this.#_cache.constructor.name, this.#_cache.dir); + + // if cache is disabled and cachedir exist then flush it + if (!this.cache && fs.existsSync(this.cacheDir)) StorageBackend.flush(this.cacheDir, this.debug.extend('#flush')); + + // generate config templates as needed + if (isObject(this.configTemplates) && getSize(this.configTemplates) > 0) { + await this.#generateConfigTemplates( + [ + [this.configTemplates.system, this.#_oclif.sysConfigFile], + [this.configTemplates.managed, this.#_oclif.managedConfigFile, { overwrite: true }], + [this.configTemplates.user, this.#_oclif.userConfigFile], + ], + { funcOpts: this.#_oclif, readOpts: { fullYamlDoc: true } }, + ); + } + + // start our config collection and load config sources in decreasing priority + const config = new Config({ + cached: this.#_oclif.configCache, + debug: this.debug.contract().extend('config'), + id: this.id, + managed: 'global', + }); + + // get early oclif hooks, these are special hooks you can use to mutate the cli config before we start + // to look for an app + this.hooks = normalizeManifestPaths({ hooks: this.hooks }, this.root).hooks; + this.debug('found early run oclif hooks %o', getObjectSizes(this.hooks)); + + // pre-config hook + // + // because this event runs BEFORE lando is ready you cannot access it through a lando plugin. instead you need to use + // an OCLIF hook. + // See: https://oclif.io/docs/hooks. + // + // FWIW if you are interested in modifying things at this level you should probably just get in touch with us + // see: https://lando.dev/support + await this.runHook('pre-config', { config }); + + // normalize our argv + const [id, ...argvSlice] = normalizeArgv(this.#_oclif, argv); + // get flags @TODO: and other things TBD? + const { flags } = await this.parse(argv, options); + this.debug('about to run command id %o with argv %o and parsed flags %o', id, argvSlice, flags); + + // normalize and process passed in config file + // @TODO: put this in parse? + if (flags['config-file']) { + if (fs.existsSync(path.resolve(flags['config-file']))) { + this.#_oclif.cliConfigFile = path.resolve(flags['config-file']); + } else { + this.debug('tried to load %o into config but it doesnt exist', flags['config-file']); + } + + // remove from env so it doesnt end up in config below + const { 'config-file': cfMeta } = this.#getGlobalFlags(this.id); + // remove envvar so it doesnt muck with downstream Config() stuff + delete process.env[cfMeta.env]; + } + + // if we have a CLI provided config source then thats first + if (this.#_oclif.cliConfigFile) config.overrides('userfile', Config.read(this.#_oclif.cliConfigFile), { encode: false }); + // then load in product envvars + config.env(this.id); + // then the user config + config.file('user', this.#_oclif.userConfigFile); + // then the global/managed config + config.file('global', this.#_oclif.managedConfigFile); + // then system configuration if it exits + if (fs.existsSync(this.#_oclif.sysConfigFile)) config.file('system', this.#_oclif.sysConfigFile); + // then defaults + config.defaults('defaults', getDefaultConfig(this.id)); + // dump cache + config.dump(); + + // any post config changes + await this.runHook('post-config', { config }); + + // run product through loadComponent to handle different input types + this.Product = await loadComponent(this.Product); + // and instantiate + const product = new this.Product(config, { debug: this.debug.contract().extend(this.id) }); + + // @TODO: + // 1. get product with load-component? + console.log(product); + + process.exit(1); + + // this.debug('going to use %o as product', minstrapper.product); + + // // use the minstrapper 2 get da product/lando + // // we call it "Product" here instead of "Lando" because at this point we want to keep it generic + // // once we are "downstream" we use Lando/lando as a convention even if the product id is not lando + // const Product = require(minstrapper.product); + // // renamespace some debuggerrs + // Product.debug = this.debug.contract(-1).extend(this.id); + // minstrapper.config.debug = Product.debug.extend('config'); + + // // instantiate + // // @NOTE: we pass in Config, Backend etc because its saves us a good .3s which is a lot in a CLI boot + // this.product = new Product(minstrapper.config, { StorageBackend: this.StorageBackend }); + // this[this.id] = this.product; + + // // Run the product bootstrap + // try { + // await this.product.bootstrap(this); + // this.debug('product %o bootstrap completed successfully', this.product.id); + // } catch (error) { + // console.error('Bootstrap failed!'); // eslint-disable-line no-console + // this.exitError(error); + // } + + // // determine if we have an app or not + // // @TODO: findApp is pretty CLI specific? shoudl we have getUtil for this? + // const appfile = this.product.config.get('core.appfile'); + // const appfiles = [`${appfile}.yaml`, `${appfile}.yml`]; + // const appfilePath = this.product.findApp(appfiles, process.cwd()); + + // // if we have an file then lets set some things in the config for downstream purposes + // if (fs.existsSync(appfilePath)) { + // // Also get our app object + // const App = this.product.getComponent('core.app'); + // this.debug('discovered a %o app at %o', App.name, path.dirname(appfilePath)); + + // // override some default static properties + // App.debug = this.debug.contract(-1); + // this.app = new App({ + // appfile: appfilePath, + // config: this.product.config, + // plugins: this.product.plugins, + // StorageBackend: this.StorageBackend, + // }); + // } + + // // determine some context stuff + // this.context = { app: this.app !== undefined, global: this.app === undefined }; + // this.ctx = this.context.app ? this.app : this.product; + // this.cid = this.context.app ? this.app.id : this.product.id; + // this.debug('command is running with context %o and cid %o', this.context, this.cid); + + // // merge in additinal hooks from the context + // config.merge(this.hooks, [this.getHooks(this.ctx)], ['concat']); + // this.debug('found %o hooks %o', 'cli', require('../utils/get-object-sizes')(this.hooks)); + // // get tasks + // this.tasks = this.getTasks(this.ctx); + // // get help https://www.youtube.com/watch?v=CpZakOJlRoY&t=30s + // this.help = this.getHelp(this.tasks, [this]); + + // // init hook + // await this.runHook('init', { id, argv: argvSlice }); + + // // Initialize + // const suffix = this.app ? `(${this.app.name}, v4)` : '(v4)'; + // const cmd = !this.product.config.get('system.packaged') ? '$0' : path.basename(process.execPath) || 'lando'; + // const usage = [`Usage: ${cmd} [args] [options] | ${chalk.magenta(suffix)}`]; + + // // Yargs! + // yargs + // .usage(usage.join(' ')) + // .example(`${this.id} start`, 'starts up the app in cwd') + // .example(`${this.id} rebuild --help`, 'displays help about the rebuild command') + // .example(`${this.id} destroy -y --debug`, 'runs destroy non-interactively and with debug output') + // .example(`${this.id} --no-cache`, 'disables and wipes cache') + // .recommendCommands() + // .showHelpOnFail(false) + // .wrap(yargs.terminalWidth() * 0.7) + // .option('channel', globalOptions.channel) + // .option('clear', globalOptions.clear) + // .option('debug', globalOptions.debug) + // .option('experimental', globalOptions.experimental) + // .option('no-cache', globalOptions['no-cache']) + // .help(false) + // .option('lando', globalOptions.lando) + // .option('help', globalOptions.help) + // .option('verbose', globalOptions.verbose) + // .group('clear', chalk.green('Global Options:')) + // .group('debug', chalk.green('Global Options:')) + // .group('help', chalk.green('Global Options:')) + // .group('no-cache', chalk.green('Global Options:')) + // .version(false); + + // // loop through the tasks and add them to the CLI + // for (const task of this.help) { + // if (task.handler) yargs.command(task); + // else yargs.command(await this.parseToYargs(task)); + // } + + // // try to get the current tasks + // const current = this.help.find((task) => task.command === id); + + // // if we cannot get teh current tasks then show help + // if (!current) { + // yargs.showHelp(); + // this.log(); + // } + + // // Show help unless this is a delegation command + // if ((yargs.argv.help || yargs.argv.lando) && current.delegate !== true) { + // yargs.showHelp('log'); + // this.log(); + // process.exit(0); + // } + + // // YARGZ MATEY + // yargs.argv; + } + + reinit(cid = this.cid) { + this.#_cache.remove([cid, 'tasks']); + this.#_cache.remove([cid, 'help']); + } + + // @TODO: need error handler? + async runHook(event, data) { + return runHook(event, data, this.hooks, { cli: this }, this.debug); + } +} diff --git a/_new/lib/config.js b/_new/lib/config.js new file mode 100644 index 0000000..c3292cf --- /dev/null +++ b/_new/lib/config.js @@ -0,0 +1,319 @@ +import fs from 'node:fs'; +import path from 'node:path'; + +import get from 'lodash-es/get.js'; +import has from 'lodash-es/has.js'; +import nconf from 'nconf'; +import set from 'lodash-es/set.js'; +import unset from 'lodash-es/unset.js'; + +import { parse as parseYAML, stringify as stringifyYAML } from 'yaml'; + +import createDebug from '../lib/debug.js'; +import encode from '../utils/encode.js'; +import encodeKeys from '../utils/encode-keys.js'; +import decodeKeys from '../utils/decode-keys.js'; +import getObjectKeys from '../utils/get-object-keys.js'; +import merge from '../utils/merge.js'; +import read from '../utils/read-file.js'; +import write from '../utils/write-file.js'; + +// custom yml/yaml formatter +['yaml', 'yml'].forEach((format) => { + nconf.formats[format] = { + parse: (data, options) => parseYAML(data, options), + stringify: (obj, options) => stringifyYAML(obj, options), + }; +}); + +/* + * Creates a new Config instance. + */ +class Config extends nconf.Provider { + static id = 'config'; + static debug = createDebug('lando:config'); + + static keys(data, { prefix = '', expandArrays = true } = {}) { + return getObjectKeys(data, { prefix, expandArrays }); + } + + // @TODO: error handling? + static merge(object, sources, ams = ['merge:id', 'replace']) { + return merge(object, sources, ams); + } + + static read(file, options) { + return read(file, options); + } + + static write(file, data, options) { + return write(file, data, options); + } + + constructor({ + ams = 'auto', + data = {}, + debug = Config.debug, + decode = true, + encode = true, + id = Config.id ?? path.basename(process.argv[1]), + managed = 'managed', + stores = {}, + cached, + } = {}) { + // super right away with no options + super(); + + // get options settled + this.ams = ams === 'auto' ? ['merge:id', 'replace'] : ams; + this.cached = cached; + this.debug = debug; + this.decode = decode; + this.encode = encode; + this.id = id; + this.managed = managed; + + // start with a memcache + this.add('#mem', { type: 'memory', readOnly: false }); + // populated with data if applicable + if (data && data !== null && typeof data === 'object') this.stores['#mem'].store = data; + + // mix in all passed in stores except #mem which is a special thing + for (const [name, store] of Object.entries(stores)) { + if (name !== '#mem') this.stores[name] = store; + } + + // log + this.debug('initialized config %o with options %o', this.id, { cached, decode, encode, managed }); + } + + add(name, options) { + // log + const dopts = { encode: get(options, 'encode', this.encode), source: options.file ?? name }; + this.debug('adding %o store %o to %o config %o', options.type, name, this.id, dopts); + // kick upstream + super.add(name, { logicalSeparator: '.', parseValues: true, ...options }); + + // encode the new store if applicable + if (get(options, 'encode', this.encode) && get(this, `stores.${name}.store`)) { + this.stores[name].store = encodeKeys(this.stores[name].store); + } + + // ensure store as at least an empty object + if (this.stores[name].store === null || this.stores[name].store === undefined) this.stores[name].store = {}; + + return this; + } + + defaults(name, data, options) { + return this.add(name, { ...options, type: 'literal', store: data }); + } + + dump() { + fs.mkdirSync(path.dirname(this.cached), { recursive: true }); + Config.write(this.cached, this); + this.debug('dumped compiled and cached config file to %o', this.cached); + } + + env(name = this.id) { + const separator = '_'; + const rootKey = `${name.toUpperCase()}${separator}`; + return this.add(name, { + logicalSeparator: '.', + lowerCase: true, + parseValues: true, + transform: (obj) => { + if (obj.key.startsWith(rootKey.toLowerCase())) { + obj.key = obj.key.replace(rootKey.toLowerCase(), ''); + obj.key = obj.key.replace(new RegExp(`${separator}${separator}`, 'g'), '-'); + obj.key = obj.key.replace(new RegExp(separator, 'g'), '.'); + return obj; + } + }, + type: 'env', + separator, + }); + } + + file(name, options) { + // if options is a string and path that exists then reset it as file + if (typeof options === 'string' && fs.existsSync(options)) options = { file: options }; + + // try to get the format + // @TODO: throw error if format is undefined? + const extension = path.extname(options.file).substring(1); + const format = nconf.formats[extension]; + + // if a js file then we can only load as a literal, + // this is a special case because nconf.formatters really doesnt work for js file + // @NOTE: this can also load JS functions and it injects THIS into them + // @NOTE: we also do this instead of a formatter because that would require use of eval + if (extension === 'js') { + const store = typeof Config.read(options.file) === 'function' ? Config.read(options.file)(this) : Config.read(options.file); + return this.add(name, { ...options, type: 'literal', store }); + } + + // otherwise just pass through + return this.add(name, { ...options, format, type: 'file' }); + } + + // replace nconf get wrapper with this one + // @TODO: options: arraystrat? + // @NOTE: we override super.get because it doesnt handle nilly-nully stores well and it doesnt merge deeply + get(path, options, data, store) { + // if we are targetting a specific store then just do that + if (path && typeof path === 'string' && path.split(':').length >= 2) { + const parts = path.split(':'); + store = parts.shift(); + path = parts.join('.'); + data = this.stores[store].store; + + // otherwise get the merged data, this is where the magix happens + } else { + data = Config.merge( + {}, + Object.keys(this.stores) + .reverse() + .map((store) => this.stores[store].store), + get(options, 'ams', this.ams), + ); + } + + // if we are encoded then make sure the path is encoded + if (get(options, 'encode', this.encode)) path = encode(path); + + // if we have a path then select from data + if (path) data = get(data, path); + + // return decoded or not + this.debug('getting %o from %o config', path || 'everything', store ? `${this.id}:${store}` : this.id); + return get(options, 'decode', this.decode) ? decodeKeys(data) : data; + } + + // like get but with no decoding/encoding + getRaw(path, options) { + return this.get(path, { ...options, encode: false, decode: false }); + } + + // return uncoded + getUncoded(path, options) { + return this.get(path, { ...options, encode: true, decode: false }); + } + + keys(data = this.getUncoded(), { prefix = '', expandArrays = true } = {}) { + return getObjectKeys(data, { prefix, expandArrays }); + } + + merge(object, sources, ams = this.ams) { + return merge(object, sources, ams); + } + + newConfig(options) { + return new Config({ debug: this.debug, ...options }); + } + + overrides(name, data, options) { + return this.add(name, { ...options, type: 'literal', store: data }); + } + + // removes a property and saves the store if applicable + remove(path, store = this.managed) { + // if this is not a file store then just unset and move on + if (!has(this.stores, `${store}.file`)) { + unset(this.stores[store].store, path); + + // otherwise we are talking about files + } else { + // get the store destination + const dest = get(this.stores, `${store}.file`); + + // if this is a yaml file then lets try to reconcile comments and data + if (['.yaml', '.yml'].includes(path.extname(dest))) { + // load the yaml doc + const yamlDoc = Config.read(dest, { fullYamlDoc: true }); + + // remove the prop + yamlDoc.deleteIn(path.split('.')); + + // write the result + Config.write(dest, yamlDoc); + + // otherwise to the usual removal + } else { + unset(this.stores[store].store, path); + Config.write(dest, this.stores[store].store); + } + } + + // finally debug and reset + this.debug('removed %o from %o', path, `${this.id}:${store}`); + this.reset(); + + // dump cache if that makes sense + if (this.cached) this.dump(); + } + + // overriden save method + save(data, store = this.managed, options) { + // purposefully try to type parse things + // NOTE: is this a good idea? + for (const key of Config.keys(data)) { + if (get(data, key)) { + // booleans + if (get(data, key) === 'true' || get(data, key) === '1') set(data, key, true); + if (get(data, key) === 'false' || get(data, key) === '0') set(data, key, false); + // arrays of strings + if (Array.isArray(this.get(key)) && typeof get(data, key) === 'string') { + set(data, key, get(data, key).split(/, |[ ,|]/)); + } + } + } + + // get the store destination + const dest = get(this.stores, `${store}.file`); + // throw error if no destination + if (!dest) throw new Error('something'); + + // figure out the encoding + if (get(options, 'encode', this.encode)) encodeKeys(data); + + // if this is a yaml file then lets try to reconcile comments and data + if (['.yaml', '.yml'].includes(path.extname(dest))) { + // load the yaml doc + const yamlDoc = Config.read(dest, { fullYamlDoc: true }); + // go through the data and set it into the doc + for (const path of Config.keys(data)) { + yamlDoc.setIn(path.split('.'), get(data, path)); + } + + // write the result + Config.write(dest, yamlDoc); + + // otherwise to the usual saving + } else { + this.stores[store].store = Config.merge({}, [this.stores[store].store, data], get(options, 'ams', this.ams)); + Config.write(dest, this.stores[store].store); + } + + // finally debug and reset + this.debug('saved %o to %o', data, dest); + this.reset(); + + // dump cache if that makes sense + if (this.cached) this.dump(); + } + + set(path, data, options) { + // encode the path if needed + if (get(options, 'encode', this.encode)) path = encode(path); + // then just bounce upstream + super.set(path, data); + } + + // this reverses the above + unset(path) { + this.remove(path, '#mem'); + } +} + +export default Config; diff --git a/_new/lib/debug.js b/_new/lib/debug.js new file mode 100644 index 0000000..4f63548 --- /dev/null +++ b/_new/lib/debug.js @@ -0,0 +1,48 @@ +import Debug from 'debug'; + +// normal debug module with some extra helper funcs +function createDebug(namespace) { + // get the normal debugger + const debug = Debug(namespace); + + // this does the opposite of extend, moves the namespace back by size delimiter + debug.contract = (size = 1) => + createDebug( + debug.namespace + .split(':') + .slice(0, Math.abs(size) * -1) + .join(':'), + ); + + // keep the old extend + debug._extend = debug.extend; + // shallow wrapper just so debug.extend gives us contract and replace as well + debug.extend = (more) => createDebug([debug.namespace, more].join(':')); + + // replaces the string or component piece + // @NOTE: this assumes a first value of 1 and not 0 + // @NOTE: but should we assume that? + // @TODO: error handling? + debug.replace = (replacee, replacer) => { + // if either replacee or replacer are undefrined then return the same + if (!replacee || !replacer) return debug; + + // if replacee is an integer then replace but assume we start at 1 + if (Number.isInteger(replacee)) { + const parts = debug.namespace.split(':'); + parts[replacee - 1] = replacer; + return createDebug(parts.join(':')); + + // just do a simple string replacement + } else if (typeof replacee === 'string') { + return createDebug('debug')(debug.namespace.replace(replacee, replacer)); + } + + // return + return debug; + }; + + return debug; +} + +export default createDebug; diff --git a/_new/lib/product.js b/_new/lib/product.js new file mode 100644 index 0000000..efbb892 --- /dev/null +++ b/_new/lib/product.js @@ -0,0 +1,266 @@ +import fs from 'node:fs'; + +import Config from '../lib/config.js'; +import FileStorage from '../components/file-storage.js'; + +import createDebug from '../lib/debug.js'; +import generateId from '../utils/generate-id.js'; + +class Product { + static debug = createDebug('lando:product'); + static id = 'product'; + + static findApp(files, startFrom) { + return require('../utils/find-app')(files, startFrom); + } + + // an internal and protected caching mechanism + #_cache; + + #_init() { + this.plugins = this.getPlugins(); + this.manifest = this.getManifest(); + this.hooks = this.getHooks(); + } + + // an internal way to "reinit" the bootstrap eg remove caches and repopulate thema + // @NOTE: should this be internal? + #_reint() { + this.#_cache.flush(); + this.#_init(); + } + + constructor(config, { debug = Product.debug, StorageBackend = FileStorage } = {}) { + // @TODO: throw error if not a config class? + // @TODO: options for config? + this.config = config || new Config(); + // reset the config debugger + this.config.constructor.debug = this.config.debug; + + // @TODO: should we allow defaults to be set for the below somehow? are they passed in? are they in config + // somewhere? both? + this.hooks = {}; + this.manifest = {}; + this.plugins = {}; + + // core stuff + this.id = config.id ?? Product.id; + this.debug = debug; + + // add our defaults as a source + // @TODO: WTF IS THIS? + // this.config.defaults('product-defaults', require('../workspace/product-defaults')({ id: this.id, env: this.id })); + + this.debug('am i here?'); + console.log(this.config.get('system')); + + // get the id + if (!this.config.get(`${this.config.managed}:system.instance`)) { + const data = { system: { instance: generateId() } }; + this.config.save(data); + this.config.set('system.instance', data.system.instance); + this.debug('could not locate instance id, setting to %o', this.config.get('system.instance')); + } + + // #_cache is an internal and protected property that hardcodes use of the core file-storage component + // we do this because we need a way a to cache things before plugins/the registry are compiled, + // because we cannot use something like async getComponent inside the constructor and because we do not + // want a full-blow async init() method we need to call EVERY time we new Bootstrap() + this.#_cache = new StorageBackend({ + debug: this.debug.extend('#cache'), + dir: this.config.get('system.syscache-dir'), + }); + + // if caching is disable and cache dir exists then flush + if (!this.config.get('core.caching') && fs.existsSync(this.config.get('system.syscache-dir'))) { + StorageBackend.flush(this.config.get('system.syscache-dir'), this.debug.extend('#flush')); + } + + // initialize + this.#_init(); + + // "private" but still "by convention" protected properties + this._componentsCache = {}; + this._componentAlises = Object.fromEntries( + Object.entries(this.config.getUncoded('core')) + .filter(([, component]) => typeof component === 'string') + .map(([type, component]) => [`core.${type}`, `${type}.${component}`]), + ); + } + + // @TODO: the point of this is to have a high level way to "fetch" a certain kind of plugin eg global and + // have it return a fully armed and operational instantiated plugin eg has the installer + // @TODO: plugin.global-install-dir is not a thing anymore? + // @TODO: would be cool for different "types" + async addPlugin(name, dest = this.config.get('plugin.global-install-dir')) { + // attempt to add the plugin + const plugin = await this.Plugin.fetch(name, dest, { + installer: await this.getComponentInstance('core.plugin-installer'), + type: 'global', + }); + + // reinit + this.#_reint(); + + // return the plugin + return plugin; + } + + // what does this do? maybe just a hook? + async bootstrap(data) { + this.runHook('bootstrap', data); + } + + findApp(files, startFrom) { + return require('../utils/find-app')(files, startFrom); + } + + // @TODO: does it make sense to also make this an instance method? + findPlugins(dir, depth = 1) { + return require('../utils/find-plugins')(dir, depth); + } + + normalizePlugins(plugins, by = 'name') { + return require('../utils/normalize-plugins')(plugins, by); + } + + // helper to get a class + getComponent(component) { + // @TODO: should we allow for a separate aliases section in the config? + return require('../utils/get-component')( + component, + this.config.newConfig({ data: this.getRegistry(), id: `${this.id}-component-registry` }), + { + aliases: this._componentAlises, + cache: this._componentsCache, + config: this.config.get(), + debug: this.debug.extend('get-component'), + }, + ); + } + + // helper to get a component (and config?) from the registry + async getComponentInstance(component, constructor = {}) { + return require('../utils/get-component-instance')(component, constructor, { + aliases: this._componentAlises, + cache: this._componentsCache, + config: this.config.get(), + debug: this.debug.extend('get-component-instance'), + registry: this.config.newConfig({ data: this.getRegistry(), id: `${this.id}-component-registry` }), + }); + } + + getHooks() { + const hooks = this.config.merge( + this.hooks, + [this.manifest.getUncoded('hooks.product', { ams: 'aoa' }), this.manifest.getUncoded(`hooks.${this.id}`, { ams: 'aoa' })], + ['aoa'], + ); + + // debug + this.debug('found %o and %o hooks %o', this.id, 'product', require('../utils/get-object-sizes')(this.hooks)); + // return + return hooks; + } + + getManifest() { + // if we have something cached then revive the manifest config + if (this.#_cache.has('manifest')) return this.config.newConfig(this.#_cache.get('manifest')); + // if we get here then we need to build the manifest + this.debug('building %o manifest...', this.id); + + // build the manifest from our plugins + const manifest = this.config.newConfig({ id: 'manifest' }); + // loop through plugins in reverse order and add them to the manifest config + for (const [name, plugin] of Object.entries(this.plugins).reverse()) { + // clone the manifest + // @TODO: something better here? + const store = JSON.parse(JSON.stringify(plugin.manifest)); + // remove plugin specific things + delete store.name; + delete store.description; + delete store.enabled; + delete store.hidden; + manifest.add(name, { type: 'literal', store }); + } + + // set + this.#_cache.set('manifest', manifest); + // return + return manifest; + } + + getPlugin(name) { + // strip any additional metadata and return just the plugin name + const data = require('../utils/parse-package-name')(name); + // @TODO: do we want to throw an error if not found? + return this.plugins[data.name]; + } + + // helper to return resolved and instantiated plugins eg this should be the list a given context needs + // @TODO: we probably will also need a section for "team" plugins + getPlugins(options = {}) { + // if we have something cached then just return that + if (this.#_cache.has('plugins.enabled')) return this.#_cache.get('plugins.enabled'); + + // if we get here then we need to do plugin discovery + this.debug('running %o plugin discovery...', this.id); + + // do the discovery + const { disabled, enabled, invalids } = require('../utils/get-plugins')( + this.config.get('plugin.dirs'), + { + config: this.config.get(), + loadOpts: [this], + type: 'global', + ...options, + }, + { + Config: this.config.constructor, + Plugin: require('../lib/plugin'), + debug: this.debug.extend('get-plugins'), + }, + ); + + // set things + this.#_cache.set('plugins.disabled', disabled); + this.#_cache.set('plugins.enabled', enabled); + this.#_cache.set('plugins.invalid', invalids); + // return + return enabled; + } + + getRegistry() { + return this.manifest.get('registry', { decode: false, encode: false }); + } + + reinit() { + this.#_reint(); + } + + // helper to remove a plugin + removePlugin(name) { + // map plugin name to object + const plugin = this.getPlugin(name); + + // throw error if there is no plugin to remove + if (!plugin) throw new Error(`could not find a plugin called ${name}`); + // throw error if plugin is a core plugin + if (plugin.type === 'core') throw new Error(`${plugin.name} is a core plugin and cannot be removed`); + + // if we get here then remove the plugin + plugin.remove(); + + // reinit + this.#_reint(); + + // return the plugin + return plugin; + } + + async runHook(event, data) { + return require('../utils/run-hook')(event, data, this.hooks, { [this.id]: this, product: this }, this.debug); + } +} + +export default Product; diff --git a/_new/lib/templator.js b/_new/lib/templator.js new file mode 100644 index 0000000..796ed0e --- /dev/null +++ b/_new/lib/templator.js @@ -0,0 +1,79 @@ +import fs from 'node:fs'; +import path from 'node:path'; + +import createDebug from '../lib/debug.js'; +import encodeKeys from '../utils/encode-keys.js'; +import read from '../utils/read-file.js'; +import write from '../utils/write-file.js'; + +/* + * @TODO + */ +class Templator { + static id = 'templator'; + static debug = createDebug('lando:templator'); + + static getType(source) { + // is a file + if (typeof source === 'string' && fs.existsSync(source)) return 'file'; + // is a function or object + if (typeof source === 'function' || typeof source === 'object') return typeof source; + + return undefined; + } + + /* + * source can be path or object? + */ + constructor(source, dest, { debug = Templator.debug, encode = true, overwrite = false } = {}) { + // @TODO: error handling eg no source/dest? + + // required props + this.source = source; + this.dest = dest; + this.name = this.source?.name ?? this.source; + + // handle objects with bad names + if (typeof this.name === 'object') this.name = 'object'; + + // options + this.debug = debug; + this.encode = encode; + this.overwrite = overwrite; + + // ensure dest dir exists + if (dest && !fs.existsSync(path.dirname(dest))) { + fs.mkdirSync(path.dirname(dest), { recursive: true }); + this.debug('ensured %o directory %o exists', source, path.dirname(dest)); + } + } + + // @TODO: include data here at some point? + // @TODO: readargs/writeargs? + // @TODO: how best to split options up? + // @TODO: actually handle template vars here at some point? + generate({ readOpts = {}, funcOpts = {} } = {}) { + // if destination already exists and we arent replacing then bail + if (fs.existsSync(this.dest) && !this.overwrite) { + this.debug('%o already exists and overwrite %o so not generating', this.dest, this.overwrite); + return; + } + + // get original type + const type = Templator.getType(this.source); + + // if source is a file then lets read it in + if (Templator.getType(this.source) === 'file') this.source = read(this.source, { extension: undefined, ...readOpts }); + + // if source is a function then lets invoke it + if (Templator.getType(this.source) === 'function') this.source = this.source(funcOpts); + + // if source is an objec then we are done? + if (Templator.getType(this.source) === 'object') { + this.encode ? write(this.dest, encodeKeys(this.source)) : write(this.dest, this.source); + this.debug('generated %o file %o from %o template %o', this.encode ? 'encoded' : 'as is', this.dest, type, this.name); + } + } +} + +export default Templator; diff --git a/_new/utils/decode-keys.js b/_new/utils/decode-keys.js new file mode 100644 index 0000000..b0860d8 --- /dev/null +++ b/_new/utils/decode-keys.js @@ -0,0 +1,15 @@ +import camelcaseKeys from 'camelcase-keys'; +import isObject from 'lodash-es/isPlainObject.js'; + +/** + * Convert the keys of an object to camelCase. + * + * @param {any} data - Value to decode. + * @returns {any} Decoded object or original value if not an object. + */ +export default function decode(data) { + // return non objects with no mutation + if (!isObject(data)) return data; + // mutate keys and return + return camelcaseKeys(data, { deep: true }); +} diff --git a/_new/utils/decode.js b/_new/utils/decode.js new file mode 100644 index 0000000..e3b869f --- /dev/null +++ b/_new/utils/decode.js @@ -0,0 +1,30 @@ +import camelCase from 'lodash-es/camelCase.js'; +import camelcaseKeys from 'camelcase-keys'; + +// @TODO: throw error for nully values? +/** + * Decode dotted or object keys to camelCase. + * + * @param {any} data - Data to decode. + * @returns {any} Decoded value. + */ +export default function decode(data) { + // if we have a nully value then just return + if (data === null || data === undefined) return data; + // if string then return + if (typeof data === 'string') + return data + .split('.') + .map((part) => camelCase(part)) + .join('.'); + // if array then map and return + if (Array.isArray(data)) + return data.map((prop) => + prop + .split('.') + .map((part) => camelCase(part)) + .join('.'), + ); + // else assume object and return + return camelcaseKeys(data, { deep: true }); +} diff --git a/_new/utils/encode-keys.js b/_new/utils/encode-keys.js new file mode 100644 index 0000000..9c7a4be --- /dev/null +++ b/_new/utils/encode-keys.js @@ -0,0 +1,15 @@ +import isObject from 'lodash-es/isPlainObject.js'; +import kebabcaseKeys from 'kebabcase-keys'; + +/** + * Convert object keys to kebab-case. + * + * @param {any} data - Data to encode. + * @returns {any} Encoded value. + */ +export default function encodeKeys(data) { + // return non objects with no mutation + if (!isObject(data)) return data; + // mutate keys and return unless the key is in plugin format + return kebabcaseKeys(data, { deep: true, exclude: [new RegExp('(^@).*/')] }); +} diff --git a/_new/utils/encode.js b/_new/utils/encode.js new file mode 100644 index 0000000..2ccf45b --- /dev/null +++ b/_new/utils/encode.js @@ -0,0 +1,31 @@ +import kebabCase from 'lodash-es/kebabCase.js'; + +import encodeKeys from './encode-keys.js'; + +// @TODO: throw error for nully values? +/** + * Encode a value by converting camelCase keys to kebab-case. + * + * @param {any} data - Data to encode. + * @returns {any} Encoded value. + */ +export default function encode(data) { + // if we have a nully value then just return + if (data === null || data === undefined) return data; + // if string then return + if (typeof data === 'string') + return data + .split('.') + .map((part) => kebabCase(part)) + .join('.'); + // if array then map and return + if (Array.isArray(data)) + return data.map((prop) => + prop + .split('.') + .map((part) => kebabCase(part)) + .join('.'), + ); + // else assume object and return, ignore keys in plugin format + return encodeKeys(data); +} diff --git a/_new/utils/find-app.js b/_new/utils/find-app.js new file mode 100644 index 0000000..5daadee --- /dev/null +++ b/_new/utils/find-app.js @@ -0,0 +1,14 @@ +import fs from 'node:fs'; + +import traverseUp from './traverse-up.js'; + +/** + * Search upwards from a starting directory for the first existing file. + * + * @param {string[]} files - List of file names to look for. + * @param {string} startFrom - Directory to begin searching in. + * @returns {string|undefined} Path to the first file found or `undefined`. + */ +export default function findApp(files, startFrom) { + return traverseUp(files, startFrom).find((file) => fs.existsSync(file)); +} diff --git a/_new/utils/find-plugins.js b/_new/utils/find-plugins.js new file mode 100644 index 0000000..102b683 --- /dev/null +++ b/_new/utils/find-plugins.js @@ -0,0 +1,40 @@ +import fs from 'node:fs'; +import path from 'node:path'; + +import readdirSyncAbsDir from './readdir-absolute.js'; + +/** + * Recursively search for plugin directories. + * + * NOTE: This is intentionally lightweight and avoids heavy dependencies. + * + * @param {string} dir - Directory to start searching in. + * @param {number} [depth=1] - How deep to recurse into child directories. + * @returns {string[]} Array of plugin directories found. + */ +// @TODO: make pConfigFiles configurable? +export default function findPlugins(dir, depth = 1) { + // if dir doesnt exist then return [] + if (!fs.existsSync(dir)) return []; + + // if depth 0 then only look in teh dir passed in + const dirs = depth === 0 ? [dir] : readdirSyncAbsDir(dir); + // list of files that indicate we have a plugin + const pConfigFiles = ['plugin.js', 'plugin.yaml', 'plugin.yml', 'package.json']; + // rescurse through dirs until we are good + return ( + dirs + .map((dir) => { + // return if path contains a plugin + if (pConfigFiles.some((file) => fs.existsSync(path.join(dir, file)))) return dir; + // otherwise recurse if depth allows + if (depth > 1) return findPlugins(dir, depth - 1); + // otherwise null + return null; + }) + // flatten + .flat(Number.POSITIVE_INFINITY) + // remove nully + .filter((dir) => dir) + ); +} diff --git a/_new/utils/generate-id.js b/_new/utils/generate-id.js new file mode 100644 index 0000000..0500a79 --- /dev/null +++ b/_new/utils/generate-id.js @@ -0,0 +1,12 @@ +import { customAlphabet } from 'nanoid'; + +const nanoid = customAlphabet('1234567890abcdefl', 17); + +/** + * Generate a unique short identifier. + * + * @returns {string} A 17 character hexadecimal id. + */ +export default function generateId() { + return nanoid(); +} diff --git a/_new/utils/get-cache-dir.js b/_new/utils/get-cache-dir.js new file mode 100644 index 0000000..bbc8361 --- /dev/null +++ b/_new/utils/get-cache-dir.js @@ -0,0 +1,47 @@ +import os from 'node:os'; +import path from 'node:path'; + +import getEnvironment from './get-environment.js'; +import getPlatform from './get-platform.js'; + +const env = getEnvironment(); +const platform = getPlatform(); + +const getOClifHome = () => { + switch (platform) { + case 'darwin': + case 'linux': + case 'wsl': + return env.HOME ?? os.homedir() ?? os.tmpdir(); + case 'win32': + return ( + env.HOME || + (env.HOMEDRIVE && env.HOMEPATH && path.join(env.HOMEDRIVE, env.HOMEPATH)) || + env.USERPROFILE || + os.homedir() || + os.tmpdir() + ); + } +}; + +/* + * Get oclif base dir based on platform + */ +const getOClifBase = (product) => { + const base = env['XDG_CACHE_HOME'] || (platform === 'win32' && env.LOCALAPPDATA) || path.join(getOClifHome(), '.cache'); + return path.join(base, product); +}; + +const macosCacheDir = (product) => { + return platform === 'darwin' ? path.join(getOClifHome(), 'Library', 'Caches', product) : undefined; +}; + +/** + * Determine the cache directory for the given product. + * + * @param {string} [product='lando'] - Product identifier used to compute the directory. + * @returns {string} The cache directory path. + */ +export default function getCacheDir(product = 'lando') { + return env[`${product.toUpperCase()}_CACHE_DIR`] ?? macosCacheDir(product) ?? getOClifBase(product); +} diff --git a/_new/utils/get-commit-hash.js b/_new/utils/get-commit-hash.js new file mode 100644 index 0000000..7c2646b --- /dev/null +++ b/_new/utils/get-commit-hash.js @@ -0,0 +1,35 @@ +import fs from 'node:fs'; +import path from 'node:path'; + +/** + * Retrieve a git commit hash from a repository directory. + * + * @param {string} dir - Path to the git repository. + * @param {object} [options] + * @param {string} [options.refFile] - Path to the ref file to read. + * @param {boolean} [options.short=false] - Whether to return the short hash. + * @returns {string|false} The commit hash or `false` if it cannot be found. + */ +export default function getCommitHash(dir = path.resolve(), { refFile = path.join(dir, '.git', 'HEAD'), short = false } = {}) { + // if reffile doesnt exist then return false + if (!fs.existsSync(refFile)) return false; + + const gitBase = path.join(path.resolve(dir), '.git'); + + // if the refFile has another ref in it then we need to reset the reffile + if (fs.readFileSync(refFile, { encoding: 'utf-8' }).startsWith('ref: ')) { + const contents = fs.readFileSync(refFile, { encoding: 'utf-8' }).trim(); + const parts = contents.split('ref: '); + const ref = parts[1] ? parts[1] : 'HEAD'; + refFile = path.join(gitBase, ref); + } + + // get the commit + const commit = fs.readFileSync(refFile, { encoding: 'utf-8' }).trim(); + + // if we are "short" then return first seven + if (short && typeof commit === 'string') return commit.slice(0, 7); + + // otherwise just return the whole thing + return commit; +} diff --git a/_new/utils/get-component-instance.js b/_new/utils/get-component-instance.js new file mode 100644 index 0000000..62524cb --- /dev/null +++ b/_new/utils/get-component-instance.js @@ -0,0 +1,49 @@ +import createDebug from '../lib/debug.js'; +import getComponent from './get-component.js'; + +import Config from '../lib/config.js'; + +/** + * Instantiate a component class and optionally run its `init` method. + * + * @param {string} component - Component id or path. + * @param {*} constructor - Argument(s) passed to the component constructor. + * @param {object} [options] + * @param {object} [options.aliases] - Component alias map. + * @param {boolean} [options.cache=true] - Whether to cache loaded classes. + * @param {Function} [options.debug] - Debug logger factory. + * @param {object} [options.config] - Configuration passed to the component. + * @param {object} [options.defaults] - Default options passed to init. + * @param {boolean} [options.init=true] - Call the component `init` method. + * @param {Config} [options.registry] - Component registry. + * @returns {Promise<*>} An initialized component instance. + */ +export default async function getComponentInstance( + component, + constructor, + { + aliases = {}, + cache = true, + debug = createDebug('@lando/core:get-component-instance'), + config = {}, + defaults = {}, + init = true, + registry = new Config({ id: 'component-registry' }), // eslint-disable-line new-cap + } = {}, +) { + // get class component and instantiate + const Component = getComponent(component, registry, { aliases, cache, config, debug }); + + // get an instance + const instance = Array.isArray(constructor) ? new Component(...constructor) : new Component(constructor); + + // and run its init func if applicable + if (instance.init && typeof instance.init === 'function' && init) { + await instance.init(constructor, { config, registry, cache, defaults, init }); + } + + // debug + debug('instantiated %o with init %o', component, init); + // and return + return instance; +} diff --git a/_new/utils/get-component.js b/_new/utils/get-component.js new file mode 100644 index 0000000..fa73b67 --- /dev/null +++ b/_new/utils/get-component.js @@ -0,0 +1,89 @@ +import fs from 'node:fs'; +import isClass from 'is-class'; + +import has from 'lodash-es/has.js'; +import isObject from 'lodash-es/isPlainObject.js'; +import merge from './merge.js'; + +import createDebug from '../lib/debug.js'; +import Config from '../lib/config.js'; + +/** + * Resolve and load a component class from a registry. + * + * @param {string} component - Component id to load. + * @param {Config} [registry] - Component registry. + * @param {object} [options] + * @param {object} [options.aliases] - Mapping of aliases to component ids. + * @param {object} [options.config] - Configuration to merge into the class. + * @param {object} [options.cache] - Object used to cache loaded classes. + * @param {Function} [options.debug] - Debug logger factory. + * @returns {Function} Loaded component class. + */ +export default function getComponent( + component, + registry = (registry = new Config({ id: 'component-registry' })), // eslint-disable-line new-cap + { aliases = {}, config = {}, cache = undefined, debug = createDebug('@lando/core:get-component') } = {}, +) { + // determine whether we should cache or not + const shouldCache = isObject(cache); + + // throw error if config is not a Config class + if (!registry.constructor || registry.constructor.name !== 'Config') { + throw new Error('get-component requires registry be a Config class'); + } + + // our intentions + debug('looking for %o in %o', component, registry.id); + + // if an alias then rerun + if (has(aliases, component)) return getComponent(aliases[component], registry, { aliases, config, cache, debug }); + + // if class is already loaded in registry and cache is true then just return the class + if (shouldCache && cache[component]) { + debug('retrieved %o from component cache', component); + return cache[component]; + } + + // try to get the path to the component + // @TODO: this should be a loader? + // if function then async? + const componentPath = registry.get(component); + + // if there is no component or it does not exist then throw an error + if (!componentPath || (!fs.existsSync(componentPath) && !fs.existsSync(`${componentPath}.js`))) { + throw new Error(`could not find component ${component}`); + } + + // otherwise try to load the component from the config + const loader = require(componentPath); + const isDynamic = loader.extends && typeof loader.getComponent === 'function'; + + // if component is "dynamically extended" then get its parent and run its getComponent function + // + // we use this instead of the usual class extension when the components parent is not static and is not known until + // the configuration has been compiled. an example would be the docker-npm plugin-installer component which extends + // whatever core.engine is + // + // otherwise assume the loader is the class itself + const Component = isDynamic + ? loader.getComponent(getComponent(loader.extends, registry, { aliases, cache, config, debug })) + : (loader.default ?? loader); + + // if Component is not a class then error + if (!isClass(Component)) throw new Error(`component ${component} needs to be a class`); + + // mix in some config + Component.config = merge({}, [Component.config, config]); + + // reset the default debug namespace + Component.debug = debug.contract(-1).extend(Component.name); + + // and set in cache if applicable + if (shouldCache) cache[component] = Component; + + // and return + debug('retrieved component %o from %o', component, registry.id); + + return Component; +} diff --git a/_new/utils/get-context.js b/_new/utils/get-context.js new file mode 100644 index 0000000..a9cf4cb --- /dev/null +++ b/_new/utils/get-context.js @@ -0,0 +1,21 @@ +import getEnvironment from './get-environment.js'; +import getPlatform from './get-platform.js'; + +/** + * Determine the runtime context of the current process. + * + * @returns {string} One of `remote`, `server`, `ci`, or `local`. + */ +export default function getContext() { + // get needed envvars + const { CI, CODESPACES, DISPLAY, GITPOD_WORKSPACE_ID, SSH_CLIENT, SSH_TTY } = getEnvironment(); + + // running on a remote development option + if (GITPOD_WORKSPACE_ID || CODESPACES) return 'remote'; + // running on a remote linux server + if (getPlatform() === 'linux' && (SSH_CLIENT || SSH_TTY) && !DISPLAY) return 'server'; + // running in a CI environment + if (CI) return 'ci'; + // running locally + return 'local'; +} diff --git a/_new/utils/get-default-config.js b/_new/utils/get-default-config.js new file mode 100644 index 0000000..e0e008f --- /dev/null +++ b/_new/utils/get-default-config.js @@ -0,0 +1,116 @@ +import os from 'node:os'; +import fs from 'node:fs'; +import path from 'node:path'; +import url from 'node:url'; + +import isRoot from 'is-root'; + +import getContext from './get-context.js'; +import getPlatform from './get-platform.js'; +import getProcess from './get-process.js'; +import getSystemDataDir from './get-system-data-dir.js'; +import isWslInteropt from './is-wsl-interopt.js'; +import read from './read-file.js'; +import traverseUp from './traverse-up.js'; + +const __dirname = path.dirname(url.fileURLToPath(import.meta.url)); + +/** + * Generate a baseline configuration object for the given product. + * + * @param {string} [id='devtool'] - Product identifier. + * @returns {object} Default configuration values. + */ +export default function getDefaultConfig(id = 'lando') { + // compute some system things + const home = os.homedir(); + const baseDir = path.join(home, `.${id}`); + const cacheDir = path.join(baseDir, 'cache'); + const configDir = path.join(baseDir, 'config'); + const dataDir = path.join(baseDir, 'data'); + const logsDir = path.join(baseDir, 'logs'); + const syscacheDir = path.join(baseDir, 'syscache'); + const sysdataDir = getSystemDataDir(id); + + const errlog = path.join(logsDir, 'error.log'); + + // find the root of core and retrieve info + const root = path.dirname(traverseUp(['package.json'], __dirname).find(fs.existsSync)); + const pjson = read(path.join(root, 'package.json')); + + // get other stuff + const platform = getPlatform(); + const user = os.userInfo(); + + return { + core: { + app: 'app', + appfile: '.appfile', + appfiles: ['base', 'dist', 'recipe', 'upstream', '', 'local', 'user'], + caching: true, + minapp: 'minapp', + }, + // @TODO: revist this? + // @TODO: do we even need core stuff in here since we have a recombined cli? + plugin: { + dirs: [ + { + id: 'core-updates', + dir: path.join(dataDir, 'plugins', '@lando', 'core-next'), + depth: 0, + }, + { + id: 'core-plugins-updates', + dir: path.join(dataDir, 'plugins', '@lando', 'core-next', 'plugins'), + depth: 2, + }, + { + id: 'user', + dir: path.join(dataDir, 'plugins'), + depth: 2, + }, + ], + }, + system: { + arch: os.arch(), + bun: process.versions.bun, + cacheDir, + configDir, + coreDir: root, + context: getContext(), + dataDir, + env: id.toUpperCase(), + errlog, + freemem: os.freemem() / 1_073_741_824, + gid: user.gid, + home, + id, + isRoot: isRoot(), + isWslInterop: isWslInteropt(), + interface: 'lib', + linux: platform === 'linux', + logsDir, + macos: platform === 'darwin', + mode: 'lib', + os: os.platform(), + platform, + product: id, + process: getProcess(), + root, + syscacheDir, + sysdataDir, + totalmem: os.totalmem() / 1_073_741_824, + version: pjson.version, + windows: platform === 'win32', + wsl: platform === 'wsl', + uid: user.uid, + user: user.username, + userAgent: `${pjson.name}/${pjson.version} ${os.platform()}-${os.arch()} bun-${process.versions.bun}`, + }, + updates: { + notify: true, + // channel? + // enavled? + }, + }; +} diff --git a/_new/utils/get-environment.js b/_new/utils/get-environment.js new file mode 100644 index 0000000..5cac95f --- /dev/null +++ b/_new/utils/get-environment.js @@ -0,0 +1,9 @@ +/** + * Return the current process environment object. + * + * @returns {NodeJS.ProcessEnv} Environment variables. + */ +export default function getEnvironment() { + const { env = {} } = process; + return env; +} diff --git a/_new/utils/get-object-keys.js b/_new/utils/get-object-keys.js new file mode 100644 index 0000000..f339b47 --- /dev/null +++ b/_new/utils/get-object-keys.js @@ -0,0 +1,28 @@ +/** + * Return all object keys as dot-separated paths. + * + * @param {object} data - Object to extract keys from. + * @param {object} [options] + * @param {string} [options.prefix=''] - Prefix for the returned keys. + * @param {boolean} [options.expandArrays=true] - Include array indexes. + * @param {string} [options.separator='.'] - Path separator. + * @returns {string[]} Array of key paths. + */ +function getObjectKeys(data, { prefix = '', expandArrays = true, separator = '.' } = {}) { + return Object.keys(data).reduce((keys, key) => { + // if we have a primitive then return the path + if (!data[key] || typeof data[key] !== 'object' || Object.keys(data[key]).length === 0) { + return !key.includes(separator) ? [...keys, `${prefix}${key}`] : [...keys, `${prefix}["${key}"]`]; + } + + // if we arent expanding arrays then dont return paths with array indexes + if (!expandArrays && Array.isArray(data[key])) { + return [...keys, `${prefix}${key}`]; + } + + // otherwise cycle through again + return [...keys, ...getObjectKeys(data[key], { expandArrays, prefix: `${prefix}${key}${separator}` })]; + }, []); +} + +export default getObjectKeys; diff --git a/_new/utils/get-object-sizes.js b/_new/utils/get-object-sizes.js new file mode 100644 index 0000000..fd0a46f --- /dev/null +++ b/_new/utils/get-object-sizes.js @@ -0,0 +1,25 @@ +import isObject from 'lodash-es/isPlainObject.js'; +import get from 'lodash-es/get.js'; +import set from 'lodash-es/set.js'; + +import getKeys from './get-object-keys.js'; +import getSize from './get-size.js'; + +/** + * Compute sizes for each key within an object. + * + * @param {object} data - Object to measure. + * @param {object} [options] + * @param {number} [options.depth=1] - Not currently implemented. + * @param {object} [options.sizes] - Initial sizes object to populate. + * @returns {object} Object keyed by path with numeric sizes. + */ +export default function getObjectSize(data, { depth = 1, sizes = {} } = {}) { + // @TODO: implement depth? + // @TODO: throw error if data is not object? + if (!isObject(data)) return {}; + // set all the sizes + for (const path of getKeys(data, { depth, expandArrays: false })) set(sizes, path, getSize(get(data, path))); + // return sizes + return sizes; +} diff --git a/_new/utils/get-platform.js b/_new/utils/get-platform.js new file mode 100644 index 0000000..307d95a --- /dev/null +++ b/_new/utils/get-platform.js @@ -0,0 +1,14 @@ +import os from 'node:os'; + +/** + * Determine the current operating system platform. + * + * @returns {string} Platform identifier (`darwin`, `linux`, `win32`, or `wsl`). + */ + +export default function getPlatform() { + // wsl check + if (os.platform() === 'linux' && os.release().toLowerCase().includes('microsoft')) return 'wsl'; + // otherwise this + return os.platform(); +} diff --git a/_new/utils/get-plugins.js b/_new/utils/get-plugins.js new file mode 100644 index 0000000..893af3e --- /dev/null +++ b/_new/utils/get-plugins.js @@ -0,0 +1,97 @@ +import createDebug from '../lib/debug.js'; +import findPlugins from './find-plugins.js'; +import getSize from './get-size.js'; +import normalizePlugins from './normalize-plugins.js'; + +import DConfig from '../lib/config.js'; +import DPlugin from '../lib/plugin.js'; + +/** + * Discover and load plugins from various directories. + * + * @param {Array} [sources=[]] - Source directories or objects. + * @param {object} [options] - Options forwarded to Plugin constructors. + * @param {object} [deps] - Dependency injection overrides. + * @param {Function} [deps.debug] - Debug creator. + * @param {typeof DConfig} [deps.Config] - Config class. + * @param {typeof DPlugin} [deps.Plugin] - Plugin class. + * @returns {object} Categorized plugins {enabled, disabled, invalids}. + */ +export default function getPlugins( + sources = [], + options = {}, + { debug = createDebug('@lando/core:get-plugins'), Config = DConfig, Plugin = DPlugin } = {}, +) { + // @TODO: error handling? + // normalize plugins and sort by weight if applicable? + sources = sources + // if the source is a string then map into array + .map((source) => (typeof source === 'string' ? { dir: source } : source)) + // rebase on some defaults + .map((source) => ({ id: source.dir, weight: 0, depth: 2, ...source })) + // sort by weight + .sort((a, b) => { + if (a.weight < b.weight) return -1; + if (a.weight > b.weight) return 1; + return 0; + }); + + // kick off message + debug( + 'looking for plugins in %o', + sources.flatMap((source) => source.dir), + ); + + // start by looping through sources and separating all the things + for (const source of sources) { + // make sure plugins is at least an empty array + if (!source.plugins || !Array.isArray(source.plugins)) source.plugins = []; + + // if we have a directory + if (source.dir) { + source.plugins = [ + ...source.plugins, + ...findPlugins(source.dir, source.depth) + .flat(Number.POSITIVE_INFINITY) + .map((dir) => new Plugin(dir, options)), + ]; + } + + // then separate out valid and invalid plugins + if (source.plugins && Array.isArray(source.plugins)) { + source.disabled = source.plugins.filter((plugin) => plugin.isValid && !plugin.enabled); + source.enabled = source.plugins.filter((plugin) => plugin.isValid && plugin.enabled); + source.invalids = source.plugins.filter((plugin) => !plugin.isValid); + } + } + + // stuff + const disabled = new Config({ id: 'plugins.disabled', decode: false, encode: false }); + const enabled = new Config({ id: 'plugins.enabled', decode: false, encode: false }); + const invalids = new Config({ id: 'plugins.invalid', decode: false, encode: false }); + + // do the priority resolution + for (const source of sources.reverse()) { + // disabled + if (source.disabled && source.disabled.length > 0) { + disabled.add(source.id, { type: 'literal', store: normalizePlugins(source.disabled) }); + } + // enabled + if (source.enabled && source.enabled.length > 0) { + enabled.add(source.id, { type: 'literal', store: normalizePlugins(source.enabled) }); + } + // invalid + if (source.invalids && source.invalids.length > 0) { + invalids.add(source.id, { type: 'literal', store: normalizePlugins(source.invalids) }); + } + } + + // assemble + const plugins = { disabled: disabled.get(), enabled: enabled.get(), invalids: invalids.get() }; + // summarize discovery + const summary = { disabled: getSize(plugins.disabled), enabled: getSize(plugins.enabled), invalids: getSize(plugins.invalids) }; + debug('found %o plugins with breakdown %o', summary.disabled + summary.enabled + summary.invalids, summary); + + // return + return plugins; +} diff --git a/_new/utils/get-process.js b/_new/utils/get-process.js new file mode 100644 index 0000000..93b696d --- /dev/null +++ b/_new/utils/get-process.js @@ -0,0 +1,13 @@ +/** + * Identify the runtime environment type. + * + * @returns {string} 'browser', 'node', or 'unknown'. + */ +export default function getProcess() { + // probably running in a browser + if (typeof window !== 'undefined' && typeof window.document !== 'undefined') return 'browser'; // eslint-disable-line no-undef + // probable running as a cli + if (typeof process !== 'undefined' && process?.versions != null && process?.versions?.node != null) return 'node'; + // no idea + return 'unknown'; +} diff --git a/_new/utils/get-size.js b/_new/utils/get-size.js new file mode 100644 index 0000000..5fb6048 --- /dev/null +++ b/_new/utils/get-size.js @@ -0,0 +1,16 @@ +/** + * Determine the size/length of various data types. + * + * @param {*} data - Value to measure. + * @returns {number} Size or length of the input. + */ +export default function getSize(data) { + // if null or undefined return 0 + if (!data || data === null) return 0; + // if its an array then + if (Array.isArray(data)) return data.flat(Number.POSITIVE_INFINITY).length; + // otherwise if its an object + if (typeof data === 'object') return Object.keys(data).length; + // otherwise just return the length of whatever it is + return data.length; +} diff --git a/_new/utils/get-system-data-dir.js b/_new/utils/get-system-data-dir.js new file mode 100644 index 0000000..7dd5cb8 --- /dev/null +++ b/_new/utils/get-system-data-dir.js @@ -0,0 +1,27 @@ +import path from 'node:path'; + +import getEnvironment from './get-environment.js'; +import getPlatform from './get-platform.js'; + +const env = getEnvironment(); + +/** + * Compute a platform-specific system data directory for the product. + * + * @param {string} [id='lando'] - Product identifier. + * @returns {string|undefined} The data directory path. + */ + +// @TODO: this needs to use getPlatform()? + +export default function getSystemDataDir(id = 'lando') { + switch (getPlatform()) { + case 'darwin': + return path.join('/', 'Library', 'Application Support', `${id[0].toUpperCase()}${id.slice(1).toLowerCase()}`); + case 'linux': + case 'wsl': + return path.join('/', 'srv', `${id.toLowerCase()}`); + case 'win32': + return path.join(env.PROGRAMDATA ?? env.ProgramData, `${id[0].toUpperCase()}${id.slice(1).toLowerCase()}`); + } +} diff --git a/_new/utils/is-dev-version.js b/_new/utils/is-dev-version.js new file mode 100644 index 0000000..868c6df --- /dev/null +++ b/_new/utils/is-dev-version.js @@ -0,0 +1,22 @@ +import semver from 'semver'; + +export default function (version) { + // throw error if not a valid version + if (semver.valid(semver.clean(version)) === null) { + throw new Error(`${version} must be a semantic version for this to work!`); + } + + // parse the version + version = semver.parse(version); + + // if prerelease is empty then this is stable version + if (version.prerelease.length === 0) return false; + + // if prerelease is length 2 with string and integer parts then this is a non-dev prerelease + if (version.prerelease.length === 2 && typeof version.prerelease[0] === 'string' && Number.isInteger(version.prerelease[1])) { + return false; + } + + // if we get here then lets just assume its a dev release? + return true; +} diff --git a/_new/utils/is-wsl-interopt.js b/_new/utils/is-wsl-interopt.js new file mode 100644 index 0000000..96a86ef --- /dev/null +++ b/_new/utils/is-wsl-interopt.js @@ -0,0 +1,25 @@ +import fs from 'node:fs'; +import os from 'node:os'; + +const WINBIN_REGEX = /\/mnt\/.\/WINDOWS\/System32$/i; + +/** + * Detect if Docker is installed via the WSL Windows interoperability layer. + * + * @returns {boolean} True if running with WSL interop Docker. + */ +export default function isWSLInteropt() { + // if not linux then easy + if (os.platform() !== 'linux') return false; + // return anything that is not wsl as false + if (!os.release().toLowerCase().includes('microsoft')) return false; + // if we dont have have WSL_INTEROP then + if (!process?.env?.WSL_INTEROP) return false; + + // attempt to find there the winbin is at + const winbin = process?.env?.PATH.split(':').filter((path) => WINBIN_REGEX.test(path)); + // if we cant find anything then false + if (winbin.length === 0) return false; + // otherwise return whether our first match exists + return fs.existsSync(winbin[0]); +} diff --git a/_new/utils/legacy-logger-wrapper.js b/_new/utils/legacy-logger-wrapper.js new file mode 100644 index 0000000..a5544d8 --- /dev/null +++ b/_new/utils/legacy-logger-wrapper.js @@ -0,0 +1,37 @@ +import createDebug from '../lib/debug.js'; + +/** + * Wrap a debug instance with methods shaped like a legacy logger. + * + * @param {Function} [debug=createDebug('legacy-logger')] - Debug creator. + * @returns {object} Logger with log-level methods. + */ +// @TODO: figure a better default value for legacy-logger? +export default function legacyLogWrapper(debug = createDebug('legacy-logger')) { + return { + error: (...args) => { + const log = debug.extend('error'); + log(...args); + }, + warn: (...args) => { + const log = debug.extend('warn'); + log(...args); + }, + info: (...args) => { + const log = debug.extend('info'); + log(...args); + }, + verbose: (...args) => { + const log = debug.extend('verbose'); + log(...args); + }, + debug: (...args) => { + const log = debug.extend('debug'); + log(...args); + }, + silly: (...args) => { + const log = debug.extend('silly'); + log(...args); + }, + }; +} diff --git a/_new/utils/load-component.js b/_new/utils/load-component.js new file mode 100644 index 0000000..bcf4dda --- /dev/null +++ b/_new/utils/load-component.js @@ -0,0 +1,23 @@ +import fs from 'node:fs'; +import util from 'node:util'; + +/** + * Returns the default export + */ +export default async function loadComponent(component) { + // we do anonymous functions first so they can hypothetically resolve to downstream things like paths + if (typeof component === 'function' && component.name === '') component = { loader: component }; + // if component is an object with "load" property then just reassign + if (typeof component === 'object' && typeof component.load === 'function') component = { ...component, loader: component.load }; + // if component is an object with "loader" function then just invoke + if (typeof component === 'object' && typeof component.loader === 'function') component = await component.loader(); + + // if component is a string that exists then attempt to load it + if (typeof component === 'string' && fs.existsSync(component)) component = await import(component); + + // if component is not a module by now then lets fake it + if (!util.types.isModuleNamespaceObject(component)) component = { default: component }; + + // @TODO: do we check stuff here or should component validation be done where implementation happens? + return component.default; +} diff --git a/utils/make-error.js b/_new/utils/make-error.js similarity index 53% rename from utils/make-error.js rename to _new/utils/make-error.js index 85f71ed..4bef73f 100644 --- a/utils/make-error.js +++ b/_new/utils/make-error.js @@ -1,23 +1,22 @@ -'use strict'; - /* eslint-disable complexity */ -/* - * Attempts to produce a standardized error object +/** + * Construct a standardized Error object from command output. + * + * @param {object} params - Command results and meta data. + * @param {string} [params.all] - Combined stdout/stderr. + * @param {string[]} [params.args] + * @param {string} [params.code] + * @param {string} [params.command] + * @param {Error} [params.error] + * @param {string} [params.errorCode] + * @param {number} [params.exitCode] + * @param {string} [params.short] + * @param {number} [params.statusCode] + * @param {string} [params.stdout] + * @param {string} [params.stderr] + * @returns {Error} Normalized error instance. */ -module.exports = ({ - all, - args, - code, - command, - context, - error, - errorCode, - short, - statusCode, - stdout, - stderr, - exitCode = 1, -}) => { +export default function makeError({ all, args, code, command, error, errorCode, exitCode, short, statusCode, stdout, stderr }) { // attempt to discover various codes code = (error && error.code) || code || undefined; errorCode = (error && error.code) || errorCode || undefined; @@ -25,18 +24,15 @@ module.exports = ({ // construct a better message // @TODO: does this make sense? - short = short || - (error && error?.json?.message) || - (error && error.reason) || - (error && error.body && error.body.error); - const message = [stdout, stderr].filter(Boolean).join('\n') || all || error.message; + short = short || (error && error.reason) || (error && error.body && error.body.error); + const message = [stdout, stderr].filter(Boolean).join('\n') || all; // repurpose original error if we have one if (Object.prototype.toString.call(error) === '[object Error]') { error.originalMessage = error.message; error.message = message || error.originalMessage || short || stdout || stderr || all; - // otherwise begin anew + // otherwise begin anew } else { error = new Error(message); } @@ -45,10 +41,9 @@ module.exports = ({ error.all = all; error.code = code; error.command = command; - error.context = context; error.args = args; - error.errorCode = errorCode ?? code; - error.exitCode = exitCode ?? code; + error.errorCode = errorCode; + error.exitCode = exitCode; error.short = short || message || stdout || stderr || all; error.statusCode = statusCode; error.stdout = stdout; @@ -57,4 +52,4 @@ module.exports = ({ // @TODO: filter out unset properties? // send it back return error; -}; +} diff --git a/_new/utils/make-success.js b/_new/utils/make-success.js new file mode 100644 index 0000000..4d3abfa --- /dev/null +++ b/_new/utils/make-success.js @@ -0,0 +1,21 @@ +/** + * Produce a standardized success result. + * + * @param {object} params - Command metadata. + * @param {string} params.all - Combined output. + * @param {string[]} params.args - Arguments passed to the command. + * @param {string} params.command - The command executed. + * @param {string} params.stdout - Standard output. + * @param {string} params.stderr - Standard error. + * @returns {object} Success information object. + */ +export default function makeSuccess({ all, args, command, stdout, stderr }) { + return { + command, + args, + exitCode: 0, + stdout, + stderr, + all, + }; +} diff --git a/_new/utils/merge-arrays.js b/_new/utils/merge-arrays.js new file mode 100644 index 0000000..edee8c4 --- /dev/null +++ b/_new/utils/merge-arrays.js @@ -0,0 +1,50 @@ +import isObject from 'lodash-es/isPlainObject.js'; +import merge from 'lodash-es/merge.js'; + +// @TODO: error handling +/** + * Merge two arrays using a variety of strategies. + * + * @param {Array} a - Base array. + * @param {Array} b - Array to merge into `a`. + * @param {string} [ams='replace'] - Strategy string, e.g. 'merge:id'. + * @returns {Array} The merged array. + */ +export default function mergeArrays(a, b, ams = 'replace') { + // get strat and id if applicable + const strategy = ams.split(':')[0]; + const by = ams.split(':')[1] || 'id'; + + switch (strategy) { + case 'aoa': + return a.length === 1 ? [a, b] : [...a, b]; + case 'concat': + return a.concat(b); + case 'first': + return a; + case 'last': + return b; + case 'merge': + return Object.entries( + [a, b].filter(Boolean).reduce((acc, datum) => { + return merge( + acc, + Object.fromEntries( + datum.map((a) => { + // if an object do fancy stuff + if (isObject(a)) { + if (Object.hasOwn(a, by)) return [a[by], a]; + if (Object.keys(a).length === 1) return [Object.keys(a)[0], a]; + } + // otherwise just return pairself + return [a, a]; + }), + ), + ); + }, {}), + ).map((data) => data[1]); + case 'replace': + default: + return merge(a, b); + } +} diff --git a/_new/utils/merge-promise.js b/_new/utils/merge-promise.js new file mode 100644 index 0000000..758e43b --- /dev/null +++ b/_new/utils/merge-promise.js @@ -0,0 +1,22 @@ +const nativePromisePrototype = (async () => {})().constructor.prototype; +const descriptors = ['then', 'catch', 'finally'].map((property) => [ + property, + Reflect.getOwnPropertyDescriptor(nativePromisePrototype, property), +]); + +/** + * Mix promise methods into an arbitrary object. + * + * @param {object} thing - Target object to decorate. + * @param {Promise|Function} promise - Promise or factory returning one. + * @returns {object} The decorated object. + */ +export default function mergePromise(thing, promise) { + for (const [property, descriptor] of descriptors) { + const value = + typeof promise === 'function' ? (...args) => Reflect.apply(descriptor.value, promise(), args) : descriptor.value.bind(promise); + Reflect.defineProperty(thing, property, { ...descriptor, value }); + } + + return thing; +} diff --git a/utils/merge.js b/_new/utils/merge.js similarity index 58% rename from utils/merge.js rename to _new/utils/merge.js index 3b0a8da..5f72bca 100644 --- a/utils/merge.js +++ b/_new/utils/merge.js @@ -1,11 +1,17 @@ -'use strict'; - -const isObject = require('lodash/isPlainObject'); -const merge = require('lodash/mergeWith'); -const mergeArrays = require('./merge-arrays'); +import isObject from 'lodash-es/isPlainObject.js'; +import lomerge from 'lodash-es/merge.js'; +import mergeArrays from './merge-arrays.js'; // @TODO: error handling -module.exports = (object, sources, ams = ['merge:id', 'replace']) => { +/** + * Deep merge objects with special array handling strategies. + * + * @param {object} object - Destination object. + * @param {object|object[]} sources - Sources to merge from. + * @param {string|string[]} [ams=['merge:id','replace']] - Array merge strategies. + * @returns {object} The merged object. + */ +export default function merge(object, sources, ams = ['merge:id', 'replace']) { // if sources is not an array then make it so if (!Array.isArray(sources)) sources = [sources]; @@ -17,7 +23,7 @@ module.exports = (object, sources, ams = ['merge:id', 'replace']) => { const fallback = ams[1] || 'replace'; // then return the merge - return merge(object, ...sources, (objValue, srcValue) => { + return lomerge(object, ...sources, (objValue, srcValue) => { // if not an arrayjust proceed normally if (!Array.isArray(objValue)) return undefined; // if first strategy is replace then also proceed normally @@ -25,11 +31,11 @@ module.exports = (object, sources, ams = ['merge:id', 'replace']) => { // if first strategy is merge and some part of objvalue has an object then try to merge with by if (first === 'merge') { // if mergable object detected in array then proceed - if (objValue.some(element => isObject(element))) return mergeArrays(objValue, srcValue, `merge:${by}`); + if (objValue.some((element) => isObject(element))) return mergeArrays(objValue, srcValue, `merge:${by}`); // otherwise return the fallback return mergeArrays(objValue, srcValue, fallback); } // if we get here then just pass it through to mergeArrays return mergeArrays(objValue, srcValue, first); }); -}; +} diff --git a/_new/utils/normalize-id2key.js b/_new/utils/normalize-id2key.js new file mode 100644 index 0000000..7a0f856 --- /dev/null +++ b/_new/utils/normalize-id2key.js @@ -0,0 +1,13 @@ +/** + * Normalize an identifier to a single string key. + * + * @param {string|string[]} id - Identifier or path array. + * @param {string} [delimiter='.'] - Delimiter for array joins. + * @returns {string} Normalized id string. + */ +export default function normalizeId2Key(id, delimiter = '.') { + // if array then join and return + if (Array.isArray(id)) return id.join(delimiter); + // otherwise just return + return id; +} diff --git a/_new/utils/normalize-manifest-paths.js b/_new/utils/normalize-manifest-paths.js new file mode 100644 index 0000000..871e99e --- /dev/null +++ b/_new/utils/normalize-manifest-paths.js @@ -0,0 +1,37 @@ +import path from 'node:path'; +import util from 'node:util'; + +import get from 'lodash-es/get.js'; +import set from 'lodash-es/set.js'; + +import getKeys from './get-object-keys.js'; + +const defaultPathyKeys = ['hooks', 'registry', 'tasks']; + +/** + * Resolve relative paths within a manifest to absolute paths. + * + * @param {object} [data={}] - Manifest object. + * @param {string} base - Base directory to resolve from. + * @param {string[]} [pathyKeys=defaultPathyKeys] - Keys that contain paths. + * @returns {object} The mutated manifest. + */ +export default function normalizeManifestPaths(data = {}, base, pathyKeys = defaultPathyKeys) { + // @TODO: error handling? + + for (const key of getKeys(data)) { + // skip if not a pathy key + if (!pathyKeys.includes(key.split('.')[0])) continue; + + // reset data to be an absolute path unless parent is a Module + if (key && typeof get(data, key) === 'string' && !path.isAbsolute(get(data, key))) { + const parentKey = key.replace(/\.[^.]+$/, ''); + if (util.types.isModuleNamespaceObject(get(data, parentKey)) === false) { + set(data, key, path.resolve(base, get(data, key))); + } + } + } + + // then return + return data; +} diff --git a/_new/utils/normalize-plugins.js b/_new/utils/normalize-plugins.js new file mode 100644 index 0000000..98af6a8 --- /dev/null +++ b/_new/utils/normalize-plugins.js @@ -0,0 +1,18 @@ +/** + * Normalize plugin definitions into an object keyed by a property. + * + * @param {object[]|object} plugins - Plugins list or map. + * @param {string} [by='name'] - Key to index array entries by. + * @returns {object} Normalized plugin map. + */ +export default function normalizePlugins(plugins, by = 'name') { + // if its an array then map to an object + if (Array.isArray(plugins)) { + return Object.fromEntries(plugins.map((plugin) => [plugin[by], plugin])); + } + + // @TODO: should we standarize the result? + // @TODO: what about an object? + // @TODO: other conditions? + return plugins; +} diff --git a/utils/parse-package-name.js b/_new/utils/parse-package-name.js similarity index 50% rename from utils/parse-package-name.js rename to _new/utils/parse-package-name.js index dbaeed4..1e37b5c 100644 --- a/utils/parse-package-name.js +++ b/_new/utils/parse-package-name.js @@ -1,19 +1,21 @@ -'use strict'; +import npmPkgArg from 'npm-package-arg'; -/* - * TBD +/** + * Parse an npm package specifier and augment its result. + * + * @param {string} plugin - Package specifier string. + * @returns {import('npm-package-arg').Result} Parsed result with additional fields. */ -module.exports = plugin => { +export default function parsePkgName(plugin /* { /*defaultTag = 'stable' } = {}*/) { // parse the plugin - const result = require('npm-package-arg')(plugin); + const result = npmPkgArg(plugin); // add a package property result.package = result.scope ? result.name.replace(`${result.scope}/`, '') : result.name; - // if we have an explict non-tag peg then lets set it if (result.type !== 'tag') result.peg = result.saveSpec || result.rawSpec; else if (result.rawSpec !== '') result.peg = result.rawSpec; // return return result; -}; +} diff --git a/_new/utils/prettify.js b/_new/utils/prettify.js new file mode 100644 index 0000000..0a5e004 --- /dev/null +++ b/_new/utils/prettify.js @@ -0,0 +1,38 @@ +import os from 'node:os'; + +/** + * Convert data structures into human friendly strings. + * + * @param {*} data - Data to prettify. + * @param {object} [options] + * @param {string} [options.arraySeparator=', '] - Delimiter for string arrays. + * @returns {string|*} Prettified data or original value. + */ +export default function prettify(data, { arraySeparator = ', ' } = {}) { + // if undefined then just return an empty string + if (data === undefined) return ''; + + // handle arrays differently + if (Array.isArray(data)) { + // join lists of strings together + if (typeof data[0] === 'string') { + return data.join(arraySeparator); + } + + // print arrays of objects nicely + if (data[0] && typeof data[0] === 'object' && Object.keys(data[0]).length > 0) { + return data + .map((item) => { + // if it doesnt have keys just return + if (typeof item !== 'object') return item; + // otherwise + return Object.keys(item) + .map((key) => `${key}: ${item[key]}`) + .join(', '); + }) + .join(os.EOL); + } + } + + return data; +} diff --git a/_new/utils/read-file.js b/_new/utils/read-file.js new file mode 100644 index 0000000..be653bf --- /dev/null +++ b/_new/utils/read-file.js @@ -0,0 +1,61 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import { createRequire } from 'node:module'; + +import jsonfile from 'jsonfile'; + +import { parse as readYAML, parseDocument as readYAMLDoc } from 'yaml'; +const readCJS = createRequire(import.meta.url); +const { readFileSync: readJSON } = jsonfile; + +const _read = (file) => fs.readFileSync(file, { encoding: 'utf8' }); + +/** + * Read a file and automatically parse based on extension. + * + * @param {string} file - File path to read. + * @param {object} [options] + * @param {string} [options.extension] - File extension override. + * @param {boolean} [options.fullYamlDoc=false] - Return full YAML document. + * @returns {*} Parsed file contents. + */ +export default function read(file, options = {}) { + // @TODO: file does nto exist? + + // if no extension and discovered extension ends with -bun-asset then this is a special workaround so bun build + // works nice with our templator + if (!options.extension && file.endsWith('-bun-asset')) { + options.extension = path.extname(file.replace(/-bun-asset$/, '')); + } + + // set extension if not set + const extension = options.extension ?? path.extname(file); + // yaml expansion + const fullYamlDoc = options.fullYamlDoc ?? false; + + // @TODO: better try/catches here? + // @TODO: throw error for default? + switch (extension) { + case '.cjs': + case 'cjs': + case '.js': + case 'js': { + return readCJS(file); + } + + case '.json': + case 'json': { + return readJSON(file, options); + } + + case '.yaml': + case '.yml': + case 'yaml': + case 'yml': { + return fullYamlDoc ? readYAMLDoc(_read(file), options) : readYAML(_read(file), options); + } + + default: + return _read(file); + } +} diff --git a/_new/utils/readdir-absolute.js b/_new/utils/readdir-absolute.js new file mode 100644 index 0000000..2d6cf80 --- /dev/null +++ b/_new/utils/readdir-absolute.js @@ -0,0 +1,17 @@ +import fs from 'node:fs'; +import path from 'node:path'; + +/** + * Read a directory and return absolute paths to sub-directories only. + * + * NOTE: This avoids external dependencies for bootstrapping. + * + * @param {string} dir - Directory to read. + * @returns {string[]} Array of absolute directory paths. + */ +export default function readDirAbsolute(dir) { + return fs + .readdirSync(dir) + .map((file) => path.join(dir, file)) + .filter((file) => fs.statSync(file).isDirectory()); +} diff --git a/_new/utils/run-hook.js b/_new/utils/run-hook.js new file mode 100644 index 0000000..f721ad0 --- /dev/null +++ b/_new/utils/run-hook.js @@ -0,0 +1,71 @@ +import chalk from 'chalk'; +import createDebug from '../lib/debug.js'; +import encode from './encode.js'; +import loadComponent from './load-component.js'; + +/** + * Execute a named hook for a set of runners. + * + * @param {string} event - Hook name. + * @param {object} data - Data passed to hook functions. + * @param {object} [hooks] - Collection of hook arrays keyed by name. + * @param {object} [context] - Context object passed as `this`. + * @param {Function} [debug] - Debug logger. + * @param {Function} [errorHandler] - Optional handler for the first failure. + * @returns {Promise<{successes: Array, failures: Array}>} Hook results. + */ +export default async function runHook(event, data, hooks = [], context = {}, debug = createDebug('lando:run-hooks'), errorHandler) { + // collect successes and failures + const final = { successes: [], failures: [] }; + // just helpful message to indicate we have started a cli hook + debug('start %s hook group', chalk.green(event)); + // get targets + const groups = hooks[event] ?? []; + const targets = groups.map((group) => group.target ?? group); + + // generate promises from hooks + const promises = targets.map(async (target) => { + // @TODO: test error handler (allow quiet fail?) + const hook = await loadComponent(target); + + // if we dont have a named function at this point we need to log a failure and confinue + if (typeof hook !== 'function' || hook.name === '') { + final.failures.push({ hook, error: new Error(`${hook.name ?? hook} is not a named function, skipping`) }); + return; + } + + // get hookname and debugger + const hookname = encode(hook.name); + const hookdebug = debug.extend(hookname); + + // @NOTE: i dont think "this" works in async functions? + const ctx = { ...context, debug: hookdebug }; + + // loop through and execute + try { + hookdebug('%s', chalk.green('started')); + + // try to get result + // @TODO: eventually cli/config are specific to this implementation so they need to be + // taken out and passed in when we move to the util + const result = await hook.call(ctx, { ...data, ...ctx }); + final.successes.push({ target, result }); + hookdebug('%s', chalk.magenta('finished')); + + // put errors here? + } catch (error) { + final.failures.push({ target, error }); + debug(error); + } + }); + + // FIRE EVERYTHING!!! + await Promise.all(promises); + debug('end %s hook group', chalk.magenta(event)); + + // handle errors if that makes sense + if (errorHandler && final.failures.length > 0) errorHandler(final.failures[0].error); + + // otherwise + return final; +} diff --git a/_new/utils/standard-error.js b/_new/utils/standard-error.js new file mode 100644 index 0000000..8c2ca39 --- /dev/null +++ b/_new/utils/standard-error.js @@ -0,0 +1,20 @@ +/** + * Error subclass used for normalized error objects. + */ +class StandardError extends Error { + constructor(error) { + // if already an error then lets pass through appropriately + if (Object.prototype.toString.call(error) === '[object Error]') { + const message = error.message; + delete error.message; + super(message, error); + } else { + super(error); + } + + // Error.captureStackTrace(this, StandardError); + // add more stuff + } +} + +export default StandardError; diff --git a/_new/utils/traverse-up.js b/_new/utils/traverse-up.js new file mode 100644 index 0000000..3359c8f --- /dev/null +++ b/_new/utils/traverse-up.js @@ -0,0 +1,18 @@ +import path from 'node:path'; + +import dropRight from 'lodash-es/dropRight.js'; +import range from 'lodash-es/range.js'; + +/** + * Generate upward file paths from a starting directory. + * + * @param {string[]} files - File names to append at each level. + * @param {string} startsFrom - Initial directory path. + * @returns {string[]} Array of candidate file paths. + */ +export default function traverseUp(files, startsFrom) { + return range(startsFrom.split(path.sep).length) + .map((end) => dropRight(startsFrom.split(path.sep), end).join(path.sep)) + .map((dir) => files.map((file) => path.join(dir, path.basename(file)))) + .flat(Number.POSITIVE_INFINITY); +} diff --git a/_new/utils/write-file.js b/_new/utils/write-file.js new file mode 100644 index 0000000..53ba7b8 --- /dev/null +++ b/_new/utils/write-file.js @@ -0,0 +1,71 @@ +import fs from 'node:fs'; +import path from 'node:path'; + +import get from 'lodash-es/get.js'; +import jsonfile from 'jsonfile'; + +import { stringify as stringifyYAML } from 'yaml'; +const { writeFileSync: writeJSON } = jsonfile; + +const _write = (file, data) => { + if (!fs.existsSync(file)) fs.mkdirSync(path.dirname(file), { recursive: true }); + fs.writeFileSync(file, data, { encoding: 'utf8' }); +}; + +// @TODO: maybe extension should be in {options}? +// @TODO: error handling, defaults etc? +// @TODO: better data type handling +/** + * Write data to a file with automatic serialization. + * + * @param {string} file - Destination file path. + * @param {*} data - Data to write. + * @param {object} [options] + * @param {string} [options.extension] - Extension override. + * @param {boolean} [options.forcePosixLineEndings=false] - Normalize line endings. + */ +export default function write(file, data, options = {}) { + // set extension if not set + const extension = options.extension ?? path.extname(file); + // linux line endings + const forcePosixLineEndings = options.forcePosixLineEndings ?? false; + + // special handling for ImportString + // @TODO: we a better way to do this without a bunch of ImportString checking? + if (typeof data !== 'string' && data?.constructor?.name === 'ImportString') data = data.toString(); + // data is a string and posixOnly then replace + if (typeof data === 'string' && forcePosixLineEndings) data = data.replace(/\r\n/g, '\n'); + + switch (extension) { + case '.json': + case 'json': { + writeJSON(file, data, { spaces: 2, ...options }); + break; + } + + case '.yaml': + case '.yml': + case 'yaml': + case 'yml': { + // if this is empty yaml then do nothing + if (data === undefined || data === null) break; + + // otherwise special handling for a full yaml doc + if (get(data, 'constructor.name') === 'Document') { + // if this is empty then lets enforce nullStr to empty + // this prevents an empty doc from outputting string "null" + const nullStr = data.contents === null ? '' : 'null'; + + _write(file, data.toString({ nullStr, ...options })); + break; + } + + // if this is a YAML DOC th en use yaml module + _write(file, stringifyYAML(data, options)); + break; + } + + default: + _write(file, data); + } +} diff --git a/app.js b/app.js index 920f230..e1a29bb 100644 --- a/app.js +++ b/app.js @@ -4,7 +4,9 @@ const _ = require('lodash'); const path = require('path'); -const {nanoid} = require('nanoid'); +const { nanoid } = require('nanoid'); + +const debug = require('./components/debug.js').default; // Helper to set the LANDO_LOAD_KEYS var const getKeys = (keys = true) => { @@ -22,25 +24,29 @@ module.exports = async (app, lando) => { app.postLockfile = `${app.name}.post-build.lock`; // add compose cache updated app.updateComposeCache = () => { - lando.cache.set(app.composeCache, { - allServices: app.allServices, - compose: app.compose, - containers: app.containers, - info: _.cloneDeep(app.info).map(service => ({...service, hostname: [], urls: []})), - name: app.name, - overrides: { - tooling: app._coreToolingOverrides, + lando.cache.set( + app.composeCache, + { + allServices: app.allServices, + compose: app.compose, + containers: app.containers, + info: _.cloneDeep(app.info).map((service) => ({ ...service, hostname: [], urls: [] })), + name: app.name, + overrides: { + tooling: app._coreToolingOverrides, + }, + primary: app._defaultService, + project: app.project, + root: app.root, + sapis: require('./utils/get-service-apis')(app), }, - primary: app._defaultService, - project: app.project, - root: app.root, - sapis: require('./utils/get-service-apis')(app), - }, {persist: true}); + { persist: true }, + ); }; // Add v4 stuff to the app object app.v4 = {}; - app.v4._debugShim = require('./utils/debug-shim')(app.log); + app.v4._debugShim = debug('app:something'); app.v4._dir = path.join(lando.config.userConfRoot, 'v4', `${app.name}-${app.id}`); app.v4.preLockfile = `${app.name}.v4.build.lock`; app.v4.postLockfile = `${app.name}.v4.build.lock`; @@ -50,39 +56,48 @@ module.exports = async (app, lando) => { // Add compose cache v4 updaters // add compose cache updated app.v4.updateComposeCache = () => { - lando.cache.set(app.v4.composeCache, { - allServices: app.allServices, - compose: app.compose, - containers: app.containers, - info: _.cloneDeep(app.info).map(service => ({...service, hostname: [], urls: []})), - name: app.name, - mounts: require('./utils/get-mounts')(_.get(app, 'v4.services', {})), - primary: app._defaultService, - project: app.project, - root: app.root, - sapis: require('./utils/get-service-apis')(app), - overrides: { - tooling: app._coreToolingOverrides, + lando.cache.set( + app.v4.composeCache, + { + allServices: app.allServices, + compose: app.compose, + containers: app.containers, + info: _.cloneDeep(app.info).map((service) => ({ ...service, hostname: [], urls: [] })), + name: app.name, + mounts: require('./utils/get-mounts')(_.get(app, 'v4.services', {})), + primary: app._defaultService, + project: app.project, + root: app.root, + sapis: require('./utils/get-service-apis')(app), + overrides: { + tooling: app._coreToolingOverrides, + }, }, - - }, {persist: true}); + { persist: true }, + ); }; // front load top level networks app.v4.addNetworks = (data = {}) => { - app.add({ - id: `v4-networks-${nanoid()}`, - info: {}, - data: [{networks: data}], - }, true); + app.add( + { + id: `v4-networks-${nanoid()}`, + info: {}, + data: [{ networks: data }], + }, + true, + ); }; // front load top level volumes app.v4.addVolumes = (data = {}) => { - app.add({ - id: `v4-volumes-${nanoid()}`, - info: {}, - data: [{volumes: data}], - }, true); + app.add( + { + id: `v4-volumes-${nanoid()}`, + info: {}, + data: [{ volumes: data }], + }, + true, + ); }; // load in and parse recipes @@ -246,18 +261,10 @@ module.exports = async (app, lando) => { // process events if (!_.isEmpty(_.get(app, 'config.events', []))) { _.forEach(app.config.events, (cmds, event) => { - app.events.on(event, 9999, async data => await require('./hooks/app-run-events')(app, lando, cmds, data, event)); + app.events.on(event, 9999, async (data) => await require('./hooks/app-run-events')(app, lando, cmds, data, event)); }); } - // LEGACY URL Scanner urls - if (_.get(lando, 'config.scanner', true) === 'legacy') { - app.events.on('post-start', 10, async () => await require('./hooks/app-run-legacy-scanner')(app, lando)); - } - - // legacy sharing stuff - await require('./hooks/app-load-legacy-sharing')(app, lando); - // REturn defualts return { env: { @@ -265,12 +272,12 @@ module.exports = async (app, lando) => { LANDO_APP_NAME: app.name, LANDO_APP_ROOT: app.root, LANDO_APP_ROOT_BIND: app.root, - LANDO_APP_COMMON_NAME: _.truncate(app.project, {length: 64}), + LANDO_APP_COMMON_NAME: _.truncate(app.project, { length: 64 }), LANDO_LOAD_KEYS: getKeys(_.get(app, 'config.keys')), BITNAMI_DEBUG: 'true', }, labels: { - 'io.lando.landofiles': app.configFiles.map(file => path.basename(file)).join(','), + 'io.lando.landofiles': app.configFiles.map((file) => path.basename(file)).join(','), 'io.lando.root': app.root, 'io.lando.src': app.configFiles.join(','), 'io.lando.http-ports': '80,443', diff --git a/bin/lando b/bin/lando deleted file mode 100755 index 158e911..0000000 --- a/bin/lando +++ /dev/null @@ -1,170 +0,0 @@ -#!/usr/bin/env node - - -/** - * Main CLI entrypoint that wraps @lando/core@3 or @lando/core@4 - * This file is meant to be linked as a lando "executable". - * - * @name lando - */ - -'use strict'; - -// set this first for all other downstream concerns -const dns = require('dns'); - -// Set DNS result order to IPv4 first -dns.setDefaultResultOrder('ipv4first'); - -// other mods -const fs = require('fs'); -const path = require('path'); - -const _ = require('lodash'); -const argv = require('@lando/argv'); - -const defaultConfig = require('../utils/get-default-config'); -const getApp = require('../utils/get-app'); -const getLandoFiles = require('../utils/get-lando-files'); -const id = path.basename(process.argv[1]); -const lmerge = require('../utils/legacy-merge'); - -// if DEBUG is set then unset it, we dont want it to toggle any debugging inside of lando -// @NOTE: are we sure? or at the very least are we sure dont want to do something with its value? -if (process.env.DEBUG) delete process.env.DEBUG; - -// start assessing debug situation with LANDO_DEBUG -if (process.env.LANDO_DEBUG) { - const scope = process.env.LANDO_DEBUG === 1 - || process.env.LANDO_DEBUG === '1' - || process.env.LANDO_DEBUG === true - || process.env.LANDO_DEBUG === 'true' ? `${id}*` : process.env.LANDO_DEBUG; - require('debug').enable(scope); -} - -// @NOTE: reconsider this when we have lando 4 arg parsing? or have that just be a lando 4 thing? -// then handle legacy --verbose flags next -// if (argv.hasOption('--verbose') -// || argv.hasOption('-v') -// || argv.hasOption('-vv') -// || argv.hasOption('-vvv') -// || argv.hasOption('-vvvv')) { -// require('debug').enable('lando*'); -// } - -// and finally prefer --debug -if (argv.hasOption('--debug')) { - require('debug').enable(argv.getOption('--debug', {defaultValue: `${id}*`})); -} - -// debugger -const debug = require('debug')(id || 'lando'); - -// now load in the runtime selector -const pjson = require(path.resolve(__dirname, '..', 'package.json')); - -// start the preflight -debug('starting %o version %o runtime selector...', id, pjson.version); - -// allow envvars to override a few core things -// @NOTE: we've kept these around for backwards compatibility, you probably shouldnt use them though -const LOGLEVELCONSOLE = process.env.LANDO_CORE_LOGLEVELCONSOLE || debug.enabled ? 4 : undefined; -const ENVPREFIX = process.env.LANDO_CORE_ENVPREFIX; -const USERCONFROOT = process.env.LANDO_CORE_USERCONFROOT; -const RUNTIME = process.env.LANDO_CORE_RUNTIME; - -// start by "minstrapping" the lando/app config -// primarily this means getting the MININMAL amount of stuff we need to determine the runtime to be used -let config = defaultConfig({envPrefix: ENVPREFIX, runtime: RUNTIME, userConfRoot: USERCONFROOT}); - -// @NOTE: is it safe to assume configSources exists and is iterable? i think so? -for (const file of config.configSources) { - config = lmerge(config, require('../utils/load-file')(file)); - debug('merged in additional config source from file %o', file); -} - -// merge in any envvars that set things -if (config.envPrefix) { - const data = require('../utils/load-envars')(config.envPrefix); - config = lmerge(config, data); - debug('merged in additional config source from %o envvars with data %o', `${config.envPrefix}_*`, data); -} - -// log minconf result -debug('final assembled minconf is %O', config); - -// try to get app configuration if we can -const {preLandoFiles, landoFile, postLandoFiles, userConfRoot} = config; - -const landoFiles = getLandoFiles([preLandoFiles, [landoFile], postLandoFiles].flat(1)); -const appConfig = (landoFiles.length > 0) ? getApp(landoFiles, userConfRoot) : {}; - -// if we have an app then normalize runtime and also log some helpful stuff -if (Object.keys(appConfig).length > 0) debug('detected an app %o at %o', appConfig.name, path.dirname(landoFiles[0])); - -// gather core candidates -const cores = [ - path.join(config.userConfRoot, 'plugins', '@lando', 'core'), - path.resolve(__dirname, '..'), -]; - -// if appConfig points to a different core lets set that here -if (typeof _.get(appConfig, 'plugins.@lando/core') === 'string') { - cores.unshift(path.resolve(appConfig.root, appConfig.plugins['@lando/core'])); -} - -// return the first core that exists that we find -const COREBASE = _.find(cores, core => fs.existsSync(path.join(core, 'index.js'))); - -// Summon the implementation of @lando/cli@3 that works with @lando/core@3 -const Cli = require(`${COREBASE}/lib/cli`); -const cli = new Cli(ENVPREFIX, LOGLEVELCONSOLE, USERCONFROOT, COREBASE, debug); -const getTasks = require(`${COREBASE}/utils/get-tasks`); -debug('starting lando with %o runtime using cli %o', `v3`, {ENVPREFIX, LOGLEVELCONSOLE, USERCONFROOT, COREBASE}); - -// Check for sudo usage -cli.checkPerms(); - -// Lando cache stuffs -process.lando = 'node'; -process.landoPlatform = require(`${COREBASE}/utils/is-wsl-interop`)() ? 'wsl' : process.platform; -process.landoTaskCacheName = '_.tasks.cache'; -process.landoTaskCacheFile = path.join(cli.defaultConfig().userConfRoot, 'cache', process.landoTaskCacheName); -process.landoAppCacheFile = !_.isEmpty(appConfig) ? appConfig.composeCache : undefined; - -// Check for a recipe cache and enforce manual app tasks cache clear if applicable -if (appConfig.recipe && !fs.existsSync(appConfig.recipeCache)) { - if (fs.existsSync(process.landoAppCacheFile)) fs.unlinkSync(process.landoAppCacheFile); -} - -// determine bs level -const bsLevel = !_.isEmpty(appConfig) && !fs.existsSync(process.landoAppCacheFile) ? 'APP' : 'TASKS'; - -// Check to see if we have a compose cache and if we dont then lets enforce a manual lando tasks cache clear -if (bsLevel === 'APP' && !fs.existsSync(appConfig.composeCache)) { - if (fs.existsSync(process.landoTaskCacheFile)) fs.unlinkSync(process.landoTaskCacheFile); -} - -// Print the cli if we've got tasks cached -if (fs.existsSync(process.landoTaskCacheFile)) { - cli.run(getTasks(appConfig, cli.argv()), appConfig); -// Otherwise min bootstrap lando so we can generate the task cache first -} else { - // NOTE: we require lando down here because it adds .5 seconds if we do it above - const Lando = require(COREBASE); - const lando = new Lando(cli.defaultConfig(appConfig)); - // add cli and appconfig for downstream usage - lando.cli = cli; - lando.appConfig = appConfig; - - // Bootstrap lando at the correct level - lando.bootstrap(bsLevel).then(lando => { - // If bootstrap level is APP then we need to get and init our app to generate the app task cache - if (bsLevel === 'APP') { - lando.getApp().init({noEngine: true}).then(() => cli.run(getTasks(appConfig, cli.argv()), appConfig)); - // Otherwise run as yooz - } else { - cli.run(getTasks(appConfig, cli.argv()), appConfig); - } - }); -} diff --git a/bin/lando.cmd b/bin/lando.cmd index 20af504..83eb36c 100644 --- a/bin/lando.cmd +++ b/bin/lando.cmd @@ -1,3 +1,3 @@ @echo off -node "%~dp0\lando" %* +bun "%~dp0\lando.js" %* diff --git a/bin/lando.js b/bin/lando.js new file mode 100755 index 0000000..ca678d1 --- /dev/null +++ b/bin/lando.js @@ -0,0 +1,259 @@ +#!/usr/bin/env bun + +/** + * Main CLI entrypoint that wraps @lando/core@3 or @lando/core@4 + * This file is meant to be linked as a lando "executable". + * + * @name lando + */ + +// @ts-nocheck + +/** + * lando + * + * @name lando + */ + +import dns from 'node:dns'; + +import argv from '@lando/argv'; + +import createDebug from '../_new/lib/debug.js'; +import Cli from '../_new/lib/cli.js'; + +// set some defaults +Cli.id = 'lando'; + +// Set DNS result order to IPv4 first +dns.setDefaultResultOrder('ipv4first'); + +// enableDebugger +let enableDebugger = false; + +// if DEBUG is set then unset it, we dont want it to toggle any debugging inside of lando +// @NOTE: are we sure? or at the very least are we sure dont want to do something with its value? +// @NOTE: you can set a custom value with --debug="*" +if (process.env.DEBUG) delete process.env.DEBUG; + +// start assessing debug situation with DEVTOOL_DEBUG +if (process.env.LANDO_DEBUG) { + enableDebugger = + process.env.LANDO_DEBUG === 1 || + process.env.LANDO_DEBUG === '1' || + process.env.LANDO_DEBUG === true || + process.env.LANDO_DEBUG === 'true' + ? true + : process.env.LANDO_DEBUG; +} + +// and finally prefer --debug +if (argv.hasOption('--debug')) enableDebugger = argv.getOption('--debug', { defaultValue: 'lando*' }); + +// construct the cli +const cli = new Cli({ + cache: !argv.hasOption('--clear') && !argv.hasOption('--no-cache'), + configTemplates: { + managed: (await import('../_new/config/managed.js')).default, + user: (await import('../_new/config/user.yaml-bun-asset', { with: { type: 'file' } })).default, + }, + debug: createDebug('lando:cli'), + hooks: { + 'pre-config': [ + await import('../_new/hooks/test.cjs'), + { + async load() { + return await import('../_new/hooks/test.cjs'); + }, + }, + async () => await import('../_new/hooks/test.js'), + async function inlinefunc({ debug }) { + debug('inline'); + }, + ], + 'post-config': [], + }, + enableDebugger, +}); + +// execute +await cli.execute(); + +/* +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +import argv from '@lando/argv'; +import find from 'lodash-es/find'; +import get from 'lodash-es/get'; +import isEmpty from 'lodash-es/isEmpty'; + +import createDebug from '../components/debug.js'; + +import defaultConfig from '../utils/get-default-config.js'; +import getApp from '../utils/get-app.js'; +import getLandoFiles from '../utils/get-lando-files.js'; +import getTasks from '../utils/get-tasks.js'; +import isWslInterop from '../utils/is-wsl-interop.js'; +import legacyMerge from '../utils/legacy-merge.js'; +import loadEnvars from '../utils/load-envars.js'; +import loadFile from '../utils/load-file.js'; + +import Cli from '../lib/cli.js'; +import Debug from 'debug'; +import Lando from '../lib/lando.js'; + +// Set DNS result order to IPv4 first +dns.setDefaultResultOrder('ipv4first'); + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const id = path.basename(process.argv[1]); + +// if DEBUG is set then unset it, we dont want it to toggle any debugging inside of lando +// @NOTE: are we sure? or at the very least are we sure dont want to do something with its value? +if (process.env.DEBUG) delete process.env.DEBUG; + +// start assessing debug situation with LANDO_DEBUG +if (process.env.LANDO_DEBUG) { + const scope = + process.env.LANDO_DEBUG === 1 || + process.env.LANDO_DEBUG === '1' || + process.env.LANDO_DEBUG === true || + process.env.LANDO_DEBUG === 'true' + ? `${id}*` + : process.env.LANDO_DEBUG; + Debug.enable(scope); +} + +// @NOTE: reconsider this when we have lando 4 arg parsing? or have that just be a lando 4 thing? +// then handle legacy --verbose flags next +// if (argv.hasOption('--verbose') +// || argv.hasOption('-v') +// || argv.hasOption('-vv') +// || argv.hasOption('-vvv') +// || argv.hasOption('-vvvv')) { +// require('debug').enable('lando*'); +// } + +// and finally prefer --debug +if (argv.hasOption('--debug')) { + Debug.enable(argv.getOption('--debug', { defaultValue: `${id}*` })); +} + +// debugger +const debug = createDebug(id || 'lando'); + +// now load in the runtime selector +const packageJsonPath = path.resolve(__dirname, '..', 'package.json'); +const pjson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')); + +// start the preflight +debug('starting %o runtime version %o', id, pjson.version); + +// allow envvars to override a few core things +// @NOTE: we've kept these around for backwards compatibility, you probably shouldnt use them though +const LOGLEVELCONSOLE = process.env.LANDO_CORE_LOGLEVELCONSOLE || debug.enabled ? 4 : undefined; +const ENVPREFIX = process.env.LANDO_CORE_ENVPREFIX; +const USERCONFROOT = process.env.LANDO_CORE_USERCONFROOT; +const RUNTIME = process.env.LANDO_CORE_RUNTIME; + +// start by "minstrapping" the lando/app config +// primarily this means getting the MININMAL amount of stuff we need to determine the runtime to be used +let config = defaultConfig({ envPrefix: ENVPREFIX, runtime: RUNTIME, userConfRoot: USERCONFROOT }); + +// @NOTE: is it safe to assume configSources exists and is iterable? i think so? +for (const file of config.configSources) { + config = legacyMerge(config, loadFile(file)); + debug('merged in additional config source from file %o', file); +} + +// merge in any envvars that set things +if (config.envPrefix) { + const data = loadEnvars(config.envPrefix); + config = legacyMerge(config, data); + debug('merged in additional config source from %o envvars with data %o', `${config.envPrefix}_*`, data); +} + +// log minconf result +debug('final assembled minconf is %O', config); + +// try to get app configuration if we can +const { preLandoFiles, landoFile, postLandoFiles, userConfRoot } = config; + +const landoFiles = getLandoFiles([preLandoFiles, [landoFile], postLandoFiles].flat(1)); +const appConfig = landoFiles.length > 0 ? getApp(landoFiles, userConfRoot) : {}; + +// if we have an app then normalize runtime and also log some helpful stuff +if (Object.keys(appConfig).length > 0) debug('detected an app %o at %o', appConfig.name, path.dirname(landoFiles[0])); + +// gather core candidates +const cores = [path.join(config.userConfRoot, 'plugins', '@lando', 'core'), path.resolve(__dirname, '..')]; + +// if appConfig points to a different core lets set that here +if (typeof get(appConfig, 'plugins.@lando/core') === 'string') { + cores.unshift(path.resolve(appConfig.root, appConfig.plugins['@lando/core'])); +} + +// return the first core that exists that we find +const COREBASE = find(cores, (core) => fs.existsSync(path.join(core, 'index.js'))); + +const main = async () => { + if (!COREBASE) throw new Error('Unable to locate @lando/core runtime'); + + // Summon the implementation of @lando/cli@3 that works with @lando/core@3 + + const cli = new Cli(ENVPREFIX, LOGLEVELCONSOLE, USERCONFROOT, COREBASE, debug); + debug('starting lando with %o runtime using cli %o', 'v3', { ENVPREFIX, LOGLEVELCONSOLE, USERCONFROOT, COREBASE }); + + // Check for sudo usage + cli.checkPerms(); + + // Lando cache stuffs + process.lando = 'node'; + process.landoPlatform = isWslInterop() ? 'wsl' : process.platform; + process.landoTaskCacheName = '_.tasks.cache'; + process.landoTaskCacheFile = path.join(cli.defaultConfig().userConfRoot, 'cache', process.landoTaskCacheName); + process.landoAppCacheFile = !isEmpty(appConfig) ? appConfig.composeCache : undefined; + + // Check for a recipe cache and enforce manual app tasks cache clear if applicable + if (appConfig.recipe && !fs.existsSync(appConfig.recipeCache)) { + if (fs.existsSync(process.landoAppCacheFile)) fs.unlinkSync(process.landoAppCacheFile); + } + + // determine bs level + const bsLevel = !isEmpty(appConfig) && !fs.existsSync(process.landoAppCacheFile) ? 'APP' : 'TASKS'; + + // Check to see if we have a compose cache and if we dont then lets enforce a manual lando tasks cache clear + if (bsLevel === 'APP' && !fs.existsSync(appConfig.composeCache)) { + if (fs.existsSync(process.landoTaskCacheFile)) fs.unlinkSync(process.landoTaskCacheFile); + } + + // Print the cli if we've got tasks cached + if (fs.existsSync(process.landoTaskCacheFile)) { + cli.run(getTasks(appConfig, cli.argv()), appConfig); + return; + } + + // Otherwise min bootstrap lando so we can generate the task cache first + const lando = new Lando(cli.defaultConfig(appConfig)); + // add cli and appconfig for downstream usage + lando.cli = cli; + lando.appConfig = appConfig; + + // Bootstrap lando at the correct level + const bootstrappedLando = await lando.bootstrap(bsLevel); + + // If bootstrap level is APP then we need to get and init our app to generate the app task cache + if (bsLevel === 'APP') { + await bootstrappedLando.getApp().init({ noEngine: true }); + } + + cli.run(getTasks(appConfig, cli.argv()), appConfig); +}; + +main().catch((error) => { + console.error(error); // eslint-disable-line no-console + process.exitCode = 1; +}); +*/ diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000..4408612 --- /dev/null +++ b/bun.lock @@ -0,0 +1,2636 @@ +{ + "lockfileVersion": 1, + "configVersion": 1, + "workspaces": { + "": { + "name": "@lando/core", + "dependencies": { + "@lando/argv": "^1.2.0", + "@npmcli/arborist": "^6.2.9", + "@oclif/core": "^4.8.0", + "@octokit/rest": "^19", + "axios": "^1.5.1", + "bluebird": "^3.4.1", + "chalk": "^4.1.2", + "clean-stacktrace": "^1.1.0", + "cli-table": "^0.3.11", + "cli-table3": "^0.6.5", + "cli-truncate": "2.1.0", + "copy-dir": "^0.4.0", + "debug": "^4.3.4", + "delay": "^5", + "dockerfile-generator": "^5.0.0", + "dockerfile-utils": "^0.15.0", + "dockerode": "^2.4.2", + "enquirer": "^2.4.1", + "figlet": "^1.8.0", + "figures": "^3.2.0", + "fs-extra": "^11.1.1", + "glob": "^7.1.3", + "inquirer": "^6.5.2", + "inquirer-autocomplete-prompt": "^1.4.0", + "is-class": "^0.0.9", + "is-docker": "^4.0.0", + "is-interactive": "^2.0.0", + "is-root": "^3.0.0", + "js-yaml": "^4.1.1", + "jsonfile": "^2.4.0", + "kebabcase-keys": "^1.0.0", + "listr2": "^6.6.1", + "lodash-es": "^4.17.21", + "log-update": "4.0.0", + "mac-ca": "^3.1.0", + "mkcert": "^3.2.0", + "nanoid": "^3", + "nconf": "^0.13.0", + "node-cache": "^4.1.1", + "node-forge": "^1.3.1", + "npm-package-arg": "^11.0.1", + "npm-profile": "^9.0.0", + "object-hash": "^1.1.8", + "pacote": "^15.1.3", + "rimraf": "^4.1.1", + "semver": "^7.3.2", + "shelljs": "^0.8.4", + "slugify": "^1.6.5", + "string-argv": "0.1.1", + "strip-ansi": "^6.0.1", + "sudo-block": "^2.0.0", + "system-ca": "^2.0.0", + "through": "^2.3.8", + "valid-path": "^2.1.0", + "valid-url": "^1.0.9", + "win-ca": "^3.5.1", + "wrap-ansi": "7.0.0", + "yaml": "^2.8.2", + "yargonaut": "^1.1.4", + "yargs": "^15.4.1", + "yargs-parser": "^11.1.1", + }, + "devDependencies": { + "@eslint/js": "^9.39.2", + "@lando/leia": "^1.0.0-beta.4", + "@lando/vitepress-theme-default-plus": "^1.1.1", + "chai": "^4.3.4", + "chai-as-promised": "^7.1.1", + "chai-events": "^0.0.1", + "eslint": "^9.14.0", + "eslint-config-flat-gitignore": "^2.1.0", + "eslint-config-prettier": "^10.1.1", + "eslint-import-resolver-exports": "^1.0.0-beta.5", + "eslint-import-resolver-typescript-bun": "^0.0.104", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-prettier": "^5.2.3", + "eslint-plugin-vue": "^10.0.0", + "globals": "^16.5.0", + "mocha": "^9.1.2", + "mock-fs": "^5.4.0", + "nyc": "^15.1.0", + "prettier": "^3.5.3", + "sinon": "^4.3.0", + "sinon-chai": "^2.14.0", + "ua-parser-js": "^1.0.39", + "vitepress": "^1.6.4", + }, + }, + }, + "packages": { + "@algolia/abtesting": ["@algolia/abtesting@1.12.0", "", { "dependencies": { "@algolia/client-common": "5.46.0", "@algolia/requester-browser-xhr": "5.46.0", "@algolia/requester-fetch": "5.46.0", "@algolia/requester-node-http": "5.46.0" } }, "sha512-EfW0bfxjPs+C7ANkJDw2TATntfBKsFiy7APh+KO0pQ8A6HYa5I0NjFuCGCXWfzzzLXNZta3QUl3n5Kmm6aJo9Q=="], + + "@algolia/autocomplete-core": ["@algolia/autocomplete-core@1.17.7", "", { "dependencies": { "@algolia/autocomplete-plugin-algolia-insights": "1.17.7", "@algolia/autocomplete-shared": "1.17.7" } }, "sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q=="], + + "@algolia/autocomplete-plugin-algolia-insights": ["@algolia/autocomplete-plugin-algolia-insights@1.17.7", "", { "dependencies": { "@algolia/autocomplete-shared": "1.17.7" }, "peerDependencies": { "search-insights": ">= 1 < 3" } }, "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A=="], + + "@algolia/autocomplete-preset-algolia": ["@algolia/autocomplete-preset-algolia@1.17.7", "", { "dependencies": { "@algolia/autocomplete-shared": "1.17.7" }, "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", "algoliasearch": ">= 4.9.1 < 6" } }, "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA=="], + + "@algolia/autocomplete-shared": ["@algolia/autocomplete-shared@1.17.7", "", { "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", "algoliasearch": ">= 4.9.1 < 6" } }, "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg=="], + + "@algolia/client-abtesting": ["@algolia/client-abtesting@5.46.0", "", { "dependencies": { "@algolia/client-common": "5.46.0", "@algolia/requester-browser-xhr": "5.46.0", "@algolia/requester-fetch": "5.46.0", "@algolia/requester-node-http": "5.46.0" } }, "sha512-eG5xV8rujK4ZIHXrRshvv9O13NmU/k42Rnd3w43iKH5RaQ2zWuZO6Q7XjaoJjAFVCsJWqRbXzbYyPGrbF3wGNg=="], + + "@algolia/client-analytics": ["@algolia/client-analytics@5.46.0", "", { "dependencies": { "@algolia/client-common": "5.46.0", "@algolia/requester-browser-xhr": "5.46.0", "@algolia/requester-fetch": "5.46.0", "@algolia/requester-node-http": "5.46.0" } }, "sha512-AYh2uL8IUW9eZrbbT+wZElyb7QkkeV3US2NEKY7doqMlyPWE8lErNfkVN1NvZdVcY4/SVic5GDbeDz2ft8YIiQ=="], + + "@algolia/client-common": ["@algolia/client-common@5.46.0", "", {}, "sha512-0emZTaYOeI9WzJi0TcNd2k3SxiN6DZfdWc2x2gHt855Jl9jPUOzfVTL6gTvCCrOlT4McvpDGg5nGO+9doEjjig=="], + + "@algolia/client-insights": ["@algolia/client-insights@5.46.0", "", { "dependencies": { "@algolia/client-common": "5.46.0", "@algolia/requester-browser-xhr": "5.46.0", "@algolia/requester-fetch": "5.46.0", "@algolia/requester-node-http": "5.46.0" } }, "sha512-wrBJ8fE+M0TDG1As4DDmwPn2TXajrvmvAN72Qwpuv8e2JOKNohF7+JxBoF70ZLlvP1A1EiH8DBu+JpfhBbNphQ=="], + + "@algolia/client-personalization": ["@algolia/client-personalization@5.46.0", "", { "dependencies": { "@algolia/client-common": "5.46.0", "@algolia/requester-browser-xhr": "5.46.0", "@algolia/requester-fetch": "5.46.0", "@algolia/requester-node-http": "5.46.0" } }, "sha512-LnkeX4p0ENt0DoftDJJDzQQJig/sFQmD1eQifl/iSjhUOGUIKC/7VTeXRcKtQB78naS8njUAwpzFvxy1CDDXDQ=="], + + "@algolia/client-query-suggestions": ["@algolia/client-query-suggestions@5.46.0", "", { "dependencies": { "@algolia/client-common": "5.46.0", "@algolia/requester-browser-xhr": "5.46.0", "@algolia/requester-fetch": "5.46.0", "@algolia/requester-node-http": "5.46.0" } }, "sha512-aF9tc4ex/smypXw+W3lBPB1jjKoaGHpZezTqofvDOI/oK1dR2sdTpFpK2Ru+7IRzYgwtRqHF3znmTlyoNs9dpA=="], + + "@algolia/client-search": ["@algolia/client-search@5.46.0", "", { "dependencies": { "@algolia/client-common": "5.46.0", "@algolia/requester-browser-xhr": "5.46.0", "@algolia/requester-fetch": "5.46.0", "@algolia/requester-node-http": "5.46.0" } }, "sha512-22SHEEVNjZfFWkFks3P6HilkR3rS7a6GjnCIqR22Zz4HNxdfT0FG+RE7efTcFVfLUkTTMQQybvaUcwMrHXYa7Q=="], + + "@algolia/ingestion": ["@algolia/ingestion@1.46.0", "", { "dependencies": { "@algolia/client-common": "5.46.0", "@algolia/requester-browser-xhr": "5.46.0", "@algolia/requester-fetch": "5.46.0", "@algolia/requester-node-http": "5.46.0" } }, "sha512-2LT0/Z+/sFwEpZLH6V17WSZ81JX2uPjgvv5eNlxgU7rPyup4NXXfuMbtCJ+6uc4RO/LQpEJd3Li59ke3wtyAsA=="], + + "@algolia/monitoring": ["@algolia/monitoring@1.46.0", "", { "dependencies": { "@algolia/client-common": "5.46.0", "@algolia/requester-browser-xhr": "5.46.0", "@algolia/requester-fetch": "5.46.0", "@algolia/requester-node-http": "5.46.0" } }, "sha512-uivZ9wSWZ8mz2ZU0dgDvQwvVZV8XBv6lYBXf8UtkQF3u7WeTqBPeU8ZoeTyLpf0jAXCYOvc1mAVmK0xPLuEwOQ=="], + + "@algolia/recommend": ["@algolia/recommend@5.46.0", "", { "dependencies": { "@algolia/client-common": "5.46.0", "@algolia/requester-browser-xhr": "5.46.0", "@algolia/requester-fetch": "5.46.0", "@algolia/requester-node-http": "5.46.0" } }, "sha512-O2BB8DuySuddgOAbhyH4jsGbL+KyDGpzJRtkDZkv091OMomqIA78emhhMhX9d/nIRrzS1wNLWB/ix7Hb2eV5rg=="], + + "@algolia/requester-browser-xhr": ["@algolia/requester-browser-xhr@5.46.0", "", { "dependencies": { "@algolia/client-common": "5.46.0" } }, "sha512-eW6xyHCyYrJD0Kjk9Mz33gQ40LfWiEA51JJTVfJy3yeoRSw/NXhAL81Pljpa0qslTs6+LO/5DYPZddct6HvISQ=="], + + "@algolia/requester-fetch": ["@algolia/requester-fetch@5.46.0", "", { "dependencies": { "@algolia/client-common": "5.46.0" } }, "sha512-Vn2+TukMGHy4PIxmdvP667tN/MhS7MPT8EEvEhS6JyFLPx3weLcxSa1F9gVvrfHWCUJhLWoMVJVB2PT8YfRGcw=="], + + "@algolia/requester-node-http": ["@algolia/requester-node-http@5.46.0", "", { "dependencies": { "@algolia/client-common": "5.46.0" } }, "sha512-xaqXyna5yBZ+r1SJ9my/DM6vfTqJg9FJgVydRJ0lnO+D5NhqGW/qaRG/iBGKr/d4fho34el6WakV7BqJvrl/HQ=="], + + "@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], + + "@babel/compat-data": ["@babel/compat-data@7.28.5", "", {}, "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA=="], + + "@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], + + "@babel/generator": ["@babel/generator@7.28.5", "", { "dependencies": { "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ=="], + + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.27.2", "", { "dependencies": { "@babel/compat-data": "^7.27.2", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ=="], + + "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="], + + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w=="], + + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.28.3", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", "@babel/traverse": "^7.28.3" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], + + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], + + "@babel/helpers": ["@babel/helpers@7.28.4", "", { "dependencies": { "@babel/template": "^7.27.2", "@babel/types": "^7.28.4" } }, "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w=="], + + "@babel/parser": ["@babel/parser@7.28.5", "", { "dependencies": { "@babel/types": "^7.28.5" }, "bin": "./bin/babel-parser.js" }, "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ=="], + + "@babel/template": ["@babel/template@7.27.2", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1" } }, "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw=="], + + "@babel/traverse": ["@babel/traverse@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/types": "^7.28.5", "debug": "^4.3.1" } }, "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ=="], + + "@babel/types": ["@babel/types@7.28.5", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA=="], + + "@colors/colors": ["@colors/colors@1.5.0", "", {}, "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ=="], + + "@docsearch/css": ["@docsearch/css@3.8.2", "", {}, "sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ=="], + + "@docsearch/js": ["@docsearch/js@3.8.2", "", { "dependencies": { "@docsearch/react": "3.8.2", "preact": "^10.0.0" } }, "sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ=="], + + "@docsearch/react": ["@docsearch/react@3.8.2", "", { "dependencies": { "@algolia/autocomplete-core": "1.17.7", "@algolia/autocomplete-preset-algolia": "1.17.7", "@docsearch/css": "3.8.2", "algoliasearch": "^5.14.2" }, "peerDependencies": { "@types/react": ">= 16.8.0 < 19.0.0", "react": ">= 16.8.0 < 19.0.0", "react-dom": ">= 16.8.0 < 19.0.0", "search-insights": ">= 1 < 3" }, "optionalPeers": ["@types/react", "react", "react-dom", "search-insights"] }, "sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg=="], + + "@emnapi/core": ["@emnapi/core@1.7.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg=="], + + "@emnapi/runtime": ["@emnapi/runtime@1.7.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA=="], + + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.21.5", "", { "os": "android", "cpu": "arm" }, "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.21.5", "", { "os": "android", "cpu": "arm64" }, "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.21.5", "", { "os": "android", "cpu": "x64" }, "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.21.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.21.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.21.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.21.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.21.5", "", { "os": "linux", "cpu": "arm" }, "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.21.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.21.5", "", { "os": "linux", "cpu": "ia32" }, "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.21.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.21.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.21.5", "", { "os": "linux", "cpu": "x64" }, "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.21.5", "", { "os": "none", "cpu": "x64" }, "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.21.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.21.5", "", { "os": "sunos", "cpu": "x64" }, "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.21.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.21.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.21.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw=="], + + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g=="], + + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], + + "@eslint/compat": ["@eslint/compat@1.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0" }, "peerDependencies": { "eslint": "^8.40 || 9" }, "optionalPeers": ["eslint"] }, "sha512-cfO82V9zxxGBxcQDr1lfaYB7wykTa0b00mGa36FrJl7iTFd0Z2cHfEYuxcBRP/iNijCsWsEkA+jzT8hGYmv33w=="], + + "@eslint/config-array": ["@eslint/config-array@0.21.1", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA=="], + + "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], + + "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], + + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.3", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ=="], + + "@eslint/js": ["@eslint/js@9.39.2", "", {}, "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], + + "@gar/promisify": ["@gar/promisify@1.1.3", "", {}, "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw=="], + + "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], + + "@humanfs/node": ["@humanfs/node@0.16.7", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ=="], + + "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], + + "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], + + "@iconify-json/simple-icons": ["@iconify-json/simple-icons@1.2.62", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-GpWQ294d4lraB3D2eBSSMROh1x9uKgpmyereLlGzVQjGZ7lbeFzby2ywXxyp4vEODmTDyf1/4WcOYs/yH4rJ5Q=="], + + "@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="], + + "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], + + "@isaacs/string-locale-compare": ["@isaacs/string-locale-compare@1.1.0", "", {}, "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ=="], + + "@istanbuljs/load-nyc-config": ["@istanbuljs/load-nyc-config@1.1.0", "", { "dependencies": { "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" } }, "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ=="], + + "@istanbuljs/schema": ["@istanbuljs/schema@0.1.3", "", {}, "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], + + "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], + + "@lando/argv": ["@lando/argv@1.2.0", "", {}, "sha512-Usr0FuXfzDezQG7ZSuaaMNoF9v/YsavgnclQqTBzV48oku/vi9fiKttlaSoXOQ1UPrC1KPC/ean1ZrDnZqcosw=="], + + "@lando/chai": ["chai@4.5.0", "", { "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.3", "deep-eql": "^4.1.3", "get-func-name": "^2.0.2", "loupe": "^2.3.6", "pathval": "^1.1.1", "type-detect": "^4.1.0" } }, "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw=="], + + "@lando/leia": ["@lando/leia@1.0.0-beta.4", "", { "dependencies": { "@lando/argv": "^1.0.6", "@lando/chai": "npm:chai@^4.4.1", "@oclif/command": "^1.8.0", "@oclif/config": "^1.17.0", "@oclif/errors": "^1.3.5", "@oclif/plugin-help": "^3.2.3", "chalk": "^4.1.2", "command-line-test": "^1.0.10", "debug": "^4.3.2", "detect-newline": "^3.1.0", "dot": "^1.1.2", "fs-extra": "^7.0.1", "glob": "^7.1.3", "lodash": "^4.17.11", "marked": "^4.0.10", "mocha": "^9.2.2", "object-hash": "^2.2.0" }, "bin": { "leia": "bin/leia" } }, "sha512-mJ6ZR8KuB8HmsThV2A0VfRhinJ517TmRR6kw8hux/O0zCwyd7peFK/8ASkkahC2Pni1CwDIApVu1q7d/LX68Fg=="], + + "@lando/vitepress-theme-default-plus": ["@lando/vitepress-theme-default-plus@1.1.1", "", { "dependencies": { "@docsearch/js": "^3.5.2", "axios": "^1.7.7", "colorette": "^2.0.20", "debug": "^4.3.2", "es-semver": "^1.0.1", "fast-glob": "^3.3.2", "feed": "^4.2.2", "fs-extra": "^11.2.0", "generate-robotstxt": "^8.0.3", "gravatar-url": "^4.0.1", "gray-matter": "^4.0.3", "js-yaml": "^4.1.0", "lodash-es": "^4.17.21", "markdown-it-container": "^4.0.0", "nanoid": "^5.0.4", "node-html-parser": "^6.1.12", "sass": "^1.69.7", "timeago.js": "^4.0.2", "vitepress-plugin-tabs": "^0.5.0", "vue": "^3.4.15", "yargs-parser": "^21.1.1" }, "bin": { "mvb": "bin/mvb.js", "multiversion-vitepress-build": "bin/mvb.js" } }, "sha512-DcwDvsUHJ8n9ofKRgclbkEXGl5DglzUSQdXNEY1MvoSMKGDTP/iZUXR5acZk6gsOmaUyQ3/vBRrIjXUvCsC1vQ=="], + + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.12", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.10.0" } }, "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@nolyfill/is-core-module": ["@nolyfill/is-core-module@1.0.39", "", {}, "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA=="], + + "@npmcli/agent": ["@npmcli/agent@2.2.2", "", { "dependencies": { "agent-base": "^7.1.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.1", "lru-cache": "^10.0.1", "socks-proxy-agent": "^8.0.3" } }, "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og=="], + + "@npmcli/arborist": ["@npmcli/arborist@6.5.1", "", { "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/fs": "^3.1.0", "@npmcli/installed-package-contents": "^2.0.2", "@npmcli/map-workspaces": "^3.0.2", "@npmcli/metavuln-calculator": "^5.0.0", "@npmcli/name-from-folder": "^2.0.0", "@npmcli/node-gyp": "^3.0.0", "@npmcli/package-json": "^4.0.0", "@npmcli/query": "^3.1.0", "@npmcli/run-script": "^6.0.0", "bin-links": "^4.0.1", "cacache": "^17.0.4", "common-ancestor-path": "^1.0.1", "hosted-git-info": "^6.1.1", "json-parse-even-better-errors": "^3.0.0", "json-stringify-nice": "^1.1.4", "minimatch": "^9.0.0", "nopt": "^7.0.0", "npm-install-checks": "^6.2.0", "npm-package-arg": "^10.1.0", "npm-pick-manifest": "^8.0.1", "npm-registry-fetch": "^14.0.3", "npmlog": "^7.0.1", "pacote": "^15.0.8", "parse-conflict-json": "^3.0.0", "proc-log": "^3.0.0", "promise-all-reject-late": "^1.0.0", "promise-call-limit": "^1.0.2", "read-package-json-fast": "^3.0.2", "semver": "^7.3.7", "ssri": "^10.0.1", "treeverse": "^3.0.0", "walk-up-path": "^3.0.1" }, "bin": { "arborist": "bin/index.js" } }, "sha512-cdV8pGurLK0CifZRilMJbm2CZ3H4Snk8PAqOngj5qmgFLjEllMLvScSZ3XKfd+CK8fo/hrPHO9zazy9OYdvmUg=="], + + "@npmcli/fs": ["@npmcli/fs@3.1.1", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg=="], + + "@npmcli/git": ["@npmcli/git@4.1.0", "", { "dependencies": { "@npmcli/promise-spawn": "^6.0.0", "lru-cache": "^7.4.4", "npm-pick-manifest": "^8.0.0", "proc-log": "^3.0.0", "promise-inflight": "^1.0.1", "promise-retry": "^2.0.1", "semver": "^7.3.5", "which": "^3.0.0" } }, "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ=="], + + "@npmcli/installed-package-contents": ["@npmcli/installed-package-contents@2.1.0", "", { "dependencies": { "npm-bundled": "^3.0.0", "npm-normalize-package-bin": "^3.0.0" }, "bin": { "installed-package-contents": "bin/index.js" } }, "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w=="], + + "@npmcli/map-workspaces": ["@npmcli/map-workspaces@3.0.6", "", { "dependencies": { "@npmcli/name-from-folder": "^2.0.0", "glob": "^10.2.2", "minimatch": "^9.0.0", "read-package-json-fast": "^3.0.0" } }, "sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA=="], + + "@npmcli/metavuln-calculator": ["@npmcli/metavuln-calculator@5.0.1", "", { "dependencies": { "cacache": "^17.0.0", "json-parse-even-better-errors": "^3.0.0", "pacote": "^15.0.0", "semver": "^7.3.5" } }, "sha512-qb8Q9wIIlEPj3WeA1Lba91R4ZboPL0uspzV0F9uwP+9AYMVB2zOoa7Pbk12g6D2NHAinSbHh6QYmGuRyHZ874Q=="], + + "@npmcli/move-file": ["@npmcli/move-file@2.0.1", "", { "dependencies": { "mkdirp": "^1.0.4", "rimraf": "^3.0.2" } }, "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ=="], + + "@npmcli/name-from-folder": ["@npmcli/name-from-folder@2.0.0", "", {}, "sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg=="], + + "@npmcli/node-gyp": ["@npmcli/node-gyp@3.0.0", "", {}, "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA=="], + + "@npmcli/package-json": ["@npmcli/package-json@4.0.1", "", { "dependencies": { "@npmcli/git": "^4.1.0", "glob": "^10.2.2", "hosted-git-info": "^6.1.1", "json-parse-even-better-errors": "^3.0.0", "normalize-package-data": "^5.0.0", "proc-log": "^3.0.0", "semver": "^7.5.3" } }, "sha512-lRCEGdHZomFsURroh522YvA/2cVb9oPIJrjHanCJZkiasz1BzcnLr3tBJhlV7S86MBJBuAQ33is2D60YitZL2Q=="], + + "@npmcli/promise-spawn": ["@npmcli/promise-spawn@6.0.2", "", { "dependencies": { "which": "^3.0.0" } }, "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg=="], + + "@npmcli/query": ["@npmcli/query@3.1.0", "", { "dependencies": { "postcss-selector-parser": "^6.0.10" } }, "sha512-C/iR0tk7KSKGldibYIB9x8GtO/0Bd0I2mhOaDb8ucQL/bQVTmGoeREaFj64Z5+iCBRf3dQfed0CjJL7I8iTkiQ=="], + + "@npmcli/redact": ["@npmcli/redact@2.0.1", "", {}, "sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw=="], + + "@npmcli/run-script": ["@npmcli/run-script@6.0.2", "", { "dependencies": { "@npmcli/node-gyp": "^3.0.0", "@npmcli/promise-spawn": "^6.0.0", "node-gyp": "^9.0.0", "read-package-json-fast": "^3.0.0", "which": "^3.0.0" } }, "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA=="], + + "@oclif/command": ["@oclif/command@1.8.36", "", { "dependencies": { "@oclif/config": "^1.18.2", "@oclif/errors": "^1.3.6", "@oclif/help": "^1.0.1", "@oclif/parser": "^3.8.17", "debug": "^4.1.1", "semver": "^7.5.4" } }, "sha512-/zACSgaYGtAQRzc7HjzrlIs14FuEYAZrMOEwicRoUnZVyRunG4+t5iSEeQu0Xy2bgbCD0U1SP/EdeNZSTXRwjQ=="], + + "@oclif/config": ["@oclif/config@1.18.17", "", { "dependencies": { "@oclif/errors": "^1.3.6", "@oclif/parser": "^3.8.17", "debug": "^4.3.4", "globby": "^11.1.0", "is-wsl": "^2.1.1", "tslib": "^2.6.1" } }, "sha512-k77qyeUvjU8qAJ3XK3fr/QVAqsZO8QOBuESnfeM5HHtPNLSyfVcwiMM2zveSW5xRdLSG3MfV8QnLVkuyCL2ENg=="], + + "@oclif/core": ["@oclif/core@4.8.0", "", { "dependencies": { "ansi-escapes": "^4.3.2", "ansis": "^3.17.0", "clean-stack": "^3.0.1", "cli-spinners": "^2.9.2", "debug": "^4.4.3", "ejs": "^3.1.10", "get-package-type": "^0.1.0", "indent-string": "^4.0.0", "is-wsl": "^2.2.0", "lilconfig": "^3.1.3", "minimatch": "^9.0.5", "semver": "^7.7.3", "string-width": "^4.2.3", "supports-color": "^8", "tinyglobby": "^0.2.14", "widest-line": "^3.1.0", "wordwrap": "^1.0.0", "wrap-ansi": "^7.0.0" } }, "sha512-jteNUQKgJHLHFbbz806aGZqf+RJJ7t4gwF4MYa8fCwCxQ8/klJNWc0MvaJiBebk7Mc+J39mdlsB4XraaCKznFw=="], + + "@oclif/errors": ["@oclif/errors@1.3.6", "", { "dependencies": { "clean-stack": "^3.0.0", "fs-extra": "^8.1", "indent-string": "^4.0.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-fYaU4aDceETd89KXP+3cLyg9EHZsLD3RxF2IU9yxahhBpspWjkWi3Dy3bTgcwZ3V47BgxQaGapzJWDM33XIVDQ=="], + + "@oclif/help": ["@oclif/help@1.0.15", "", { "dependencies": { "@oclif/config": "1.18.16", "@oclif/errors": "1.3.6", "chalk": "^4.1.2", "indent-string": "^4.0.0", "lodash": "^4.17.21", "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "widest-line": "^3.1.0", "wrap-ansi": "^6.2.0" } }, "sha512-Yt8UHoetk/XqohYX76DfdrUYLsPKMc5pgkzsZVHDyBSkLiGRzujVaGZdjr32ckVZU9q3a47IjhWxhip7Dz5W/g=="], + + "@oclif/linewrap": ["@oclif/linewrap@1.0.0", "", {}, "sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw=="], + + "@oclif/parser": ["@oclif/parser@3.8.17", "", { "dependencies": { "@oclif/errors": "^1.3.6", "@oclif/linewrap": "^1.0.0", "chalk": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-l04iSd0xoh/16TGVpXb81Gg3z7tlQGrEup16BrVLsZBK6SEYpYHRJZnM32BwZrHI97ZSFfuSwVlzoo6HdsaK8A=="], + + "@oclif/plugin-help": ["@oclif/plugin-help@3.3.1", "", { "dependencies": { "@oclif/command": "^1.8.15", "@oclif/config": "1.18.2", "@oclif/errors": "1.3.5", "@oclif/help": "^1.0.1", "chalk": "^4.1.2", "indent-string": "^4.0.0", "lodash": "^4.17.21", "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "widest-line": "^3.1.0", "wrap-ansi": "^6.2.0" } }, "sha512-QuSiseNRJygaqAdABYFWn/H1CwIZCp9zp/PLid6yXvy6VcQV7OenEFF5XuYaCvSARe2Tg9r8Jqls5+fw1A9CbQ=="], + + "@octokit/auth-token": ["@octokit/auth-token@3.0.4", "", {}, "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ=="], + + "@octokit/core": ["@octokit/core@4.2.4", "", { "dependencies": { "@octokit/auth-token": "^3.0.0", "@octokit/graphql": "^5.0.0", "@octokit/request": "^6.0.0", "@octokit/request-error": "^3.0.0", "@octokit/types": "^9.0.0", "before-after-hook": "^2.2.0", "universal-user-agent": "^6.0.0" } }, "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ=="], + + "@octokit/endpoint": ["@octokit/endpoint@7.0.6", "", { "dependencies": { "@octokit/types": "^9.0.0", "is-plain-object": "^5.0.0", "universal-user-agent": "^6.0.0" } }, "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg=="], + + "@octokit/graphql": ["@octokit/graphql@5.0.6", "", { "dependencies": { "@octokit/request": "^6.0.0", "@octokit/types": "^9.0.0", "universal-user-agent": "^6.0.0" } }, "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw=="], + + "@octokit/openapi-types": ["@octokit/openapi-types@18.1.1", "", {}, "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw=="], + + "@octokit/plugin-paginate-rest": ["@octokit/plugin-paginate-rest@6.1.2", "", { "dependencies": { "@octokit/tsconfig": "^1.0.2", "@octokit/types": "^9.2.3" }, "peerDependencies": { "@octokit/core": ">=4" } }, "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ=="], + + "@octokit/plugin-request-log": ["@octokit/plugin-request-log@1.0.4", "", { "peerDependencies": { "@octokit/core": ">=3" } }, "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA=="], + + "@octokit/plugin-rest-endpoint-methods": ["@octokit/plugin-rest-endpoint-methods@7.2.3", "", { "dependencies": { "@octokit/types": "^10.0.0" }, "peerDependencies": { "@octokit/core": ">=3" } }, "sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA=="], + + "@octokit/request": ["@octokit/request@6.2.8", "", { "dependencies": { "@octokit/endpoint": "^7.0.0", "@octokit/request-error": "^3.0.0", "@octokit/types": "^9.0.0", "is-plain-object": "^5.0.0", "node-fetch": "^2.6.7", "universal-user-agent": "^6.0.0" } }, "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw=="], + + "@octokit/request-error": ["@octokit/request-error@3.0.3", "", { "dependencies": { "@octokit/types": "^9.0.0", "deprecation": "^2.0.0", "once": "^1.4.0" } }, "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ=="], + + "@octokit/rest": ["@octokit/rest@19.0.13", "", { "dependencies": { "@octokit/core": "^4.2.1", "@octokit/plugin-paginate-rest": "^6.1.2", "@octokit/plugin-request-log": "^1.0.4", "@octokit/plugin-rest-endpoint-methods": "^7.1.2" } }, "sha512-/EzVox5V9gYGdbAI+ovYj3nXQT1TtTHRT+0eZPcuC05UFSWO3mdO9UY1C0i2eLF9Un1ONJkAk+IEtYGAC+TahA=="], + + "@octokit/tsconfig": ["@octokit/tsconfig@1.0.2", "", {}, "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA=="], + + "@octokit/types": ["@octokit/types@9.3.2", "", { "dependencies": { "@octokit/openapi-types": "^18.0.0" } }, "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA=="], + + "@parcel/watcher": ["@parcel/watcher@2.5.1", "", { "dependencies": { "detect-libc": "^1.0.3", "is-glob": "^4.0.3", "micromatch": "^4.0.5", "node-addon-api": "^7.0.0" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.5.1", "@parcel/watcher-darwin-arm64": "2.5.1", "@parcel/watcher-darwin-x64": "2.5.1", "@parcel/watcher-freebsd-x64": "2.5.1", "@parcel/watcher-linux-arm-glibc": "2.5.1", "@parcel/watcher-linux-arm-musl": "2.5.1", "@parcel/watcher-linux-arm64-glibc": "2.5.1", "@parcel/watcher-linux-arm64-musl": "2.5.1", "@parcel/watcher-linux-x64-glibc": "2.5.1", "@parcel/watcher-linux-x64-musl": "2.5.1", "@parcel/watcher-win32-arm64": "2.5.1", "@parcel/watcher-win32-ia32": "2.5.1", "@parcel/watcher-win32-x64": "2.5.1" } }, "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg=="], + + "@parcel/watcher-android-arm64": ["@parcel/watcher-android-arm64@2.5.1", "", { "os": "android", "cpu": "arm64" }, "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA=="], + + "@parcel/watcher-darwin-arm64": ["@parcel/watcher-darwin-arm64@2.5.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw=="], + + "@parcel/watcher-darwin-x64": ["@parcel/watcher-darwin-x64@2.5.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg=="], + + "@parcel/watcher-freebsd-x64": ["@parcel/watcher-freebsd-x64@2.5.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ=="], + + "@parcel/watcher-linux-arm-glibc": ["@parcel/watcher-linux-arm-glibc@2.5.1", "", { "os": "linux", "cpu": "arm" }, "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA=="], + + "@parcel/watcher-linux-arm-musl": ["@parcel/watcher-linux-arm-musl@2.5.1", "", { "os": "linux", "cpu": "arm" }, "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q=="], + + "@parcel/watcher-linux-arm64-glibc": ["@parcel/watcher-linux-arm64-glibc@2.5.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w=="], + + "@parcel/watcher-linux-arm64-musl": ["@parcel/watcher-linux-arm64-musl@2.5.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg=="], + + "@parcel/watcher-linux-x64-glibc": ["@parcel/watcher-linux-x64-glibc@2.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A=="], + + "@parcel/watcher-linux-x64-musl": ["@parcel/watcher-linux-x64-musl@2.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg=="], + + "@parcel/watcher-win32-arm64": ["@parcel/watcher-win32-arm64@2.5.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw=="], + + "@parcel/watcher-win32-ia32": ["@parcel/watcher-win32-ia32@2.5.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ=="], + + "@parcel/watcher-win32-x64": ["@parcel/watcher-win32-x64@2.5.1", "", { "os": "win32", "cpu": "x64" }, "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA=="], + + "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], + + "@pkgr/core": ["@pkgr/core@0.2.9", "", {}, "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA=="], + + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.53.3", "", { "os": "android", "cpu": "arm" }, "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.53.3", "", { "os": "android", "cpu": "arm64" }, "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.53.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.53.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ=="], + + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.53.3", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w=="], + + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.53.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q=="], + + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.53.3", "", { "os": "linux", "cpu": "arm" }, "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw=="], + + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.53.3", "", { "os": "linux", "cpu": "arm" }, "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg=="], + + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.53.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w=="], + + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.53.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A=="], + + "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.53.3", "", { "os": "linux", "cpu": "none" }, "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g=="], + + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.53.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw=="], + + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.53.3", "", { "os": "linux", "cpu": "none" }, "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g=="], + + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.53.3", "", { "os": "linux", "cpu": "none" }, "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A=="], + + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.53.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg=="], + + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.53.3", "", { "os": "linux", "cpu": "x64" }, "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w=="], + + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.53.3", "", { "os": "linux", "cpu": "x64" }, "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q=="], + + "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.53.3", "", { "os": "none", "cpu": "arm64" }, "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw=="], + + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.53.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw=="], + + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.53.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA=="], + + "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.53.3", "", { "os": "win32", "cpu": "x64" }, "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.53.3", "", { "os": "win32", "cpu": "x64" }, "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ=="], + + "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], + + "@shikijs/core": ["@shikijs/core@2.5.0", "", { "dependencies": { "@shikijs/engine-javascript": "2.5.0", "@shikijs/engine-oniguruma": "2.5.0", "@shikijs/types": "2.5.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.4" } }, "sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg=="], + + "@shikijs/engine-javascript": ["@shikijs/engine-javascript@2.5.0", "", { "dependencies": { "@shikijs/types": "2.5.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^3.1.0" } }, "sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w=="], + + "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@2.5.0", "", { "dependencies": { "@shikijs/types": "2.5.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw=="], + + "@shikijs/langs": ["@shikijs/langs@2.5.0", "", { "dependencies": { "@shikijs/types": "2.5.0" } }, "sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w=="], + + "@shikijs/themes": ["@shikijs/themes@2.5.0", "", { "dependencies": { "@shikijs/types": "2.5.0" } }, "sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw=="], + + "@shikijs/transformers": ["@shikijs/transformers@2.5.0", "", { "dependencies": { "@shikijs/core": "2.5.0", "@shikijs/types": "2.5.0" } }, "sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg=="], + + "@shikijs/types": ["@shikijs/types@2.5.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw=="], + + "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="], + + "@sigstore/bundle": ["@sigstore/bundle@1.1.0", "", { "dependencies": { "@sigstore/protobuf-specs": "^0.2.0" } }, "sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog=="], + + "@sigstore/protobuf-specs": ["@sigstore/protobuf-specs@0.2.1", "", {}, "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A=="], + + "@sigstore/sign": ["@sigstore/sign@1.0.0", "", { "dependencies": { "@sigstore/bundle": "^1.1.0", "@sigstore/protobuf-specs": "^0.2.0", "make-fetch-happen": "^11.0.1" } }, "sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA=="], + + "@sigstore/tuf": ["@sigstore/tuf@1.0.3", "", { "dependencies": { "@sigstore/protobuf-specs": "^0.2.0", "tuf-js": "^1.1.7" } }, "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg=="], + + "@sinonjs/commons": ["@sinonjs/commons@1.8.6", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ=="], + + "@sinonjs/formatio": ["@sinonjs/formatio@2.0.0", "", { "dependencies": { "samsam": "1.3.0" } }, "sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg=="], + + "@sinonjs/samsam": ["@sinonjs/samsam@3.3.3", "", { "dependencies": { "@sinonjs/commons": "^1.3.0", "array-from": "^2.1.1", "lodash": "^4.17.15" } }, "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ=="], + + "@sinonjs/text-encoding": ["@sinonjs/text-encoding@0.7.3", "", {}, "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA=="], + + "@tootallnate/once": ["@tootallnate/once@2.0.0", "", {}, "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A=="], + + "@tufjs/canonical-json": ["@tufjs/canonical-json@1.0.0", "", {}, "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ=="], + + "@tufjs/models": ["@tufjs/models@1.0.4", "", { "dependencies": { "@tufjs/canonical-json": "1.0.0", "minimatch": "^9.0.0" } }, "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A=="], + + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], + + "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="], + + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + + "@types/json5": ["@types/json5@0.0.29", "", {}, "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="], + + "@types/linkify-it": ["@types/linkify-it@5.0.0", "", {}, "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q=="], + + "@types/markdown-it": ["@types/markdown-it@14.1.2", "", { "dependencies": { "@types/linkify-it": "^5", "@types/mdurl": "^2" } }, "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog=="], + + "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], + + "@types/mdurl": ["@types/mdurl@2.0.0", "", {}, "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg=="], + + "@types/minimist": ["@types/minimist@1.2.5", "", {}, "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag=="], + + "@types/node": ["@types/node@24.10.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-WOhQTZ4G8xZ1tjJTvKOpyEVSGgOTvJAfDK3FNFgELyaTpzhdgHVHeqW8V+UJvzF5BT+/B54T/1S2K6gd9c7bbA=="], + + "@types/normalize-package-data": ["@types/normalize-package-data@2.4.4", "", {}, "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA=="], + + "@types/parse-json": ["@types/parse-json@4.0.2", "", {}, "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw=="], + + "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], + + "@types/web-bluetooth": ["@types/web-bluetooth@0.0.21", "", {}, "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA=="], + + "@ungap/promise-all-settled": ["@ungap/promise-all-settled@1.1.2", "", {}, "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q=="], + + "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], + + "@unrs/resolver-binding-android-arm-eabi": ["@unrs/resolver-binding-android-arm-eabi@1.11.1", "", { "os": "android", "cpu": "arm" }, "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw=="], + + "@unrs/resolver-binding-android-arm64": ["@unrs/resolver-binding-android-arm64@1.11.1", "", { "os": "android", "cpu": "arm64" }, "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g=="], + + "@unrs/resolver-binding-darwin-arm64": ["@unrs/resolver-binding-darwin-arm64@1.11.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g=="], + + "@unrs/resolver-binding-darwin-x64": ["@unrs/resolver-binding-darwin-x64@1.11.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ=="], + + "@unrs/resolver-binding-freebsd-x64": ["@unrs/resolver-binding-freebsd-x64@1.11.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw=="], + + "@unrs/resolver-binding-linux-arm-gnueabihf": ["@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1", "", { "os": "linux", "cpu": "arm" }, "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw=="], + + "@unrs/resolver-binding-linux-arm-musleabihf": ["@unrs/resolver-binding-linux-arm-musleabihf@1.11.1", "", { "os": "linux", "cpu": "arm" }, "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw=="], + + "@unrs/resolver-binding-linux-arm64-gnu": ["@unrs/resolver-binding-linux-arm64-gnu@1.11.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ=="], + + "@unrs/resolver-binding-linux-arm64-musl": ["@unrs/resolver-binding-linux-arm64-musl@1.11.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w=="], + + "@unrs/resolver-binding-linux-ppc64-gnu": ["@unrs/resolver-binding-linux-ppc64-gnu@1.11.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA=="], + + "@unrs/resolver-binding-linux-riscv64-gnu": ["@unrs/resolver-binding-linux-riscv64-gnu@1.11.1", "", { "os": "linux", "cpu": "none" }, "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ=="], + + "@unrs/resolver-binding-linux-riscv64-musl": ["@unrs/resolver-binding-linux-riscv64-musl@1.11.1", "", { "os": "linux", "cpu": "none" }, "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew=="], + + "@unrs/resolver-binding-linux-s390x-gnu": ["@unrs/resolver-binding-linux-s390x-gnu@1.11.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg=="], + + "@unrs/resolver-binding-linux-x64-gnu": ["@unrs/resolver-binding-linux-x64-gnu@1.11.1", "", { "os": "linux", "cpu": "x64" }, "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w=="], + + "@unrs/resolver-binding-linux-x64-musl": ["@unrs/resolver-binding-linux-x64-musl@1.11.1", "", { "os": "linux", "cpu": "x64" }, "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA=="], + + "@unrs/resolver-binding-wasm32-wasi": ["@unrs/resolver-binding-wasm32-wasi@1.11.1", "", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.11" }, "cpu": "none" }, "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ=="], + + "@unrs/resolver-binding-win32-arm64-msvc": ["@unrs/resolver-binding-win32-arm64-msvc@1.11.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw=="], + + "@unrs/resolver-binding-win32-ia32-msvc": ["@unrs/resolver-binding-win32-ia32-msvc@1.11.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ=="], + + "@unrs/resolver-binding-win32-x64-msvc": ["@unrs/resolver-binding-win32-x64-msvc@1.11.1", "", { "os": "win32", "cpu": "x64" }, "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g=="], + + "@vitejs/plugin-vue": ["@vitejs/plugin-vue@5.2.4", "", { "peerDependencies": { "vite": "^5.0.0 || ^6.0.0", "vue": "^3.2.25" } }, "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA=="], + + "@vue/compiler-core": ["@vue/compiler-core@3.5.25", "", { "dependencies": { "@babel/parser": "^7.28.5", "@vue/shared": "3.5.25", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-vay5/oQJdsNHmliWoZfHPoVZZRmnSWhug0BYT34njkYTPqClh3DNWLkZNJBVSjsNMrg0CCrBfoKkjZQPM/QVUw=="], + + "@vue/compiler-dom": ["@vue/compiler-dom@3.5.25", "", { "dependencies": { "@vue/compiler-core": "3.5.25", "@vue/shared": "3.5.25" } }, "sha512-4We0OAcMZsKgYoGlMjzYvaoErltdFI2/25wqanuTu+S4gismOTRTBPi4IASOjxWdzIwrYSjnqONfKvuqkXzE2Q=="], + + "@vue/compiler-sfc": ["@vue/compiler-sfc@3.5.25", "", { "dependencies": { "@babel/parser": "^7.28.5", "@vue/compiler-core": "3.5.25", "@vue/compiler-dom": "3.5.25", "@vue/compiler-ssr": "3.5.25", "@vue/shared": "3.5.25", "estree-walker": "^2.0.2", "magic-string": "^0.30.21", "postcss": "^8.5.6", "source-map-js": "^1.2.1" } }, "sha512-PUgKp2rn8fFsI++lF2sO7gwO2d9Yj57Utr5yEsDf3GNaQcowCLKL7sf+LvVFvtJDXUp/03+dC6f2+LCv5aK1ag=="], + + "@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.25", "", { "dependencies": { "@vue/compiler-dom": "3.5.25", "@vue/shared": "3.5.25" } }, "sha512-ritPSKLBcParnsKYi+GNtbdbrIE1mtuFEJ4U1sWeuOMlIziK5GtOL85t5RhsNy4uWIXPgk+OUdpnXiTdzn8o3A=="], + + "@vue/devtools-api": ["@vue/devtools-api@7.7.9", "", { "dependencies": { "@vue/devtools-kit": "^7.7.9" } }, "sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g=="], + + "@vue/devtools-kit": ["@vue/devtools-kit@7.7.9", "", { "dependencies": { "@vue/devtools-shared": "^7.7.9", "birpc": "^2.3.0", "hookable": "^5.5.3", "mitt": "^3.0.1", "perfect-debounce": "^1.0.0", "speakingurl": "^14.0.1", "superjson": "^2.2.2" } }, "sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA=="], + + "@vue/devtools-shared": ["@vue/devtools-shared@7.7.9", "", { "dependencies": { "rfdc": "^1.4.1" } }, "sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA=="], + + "@vue/reactivity": ["@vue/reactivity@3.5.25", "", { "dependencies": { "@vue/shared": "3.5.25" } }, "sha512-5xfAypCQepv4Jog1U4zn8cZIcbKKFka3AgWHEFQeK65OW+Ys4XybP6z2kKgws4YB43KGpqp5D/K3go2UPPunLA=="], + + "@vue/runtime-core": ["@vue/runtime-core@3.5.25", "", { "dependencies": { "@vue/reactivity": "3.5.25", "@vue/shared": "3.5.25" } }, "sha512-Z751v203YWwYzy460bzsYQISDfPjHTl+6Zzwo/a3CsAf+0ccEjQ8c+0CdX1WsumRTHeywvyUFtW6KvNukT/smA=="], + + "@vue/runtime-dom": ["@vue/runtime-dom@3.5.25", "", { "dependencies": { "@vue/reactivity": "3.5.25", "@vue/runtime-core": "3.5.25", "@vue/shared": "3.5.25", "csstype": "^3.1.3" } }, "sha512-a4WrkYFbb19i9pjkz38zJBg8wa/rboNERq3+hRRb0dHiJh13c+6kAbgqCPfMaJ2gg4weWD3APZswASOfmKwamA=="], + + "@vue/server-renderer": ["@vue/server-renderer@3.5.25", "", { "dependencies": { "@vue/compiler-ssr": "3.5.25", "@vue/shared": "3.5.25" }, "peerDependencies": { "vue": "3.5.25" } }, "sha512-UJaXR54vMG61i8XNIzTSf2Q7MOqZHpp8+x3XLGtE3+fL+nQd+k7O5+X3D/uWrnQXOdMw5VPih+Uremcw+u1woQ=="], + + "@vue/shared": ["@vue/shared@3.5.25", "", {}, "sha512-AbOPdQQnAnzs58H2FrrDxYj/TJfmeS2jdfEEhgiKINy+bnOANmVizIEgq1r+C5zsbs6l1CCQxtcj71rwNQ4jWg=="], + + "@vueuse/core": ["@vueuse/core@12.8.2", "", { "dependencies": { "@types/web-bluetooth": "^0.0.21", "@vueuse/metadata": "12.8.2", "@vueuse/shared": "12.8.2", "vue": "^3.5.13" } }, "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ=="], + + "@vueuse/integrations": ["@vueuse/integrations@12.8.2", "", { "dependencies": { "@vueuse/core": "12.8.2", "@vueuse/shared": "12.8.2", "vue": "^3.5.13" }, "peerDependencies": { "async-validator": "^4", "axios": "^1", "change-case": "^5", "drauu": "^0.4", "focus-trap": "^7", "fuse.js": "^7", "idb-keyval": "^6", "jwt-decode": "^4", "nprogress": "^0.2", "qrcode": "^1.5", "sortablejs": "^1", "universal-cookie": "^7" }, "optionalPeers": ["async-validator", "axios", "change-case", "drauu", "focus-trap", "fuse.js", "idb-keyval", "jwt-decode", "nprogress", "qrcode", "sortablejs", "universal-cookie"] }, "sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g=="], + + "@vueuse/metadata": ["@vueuse/metadata@12.8.2", "", {}, "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A=="], + + "@vueuse/shared": ["@vueuse/shared@12.8.2", "", { "dependencies": { "vue": "^3.5.13" } }, "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w=="], + + "JSONStream": ["JSONStream@1.3.2", "", { "dependencies": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" }, "bin": { "JSONStream": "./bin.js" } }, "sha512-mn0KSip7N4e0UDPZHnqDsHECo5uGQrixQKnAskOM1BIB8hd7QKbd6il8IPRPudPHOeHiECoCFqhyMaRO9+nWyA=="], + + "abbrev": ["abbrev@2.0.0", "", {}, "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ=="], + + "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + + "agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], + + "agentkeepalive": ["agentkeepalive@4.6.0", "", { "dependencies": { "humanize-ms": "^1.2.1" } }, "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ=="], + + "aggregate-error": ["aggregate-error@3.1.0", "", { "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" } }, "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA=="], + + "ajv": ["ajv@6.12.6", "", { "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" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + + "algoliasearch": ["algoliasearch@5.46.0", "", { "dependencies": { "@algolia/abtesting": "1.12.0", "@algolia/client-abtesting": "5.46.0", "@algolia/client-analytics": "5.46.0", "@algolia/client-common": "5.46.0", "@algolia/client-insights": "5.46.0", "@algolia/client-personalization": "5.46.0", "@algolia/client-query-suggestions": "5.46.0", "@algolia/client-search": "5.46.0", "@algolia/ingestion": "1.46.0", "@algolia/monitoring": "1.46.0", "@algolia/recommend": "5.46.0", "@algolia/requester-browser-xhr": "5.46.0", "@algolia/requester-fetch": "5.46.0", "@algolia/requester-node-http": "5.46.0" } }, "sha512-7ML6fa2K93FIfifG3GMWhDEwT5qQzPTmoHKCTvhzGEwdbQ4n0yYUWZlLYT75WllTGJCJtNUI0C1ybN4BCegqvg=="], + + "ansi-colors": ["ansi-colors@4.1.1", "", {}, "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA=="], + + "ansi-escapes": ["ansi-escapes@4.3.2", "", { "dependencies": { "type-fest": "^0.21.3" } }, "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ=="], + + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "ansis": ["ansis@3.17.0", "", {}, "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg=="], + + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], + + "append-transform": ["append-transform@2.0.0", "", { "dependencies": { "default-require-extensions": "^3.0.0" } }, "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg=="], + + "aproba": ["aproba@2.1.0", "", {}, "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew=="], + + "archy": ["archy@1.0.0", "", {}, "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw=="], + + "are-we-there-yet": ["are-we-there-yet@4.0.2", "", {}, "sha512-ncSWAawFhKMJDTdoAeOV+jyW1VCMj5QIAwULIBV0SSR7B/RLPPEQiknKcg/RIIZlUQrxELpsxMiTUoAQ4sIUyg=="], + + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "array-buffer-byte-length": ["array-buffer-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" } }, "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw=="], + + "array-from": ["array-from@2.1.1", "", {}, "sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg=="], + + "array-includes": ["array-includes@3.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.0", "es-object-atoms": "^1.1.1", "get-intrinsic": "^1.3.0", "is-string": "^1.1.1", "math-intrinsics": "^1.1.0" } }, "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ=="], + + "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="], + + "array.prototype.findlastindex": ["array.prototype.findlastindex@1.2.6", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-shim-unscopables": "^1.1.0" } }, "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ=="], + + "array.prototype.flat": ["array.prototype.flat@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg=="], + + "array.prototype.flatmap": ["array.prototype.flatmap@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg=="], + + "arraybuffer.prototype.slice": ["arraybuffer.prototype.slice@1.0.4", "", { "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" } }, "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ=="], + + "arrify": ["arrify@1.0.1", "", {}, "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA=="], + + "assertion-error": ["assertion-error@1.1.0", "", {}, "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw=="], + + "astral-regex": ["astral-regex@2.0.0", "", {}, "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="], + + "async": ["async@3.2.6", "", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="], + + "async-function": ["async-function@1.0.0", "", {}, "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA=="], + + "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], + + "at-least-node": ["at-least-node@1.0.0", "", {}, "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg=="], + + "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], + + "axios": ["axios@1.13.2", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "baseline-browser-mapping": ["baseline-browser-mapping@2.9.5", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-D5vIoztZOq1XM54LUdttJVc96ggEsIfju2JBvht06pSzpckp3C7HReun67Bghzrtdsq9XdMGbSSB3v3GhMNmAA=="], + + "before-after-hook": ["before-after-hook@2.2.3", "", {}, "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ=="], + + "bin-links": ["bin-links@4.0.4", "", { "dependencies": { "cmd-shim": "^6.0.0", "npm-normalize-package-bin": "^3.0.0", "read-cmd-shim": "^4.0.0", "write-file-atomic": "^5.0.0" } }, "sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA=="], + + "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], + + "bindings": ["bindings@1.5.0", "", { "dependencies": { "file-uri-to-path": "1.0.0" } }, "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ=="], + + "birpc": ["birpc@2.9.0", "", {}, "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw=="], + + "bl": ["bl@1.2.3", "", { "dependencies": { "readable-stream": "^2.3.5", "safe-buffer": "^5.1.1" } }, "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww=="], + + "bluebird": ["bluebird@3.7.2", "", {}, "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="], + + "blueimp-md5": ["blueimp-md5@2.19.0", "", {}, "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w=="], + + "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], + + "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "browser-stdout": ["browser-stdout@1.3.1", "", {}, "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw=="], + + "browserslist": ["browserslist@4.28.1", "", { "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA=="], + + "buffer-alloc": ["buffer-alloc@1.2.0", "", { "dependencies": { "buffer-alloc-unsafe": "^1.1.0", "buffer-fill": "^1.0.0" } }, "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow=="], + + "buffer-alloc-unsafe": ["buffer-alloc-unsafe@1.1.0", "", {}, "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg=="], + + "buffer-fill": ["buffer-fill@1.0.0", "", {}, "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ=="], + + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], + + "bun-types": ["bun-types@0.8.1", "", {}, "sha512-VuCBox66P/3a8gVOffLCWIS6vdpXq4y3eJuF3VnsyC5HpykmIjkcr5wYDn22qQdeTUmOfCcBy1SZmtrZCeUr3A=="], + + "cacache": ["cacache@17.1.4", "", { "dependencies": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", "glob": "^10.2.2", "lru-cache": "^7.7.1", "minipass": "^7.0.3", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^4.0.0", "ssri": "^10.0.0", "tar": "^6.1.11", "unique-filename": "^3.0.0" } }, "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A=="], + + "caching-transform": ["caching-transform@4.0.0", "", { "dependencies": { "hasha": "^5.0.0", "make-dir": "^3.0.0", "package-hash": "^4.0.0", "write-file-atomic": "^3.0.0" } }, "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA=="], + + "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="], + + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + + "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + + "camelcase": ["camelcase@5.3.1", "", {}, "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="], + + "camelcase-keys": ["camelcase-keys@6.2.2", "", { "dependencies": { "camelcase": "^5.3.1", "map-obj": "^4.0.0", "quick-lru": "^4.0.1" } }, "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001760", "", {}, "sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw=="], + + "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], + + "chai": ["chai@4.5.0", "", { "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.3", "deep-eql": "^4.1.3", "get-func-name": "^2.0.2", "loupe": "^2.3.6", "pathval": "^1.1.1", "type-detect": "^4.1.0" } }, "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw=="], + + "chai-as-promised": ["chai-as-promised@7.1.2", "", { "dependencies": { "check-error": "^1.0.2" }, "peerDependencies": { "chai": ">= 2.1.2 < 6" } }, "sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw=="], + + "chai-events": ["chai-events@0.0.1", "", { "dependencies": { "chai": "^3.5.0" } }, "sha512-z0T88ZW4syURwNVRtQDtb9yPDJDr0YTJlOOskgcMOYvwRQfBjiLotzQGi1J4PyRavLxAR5wp9V3aNph8hO4Ymw=="], + + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="], + + "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], + + "chardet": ["chardet@0.7.0", "", {}, "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="], + + "check-error": ["check-error@1.0.3", "", { "dependencies": { "get-func-name": "^2.0.2" } }, "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg=="], + + "chokidar": ["chokidar@3.5.3", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw=="], + + "chownr": ["chownr@1.1.4", "", {}, "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="], + + "clean-stack": ["clean-stack@3.0.1", "", { "dependencies": { "escape-string-regexp": "4.0.0" } }, "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg=="], + + "clean-stacktrace": ["clean-stacktrace@1.1.0", "", { "dependencies": { "stack-utils-node-internals": "^1.0.1" } }, "sha512-S8H9ouQL4PYkf/HM7498vxcAIMo9RgUf4rEuP9HrG6+FeRQ+dHV28c8iKGfmDSq/UQU0fnFiTDV/XCyfQz+U8g=="], + + "cli-cursor": ["cli-cursor@2.1.0", "", { "dependencies": { "restore-cursor": "^2.0.0" } }, "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw=="], + + "cli-spinners": ["cli-spinners@2.9.2", "", {}, "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg=="], + + "cli-table": ["cli-table@0.3.11", "", { "dependencies": { "colors": "1.0.3" } }, "sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ=="], + + "cli-table3": ["cli-table3@0.6.5", "", { "dependencies": { "string-width": "^4.2.0" }, "optionalDependencies": { "@colors/colors": "1.5.0" } }, "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ=="], + + "cli-truncate": ["cli-truncate@2.1.0", "", { "dependencies": { "slice-ansi": "^3.0.0", "string-width": "^4.2.0" } }, "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg=="], + + "cli-width": ["cli-width@2.2.1", "", {}, "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw=="], + + "cliui": ["cliui@6.0.0", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^6.2.0" } }, "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ=="], + + "clone": ["clone@2.1.2", "", {}, "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w=="], + + "cmd-shim": ["cmd-shim@6.0.3", "", {}, "sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "color-support": ["color-support@1.1.3", "", { "bin": { "color-support": "bin.js" } }, "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg=="], + + "colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="], + + "colors": ["colors@1.0.3", "", {}, "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw=="], + + "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], + + "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], + + "command-line-test": ["command-line-test@1.0.10", "", {}, "sha512-osdAsKGgEG457KlkGCMS4dPi7zJPPh8pZURhAmBcS3jO+prfYlQ6K0XagfGRGT1ztxfV2flNfBnGQz7kzHDlew=="], + + "commander": ["commander@14.0.2", "", {}, "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ=="], + + "common-ancestor-path": ["common-ancestor-path@1.0.1", "", {}, "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w=="], + + "commondir": ["commondir@1.0.1", "", {}, "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "concat-stream": ["concat-stream@1.6.2", "", { "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" } }, "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw=="], + + "console-control-strings": ["console-control-strings@1.1.0", "", {}, "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ=="], + + "convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], + + "copy-anything": ["copy-anything@4.0.5", "", { "dependencies": { "is-what": "^5.2.0" } }, "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA=="], + + "copy-dir": ["copy-dir@0.4.0", "", { "dependencies": { "mkdir-p": "~0.0.4" } }, "sha512-mIefrD97nE1XX2th570tR5UQvW6/92czEPGe+oTtrxPAJl+KOKLpzcRa+e38WEpmt/IUN1n65KvRMzPblR+fDQ=="], + + "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], + + "cosmiconfig": ["cosmiconfig@6.0.0", "", { "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.1.0", "parse-json": "^5.0.0", "path-type": "^4.0.0", "yaml": "^1.7.2" } }, "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg=="], + + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "css-select": ["css-select@5.2.2", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="], + + "css-what": ["css-what@6.2.2", "", {}, "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="], + + "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], + + "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], + + "data-view-buffer": ["data-view-buffer@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ=="], + + "data-view-byte-length": ["data-view-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ=="], + + "data-view-byte-offset": ["data-view-byte-offset@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" } }, "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ=="], + + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "decamelize": ["decamelize@1.2.0", "", {}, "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA=="], + + "decamelize-keys": ["decamelize-keys@1.1.1", "", { "dependencies": { "decamelize": "^1.1.0", "map-obj": "^1.0.0" } }, "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg=="], + + "deep-eql": ["deep-eql@4.1.4", "", { "dependencies": { "type-detect": "^4.0.0" } }, "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg=="], + + "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], + + "default-require-extensions": ["default-require-extensions@3.0.1", "", { "dependencies": { "strip-bom": "^4.0.0" } }, "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw=="], + + "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], + + "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], + + "delay": ["delay@5.0.0", "", {}, "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw=="], + + "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], + + "delegates": ["delegates@1.0.0", "", {}, "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ=="], + + "deprecation": ["deprecation@2.3.1", "", {}, "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ=="], + + "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], + + "detect-libc": ["detect-libc@1.0.3", "", { "bin": { "detect-libc": "./bin/detect-libc.js" } }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="], + + "detect-newline": ["detect-newline@3.1.0", "", {}, "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA=="], + + "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], + + "diff": ["diff@5.0.0", "", {}, "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w=="], + + "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="], + + "docker-modem": ["docker-modem@1.0.9", "", { "dependencies": { "JSONStream": "1.3.2", "debug": "^3.2.6", "readable-stream": "~1.0.26-4", "split-ca": "^1.0.0" } }, "sha512-lVjqCSCIAUDZPAZIeyM125HXfNvOmYYInciphNrLrylUtKyW66meAjSPXWchKVzoIYZx69TPnAepVSSkeawoIw=="], + + "dockerfile-ast": ["dockerfile-ast@0.6.1", "", { "dependencies": { "vscode-languageserver-textdocument": "^1.0.8", "vscode-languageserver-types": "^3.17.3" } }, "sha512-m3rH2qHHU2pSTCppXgJT+1KLxhvkdROOxVPof5Yz4IPGSw6K+x0B0/RFdYgXN5zsIUTlbOSRyfDCv3/uVhnNmg=="], + + "dockerfile-generator": ["dockerfile-generator@5.0.3", "", { "dependencies": { "jsonschema": "^1.4.0" } }, "sha512-Tc3OY/gP9DSPwbB+9DAaG01usN67bY2yBYHJGAYq7sgMEAOnETKVDaEqfTqRIRGvyTbP+jz9JQTUoTihQZqhUQ=="], + + "dockerfile-utils": ["dockerfile-utils@0.15.0", "", { "dependencies": { "dockerfile-ast": "0.6.1", "vscode-languageserver-textdocument": "^1.0.8", "vscode-languageserver-types": "^3.17.3" }, "bin": { "dockerfile-utils": "bin/dockerfile-utils" } }, "sha512-hV2OExB797C3/GlOloywmMZzu3MPmzMziGuCaPWh/m9qHgTyfN4+EI3b6xhHDXy78PU0GqwvHnZVX7wfpqOCkg=="], + + "dockerode": ["dockerode@2.5.8", "", { "dependencies": { "concat-stream": "~1.6.2", "docker-modem": "^1.0.8", "tar-fs": "~1.16.3" } }, "sha512-+7iOUYBeDTScmOmQqpUYQaE7F4vvIt6+gIZNHWhqAQEI887tiPFB9OvXI/HzQYqfUNvukMK+9myLW63oTJPZpw=="], + + "doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="], + + "dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="], + + "domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], + + "domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="], + + "domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="], + + "dot": ["dot@1.1.3", "", { "bin": { "dottojs": "./bin/dot-packer" } }, "sha512-/nt74Rm+PcfnirXGEdhZleTwGC2LMnuKTeeTIlI82xb5loBBoXNYzr2ezCroPSMtilK8EZIfcNZwOcHN+ib1Lg=="], + + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], + + "ejs": ["ejs@3.1.10", "", { "dependencies": { "jake": "^10.8.5" }, "bin": { "ejs": "bin/cli.js" } }, "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA=="], + + "electron-to-chromium": ["electron-to-chromium@1.5.267", "", {}, "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw=="], + + "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "emoji-regex-xs": ["emoji-regex-xs@1.0.0", "", {}, "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg=="], + + "encoding": ["encoding@0.1.13", "", { "dependencies": { "iconv-lite": "^0.6.2" } }, "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A=="], + + "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="], + + "enquirer": ["enquirer@2.4.1", "", { "dependencies": { "ansi-colors": "^4.1.1", "strip-ansi": "^6.0.1" } }, "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ=="], + + "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + + "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], + + "err-code": ["err-code@2.0.3", "", {}, "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA=="], + + "error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="], + + "es-abstract": ["es-abstract@1.24.0", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.3.0", "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.19" } }, "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg=="], + + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + + "es-semver": ["es-semver@1.0.1", "", { "bin": { "semver": "./bin/semver" } }, "sha512-SSQuJFYpMRCAYZFk2p5Y7/xP2Kbs9bJsdQoGt05IzLGWemMzEKvJWVI+qATFVABJbIhuZd1cEKXczxNG3KgvlQ=="], + + "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], + + "es-shim-unscopables": ["es-shim-unscopables@1.1.0", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw=="], + + "es-to-primitive": ["es-to-primitive@1.3.0", "", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="], + + "es6-error": ["es6-error@4.1.1", "", {}, "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg=="], + + "esbuild": ["esbuild@0.21.5", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.21.5", "@esbuild/android-arm": "0.21.5", "@esbuild/android-arm64": "0.21.5", "@esbuild/android-x64": "0.21.5", "@esbuild/darwin-arm64": "0.21.5", "@esbuild/darwin-x64": "0.21.5", "@esbuild/freebsd-arm64": "0.21.5", "@esbuild/freebsd-x64": "0.21.5", "@esbuild/linux-arm": "0.21.5", "@esbuild/linux-arm64": "0.21.5", "@esbuild/linux-ia32": "0.21.5", "@esbuild/linux-loong64": "0.21.5", "@esbuild/linux-mips64el": "0.21.5", "@esbuild/linux-ppc64": "0.21.5", "@esbuild/linux-riscv64": "0.21.5", "@esbuild/linux-s390x": "0.21.5", "@esbuild/linux-x64": "0.21.5", "@esbuild/netbsd-x64": "0.21.5", "@esbuild/openbsd-x64": "0.21.5", "@esbuild/sunos-x64": "0.21.5", "@esbuild/win32-arm64": "0.21.5", "@esbuild/win32-ia32": "0.21.5", "@esbuild/win32-x64": "0.21.5" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw=="], + + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + + "eslint": ["eslint@9.39.2", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.1", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.39.2", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw=="], + + "eslint-config-flat-gitignore": ["eslint-config-flat-gitignore@2.1.0", "", { "dependencies": { "@eslint/compat": "^1.2.5" }, "peerDependencies": { "eslint": "^9.5.0" } }, "sha512-cJzNJ7L+psWp5mXM7jBX+fjHtBvvh06RBlcweMhKD8jWqQw0G78hOW5tpVALGHGFPsBV+ot2H+pdDGJy6CV8pA=="], + + "eslint-config-prettier": ["eslint-config-prettier@10.1.8", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w=="], + + "eslint-import-resolver-exports": ["eslint-import-resolver-exports@1.0.0-beta.5", "", { "dependencies": { "resolve.exports": "^2.0.0" }, "peerDependencies": { "eslint": "*", "eslint-plugin-import": "*" } }, "sha512-o6t0w7muUpXr7MkUVzD5igQoDfAQvTmcPp8HEAJdNF8eOuAO+yn6I/TTyMxz9ecCwzX7e02vzlkHURoScUuidg=="], + + "eslint-import-resolver-node": ["eslint-import-resolver-node@0.3.9", "", { "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", "resolve": "^1.22.4" } }, "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g=="], + + "eslint-import-resolver-typescript": ["eslint-import-resolver-typescript@3.10.1", "", { "dependencies": { "@nolyfill/is-core-module": "1.0.39", "debug": "^4.4.0", "get-tsconfig": "^4.10.0", "is-bun-module": "^2.0.0", "stable-hash": "^0.0.5", "tinyglobby": "^0.2.13", "unrs-resolver": "^1.6.2" }, "peerDependencies": { "eslint": "*", "eslint-plugin-import": "*", "eslint-plugin-import-x": "*" }, "optionalPeers": ["eslint-plugin-import", "eslint-plugin-import-x"] }, "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ=="], + + "eslint-import-resolver-typescript-bun": ["eslint-import-resolver-typescript-bun@0.0.104", "", { "dependencies": { "debug": "^4.3.6", "eslint-import-resolver-typescript": "^3.6.3" }, "peerDependencies": { "bun-types": "^0.8.1" } }, "sha512-sikZSFGoc9qDcJnDCMtVE1DFslbd2u8dZ7AsL4zIWhzWMcUAUoqAGhxxKHZNQebmHczU7IKBSRmDMjrE7TOS8w=="], + + "eslint-module-utils": ["eslint-module-utils@2.12.1", "", { "dependencies": { "debug": "^3.2.7" } }, "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw=="], + + "eslint-plugin-import": ["eslint-plugin-import@2.32.0", "", { "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", "array.prototype.findlastindex": "^1.2.6", "array.prototype.flat": "^1.3.3", "array.prototype.flatmap": "^1.3.3", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.12.1", "hasown": "^2.0.2", "is-core-module": "^2.16.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", "object.values": "^1.2.1", "semver": "^6.3.1", "string.prototype.trimend": "^1.0.9", "tsconfig-paths": "^3.15.0" }, "peerDependencies": { "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA=="], + + "eslint-plugin-prettier": ["eslint-plugin-prettier@5.5.4", "", { "dependencies": { "prettier-linter-helpers": "^1.0.0", "synckit": "^0.11.7" }, "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", "prettier": ">=3.0.0" }, "optionalPeers": ["@types/eslint", "eslint-config-prettier"] }, "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg=="], + + "eslint-plugin-vue": ["eslint-plugin-vue@10.6.2", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "natural-compare": "^1.4.0", "nth-check": "^2.1.1", "postcss-selector-parser": "^7.1.0", "semver": "^7.6.3", "xml-name-validator": "^4.0.0" }, "peerDependencies": { "@stylistic/eslint-plugin": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", "@typescript-eslint/parser": "^7.0.0 || ^8.0.0", "eslint": "^8.57.0 || ^9.0.0", "vue-eslint-parser": "^10.0.0" }, "optionalPeers": ["@stylistic/eslint-plugin", "@typescript-eslint/parser"] }, "sha512-nA5yUs/B1KmKzvC42fyD0+l9Yd+LtEpVhWRbXuDj0e+ZURcTtyRbMDWUeJmTAh2wC6jC83raS63anNM2YT3NPw=="], + + "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], + + "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + + "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + + "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + + "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], + + "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], + + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + + "estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + + "eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], + + "exponential-backoff": ["exponential-backoff@3.1.3", "", {}, "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA=="], + + "extend-shallow": ["extend-shallow@2.0.1", "", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="], + + "external-editor": ["external-editor@3.1.0", "", { "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" } }, "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-diff": ["fast-diff@1.3.0", "", {}, "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw=="], + + "fast-glob": ["fast-glob@3.3.3", "", { "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" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + + "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], + + "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], + + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], + + "feed": ["feed@4.2.2", "", { "dependencies": { "xml-js": "^1.6.11" } }, "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ=="], + + "figlet": ["figlet@1.9.4", "", { "dependencies": { "commander": "^14.0.0" }, "bin": { "figlet": "bin/index.js" } }, "sha512-uN6QE+TrzTAHC1IWTyrc4FfGo2KH/82J8Jl1tyKB7+z5DBit/m3D++Iu5lg91qJMnQQ3vpJrj5gxcK/pk4R9tQ=="], + + "figures": ["figures@3.2.0", "", { "dependencies": { "escape-string-regexp": "^1.0.5" } }, "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg=="], + + "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], + + "file-uri-to-path": ["file-uri-to-path@1.0.0", "", {}, "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="], + + "filelist": ["filelist@1.0.4", "", { "dependencies": { "minimatch": "^5.0.1" } }, "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "find-cache-dir": ["find-cache-dir@3.3.2", "", { "dependencies": { "commondir": "^1.0.1", "make-dir": "^3.0.2", "pkg-dir": "^4.1.0" } }, "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig=="], + + "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], + + "flat": ["flat@5.0.2", "", { "bin": { "flat": "cli.js" } }, "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ=="], + + "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], + + "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], + + "focus-trap": ["focus-trap@7.6.6", "", { "dependencies": { "tabbable": "^6.3.0" } }, "sha512-v/Z8bvMCajtx4mEXmOo7QEsIzlIOqRXTIwgUfsFOF9gEsespdbD0AkPIka1bSXZ8Y8oZ+2IVDQZePkTfEHZl7Q=="], + + "follow-redirects": ["follow-redirects@1.15.11", "", {}, "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ=="], + + "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], + + "foreground-child": ["foreground-child@2.0.0", "", { "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^3.0.2" } }, "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA=="], + + "form-data": ["form-data@4.0.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="], + + "fromentries": ["fromentries@1.3.2", "", {}, "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg=="], + + "fs-constants": ["fs-constants@1.0.0", "", {}, "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="], + + "fs-extra": ["fs-extra@11.3.2", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A=="], + + "fs-minipass": ["fs-minipass@3.0.3", "", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw=="], + + "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "function.prototype.name": ["function.prototype.name@1.1.8", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "functions-have-names": "^1.2.3", "hasown": "^2.0.2", "is-callable": "^1.2.7" } }, "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q=="], + + "functions-have-names": ["functions-have-names@1.2.3", "", {}, "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="], + + "gauge": ["gauge@5.0.2", "", { "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.3", "console-control-strings": "^1.1.0", "has-unicode": "^2.0.1", "signal-exit": "^4.0.1", "string-width": "^4.2.3", "strip-ansi": "^6.0.1", "wide-align": "^1.1.5" } }, "sha512-pMaFftXPtiGIHCJHdcUUx9Rby/rFT/Kkt3fIIGCs+9PMDIljSyRiqraTlxNtBReJRDfUefpa263RQ3vnp5G/LQ=="], + + "generate-robotstxt": ["generate-robotstxt@8.0.3", "", { "dependencies": { "cosmiconfig": "^6.0.0", "fs-extra": "^9.0.0", "ip-regex": "^4.1.0", "is-absolute-url": "^3.0.3", "meow": "^7.0.1", "resolve-from": "^5.0.0" }, "bin": { "generate-robotstxt": "dist/cli.js" } }, "sha512-iD//oAVKcHOCz9M0IiT3pyUiF2uN1qvL3qaTA8RGLz7NU7l0XVwyzd3rN+tzhB657DNUgrygXt9w8+0zkTMFrg=="], + + "generator-function": ["generator-function@2.0.1", "", {}, "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g=="], + + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + + "get-func-name": ["get-func-name@2.0.2", "", {}, "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ=="], + + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + + "get-package-type": ["get-package-type@0.1.0", "", {}, "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q=="], + + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + + "get-symbol-description": ["get-symbol-description@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg=="], + + "get-tsconfig": ["get-tsconfig@4.13.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ=="], + + "glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + + "globals": ["globals@16.5.0", "", {}, "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ=="], + + "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], + + "globby": ["globby@11.1.0", "", { "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" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], + + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "gravatar-url": ["gravatar-url@4.0.1", "", { "dependencies": { "md5-hex": "^4.0.0", "type-fest": "^1.0.2" } }, "sha512-AiU83cghGg2D8vAUwrMXCByejkkm4RtLwMNGmPU7VhqBYhsxcBCV0SAzRpYNbUCpTci5v46J/KFKPmDYaG2oyA=="], + + "gray-matter": ["gray-matter@4.0.3", "", { "dependencies": { "js-yaml": "^3.13.1", "kind-of": "^6.0.2", "section-matter": "^1.0.0", "strip-bom-string": "^1.0.0" } }, "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q=="], + + "growl": ["growl@1.10.5", "", {}, "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA=="], + + "hard-rejection": ["hard-rejection@2.1.0", "", {}, "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA=="], + + "has-ansi": ["has-ansi@2.0.0", "", { "dependencies": { "ansi-regex": "^2.0.0" } }, "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg=="], + + "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], + + "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], + + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], + + "has-unicode": ["has-unicode@2.0.1", "", {}, "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ=="], + + "hasha": ["hasha@5.2.2", "", { "dependencies": { "is-stream": "^2.0.0", "type-fest": "^0.8.0" } }, "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "hast-util-to-html": ["hast-util-to-html@9.0.5", "", { "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" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="], + + "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="], + + "he": ["he@1.2.0", "", { "bin": { "he": "bin/he" } }, "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="], + + "hookable": ["hookable@5.5.3", "", {}, "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ=="], + + "hosted-git-info": ["hosted-git-info@6.1.3", "", { "dependencies": { "lru-cache": "^7.5.1" } }, "sha512-HVJyzUrLIL1c0QmviVh5E8VGyUS7xCFPS6yydaVd1UegW+ibV/CohqTH9MkOLDp5o+rb82DMo77PTuc9F/8GKw=="], + + "html-escaper": ["html-escaper@2.0.2", "", {}, "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="], + + "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="], + + "http-cache-semantics": ["http-cache-semantics@4.2.0", "", {}, "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="], + + "http-proxy-agent": ["http-proxy-agent@5.0.0", "", { "dependencies": { "@tootallnate/once": "2", "agent-base": "6", "debug": "4" } }, "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w=="], + + "https-proxy-agent": ["https-proxy-agent@5.0.1", "", { "dependencies": { "agent-base": "6", "debug": "4" } }, "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA=="], + + "humanize-ms": ["humanize-ms@1.2.1", "", { "dependencies": { "ms": "^2.0.0" } }, "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ=="], + + "iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], + + "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "ignore-walk": ["ignore-walk@6.0.5", "", { "dependencies": { "minimatch": "^9.0.0" } }, "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A=="], + + "immutable": ["immutable@5.1.4", "", {}, "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA=="], + + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + + "indent-string": ["indent-string@4.0.0", "", {}, "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="], + + "infer-owner": ["infer-owner@1.0.4", "", {}, "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A=="], + + "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "ini": ["ini@2.0.0", "", {}, "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA=="], + + "inquirer": ["inquirer@6.5.2", "", { "dependencies": { "ansi-escapes": "^3.2.0", "chalk": "^2.4.2", "cli-cursor": "^2.1.0", "cli-width": "^2.0.0", "external-editor": "^3.0.3", "figures": "^2.0.0", "lodash": "^4.17.12", "mute-stream": "0.0.7", "run-async": "^2.2.0", "rxjs": "^6.4.0", "string-width": "^2.1.0", "strip-ansi": "^5.1.0", "through": "^2.3.6" } }, "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ=="], + + "inquirer-autocomplete-prompt": ["inquirer-autocomplete-prompt@1.4.0", "", { "dependencies": { "ansi-escapes": "^4.3.1", "chalk": "^4.0.0", "figures": "^3.2.0", "run-async": "^2.4.0", "rxjs": "^6.6.2" }, "peerDependencies": { "inquirer": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-qHgHyJmbULt4hI+kCmwX92MnSxDs/Yhdt4wPA30qnoa01OF6uTXV8yvH4hKXgdaTNmkZ9D01MHjqKYEuJN+ONw=="], + + "internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="], + + "interpret": ["interpret@1.4.0", "", {}, "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA=="], + + "ip-address": ["ip-address@10.1.0", "", {}, "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q=="], + + "ip-regex": ["ip-regex@4.3.0", "", {}, "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q=="], + + "is-absolute-url": ["is-absolute-url@3.0.3", "", {}, "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q=="], + + "is-array-buffer": ["is-array-buffer@3.0.5", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A=="], + + "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], + + "is-async-function": ["is-async-function@2.1.1", "", { "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ=="], + + "is-bigint": ["is-bigint@1.1.0", "", { "dependencies": { "has-bigints": "^1.0.2" } }, "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ=="], + + "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], + + "is-boolean-object": ["is-boolean-object@1.2.2", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A=="], + + "is-bun-module": ["is-bun-module@2.0.0", "", { "dependencies": { "semver": "^7.7.1" } }, "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ=="], + + "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], + + "is-class": ["is-class@0.0.9", "", {}, "sha512-kUfRnejcRC9YLgblxoJ76dp9gZ3vMKTrDS5I6z2UVMOsHHSImNKCJocjQTkZr38PwiSZ9LVklaHEENaVYeFTXg=="], + + "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], + + "is-data-view": ["is-data-view@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" } }, "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw=="], + + "is-date-object": ["is-date-object@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg=="], + + "is-docker": ["is-docker@4.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA=="], + + "is-electron": ["is-electron@2.2.2", "", {}, "sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg=="], + + "is-extendable": ["is-extendable@0.1.1", "", {}, "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-finalizationregistry": ["is-finalizationregistry@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "is-generator-function": ["is-generator-function@1.1.2", "", { "dependencies": { "call-bound": "^1.0.4", "generator-function": "^2.0.0", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-interactive": ["is-interactive@2.0.0", "", {}, "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ=="], + + "is-lambda": ["is-lambda@1.0.1", "", {}, "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ=="], + + "is-map": ["is-map@2.0.3", "", {}, "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw=="], + + "is-negative-zero": ["is-negative-zero@2.0.3", "", {}, "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-number-object": ["is-number-object@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw=="], + + "is-plain-obj": ["is-plain-obj@2.1.0", "", {}, "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA=="], + + "is-plain-object": ["is-plain-object@5.0.0", "", {}, "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="], + + "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="], + + "is-root": ["is-root@3.0.0", "", {}, "sha512-C13bL54yQdgniduW8KFe81ttgQINcwMgil/zyNuDzr/xjIyDMkcvcc9dON62RH9VBAHOI7le+lTo/U3PY3irwg=="], + + "is-set": ["is-set@2.0.3", "", {}, "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg=="], + + "is-shared-array-buffer": ["is-shared-array-buffer@1.0.4", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A=="], + + "is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], + + "is-string": ["is-string@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA=="], + + "is-symbol": ["is-symbol@1.1.1", "", { "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", "safe-regex-test": "^1.1.0" } }, "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w=="], + + "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="], + + "is-typedarray": ["is-typedarray@1.0.0", "", {}, "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="], + + "is-unicode-supported": ["is-unicode-supported@0.1.0", "", {}, "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw=="], + + "is-weakmap": ["is-weakmap@2.0.2", "", {}, "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w=="], + + "is-weakref": ["is-weakref@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew=="], + + "is-weakset": ["is-weakset@2.0.4", "", { "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ=="], + + "is-what": ["is-what@5.5.0", "", {}, "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw=="], + + "is-windows": ["is-windows@1.0.2", "", {}, "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="], + + "is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + + "isarray": ["isarray@0.0.1", "", {}, "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "istanbul-lib-coverage": ["istanbul-lib-coverage@3.2.2", "", {}, "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg=="], + + "istanbul-lib-hook": ["istanbul-lib-hook@3.0.0", "", { "dependencies": { "append-transform": "^2.0.0" } }, "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ=="], + + "istanbul-lib-instrument": ["istanbul-lib-instrument@4.0.3", "", { "dependencies": { "@babel/core": "^7.7.5", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.0.0", "semver": "^6.3.0" } }, "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ=="], + + "istanbul-lib-processinfo": ["istanbul-lib-processinfo@2.0.3", "", { "dependencies": { "archy": "^1.0.0", "cross-spawn": "^7.0.3", "istanbul-lib-coverage": "^3.2.0", "p-map": "^3.0.0", "rimraf": "^3.0.0", "uuid": "^8.3.2" } }, "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg=="], + + "istanbul-lib-report": ["istanbul-lib-report@3.0.1", "", { "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", "supports-color": "^7.1.0" } }, "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw=="], + + "istanbul-lib-source-maps": ["istanbul-lib-source-maps@4.0.1", "", { "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" } }, "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw=="], + + "istanbul-reports": ["istanbul-reports@3.2.0", "", { "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" } }, "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA=="], + + "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], + + "jake": ["jake@10.9.4", "", { "dependencies": { "async": "^3.2.6", "filelist": "^1.0.4", "picocolors": "^1.1.1" }, "bin": { "jake": "bin/cli.js" } }, "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA=="], + + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], + + "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + + "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], + + "json-parse-even-better-errors": ["json-parse-even-better-errors@3.0.2", "", {}, "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ=="], + + "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], + + "json-stringify-nice": ["json-stringify-nice@1.1.4", "", {}, "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw=="], + + "json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], + + "jsonfile": ["jsonfile@2.4.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw=="], + + "jsonparse": ["jsonparse@1.3.1", "", {}, "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg=="], + + "jsonschema": ["jsonschema@1.5.0", "", {}, "sha512-K+A9hhqbn0f3pJX17Q/7H6yQfD/5OXgdrR5UE12gMXCiN9D5Xq2o5mddV2QEcX/bjla99ASsAAQUyMCCRWAEhw=="], + + "just-diff": ["just-diff@6.0.2", "", {}, "sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA=="], + + "just-diff-apply": ["just-diff-apply@5.5.0", "", {}, "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw=="], + + "just-extend": ["just-extend@4.2.1", "", {}, "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg=="], + + "kebabcase-keys": ["kebabcase-keys@1.0.0", "", { "dependencies": { "lodash.kebabcase": "^4.1.1", "map-obj": "^3.0.0", "quick-lru": "^1.0.0" } }, "sha512-SsAYzJjJj96kMgKg8dOolzaeRbZQLzdyftDBg69zwK61vMggK0pngdlmlkcdq7A2mIe3glymyi0+Jn29s2yAfw=="], + + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + + "kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="], + + "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], + + "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="], + + "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], + + "listr2": ["listr2@6.6.1", "", { "dependencies": { "cli-truncate": "^3.1.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^5.0.1", "rfdc": "^1.3.0", "wrap-ansi": "^8.1.0" }, "peerDependencies": { "enquirer": ">= 2.3.0 < 3" }, "optionalPeers": ["enquirer"] }, "sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg=="], + + "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + + "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], + + "lodash-es": ["lodash-es@4.17.21", "", {}, "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="], + + "lodash.flattendeep": ["lodash.flattendeep@4.4.0", "", {}, "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ=="], + + "lodash.get": ["lodash.get@4.4.2", "", {}, "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ=="], + + "lodash.kebabcase": ["lodash.kebabcase@4.1.1", "", {}, "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g=="], + + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + + "log-symbols": ["log-symbols@4.1.0", "", { "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" } }, "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg=="], + + "log-update": ["log-update@4.0.0", "", { "dependencies": { "ansi-escapes": "^4.3.0", "cli-cursor": "^3.1.0", "slice-ansi": "^4.0.0", "wrap-ansi": "^6.2.0" } }, "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg=="], + + "lolex": ["lolex@2.7.5", "", {}, "sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q=="], + + "loupe": ["loupe@2.3.7", "", { "dependencies": { "get-func-name": "^2.0.1" } }, "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA=="], + + "lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="], + + "mac-ca": ["mac-ca@3.1.3", "", { "dependencies": { "node-forge": "^1.3.1", "undici": "^6.16.1" } }, "sha512-yAdth+3TAfAyYYxNlnIJxKJbNOVvn9ZiQ1C9XJAj8ThKBBd5hu581sFjld3wr4DSrHcQwn7rt+t6dLiB+vFEFQ=="], + + "macos-export-certificate-and-key": ["macos-export-certificate-and-key@1.2.4", "", { "dependencies": { "bindings": "^1.5.0", "node-addon-api": "^4.3.0" }, "os": "darwin" }, "sha512-y5QZEywlBNKd+EhPZ1Hz1FmDbbeQKtuVHJaTlawdl7vXw9bi/4tJB2xSMwX4sMVcddy3gbQ8K0IqXAi2TpDo2g=="], + + "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], + + "make-dir": ["make-dir@3.1.0", "", { "dependencies": { "semver": "^6.0.0" } }, "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw=="], + + "make-fetch-happen": ["make-fetch-happen@11.1.1", "", { "dependencies": { "agentkeepalive": "^4.2.1", "cacache": "^17.0.0", "http-cache-semantics": "^4.1.1", "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", "lru-cache": "^7.7.1", "minipass": "^5.0.0", "minipass-fetch": "^3.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", "promise-retry": "^2.0.1", "socks-proxy-agent": "^7.0.0", "ssri": "^10.0.0" } }, "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w=="], + + "map-obj": ["map-obj@3.1.0", "", {}, "sha512-Xg1iyYz/+iIW6YoMldux47H/e5QZyDSB41Kb0ev+YYHh3FJnyyzY0vTk/WbVeWcCvdXd70cOriUBmhP8alUFBA=="], + + "mark.js": ["mark.js@8.11.1", "", {}, "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ=="], + + "markdown-it-container": ["markdown-it-container@4.0.0", "", {}, "sha512-HaNccxUH0l7BNGYbFbjmGpf5aLHAMTinqRZQAEQbMr2cdD3z91Q6kIo1oUn1CQndkT03jat6ckrdRYuwwqLlQw=="], + + "marked": ["marked@4.3.0", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A=="], + + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + + "md5-hex": ["md5-hex@4.0.0", "", { "dependencies": { "blueimp-md5": "^2.18.0" } }, "sha512-di38zHPn4Tz8LCb5Lz8SpLb/20Hv23aPXpF4Bq1mR5r9JuCZQ/JpcDUxFfZF9Ur5GiUvqS5NQOkR+fm5cYZ0IQ=="], + + "mdast-util-to-hast": ["mdast-util-to-hast@13.2.1", "", { "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" } }, "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA=="], + + "meow": ["meow@7.1.1", "", { "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": "^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" } }, "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="], + + "micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="], + + "micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "mimic-fn": ["mimic-fn@1.2.0", "", {}, "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="], + + "min-indent": ["min-indent@1.0.1", "", {}, "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg=="], + + "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + + "minimist-options": ["minimist-options@4.1.0", "", { "dependencies": { "arrify": "^1.0.1", "is-plain-obj": "^1.1.0", "kind-of": "^6.0.3" } }, "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A=="], + + "minipass": ["minipass@5.0.0", "", {}, "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="], + + "minipass-collect": ["minipass-collect@1.0.2", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA=="], + + "minipass-fetch": ["minipass-fetch@3.0.5", "", { "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" }, "optionalDependencies": { "encoding": "^0.1.13" } }, "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg=="], + + "minipass-flush": ["minipass-flush@1.0.5", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw=="], + + "minipass-json-stream": ["minipass-json-stream@1.0.2", "", { "dependencies": { "jsonparse": "^1.3.1", "minipass": "^3.0.0" } }, "sha512-myxeeTm57lYs8pH2nxPzmEEg8DGIgW+9mv6D4JZD2pa81I/OBjeU7PtICXV6c9eRGTA5JMDsuIPUZRCyBMYNhg=="], + + "minipass-pipeline": ["minipass-pipeline@1.2.4", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A=="], + + "minipass-sized": ["minipass-sized@1.0.3", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g=="], + + "minisearch": ["minisearch@7.2.0", "", {}, "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg=="], + + "minizlib": ["minizlib@2.1.2", "", { "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="], + + "mitt": ["mitt@3.0.1", "", {}, "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="], + + "mkcert": ["mkcert@3.2.0", "", { "dependencies": { "commander": "^11.0.0", "node-forge": "^1.3.1" }, "bin": { "mkcert": "dist/cli.js" } }, "sha512-026Eivq9RoOjOuLJGzbhGwXUAjBxRX11Z7Jbm4/7lqT/Av+XNy9SPrJte6+UpEt7i+W3e/HZYxQqlQcqXZWSzg=="], + + "mkdir-p": ["mkdir-p@0.0.7", "", {}, "sha512-VkWaZNxDgZle/aJAemUAWdyYX7geyuleKYFfRejf/pFKjxBDbWrMAy41ijg5EiI1U00WR9JcvynuDedE/fTxLA=="], + + "mkdirp": ["mkdirp@0.5.6", "", { "dependencies": { "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw=="], + + "mocha": ["mocha@9.2.2", "", { "dependencies": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", "chokidar": "3.5.3", "debug": "4.3.3", "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", "glob": "7.2.0", "growl": "1.10.5", "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", "minimatch": "4.2.1", "ms": "2.1.3", "nanoid": "3.3.1", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", "which": "2.0.2", "workerpool": "6.2.0", "yargs": "16.2.0", "yargs-parser": "20.2.4", "yargs-unparser": "2.0.0" }, "bin": { "mocha": "bin/mocha", "_mocha": "bin/_mocha" } }, "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g=="], + + "mock-fs": ["mock-fs@5.5.0", "", {}, "sha512-d/P1M/RacgM3dB0sJ8rjeRNXxtapkPCUnMGmIN0ixJ16F/E4GUZCvWcSGfWGz8eaXYvn1s9baUwNjI4LOPEjiA=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "mute-stream": ["mute-stream@0.0.7", "", {}, "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ=="], + + "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + + "napi-postinstall": ["napi-postinstall@0.3.4", "", { "bin": { "napi-postinstall": "lib/cli.js" } }, "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ=="], + + "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], + + "nconf": ["nconf@0.13.0", "", { "dependencies": { "async": "^3.0.0", "ini": "^2.0.0", "secure-keys": "^1.0.0", "yargs": "^16.1.1" } }, "sha512-hJ/u2xCpA663h6xyOiztx3y+lg9eU0rdkwJ+c4FtiHo2g/gB0sjXtW31yTdMLWLOIj1gL2FcJMwfOqouuUK/Wg=="], + + "negotiator": ["negotiator@0.6.4", "", {}, "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w=="], + + "nise": ["nise@1.5.3", "", { "dependencies": { "@sinonjs/formatio": "^3.2.1", "@sinonjs/text-encoding": "^0.7.1", "just-extend": "^4.0.2", "lolex": "^5.0.1", "path-to-regexp": "^1.7.0" } }, "sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ=="], + + "node-addon-api": ["node-addon-api@4.3.0", "", {}, "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ=="], + + "node-cache": ["node-cache@4.2.1", "", { "dependencies": { "clone": "2.x", "lodash": "^4.17.15" } }, "sha512-BOb67bWg2dTyax5kdef5WfU3X8xu4wPg+zHzkvls0Q/QpYycIFRLEEIdAx9Wma43DxG6Qzn4illdZoYseKWa4A=="], + + "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], + + "node-forge": ["node-forge@1.3.3", "", {}, "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg=="], + + "node-gyp": ["node-gyp@9.4.1", "", { "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", "glob": "^7.1.4", "graceful-fs": "^4.2.6", "make-fetch-happen": "^10.0.3", "nopt": "^6.0.0", "npmlog": "^6.0.0", "rimraf": "^3.0.2", "semver": "^7.3.5", "tar": "^6.1.2", "which": "^2.0.2" }, "bin": { "node-gyp": "bin/node-gyp.js" } }, "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ=="], + + "node-html-parser": ["node-html-parser@6.1.13", "", { "dependencies": { "css-select": "^5.1.0", "he": "1.2.0" } }, "sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg=="], + + "node-preload": ["node-preload@0.2.1", "", { "dependencies": { "process-on-spawn": "^1.0.0" } }, "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ=="], + + "node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], + + "nopt": ["nopt@7.2.1", "", { "dependencies": { "abbrev": "^2.0.0" }, "bin": { "nopt": "bin/nopt.js" } }, "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w=="], + + "normalize-package-data": ["normalize-package-data@5.0.0", "", { "dependencies": { "hosted-git-info": "^6.0.0", "is-core-module": "^2.8.1", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" } }, "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q=="], + + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + + "npm-bundled": ["npm-bundled@3.0.1", "", { "dependencies": { "npm-normalize-package-bin": "^3.0.0" } }, "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ=="], + + "npm-install-checks": ["npm-install-checks@6.3.0", "", { "dependencies": { "semver": "^7.1.1" } }, "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw=="], + + "npm-normalize-package-bin": ["npm-normalize-package-bin@3.0.1", "", {}, "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ=="], + + "npm-package-arg": ["npm-package-arg@11.0.3", "", { "dependencies": { "hosted-git-info": "^7.0.0", "proc-log": "^4.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^5.0.0" } }, "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw=="], + + "npm-packlist": ["npm-packlist@7.0.4", "", { "dependencies": { "ignore-walk": "^6.0.0" } }, "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q=="], + + "npm-pick-manifest": ["npm-pick-manifest@8.0.2", "", { "dependencies": { "npm-install-checks": "^6.0.0", "npm-normalize-package-bin": "^3.0.0", "npm-package-arg": "^10.0.0", "semver": "^7.3.5" } }, "sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg=="], + + "npm-profile": ["npm-profile@9.0.2", "", { "dependencies": { "npm-registry-fetch": "^17.0.0", "proc-log": "^4.0.0" } }, "sha512-4S/fd/PNyGgjaGolsdUJFsnfEb+AxJzrrZC3I9qbTYZJ3PJy8T46tIWXA4pBoaeiGh2M2GRvK1K/xMQe1Xgbvw=="], + + "npm-registry-fetch": ["npm-registry-fetch@14.0.5", "", { "dependencies": { "make-fetch-happen": "^11.0.0", "minipass": "^5.0.0", "minipass-fetch": "^3.0.0", "minipass-json-stream": "^1.0.1", "minizlib": "^2.1.2", "npm-package-arg": "^10.0.0", "proc-log": "^3.0.0" } }, "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA=="], + + "npmlog": ["npmlog@7.0.1", "", { "dependencies": { "are-we-there-yet": "^4.0.0", "console-control-strings": "^1.1.0", "gauge": "^5.0.0", "set-blocking": "^2.0.0" } }, "sha512-uJ0YFk/mCQpLBt+bxN88AKd+gyqZvZDbtiNxk6Waqcj2aPRyfVx8ITawkyQynxUagInjdYT1+qj4NfA5KJJUxg=="], + + "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="], + + "nyc": ["nyc@15.1.0", "", { "dependencies": { "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", "caching-transform": "^4.0.0", "convert-source-map": "^1.7.0", "decamelize": "^1.2.0", "find-cache-dir": "^3.2.0", "find-up": "^4.1.0", "foreground-child": "^2.0.0", "get-package-type": "^0.1.0", "glob": "^7.1.6", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-hook": "^3.0.0", "istanbul-lib-instrument": "^4.0.0", "istanbul-lib-processinfo": "^2.0.2", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", "make-dir": "^3.0.0", "node-preload": "^0.2.1", "p-map": "^3.0.0", "process-on-spawn": "^1.0.0", "resolve-from": "^5.0.0", "rimraf": "^3.0.0", "signal-exit": "^3.0.2", "spawn-wrap": "^2.0.0", "test-exclude": "^6.0.0", "yargs": "^15.0.2" }, "bin": { "nyc": "bin/nyc.js" } }, "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A=="], + + "object-hash": ["object-hash@1.3.1", "", {}, "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA=="], + + "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], + + "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], + + "object.assign": ["object.assign@4.1.7", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="], + + "object.fromentries": ["object.fromentries@2.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0" } }, "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ=="], + + "object.groupby": ["object.groupby@1.0.3", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2" } }, "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ=="], + + "object.values": ["object.values@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "onetime": ["onetime@2.0.1", "", { "dependencies": { "mimic-fn": "^1.0.0" } }, "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ=="], + + "oniguruma-to-es": ["oniguruma-to-es@3.1.1", "", { "dependencies": { "emoji-regex-xs": "^1.0.0", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ=="], + + "optionator": ["optionator@0.9.4", "", { "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.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], + + "os-tmpdir": ["os-tmpdir@1.0.2", "", {}, "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g=="], + + "own-keys": ["own-keys@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="], + + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + + "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + + "p-map": ["p-map@3.0.0", "", { "dependencies": { "aggregate-error": "^3.0.0" } }, "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ=="], + + "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="], + + "package-hash": ["package-hash@4.0.0", "", { "dependencies": { "graceful-fs": "^4.1.15", "hasha": "^5.0.0", "lodash.flattendeep": "^4.4.0", "release-zalgo": "^1.0.0" } }, "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ=="], + + "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], + + "pacote": ["pacote@15.2.0", "", { "dependencies": { "@npmcli/git": "^4.0.0", "@npmcli/installed-package-contents": "^2.0.1", "@npmcli/promise-spawn": "^6.0.1", "@npmcli/run-script": "^6.0.0", "cacache": "^17.0.0", "fs-minipass": "^3.0.0", "minipass": "^5.0.0", "npm-package-arg": "^10.0.0", "npm-packlist": "^7.0.0", "npm-pick-manifest": "^8.0.0", "npm-registry-fetch": "^14.0.0", "proc-log": "^3.0.0", "promise-retry": "^2.0.1", "read-package-json": "^6.0.0", "read-package-json-fast": "^3.0.0", "sigstore": "^1.3.0", "ssri": "^10.0.0", "tar": "^6.1.11" }, "bin": { "pacote": "lib/bin.js" } }, "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA=="], + + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + + "parent-require": ["parent-require@1.0.0", "", {}, "sha512-2MXDNZC4aXdkkap+rBBMv0lUsfJqvX5/2FiYYnfCnorZt3Pk06/IOR5KeaoghgS2w07MLWgjbsnyaq6PdHn2LQ=="], + + "parse-conflict-json": ["parse-conflict-json@3.0.1", "", { "dependencies": { "json-parse-even-better-errors": "^3.0.0", "just-diff": "^6.0.0", "just-diff-apply": "^5.2.0" } }, "sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw=="], + + "parse-json": ["parse-json@5.2.0", "", { "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" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], + + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + + "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], + + "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + + "path-to-regexp": ["path-to-regexp@1.9.0", "", { "dependencies": { "isarray": "0.0.1" } }, "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g=="], + + "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], + + "pathval": ["pathval@1.1.1", "", {}, "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ=="], + + "perfect-debounce": ["perfect-debounce@1.0.0", "", {}, "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + + "pify": ["pify@3.0.0", "", {}, "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg=="], + + "pkg-dir": ["pkg-dir@4.2.0", "", { "dependencies": { "find-up": "^4.0.0" } }, "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ=="], + + "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], + + "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], + + "postcss-selector-parser": ["postcss-selector-parser@7.1.1", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg=="], + + "preact": ["preact@10.28.0", "", {}, "sha512-rytDAoiXr3+t6OIP3WGlDd0ouCUG1iCWzkcY3++Nreuoi17y6T5i/zRhe6uYfoVcxq6YU+sBtJouuRDsq8vvqA=="], + + "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], + + "prettier": ["prettier@3.7.4", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA=="], + + "prettier-linter-helpers": ["prettier-linter-helpers@1.0.0", "", { "dependencies": { "fast-diff": "^1.1.2" } }, "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w=="], + + "proc-log": ["proc-log@3.0.0", "", {}, "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A=="], + + "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], + + "process-on-spawn": ["process-on-spawn@1.1.0", "", { "dependencies": { "fromentries": "^1.2.0" } }, "sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q=="], + + "promise-all-reject-late": ["promise-all-reject-late@1.0.1", "", {}, "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw=="], + + "promise-call-limit": ["promise-call-limit@1.0.2", "", {}, "sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA=="], + + "promise-inflight": ["promise-inflight@1.0.1", "", {}, "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g=="], + + "promise-retry": ["promise-retry@2.0.1", "", { "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" } }, "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g=="], + + "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="], + + "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], + + "pump": ["pump@1.0.3", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw=="], + + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "quick-lru": ["quick-lru@1.1.0", "", {}, "sha512-tRS7sTgyxMXtLum8L65daJnHUhfDUgboRdcWW2bR9vBfrj2+O5HSMbQOJfJJjIVSPFqbBCF37FpwWXGitDc5tA=="], + + "randombytes": ["randombytes@2.1.0", "", { "dependencies": { "safe-buffer": "^5.1.0" } }, "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="], + + "read-cmd-shim": ["read-cmd-shim@4.0.0", "", {}, "sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q=="], + + "read-package-json": ["read-package-json@6.0.4", "", { "dependencies": { "glob": "^10.2.2", "json-parse-even-better-errors": "^3.0.0", "normalize-package-data": "^5.0.0", "npm-normalize-package-bin": "^3.0.0" } }, "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw=="], + + "read-package-json-fast": ["read-package-json-fast@3.0.2", "", { "dependencies": { "json-parse-even-better-errors": "^3.0.0", "npm-normalize-package-bin": "^3.0.0" } }, "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw=="], + + "read-pkg": ["read-pkg@5.2.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" } }, "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg=="], + + "read-pkg-up": ["read-pkg-up@7.0.1", "", { "dependencies": { "find-up": "^4.1.0", "read-pkg": "^5.2.0", "type-fest": "^0.8.1" } }, "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg=="], + + "readable-stream": ["readable-stream@2.3.8", "", { "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" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + + "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], + + "rechoir": ["rechoir@0.6.2", "", { "dependencies": { "resolve": "^1.1.6" } }, "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw=="], + + "redent": ["redent@3.0.0", "", { "dependencies": { "indent-string": "^4.0.0", "strip-indent": "^3.0.0" } }, "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg=="], + + "reflect.getprototypeof": ["reflect.getprototypeof@1.0.10", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw=="], + + "regex": ["regex@6.1.0", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg=="], + + "regex-recursion": ["regex-recursion@6.0.2", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg=="], + + "regex-utilities": ["regex-utilities@2.3.0", "", {}, "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng=="], + + "regexp.prototype.flags": ["regexp.prototype.flags@1.5.4", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "set-function-name": "^2.0.2" } }, "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA=="], + + "release-zalgo": ["release-zalgo@1.0.0", "", { "dependencies": { "es6-error": "^4.0.1" } }, "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA=="], + + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + + "require-main-filename": ["require-main-filename@2.0.0", "", {}, "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="], + + "resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="], + + "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], + + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], + + "resolve.exports": ["resolve.exports@2.0.3", "", {}, "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A=="], + + "restore-cursor": ["restore-cursor@2.0.0", "", { "dependencies": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" } }, "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q=="], + + "retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="], + + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], + + "rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="], + + "rimraf": ["rimraf@4.4.1", "", { "dependencies": { "glob": "^9.2.0" }, "bin": { "rimraf": "dist/cjs/src/bin.js" } }, "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og=="], + + "rollup": ["rollup@4.53.3", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.53.3", "@rollup/rollup-android-arm64": "4.53.3", "@rollup/rollup-darwin-arm64": "4.53.3", "@rollup/rollup-darwin-x64": "4.53.3", "@rollup/rollup-freebsd-arm64": "4.53.3", "@rollup/rollup-freebsd-x64": "4.53.3", "@rollup/rollup-linux-arm-gnueabihf": "4.53.3", "@rollup/rollup-linux-arm-musleabihf": "4.53.3", "@rollup/rollup-linux-arm64-gnu": "4.53.3", "@rollup/rollup-linux-arm64-musl": "4.53.3", "@rollup/rollup-linux-loong64-gnu": "4.53.3", "@rollup/rollup-linux-ppc64-gnu": "4.53.3", "@rollup/rollup-linux-riscv64-gnu": "4.53.3", "@rollup/rollup-linux-riscv64-musl": "4.53.3", "@rollup/rollup-linux-s390x-gnu": "4.53.3", "@rollup/rollup-linux-x64-gnu": "4.53.3", "@rollup/rollup-linux-x64-musl": "4.53.3", "@rollup/rollup-openharmony-arm64": "4.53.3", "@rollup/rollup-win32-arm64-msvc": "4.53.3", "@rollup/rollup-win32-ia32-msvc": "4.53.3", "@rollup/rollup-win32-x64-gnu": "4.53.3", "@rollup/rollup-win32-x64-msvc": "4.53.3", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA=="], + + "run-async": ["run-async@2.4.1", "", {}, "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "rxjs": ["rxjs@6.6.7", "", { "dependencies": { "tslib": "^1.9.0" } }, "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ=="], + + "safe-array-concat": ["safe-array-concat@1.1.3", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q=="], + + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "safe-push-apply": ["safe-push-apply@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" } }, "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA=="], + + "safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="], + + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + + "samsam": ["samsam@1.3.0", "", {}, "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg=="], + + "sass": ["sass@1.95.0", "", { "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", "source-map-js": ">=0.6.2 <2.0.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" }, "bin": { "sass": "sass.js" } }, "sha512-9QMjhLq+UkOg/4bb8Lt8A+hJZvY3t+9xeZMKSBtBEgxrXA3ed5Ts4NDreUkYgJP1BTmrscQE/xYhf7iShow6lw=="], + + "sax": ["sax@1.4.3", "", {}, "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ=="], + + "search-insights": ["search-insights@2.17.3", "", {}, "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ=="], + + "section-matter": ["section-matter@1.0.0", "", { "dependencies": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" } }, "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA=="], + + "secure-keys": ["secure-keys@1.0.0", "", {}, "sha512-nZi59hW3Sl5P3+wOO89eHBAAGwmCPd2aE1+dLZV5MO+ItQctIvAqihzaAXIQhvtH4KJPxM080HsnqltR2y8cWg=="], + + "semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], + + "serialize-javascript": ["serialize-javascript@6.0.0", "", { "dependencies": { "randombytes": "^2.1.0" } }, "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag=="], + + "set-blocking": ["set-blocking@2.0.0", "", {}, "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="], + + "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], + + "set-function-name": ["set-function-name@2.0.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2" } }, "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ=="], + + "set-proto": ["set-proto@1.0.0", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0" } }, "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "shelljs": ["shelljs@0.8.5", "", { "dependencies": { "glob": "^7.0.0", "interpret": "^1.0.0", "rechoir": "^0.6.2" }, "bin": { "shjs": "bin/shjs" } }, "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow=="], + + "shiki": ["shiki@2.5.0", "", { "dependencies": { "@shikijs/core": "2.5.0", "@shikijs/engine-javascript": "2.5.0", "@shikijs/engine-oniguruma": "2.5.0", "@shikijs/langs": "2.5.0", "@shikijs/themes": "2.5.0", "@shikijs/types": "2.5.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ=="], + + "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], + + "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], + + "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], + + "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], + + "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + + "sigstore": ["sigstore@1.9.0", "", { "dependencies": { "@sigstore/bundle": "^1.1.0", "@sigstore/protobuf-specs": "^0.2.0", "@sigstore/sign": "^1.0.0", "@sigstore/tuf": "^1.0.3", "make-fetch-happen": "^11.0.1" }, "bin": { "sigstore": "bin/sigstore.js" } }, "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A=="], + + "sinon": ["sinon@4.5.0", "", { "dependencies": { "@sinonjs/formatio": "^2.0.0", "diff": "^3.1.0", "lodash.get": "^4.4.2", "lolex": "^2.2.0", "nise": "^1.2.0", "supports-color": "^5.1.0", "type-detect": "^4.0.5" } }, "sha512-trdx+mB0VBBgoYucy6a9L7/jfQOmvGeaKZT4OOJ+lPAtI8623xyGr8wLiE4eojzBS8G9yXbhx42GHUOVLr4X2w=="], + + "sinon-chai": ["sinon-chai@2.14.0", "", { "peerDependencies": { "chai": ">=1.9.2 <5", "sinon": "^1.4.0 || ^2.1.0 || ^3.0.0 || ^4.0.0" } }, "sha512-9stIF1utB0ywNHNT7RgiXbdmen8QDCRsrTjw+G9TgKt1Yexjiv8TOWZ6WHsTPz57Yky3DIswZvEqX8fpuHNDtQ=="], + + "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], + + "slice-ansi": ["slice-ansi@3.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" } }, "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ=="], + + "slugify": ["slugify@1.6.6", "", {}, "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw=="], + + "smart-buffer": ["smart-buffer@4.2.0", "", {}, "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="], + + "socks": ["socks@2.8.7", "", { "dependencies": { "ip-address": "^10.0.1", "smart-buffer": "^4.2.0" } }, "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A=="], + + "socks-proxy-agent": ["socks-proxy-agent@7.0.0", "", { "dependencies": { "agent-base": "^6.0.2", "debug": "^4.3.3", "socks": "^2.6.2" } }, "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww=="], + + "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], + + "spawn-wrap": ["spawn-wrap@2.0.0", "", { "dependencies": { "foreground-child": "^2.0.0", "is-windows": "^1.0.2", "make-dir": "^3.0.0", "rimraf": "^3.0.0", "signal-exit": "^3.0.2", "which": "^2.0.1" } }, "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg=="], + + "spdx-correct": ["spdx-correct@3.2.0", "", { "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA=="], + + "spdx-exceptions": ["spdx-exceptions@2.5.0", "", {}, "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="], + + "spdx-expression-parse": ["spdx-expression-parse@3.0.1", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="], + + "spdx-license-ids": ["spdx-license-ids@3.0.22", "", {}, "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ=="], + + "speakingurl": ["speakingurl@14.0.1", "", {}, "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ=="], + + "split": ["split@1.0.1", "", { "dependencies": { "through": "2" } }, "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg=="], + + "split-ca": ["split-ca@1.0.1", "", {}, "sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ=="], + + "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], + + "ssri": ["ssri@10.0.6", "", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ=="], + + "stable-hash": ["stable-hash@0.0.5", "", {}, "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA=="], + + "stack-utils-node-internals": ["stack-utils-node-internals@1.0.1", "", {}, "sha512-lMuPPh5lj8Nj+vGsxnrp5LRamN5SF++yJE+skeXz9Chy/Uw93BzxzrnQ/8BLOIKKVsJ44bleARrfSUh3ZGdMZw=="], + + "stop-iteration-iterator": ["stop-iteration-iterator@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "internal-slot": "^1.1.0" } }, "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ=="], + + "string-argv": ["string-argv@0.1.1", "", {}, "sha512-El1Va5ehZ0XTj3Ekw4WFidXvTmt9SrC0+eigdojgtJMVtPkF0qbBe9fyNSl9eQf+kUHnTSQxdQYzuHfZy8V+DQ=="], + + "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string.prototype.trim": ["string.prototype.trim@1.2.10", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-object-atoms": "^1.0.0", "has-property-descriptors": "^1.0.2" } }, "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA=="], + + "string.prototype.trimend": ["string.prototype.trimend@1.0.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ=="], + + "string.prototype.trimstart": ["string.prototype.trimstart@1.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg=="], + + "string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + + "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], + + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], + + "strip-bom-string": ["strip-bom-string@1.0.0", "", {}, "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g=="], + + "strip-indent": ["strip-indent@3.0.0", "", { "dependencies": { "min-indent": "^1.0.0" } }, "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ=="], + + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + + "sudo-block": ["sudo-block@2.0.0", "", { "dependencies": { "chalk": "^2.1.0", "is-docker": "^1.0.0", "is-root": "^1.0.0" } }, "sha512-BtQhz9xtBrwznoyakSOqj9posQoQjeyN0guytNriU6CnAcjF18WkPaN45xM1tLkwNLRBFK7tZUQDIE+iEOzayg=="], + + "superjson": ["superjson@2.2.6", "", { "dependencies": { "copy-anything": "^4" } }, "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA=="], + + "supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], + + "synckit": ["synckit@0.11.11", "", { "dependencies": { "@pkgr/core": "^0.2.9" } }, "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw=="], + + "system-ca": ["system-ca@2.0.1", "", { "optionalDependencies": { "macos-export-certificate-and-key": "^1.2.0", "win-export-certificate-and-key": "^2.1.0" } }, "sha512-9ZDV9yl8ph6Op67wDGPr4LykX86usE9x3le+XZSHfVMiiVJ5IRgmCWjLgxyz35ju9H3GDIJJZm4ogAeIfN5cQQ=="], + + "tabbable": ["tabbable@6.3.0", "", {}, "sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ=="], + + "tar": ["tar@6.2.1", "", { "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" } }, "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A=="], + + "tar-fs": ["tar-fs@1.16.6", "", { "dependencies": { "chownr": "^1.0.1", "mkdirp": "^0.5.1", "pump": "^1.0.0", "tar-stream": "^1.1.2" } }, "sha512-JkOgFt3FxM/2v2CNpAVHqMW2QASjc/Hxo7IGfNd3MHaDYSW/sBFiS7YVmmhmr8x6vwN1VFQDQGdT2MWpmIuVKA=="], + + "tar-stream": ["tar-stream@1.6.2", "", { "dependencies": { "bl": "^1.0.0", "buffer-alloc": "^1.2.0", "end-of-stream": "^1.0.0", "fs-constants": "^1.0.0", "readable-stream": "^2.3.0", "to-buffer": "^1.1.1", "xtend": "^4.0.0" } }, "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A=="], + + "test-exclude": ["test-exclude@6.0.0", "", { "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" } }, "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w=="], + + "through": ["through@2.3.8", "", {}, "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="], + + "timeago.js": ["timeago.js@4.0.2", "", {}, "sha512-a7wPxPdVlQL7lqvitHGGRsofhdwtkoSXPGATFuSOA2i1ZNQEPLrGnj68vOp2sOJTCFAQVXPeNMX/GctBaO9L2w=="], + + "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], + + "tmp": ["tmp@0.0.33", "", { "dependencies": { "os-tmpdir": "~1.0.2" } }, "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw=="], + + "to-buffer": ["to-buffer@1.2.2", "", { "dependencies": { "isarray": "^2.0.5", "safe-buffer": "^5.2.1", "typed-array-buffer": "^1.0.3" } }, "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + + "treeverse": ["treeverse@3.0.0", "", {}, "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ=="], + + "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], + + "trim-newlines": ["trim-newlines@3.0.1", "", {}, "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw=="], + + "tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "tuf-js": ["tuf-js@1.1.7", "", { "dependencies": { "@tufjs/models": "1.0.4", "debug": "^4.3.4", "make-fetch-happen": "^11.1.1" } }, "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg=="], + + "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], + + "type-detect": ["type-detect@4.1.0", "", {}, "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw=="], + + "type-fest": ["type-fest@1.4.0", "", {}, "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA=="], + + "typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="], + + "typed-array-byte-length": ["typed-array-byte-length@1.0.3", "", { "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.14" } }, "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg=="], + + "typed-array-byte-offset": ["typed-array-byte-offset@1.0.4", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.15", "reflect.getprototypeof": "^1.0.9" } }, "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ=="], + + "typed-array-length": ["typed-array-length@1.0.7", "", { "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "is-typed-array": "^1.1.13", "possible-typed-array-names": "^1.0.0", "reflect.getprototypeof": "^1.0.6" } }, "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg=="], + + "typedarray": ["typedarray@0.0.6", "", {}, "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="], + + "typedarray-to-buffer": ["typedarray-to-buffer@3.1.5", "", { "dependencies": { "is-typedarray": "^1.0.0" } }, "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q=="], + + "ua-parser-js": ["ua-parser-js@1.0.41", "", { "bin": { "ua-parser-js": "script/cli.js" } }, "sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug=="], + + "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="], + + "undici": ["undici@6.22.0", "", {}, "sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw=="], + + "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + + "unique-filename": ["unique-filename@3.0.0", "", { "dependencies": { "unique-slug": "^4.0.0" } }, "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g=="], + + "unique-slug": ["unique-slug@4.0.0", "", { "dependencies": { "imurmurhash": "^0.1.4" } }, "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ=="], + + "unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="], + + "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="], + + "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="], + + "unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="], + + "unist-util-visit-parents": ["unist-util-visit-parents@6.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ=="], + + "universal-user-agent": ["universal-user-agent@6.0.1", "", {}, "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ=="], + + "universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], + + "unrs-resolver": ["unrs-resolver@1.11.1", "", { "dependencies": { "napi-postinstall": "^0.3.0" }, "optionalDependencies": { "@unrs/resolver-binding-android-arm-eabi": "1.11.1", "@unrs/resolver-binding-android-arm64": "1.11.1", "@unrs/resolver-binding-darwin-arm64": "1.11.1", "@unrs/resolver-binding-darwin-x64": "1.11.1", "@unrs/resolver-binding-freebsd-x64": "1.11.1", "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", "@unrs/resolver-binding-linux-x64-musl": "1.11.1", "@unrs/resolver-binding-wasm32-wasi": "1.11.1", "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" } }, "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg=="], + + "update-browserslist-db": ["update-browserslist-db@1.2.2", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA=="], + + "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], + + "valid-path": ["valid-path@2.1.0", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-hYanLM6kqE7zLl0oykV//2q3meRgYGOtS2lgChozuWjjghSqR8xwc3199bDGUFPwszk/MhvHhyVys8HdHU9buw=="], + + "valid-url": ["valid-url@1.0.9", "", {}, "sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA=="], + + "validate-npm-package-license": ["validate-npm-package-license@3.0.4", "", { "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="], + + "validate-npm-package-name": ["validate-npm-package-name@5.0.1", "", {}, "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ=="], + + "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="], + + "vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="], + + "vite": ["vite@5.4.21", "", { "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", "rollup": "^4.20.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" }, "optionalPeers": ["@types/node", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser"], "bin": { "vite": "bin/vite.js" } }, "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw=="], + + "vitepress": ["vitepress@1.6.4", "", { "dependencies": { "@docsearch/css": "3.8.2", "@docsearch/js": "3.8.2", "@iconify-json/simple-icons": "^1.2.21", "@shikijs/core": "^2.1.0", "@shikijs/transformers": "^2.1.0", "@shikijs/types": "^2.1.0", "@types/markdown-it": "^14.1.2", "@vitejs/plugin-vue": "^5.2.1", "@vue/devtools-api": "^7.7.0", "@vue/shared": "^3.5.13", "@vueuse/core": "^12.4.0", "@vueuse/integrations": "^12.4.0", "focus-trap": "^7.6.4", "mark.js": "8.11.1", "minisearch": "^7.1.1", "shiki": "^2.1.0", "vite": "^5.4.14", "vue": "^3.5.13" }, "peerDependencies": { "markdown-it-mathjax3": "^4", "postcss": "^8" }, "optionalPeers": ["markdown-it-mathjax3", "postcss"], "bin": { "vitepress": "bin/vitepress.js" } }, "sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg=="], + + "vitepress-plugin-tabs": ["vitepress-plugin-tabs@0.5.0", "", { "peerDependencies": { "vitepress": "^1.0.0-rc.27", "vue": "^3.3.8" } }, "sha512-SIhFWwGsUkTByfc2b279ray/E0Jt8vDTsM1LiHxmCOBAEMmvzIBZSuYYT1DpdDTiS3SuJieBheJkYnwCq/yD9A=="], + + "vscode-languageserver-textdocument": ["vscode-languageserver-textdocument@1.0.12", "", {}, "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA=="], + + "vscode-languageserver-types": ["vscode-languageserver-types@3.17.5", "", {}, "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg=="], + + "vue": ["vue@3.5.25", "", { "dependencies": { "@vue/compiler-dom": "3.5.25", "@vue/compiler-sfc": "3.5.25", "@vue/runtime-dom": "3.5.25", "@vue/server-renderer": "3.5.25", "@vue/shared": "3.5.25" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-YLVdgv2K13WJ6n+kD5owehKtEXwdwXuj2TTyJMsO7pSeKw2bfRNZGjhB7YzrpbMYj5b5QsUebHpOqR3R3ziy/g=="], + + "vue-eslint-parser": ["vue-eslint-parser@10.2.0", "", { "dependencies": { "debug": "^4.4.0", "eslint-scope": "^8.2.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.6.0", "semver": "^7.6.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0" } }, "sha512-CydUvFOQKD928UzZhTp4pr2vWz1L+H99t7Pkln2QSPdvmURT0MoC4wUccfCnuEaihNsu9aYYyk+bep8rlfkUXw=="], + + "walk-up-path": ["walk-up-path@3.0.1", "", {}, "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA=="], + + "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + + "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "which-boxed-primitive": ["which-boxed-primitive@1.1.1", "", { "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", "is-number-object": "^1.1.1", "is-string": "^1.1.1", "is-symbol": "^1.1.1" } }, "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA=="], + + "which-builtin-type": ["which-builtin-type@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.1.0", "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", "which-typed-array": "^1.1.16" } }, "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q=="], + + "which-collection": ["which-collection@1.0.2", "", { "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" } }, "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw=="], + + "which-module": ["which-module@2.0.1", "", {}, "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ=="], + + "which-typed-array": ["which-typed-array@1.1.19", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw=="], + + "wide-align": ["wide-align@1.1.5", "", { "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg=="], + + "widest-line": ["widest-line@3.1.0", "", { "dependencies": { "string-width": "^4.0.0" } }, "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg=="], + + "win-ca": ["win-ca@3.5.1", "", { "dependencies": { "is-electron": "^2.2.0", "make-dir": "^1.3.0", "node-forge": "^1.2.1", "split": "^1.0.1" } }, "sha512-RNy9gpBS6cxWHjfbqwBA7odaHyT+YQNhtdpJZwYCFoxB/Dq22oeOZ9YCXMwjhLytKpo7JJMnKdJ/ve7N12zzfQ=="], + + "win-export-certificate-and-key": ["win-export-certificate-and-key@2.1.0", "", { "dependencies": { "bindings": "^1.5.0", "node-addon-api": "^3.1.0" }, "os": "win32" }, "sha512-WeMLa/2uNZcS/HWGKU2G1Gzeh3vHpV/UFvwLhJLKxPHYFAbubxxVcJbqmPXaqySWK1Ymymh16zKK5WYIJ3zgzA=="], + + "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], + + "wordwrap": ["wordwrap@1.0.0", "", {}, "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q=="], + + "workerpool": ["workerpool@6.2.0", "", {}, "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A=="], + + "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "write-file-atomic": ["write-file-atomic@3.0.3", "", { "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q=="], + + "xml-js": ["xml-js@1.6.11", "", { "dependencies": { "sax": "^1.2.4" }, "bin": { "xml-js": "./bin/cli.js" } }, "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g=="], + + "xml-name-validator": ["xml-name-validator@4.0.0", "", {}, "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw=="], + + "xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="], + + "y18n": ["y18n@4.0.3", "", {}, "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="], + + "yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + + "yaml": ["yaml@2.8.2", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A=="], + + "yargonaut": ["yargonaut@1.1.4", "", { "dependencies": { "chalk": "^1.1.1", "figlet": "^1.1.1", "parent-require": "^1.0.0" } }, "sha512-rHgFmbgXAAzl+1nngqOcwEljqHGG9uUZoPjsdZEs1w5JW9RXYzrSvH/u70C1JE5qFi0qjsdhnUX/dJRpWqitSA=="], + + "yargs": ["yargs@15.4.1", "", { "dependencies": { "cliui": "^6.0.0", "decamelize": "^1.2.0", "find-up": "^4.1.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^18.1.2" } }, "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A=="], + + "yargs-parser": ["yargs-parser@11.1.1", "", { "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } }, "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ=="], + + "yargs-unparser": ["yargs-unparser@2.0.0", "", { "dependencies": { "camelcase": "^6.0.0", "decamelize": "^4.0.0", "flat": "^5.0.2", "is-plain-obj": "^2.1.0" } }, "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA=="], + + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + + "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], + + "@babel/core/convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + + "@babel/core/json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + + "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + + "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + + "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + + "@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + + "@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + + "@istanbuljs/load-nyc-config/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], + + "@istanbuljs/load-nyc-config/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="], + + "@lando/leia/fs-extra": ["fs-extra@7.0.1", "", { "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw=="], + + "@lando/leia/object-hash": ["object-hash@2.2.0", "", {}, "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw=="], + + "@lando/vitepress-theme-default-plus/nanoid": ["nanoid@5.1.6", "", { "bin": { "nanoid": "bin/nanoid.js" } }, "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg=="], + + "@lando/vitepress-theme-default-plus/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "@npmcli/agent/agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], + + "@npmcli/agent/http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="], + + "@npmcli/agent/https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], + + "@npmcli/agent/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + + "@npmcli/agent/socks-proxy-agent": ["socks-proxy-agent@8.0.5", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "socks": "^2.8.3" } }, "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw=="], + + "@npmcli/arborist/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "@npmcli/arborist/npm-package-arg": ["npm-package-arg@10.1.0", "", { "dependencies": { "hosted-git-info": "^6.0.0", "proc-log": "^3.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^5.0.0" } }, "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA=="], + + "@npmcli/git/which": ["which@3.0.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/which.js" } }, "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg=="], + + "@npmcli/map-workspaces/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], + + "@npmcli/map-workspaces/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "@npmcli/move-file/mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], + + "@npmcli/move-file/rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="], + + "@npmcli/package-json/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], + + "@npmcli/promise-spawn/which": ["which@3.0.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/which.js" } }, "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg=="], + + "@npmcli/query/postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], + + "@npmcli/run-script/which": ["which@3.0.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/which.js" } }, "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg=="], + + "@oclif/core/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "@oclif/errors/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], + + "@oclif/help/@oclif/config": ["@oclif/config@1.18.16", "", { "dependencies": { "@oclif/errors": "^1.3.6", "@oclif/parser": "^3.8.16", "debug": "^4.3.4", "globby": "^11.1.0", "is-wsl": "^2.1.1", "tslib": "^2.6.1" } }, "sha512-VskIxVcN22qJzxRUq+raalq6Q3HUde7sokB7/xk5TqRZGEKRVbFeqdQBxDWwQeudiJEgcNiMvIFbMQ43dY37FA=="], + + "@oclif/help/wrap-ansi": ["wrap-ansi@6.2.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="], + + "@oclif/plugin-help/@oclif/config": ["@oclif/config@1.18.2", "", { "dependencies": { "@oclif/errors": "^1.3.3", "@oclif/parser": "^3.8.0", "debug": "^4.1.1", "globby": "^11.0.1", "is-wsl": "^2.1.1", "tslib": "^2.0.0" } }, "sha512-cE3qfHWv8hGRCP31j7fIS7BfCflm/BNZ2HNqHexH+fDrdF2f1D5S8VmXWLC77ffv3oDvWyvE9AZeR0RfmHCCaA=="], + + "@oclif/plugin-help/@oclif/errors": ["@oclif/errors@1.3.5", "", { "dependencies": { "clean-stack": "^3.0.0", "fs-extra": "^8.1", "indent-string": "^4.0.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" } }, "sha512-OivucXPH/eLLlOT7FkCMoZXiaVYf8I/w1eTAM1+gKzfhALwWTusxEx7wBmW0uzvkSg/9ovWLycPaBgJbM3LOCQ=="], + + "@oclif/plugin-help/wrap-ansi": ["wrap-ansi@6.2.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="], + + "@octokit/plugin-rest-endpoint-methods/@octokit/types": ["@octokit/types@10.0.0", "", { "dependencies": { "@octokit/openapi-types": "^18.0.0" } }, "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg=="], + + "@parcel/watcher/node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="], + + "@sinonjs/commons/type-detect": ["type-detect@4.0.8", "", {}, "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g=="], + + "@tufjs/models/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "aggregate-error/clean-stack": ["clean-stack@2.2.0", "", {}, "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A=="], + + "ansi-escapes/type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="], + + "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "bin-links/write-file-atomic": ["write-file-atomic@5.0.1", "", { "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^4.0.1" } }, "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw=="], + + "cacache/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], + + "cacache/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "cacache/p-map": ["p-map@4.0.0", "", { "dependencies": { "aggregate-error": "^3.0.0" } }, "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ=="], + + "camelcase-keys/map-obj": ["map-obj@4.3.0", "", {}, "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ=="], + + "camelcase-keys/quick-lru": ["quick-lru@4.0.1", "", {}, "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g=="], + + "chai-events/chai": ["chai@3.5.0", "", { "dependencies": { "assertion-error": "^1.0.1", "deep-eql": "^0.1.3", "type-detect": "^1.0.0" } }, "sha512-eRYY0vPS2a9zt5w5Z0aCeWbrXTEyvk7u/Xf71EzNObrjSCPgMm1Nku/D/u2tiqHBX5j40wWhj54YJLtgn8g55A=="], + + "chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "cliui/wrap-ansi": ["wrap-ansi@6.2.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="], + + "cosmiconfig/yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="], + + "decamelize-keys/map-obj": ["map-obj@1.0.1", "", {}, "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg=="], + + "default-require-extensions/strip-bom": ["strip-bom@4.0.0", "", {}, "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w=="], + + "docker-modem/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "docker-modem/readable-stream": ["readable-stream@1.0.34", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", "isarray": "0.0.1", "string_decoder": "~0.10.x" } }, "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg=="], + + "encoding/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], + + "enquirer/ansi-colors": ["ansi-colors@4.1.3", "", {}, "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw=="], + + "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "eslint-plugin-import/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "eslint-plugin-import/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "figures/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "filelist/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="], + + "fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], + + "fs-minipass/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "gauge/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "generate-robotstxt/fs-extra": ["fs-extra@9.1.0", "", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="], + + "gray-matter/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="], + + "has-ansi/ansi-regex": ["ansi-regex@2.1.1", "", {}, "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="], + + "hasha/type-fest": ["type-fest@0.8.1", "", {}, "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="], + + "ignore-walk/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "import-fresh/resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + + "inquirer/ansi-escapes": ["ansi-escapes@3.2.0", "", {}, "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ=="], + + "inquirer/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], + + "inquirer/figures": ["figures@2.0.0", "", { "dependencies": { "escape-string-regexp": "^1.0.5" } }, "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA=="], + + "inquirer/string-width": ["string-width@2.1.1", "", { "dependencies": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" } }, "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw=="], + + "inquirer/strip-ansi": ["strip-ansi@5.2.0", "", { "dependencies": { "ansi-regex": "^4.1.0" } }, "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA=="], + + "is-wsl/is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], + + "istanbul-lib-instrument/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "istanbul-lib-processinfo/rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="], + + "istanbul-lib-report/make-dir": ["make-dir@4.0.0", "", { "dependencies": { "semver": "^7.5.3" } }, "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw=="], + + "istanbul-lib-report/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "listr2/cli-truncate": ["cli-truncate@3.1.0", "", { "dependencies": { "slice-ansi": "^5.0.0", "string-width": "^5.0.0" } }, "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA=="], + + "listr2/log-update": ["log-update@5.0.1", "", { "dependencies": { "ansi-escapes": "^5.0.0", "cli-cursor": "^4.0.0", "slice-ansi": "^5.0.0", "strip-ansi": "^7.0.1", "wrap-ansi": "^8.0.1" } }, "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw=="], + + "listr2/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + + "log-update/cli-cursor": ["cli-cursor@3.1.0", "", { "dependencies": { "restore-cursor": "^3.1.0" } }, "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw=="], + + "log-update/slice-ansi": ["slice-ansi@4.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" } }, "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ=="], + + "log-update/wrap-ansi": ["wrap-ansi@6.2.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="], + + "make-dir/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "meow/normalize-package-data": ["normalize-package-data@2.5.0", "", { "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } }, "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA=="], + + "meow/type-fest": ["type-fest@0.13.1", "", {}, "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg=="], + + "meow/yargs-parser": ["yargs-parser@18.1.3", "", { "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } }, "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ=="], + + "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "minimist-options/is-plain-obj": ["is-plain-obj@1.1.0", "", {}, "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg=="], + + "minipass-collect/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "minipass-fetch/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "minipass-flush/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "minipass-json-stream/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "minipass-pipeline/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "minipass-sized/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "mkcert/commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="], + + "mocha/debug": ["debug@4.3.3", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q=="], + + "mocha/glob": ["glob@7.2.0", "", { "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" } }, "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q=="], + + "mocha/js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + + "mocha/minimatch": ["minimatch@4.2.1", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g=="], + + "mocha/nanoid": ["nanoid@3.3.1", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw=="], + + "mocha/yargs": ["yargs@16.2.0", "", { "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" } }, "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw=="], + + "mocha/yargs-parser": ["yargs-parser@20.2.4", "", {}, "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA=="], + + "nconf/yargs": ["yargs@16.2.0", "", { "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" } }, "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw=="], + + "nise/@sinonjs/formatio": ["@sinonjs/formatio@3.2.2", "", { "dependencies": { "@sinonjs/commons": "^1", "@sinonjs/samsam": "^3.1.0" } }, "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ=="], + + "nise/lolex": ["lolex@5.1.2", "", { "dependencies": { "@sinonjs/commons": "^1.7.0" } }, "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A=="], + + "node-gyp/make-fetch-happen": ["make-fetch-happen@10.2.1", "", { "dependencies": { "agentkeepalive": "^4.2.1", "cacache": "^16.1.0", "http-cache-semantics": "^4.1.0", "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", "lru-cache": "^7.7.1", "minipass": "^3.1.6", "minipass-collect": "^1.0.2", "minipass-fetch": "^2.0.3", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", "promise-retry": "^2.0.1", "socks-proxy-agent": "^7.0.0", "ssri": "^9.0.0" } }, "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w=="], + + "node-gyp/nopt": ["nopt@6.0.0", "", { "dependencies": { "abbrev": "^1.0.0" }, "bin": { "nopt": "bin/nopt.js" } }, "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g=="], + + "node-gyp/npmlog": ["npmlog@6.0.2", "", { "dependencies": { "are-we-there-yet": "^3.0.0", "console-control-strings": "^1.1.0", "gauge": "^4.0.3", "set-blocking": "^2.0.0" } }, "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg=="], + + "node-gyp/rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="], + + "npm-package-arg/hosted-git-info": ["hosted-git-info@7.0.2", "", { "dependencies": { "lru-cache": "^10.0.1" } }, "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w=="], + + "npm-package-arg/proc-log": ["proc-log@4.2.0", "", {}, "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA=="], + + "npm-pick-manifest/npm-package-arg": ["npm-package-arg@10.1.0", "", { "dependencies": { "hosted-git-info": "^6.0.0", "proc-log": "^3.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^5.0.0" } }, "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA=="], + + "npm-profile/npm-registry-fetch": ["npm-registry-fetch@17.1.0", "", { "dependencies": { "@npmcli/redact": "^2.0.0", "jsonparse": "^1.3.1", "make-fetch-happen": "^13.0.0", "minipass": "^7.0.2", "minipass-fetch": "^3.0.0", "minizlib": "^2.1.2", "npm-package-arg": "^11.0.0", "proc-log": "^4.0.0" } }, "sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA=="], + + "npm-profile/proc-log": ["proc-log@4.2.0", "", {}, "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA=="], + + "npm-registry-fetch/npm-package-arg": ["npm-package-arg@10.1.0", "", { "dependencies": { "hosted-git-info": "^6.0.0", "proc-log": "^3.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^5.0.0" } }, "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA=="], + + "nyc/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], + + "nyc/rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="], + + "pacote/npm-package-arg": ["npm-package-arg@10.1.0", "", { "dependencies": { "hosted-git-info": "^6.0.0", "proc-log": "^3.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^5.0.0" } }, "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA=="], + + "parse-json/json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], + + "path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + + "path-scurry/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "pkg-dir/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], + + "read-package-json/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], + + "read-pkg/normalize-package-data": ["normalize-package-data@2.5.0", "", { "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } }, "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA=="], + + "read-pkg/type-fest": ["type-fest@0.6.0", "", {}, "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg=="], + + "read-pkg-up/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], + + "read-pkg-up/type-fest": ["type-fest@0.8.1", "", {}, "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="], + + "readable-stream/isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], + + "readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "rimraf/glob": ["glob@9.3.5", "", { "dependencies": { "fs.realpath": "^1.0.0", "minimatch": "^8.0.2", "minipass": "^4.2.4", "path-scurry": "^1.6.1" } }, "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q=="], + + "rxjs/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], + + "safe-array-concat/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], + + "safe-push-apply/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], + + "sass/chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + + "sinon/diff": ["diff@3.5.0", "", {}, "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA=="], + + "sinon/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + + "spawn-wrap/rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="], + + "ssri/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "string_decoder/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], + + "sudo-block/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], + + "sudo-block/is-docker": ["is-docker@1.1.0", "", {}, "sha512-ZEpopPu+bLIb/x3IF9wXxRdAW74e/ity1XGRxpznAaABKhc8mmtRamRB2l71CSs1YMS8FQxDK/vPK10XlhzG2A=="], + + "sudo-block/is-root": ["is-root@1.0.0", "", {}, "sha512-1d50EJ7ipFxb9bIx213o6KPaJmHN8f+nR48UZWxWVzDx+NA3kpscxi02oQX3rGkEaLBi9m3ZayHngQc3+bBX9w=="], + + "tar/chownr": ["chownr@2.0.0", "", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="], + + "tar/fs-minipass": ["fs-minipass@2.1.0", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg=="], + + "tar/mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], + + "to-buffer/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], + + "which-builtin-type/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], + + "win-ca/make-dir": ["make-dir@1.3.0", "", { "dependencies": { "pify": "^3.0.0" } }, "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ=="], + + "win-export-certificate-and-key/node-addon-api": ["node-addon-api@3.2.1", "", {}, "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A=="], + + "yargonaut/chalk": ["chalk@1.1.3", "", { "dependencies": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", "has-ansi": "^2.0.0", "strip-ansi": "^3.0.0", "supports-color": "^2.0.0" } }, "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A=="], + + "yargs/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], + + "yargs/yargs-parser": ["yargs-parser@18.1.3", "", { "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } }, "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ=="], + + "yargs-unparser/camelcase": ["camelcase@6.3.0", "", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="], + + "yargs-unparser/decamelize": ["decamelize@4.0.0", "", {}, "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ=="], + + "@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + + "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + + "@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "@istanbuljs/load-nyc-config/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], + + "@istanbuljs/load-nyc-config/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + + "@lando/leia/fs-extra/jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], + + "@lando/leia/fs-extra/universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], + + "@npmcli/arborist/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "@npmcli/map-workspaces/glob/foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], + + "@npmcli/map-workspaces/glob/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "@npmcli/map-workspaces/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "@npmcli/package-json/glob/foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], + + "@npmcli/package-json/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "@npmcli/package-json/glob/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "@oclif/core/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "@oclif/errors/fs-extra/jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], + + "@oclif/errors/fs-extra/universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], + + "@oclif/plugin-help/@oclif/config/@oclif/errors": ["@oclif/errors@1.3.6", "", { "dependencies": { "clean-stack": "^3.0.0", "fs-extra": "^8.1", "indent-string": "^4.0.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-fYaU4aDceETd89KXP+3cLyg9EHZsLD3RxF2IU9yxahhBpspWjkWi3Dy3bTgcwZ3V47BgxQaGapzJWDM33XIVDQ=="], + + "@oclif/plugin-help/@oclif/errors/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], + + "@oclif/plugin-help/@oclif/errors/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "@tufjs/models/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "bin-links/write-file-atomic/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "cacache/glob/foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], + + "cacache/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "chai-events/chai/deep-eql": ["deep-eql@0.1.3", "", { "dependencies": { "type-detect": "0.1.1" } }, "sha512-6sEotTRGBFiNcqVoeHwnfopbSpi5NbH1VWJmYCVkmxMmaVTT0bUTrNaGyBwhgP4MZL012W/mkzIn3Da+iDYweg=="], + + "chai-events/chai/type-detect": ["type-detect@1.0.0", "", {}, "sha512-f9Uv6ezcpvCQjJU0Zqbg+65qdcszv3qUQsZfjdRbWiZ7AMenrX1u0lNk9EoWWX6e1F+NULyg27mtdeZ5WhpljA=="], + + "docker-modem/readable-stream/string_decoder": ["string_decoder@0.10.31", "", {}, "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="], + + "filelist/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "generate-robotstxt/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], + + "gray-matter/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + + "ignore-walk/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "inquirer/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + + "inquirer/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "inquirer/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + + "inquirer/figures/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "inquirer/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@2.0.0", "", {}, "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w=="], + + "inquirer/string-width/strip-ansi": ["strip-ansi@4.0.0", "", { "dependencies": { "ansi-regex": "^3.0.0" } }, "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow=="], + + "inquirer/strip-ansi/ansi-regex": ["ansi-regex@4.1.1", "", {}, "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g=="], + + "listr2/cli-truncate/slice-ansi": ["slice-ansi@5.0.0", "", { "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" } }, "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ=="], + + "listr2/cli-truncate/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + + "listr2/log-update/ansi-escapes": ["ansi-escapes@5.0.0", "", { "dependencies": { "type-fest": "^1.0.2" } }, "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA=="], + + "listr2/log-update/cli-cursor": ["cli-cursor@4.0.0", "", { "dependencies": { "restore-cursor": "^4.0.0" } }, "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg=="], + + "listr2/log-update/slice-ansi": ["slice-ansi@5.0.0", "", { "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" } }, "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ=="], + + "listr2/log-update/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + + "listr2/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "listr2/wrap-ansi/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + + "listr2/wrap-ansi/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + + "log-update/cli-cursor/restore-cursor": ["restore-cursor@3.1.0", "", { "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA=="], + + "meow/normalize-package-data/hosted-git-info": ["hosted-git-info@2.8.9", "", {}, "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw=="], + + "meow/normalize-package-data/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="], + + "mocha/debug/ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="], + + "mocha/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "mocha/yargs/cliui": ["cliui@7.0.4", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" } }, "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ=="], + + "mocha/yargs/y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + + "nconf/yargs/cliui": ["cliui@7.0.4", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" } }, "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ=="], + + "nconf/yargs/y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + + "nconf/yargs/yargs-parser": ["yargs-parser@20.2.4", "", {}, "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA=="], + + "node-gyp/make-fetch-happen/cacache": ["cacache@16.1.3", "", { "dependencies": { "@npmcli/fs": "^2.1.0", "@npmcli/move-file": "^2.0.0", "chownr": "^2.0.0", "fs-minipass": "^2.1.0", "glob": "^8.0.1", "infer-owner": "^1.0.4", "lru-cache": "^7.7.1", "minipass": "^3.1.6", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "mkdirp": "^1.0.4", "p-map": "^4.0.0", "promise-inflight": "^1.0.1", "rimraf": "^3.0.2", "ssri": "^9.0.0", "tar": "^6.1.11", "unique-filename": "^2.0.0" } }, "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ=="], + + "node-gyp/make-fetch-happen/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "node-gyp/make-fetch-happen/minipass-fetch": ["minipass-fetch@2.1.2", "", { "dependencies": { "minipass": "^3.1.6", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" }, "optionalDependencies": { "encoding": "^0.1.13" } }, "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA=="], + + "node-gyp/make-fetch-happen/ssri": ["ssri@9.0.1", "", { "dependencies": { "minipass": "^3.1.1" } }, "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q=="], + + "node-gyp/nopt/abbrev": ["abbrev@1.1.1", "", {}, "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="], + + "node-gyp/npmlog/are-we-there-yet": ["are-we-there-yet@3.0.1", "", { "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" } }, "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg=="], + + "node-gyp/npmlog/gauge": ["gauge@4.0.4", "", { "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.3", "console-control-strings": "^1.1.0", "has-unicode": "^2.0.1", "signal-exit": "^3.0.7", "string-width": "^4.2.3", "strip-ansi": "^6.0.1", "wide-align": "^1.1.5" } }, "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg=="], + + "npm-package-arg/hosted-git-info/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + + "npm-profile/npm-registry-fetch/make-fetch-happen": ["make-fetch-happen@13.0.1", "", { "dependencies": { "@npmcli/agent": "^2.0.0", "cacache": "^18.0.0", "http-cache-semantics": "^4.1.1", "is-lambda": "^1.0.1", "minipass": "^7.0.2", "minipass-fetch": "^3.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", "proc-log": "^4.2.0", "promise-retry": "^2.0.1", "ssri": "^10.0.0" } }, "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA=="], + + "npm-profile/npm-registry-fetch/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "nyc/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], + + "pkg-dir/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], + + "read-package-json/glob/foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], + + "read-package-json/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "read-package-json/glob/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "read-pkg-up/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], + + "read-pkg/normalize-package-data/hosted-git-info": ["hosted-git-info@2.8.9", "", {}, "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw=="], + + "read-pkg/normalize-package-data/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="], + + "rimraf/glob/minimatch": ["minimatch@8.0.4", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA=="], + + "rimraf/glob/minipass": ["minipass@4.2.8", "", {}, "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ=="], + + "sass/chokidar/readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + + "sinon/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + + "sudo-block/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + + "sudo-block/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "sudo-block/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + + "tar/fs-minipass/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "yargonaut/chalk/ansi-styles": ["ansi-styles@2.2.1", "", {}, "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA=="], + + "yargonaut/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "yargonaut/chalk/strip-ansi": ["strip-ansi@3.0.1", "", { "dependencies": { "ansi-regex": "^2.0.0" } }, "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg=="], + + "yargonaut/chalk/supports-color": ["supports-color@2.0.0", "", {}, "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g=="], + + "yargs/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], + + "@istanbuljs/load-nyc-config/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], + + "@npmcli/map-workspaces/glob/foreground-child/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "@npmcli/package-json/glob/foreground-child/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "@npmcli/package-json/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "@oclif/plugin-help/@oclif/config/@oclif/errors/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], + + "@oclif/plugin-help/@oclif/config/@oclif/errors/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "@oclif/plugin-help/@oclif/errors/fs-extra/jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], + + "@oclif/plugin-help/@oclif/errors/fs-extra/universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], + + "cacache/glob/foreground-child/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "cacache/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "chai-events/chai/deep-eql/type-detect": ["type-detect@0.1.1", "", {}, "sha512-5rqszGVwYgBoDkIm2oUtvkfZMQ0vk29iDMU0W2qCa3rG0vPDNczCMT4hV/bLBgLg8k8ri6+u3Zbt+S/14eMzlA=="], + + "inquirer/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "inquirer/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + + "inquirer/string-width/strip-ansi/ansi-regex": ["ansi-regex@3.0.1", "", {}, "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw=="], + + "listr2/cli-truncate/slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "listr2/cli-truncate/slice-ansi/is-fullwidth-code-point": ["is-fullwidth-code-point@4.0.0", "", {}, "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ=="], + + "listr2/cli-truncate/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + + "listr2/cli-truncate/string-width/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + + "listr2/log-update/cli-cursor/restore-cursor": ["restore-cursor@4.0.0", "", { "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg=="], + + "listr2/log-update/slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "listr2/log-update/slice-ansi/is-fullwidth-code-point": ["is-fullwidth-code-point@4.0.0", "", {}, "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ=="], + + "listr2/log-update/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "listr2/wrap-ansi/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + + "listr2/wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "log-update/cli-cursor/restore-cursor/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], + + "node-gyp/make-fetch-happen/cacache/@npmcli/fs": ["@npmcli/fs@2.1.2", "", { "dependencies": { "@gar/promisify": "^1.1.3", "semver": "^7.3.5" } }, "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ=="], + + "node-gyp/make-fetch-happen/cacache/chownr": ["chownr@2.0.0", "", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="], + + "node-gyp/make-fetch-happen/cacache/fs-minipass": ["fs-minipass@2.1.0", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg=="], + + "node-gyp/make-fetch-happen/cacache/glob": ["glob@8.1.0", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^5.0.1", "once": "^1.3.0" } }, "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ=="], + + "node-gyp/make-fetch-happen/cacache/mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], + + "node-gyp/make-fetch-happen/cacache/p-map": ["p-map@4.0.0", "", { "dependencies": { "aggregate-error": "^3.0.0" } }, "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ=="], + + "node-gyp/make-fetch-happen/cacache/unique-filename": ["unique-filename@2.0.1", "", { "dependencies": { "unique-slug": "^3.0.0" } }, "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A=="], + + "node-gyp/npmlog/are-we-there-yet/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "npm-profile/npm-registry-fetch/make-fetch-happen/cacache": ["cacache@18.0.4", "", { "dependencies": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", "glob": "^10.2.2", "lru-cache": "^10.0.1", "minipass": "^7.0.3", "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^4.0.0", "ssri": "^10.0.0", "tar": "^6.1.11", "unique-filename": "^3.0.0" } }, "sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ=="], + + "nyc/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], + + "pkg-dir/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], + + "read-package-json/glob/foreground-child/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "read-package-json/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "read-pkg-up/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], + + "rimraf/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "sudo-block/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "sudo-block/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + + "yargonaut/chalk/strip-ansi/ansi-regex": ["ansi-regex@2.1.1", "", {}, "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="], + + "yargs/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], + + "@istanbuljs/load-nyc-config/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], + + "@oclif/plugin-help/@oclif/config/@oclif/errors/fs-extra/jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], + + "@oclif/plugin-help/@oclif/config/@oclif/errors/fs-extra/universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], + + "inquirer/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + + "listr2/cli-truncate/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "listr2/log-update/cli-cursor/restore-cursor/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], + + "log-update/cli-cursor/restore-cursor/onetime/mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], + + "node-gyp/make-fetch-happen/cacache/glob/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="], + + "node-gyp/make-fetch-happen/cacache/unique-filename/unique-slug": ["unique-slug@3.0.0", "", { "dependencies": { "imurmurhash": "^0.1.4" } }, "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w=="], + + "npm-profile/npm-registry-fetch/make-fetch-happen/cacache/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], + + "npm-profile/npm-registry-fetch/make-fetch-happen/cacache/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + + "npm-profile/npm-registry-fetch/make-fetch-happen/cacache/minipass-collect": ["minipass-collect@2.0.1", "", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw=="], + + "npm-profile/npm-registry-fetch/make-fetch-happen/cacache/p-map": ["p-map@4.0.0", "", { "dependencies": { "aggregate-error": "^3.0.0" } }, "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ=="], + + "nyc/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], + + "pkg-dir/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], + + "read-pkg-up/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], + + "sudo-block/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + + "yargs/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], + + "listr2/log-update/cli-cursor/restore-cursor/onetime/mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], + + "node-gyp/make-fetch-happen/cacache/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "npm-profile/npm-registry-fetch/make-fetch-happen/cacache/glob/foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], + + "npm-profile/npm-registry-fetch/make-fetch-happen/cacache/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "npm-profile/npm-registry-fetch/make-fetch-happen/cacache/glob/foreground-child/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "npm-profile/npm-registry-fetch/make-fetch-happen/cacache/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + } +} diff --git a/bunfig.toml b/bunfig.toml new file mode 100644 index 0000000..2209ebe --- /dev/null +++ b/bunfig.toml @@ -0,0 +1,7 @@ +name = "lando" +entrypoint = "bin/lando" +test-dir = "test" + +[test] +coverage = true +coverageSkipTestFiles = true diff --git a/components/yaml.js b/components/yaml.js index 43037be..20397bd 100644 --- a/components/yaml.js +++ b/components/yaml.js @@ -10,7 +10,7 @@ const validPath = require('valid-path'); // @TODO: debugger? // helper to extract type tag -const parseFileTypeInput = input => { +const parseFileTypeInput = (input) => { // find the parts const parts = input.split('@'); const file = parts[0].trim(); @@ -25,14 +25,14 @@ const parseFileTypeInput = input => { // helper to find file const findFile = (file, base = undefined) => { return require('../utils/traverse-up')([file], path.resolve(base)) - .map(candidate => path.join(path.dirname(candidate), file)) - .find(candidate => fs.existsSync(candidate)); + .map((candidate) => path.join(path.dirname(candidate), file)) + .find((candidate) => fs.existsSync(candidate)); }; // file loader options const fileloader = { kind: 'scalar', - resolve: function(data) { + resolve: function (data) { // Kill immediately if we have to if (typeof data !== 'string') return false; @@ -45,29 +45,29 @@ const fileloader = { // Otherwise check the path exists return fs.existsSync(input.file); }, - construct: function(data) { + construct: function (data) { // transform data - data = {raw: data, ...parseFileTypeInput(data)}; + data = { raw: data, ...parseFileTypeInput(data) }; // normalize if needed data.file = !path.isAbsolute(data.file) ? findFile(data.file, this.base) : data.file; // switch based on type switch (data.type) { case 'binary': - return new ImportString(fs.readFileSync(data.file, {encoding: 'base64'}), data); + return new ImportString(fs.readFileSync(data.file, { encoding: 'base64' }), data); case 'json': - return new ImportObject(JSON.parse(fs.readFileSync(data.file, {encoding: 'utf8'}), data)); + return new ImportObject(JSON.parse(fs.readFileSync(data.file, { encoding: 'utf8' }), data)); case 'string': - return new ImportString(fs.readFileSync(data.file, {encoding: 'utf8'}), data); + return new ImportString(fs.readFileSync(data.file, { encoding: 'utf8' }), data); case 'yaml': case 'yml': return new ImportObject(yaml.load(data.file), data); default: - return new ImportString(fs.readFileSync(data.file, {encoding: 'utf8'}), data); + return new ImportString(fs.readFileSync(data.file, { encoding: 'utf8' }), data); } }, - predicate: data => data instanceof ImportString || data instanceof ImportObject, - represent: data => data.getDumper(), + predicate: (data) => data instanceof ImportString || data instanceof ImportObject, + represent: (data) => data.getDumper(), }; // wrapper to accomodate a base url for files @@ -86,10 +86,7 @@ class FileType extends yaml.Type { } const getLandoSchema = (base = process.cwd()) => { - return yaml.DEFAULT_SCHEMA.extend([ - new FileType('!import', {...fileloader, base}), - new FileType('!load', {...fileloader, base}), - ]); + return yaml.DEFAULT_SCHEMA.extend([new FileType('!import', { ...fileloader, base }), new FileType('!load', { ...fileloader, base })]); }; class ImportString extends String { @@ -140,24 +137,23 @@ yaml._dump = yaml.dump; yaml.load = (data, options = {}) => { // if data is buffer then just pass it through - if (Buffer.isBuffer(data)) return yaml._load(data, {schema: getLandoSchema(options.base), ...options}); + if (Buffer.isBuffer(data)) return yaml._load(data, { schema: getLandoSchema(options.base), ...options }); // ditto for multiline strings - else if (data.split('\n').length > 1) return yaml._load(data, {schema: getLandoSchema(options.base), ...options}); + else if (data.split('\n').length > 1) return yaml._load(data, { schema: getLandoSchema(options.base), ...options }); // if we get here its either the path to a file or not // if data is actually a file then we do some extra stuff if (validPath(data) && fs.existsSync(data)) { options.base = options.base ?? path.dirname(path.resolve(data)); - data = fs.readFileSync(data, {encoding: 'utf8'}); + data = fs.readFileSync(data, { encoding: 'utf8' }); } // pass through - return yaml._load(data, {schema: getLandoSchema(options.base), ...options}); + return yaml._load(data, { schema: getLandoSchema(options.base), ...options }); }; yaml.dump = (data, options = {}) => { - return yaml._dump(data, {schema: getLandoSchema(), quotingType: '"', ...options}); + return yaml._dump(data, { schema: getLandoSchema(), quotingType: '"', ...options }); }; - module.exports = yaml; diff --git a/docs/.eslintrc.json b/docs/.eslintrc.json deleted file mode 100644 index 25a5930..0000000 --- a/docs/.eslintrc.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "parser": "@babel/eslint-parser", - "parserOptions": { - "sourceType": "module", - "ecmaVersion": 8, - "requireConfigFile": false - }, - "extends": [ - "plugin:vue/recommended", - "google" - ], - "root": true, - "rules": { - "linebreak-style": 0, - "arrow-parens": ["error", - "as-needed" - ], - "max-len": ["error", { - "code": 12000, - "ignoreComments": true - }] - } -} diff --git a/docs/.vitepress/config.mjs b/docs/.vitepress/config.mjs index d54193f..e3f99b5 100644 --- a/docs/.vitepress/config.mjs +++ b/docs/.vitepress/config.mjs @@ -1,12 +1,8 @@ -import {createRequire} from 'module'; +import { defineConfig } from '@lando/vitepress-theme-default-plus/config'; +import { default as getBaseUrl } from '@lando/vitepress-theme-default-plus/get-base-url'; +import { default as isDevRelease } from '@lando/vitepress-theme-default-plus/is-dev-release'; +import pjson from '../../package.json'; -import {defineConfig} from '@lando/vitepress-theme-default-plus/config'; -import {default as getBaseUrl} from '@lando/vitepress-theme-default-plus/get-base-url'; -import {default as isDevRelease} from '@lando/vitepress-theme-default-plus/is-dev-release'; - -const require = createRequire(import.meta.url); - -const pjson = require('../../package.json'); const landoPlugin = pjson.name.replace('@lando/', ''); // backwards compat with LANDO_MVB_VERSION @@ -27,12 +23,12 @@ const sidebarEnder = { { text: 'Other Doc Versions', items: [ - {text: 'stable', target: '_blank', link: '../../v/stable/'}, - {text: 'edge', target: '_blank', link: '../../v/edge/'}, - {text: 'see all versions', target: '_blank', link: '../../v/'}, + { text: 'stable', target: '_blank', link: '../../v/stable/' }, + { text: 'edge', target: '_blank', link: '../../v/edge/' }, + { text: 'see all versions', target: '_blank', link: '../../v/' }, ], }, - {text: 'Other Releases', link: 'https://github.com/lando/core-next/releases'}, + { text: 'Other Releases', link: 'https://github.com/lando/core-next/releases' }, ], }; @@ -53,14 +49,14 @@ export default defineConfig({ baseUrl, navBaseUrl: 'https://docs.lando.dev/v/next', head: [ - ['meta', {name: 'viewport', content: 'width=device-width, initial-scale=1'}], - ['link', {rel: 'icon', href: '/favicon.ico', size: 'any'}], - ['link', {rel: 'icon', href: '/favicon.svg', type: 'image/svg+xml'}], + ['meta', { name: 'viewport', content: 'width=device-width, initial-scale=1' }], + ['link', { rel: 'icon', href: '/favicon.ico', size: 'any' }], + ['link', { rel: 'icon', href: '/favicon.svg', type: 'image/svg+xml' }], ], themeConfig: { internalDomains: [ - '^https:\/\/lando-core-next\.netlify\.app(\/.*)?$', - '^https:\/\/[a-zA-Z0-9-]+--lando-core-next\.netlify\.app(\/.*)?$', + '^https:\/\/lando-core-next\.netlify\.app(\/.*)?$', // eslint-disable-line no-useless-escape + '^https:\/\/[a-zA-Z0-9-]+--lando-core-next\.netlify\.app(\/.*)?$', // eslint-disable-line no-useless-escape ], multiVersionBuild: { build: 'dev', @@ -71,32 +67,28 @@ export default defineConfig({ { text: 'Landofile', collapsed: false, - items: [ - {text: 'Services', link: '/landofile/services.html'}, - ], + items: [{ text: 'Services', link: '/landofile/services.html' }], }, { text: 'Services', collapsed: false, - items: [ - {text: 'L-337', link: '/services/l337.html'}, - ], + items: [{ text: 'L-337', link: '/services/l337.html' }], }, { text: 'Contribution', collapsed: false, items: [ - {text: 'Development', link: '/development'}, - {text: 'Team', link: '/team'}, + { text: 'Development', link: '/development' }, + { text: 'Team', link: '/team' }, ], }, { text: 'Help & Support', collapsed: false, items: [ - {text: 'GitHub', link: 'https://github.com/lando/core-next/issues/new/choose'}, - {text: 'Slack', link: 'https://www.launchpass.com/devwithlando'}, - {text: 'Contact Us', link: '/support'}, + { text: 'GitHub', link: 'https://github.com/lando/core-next/issues/new/choose' }, + { text: 'Slack', link: 'https://www.launchpass.com/devwithlando' }, + { text: 'Contact Us', link: '/support' }, ], }, { @@ -106,4 +98,3 @@ export default defineConfig({ ], }, }); - diff --git a/entitlements.xml b/entitlements.xml index a1c430a..afa54db 100644 --- a/entitlements.xml +++ b/entitlements.xml @@ -2,7 +2,15 @@ - com.apple.security.cs.allow-unsigned-executable-memory - + com.apple.security.cs.allow-jit + + com.apple.security.cs.allow-unsigned-executable-memory + + com.apple.security.cs.disable-executable-page-protection + + com.apple.security.cs.allow-dyld-environment-variables + + com.apple.security.cs.disable-library-validation + diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..07f9209 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,68 @@ +// eslint.config.js (ESM, ESLint 9+ flat config) +import js from '@eslint/js'; +import globals from 'globals'; + +import gitignore from 'eslint-config-flat-gitignore'; +import importPlugin from 'eslint-plugin-import'; +import prettierPlugin from 'eslint-plugin-prettier'; +import prettierConfig from 'eslint-config-prettier'; +import vuePlugin from 'eslint-plugin-vue'; + +export default [ + gitignore(), + + // Equivalent of "eslint:recommended" + js.configs.recommended, + + // Disable formatting-related rules that conflict with Prettier + prettierConfig, + + // Your project rules + { + files: ['**/*.{js,cjs,mjs,ts,tsx,vue}'], + languageOptions: { + ecmaVersion: 2025, + sourceType: 'module', + globals: { + ...globals.node, + ...globals.mocha, + ...globals.es2025, + }, + }, + plugins: { + import: importPlugin, + prettier: prettierPlugin, + vue: vuePlugin, + }, + ignores: ['**/*.d.ts', '**/*.map'], + rules: { + // Prettier + 'prettier/prettier': 'error', + + // Code quality + 'no-console': 'warn', + 'no-debugger': 'error', + + // Enforce ESM (no CommonJS) + 'import/no-commonjs': 'error', + + // Import plugin base rules (equivalent-ish to plugin:import/recommended + errors/warnings) + ...(importPlugin.configs?.recommended?.rules ?? {}), + ...(importPlugin.configs?.errors?.rules ?? {}), + ...(importPlugin.configs?.warnings?.rules ?? {}), + + // Vue recommended rules + ...(vuePlugin.configs?.recommended?.rules ?? {}), + }, + settings: { + 'import/resolver': { + 'typescript-bun': { + project: true, + alwaysTryTypes: true, + }, + 'exports': true, + 'node': true, + }, + }, + }, +]; diff --git a/hooks/app-add-2-landonet.js b/hooks/app-add-2-landonet.js index af8edd6..d044017 100644 --- a/hooks/app-add-2-landonet.js +++ b/hooks/app-add-2-landonet.js @@ -6,21 +6,27 @@ module.exports = async (app, lando) => { // We assume the lando net exists at this point const landonet = lando.engine.getNetwork(lando.config.networkBridge); // List all our app containers - return lando.engine.list({project: app.project}) - // Go through each container - .map(container => { - // Define the internal aliae - const internalAlias = `${container.service}.${container.app}.internal`; - // Sometimes you need to disconnect before you reconnect - return landonet.disconnect({Container: container.id, Force: true}) - // Only throw non not connected errors - .catch(error => { - if (!_.includes(error.message, 'is not connected to network')) throw error; - }) - // Connect - .then(() => { - landonet.connect({Container: container.id, EndpointConfig: {Aliases: [internalAlias]}}); - app.log.debug('connected %s to the landonet', container.name); - }); - }); + return ( + lando.engine + .list({ project: app.project }) + // Go through each container + .map((container) => { + // Define the internal aliae + const internalAlias = `${container.service}.${container.app}.internal`; + // Sometimes you need to disconnect before you reconnect + return ( + landonet + .disconnect({ Container: container.id, Force: true }) + // Only throw non not connected errors + .catch((error) => { + if (!_.includes(error.message, 'is not connected to network')) throw error; + }) + // Connect + .then(() => { + landonet.connect({ Container: container.id, EndpointConfig: { Aliases: [internalAlias] } }); + app.log('connected %s to the landonet', container.name); + }) + ); + }) + ); }; diff --git a/hooks/app-add-healthchecks.js b/hooks/app-add-healthchecks.js index 4694865..31d1001 100644 --- a/hooks/app-add-healthchecks.js +++ b/hooks/app-add-healthchecks.js @@ -4,10 +4,10 @@ const _ = require('lodash'); const debug = require('debug')('@lando/core:healthcheck'); const isStringy = require('../utils/is-stringy'); -const {color} = require('listr2'); +const { color } = require('listr2'); -module.exports = async app => { - const exec = (command, container, {api = 3, service, log = debug, user = 'root'} = {}) => { +module.exports = async (app) => { + const exec = (command, container, { api = 3, service, log = debug, user = 'root' } = {}) => { log('running %o healthcheck %o...', service, command); // if is stringy then multipass @@ -16,36 +16,37 @@ module.exports = async app => { command = api === 3 ? ['/helpers/exec-multiliner.sh', command] : ['/etc/lando/exec-multiliner.sh', command]; } - return app.engine.run({ - id: container, - cmd: command, - compose: app.compose, - project: app.project, - opts: { - user, - cstdio: 'pipe', - silent: true, - noTTY: true, - services: [service], - }, - }) - .then(response => { - log('%o healthcheck passed with output %o', service, command, response); - return {service, command, response}; - }) - .catch(error => { - error.code = 1; - error.service = service; - log('%o healthcheck failed with error %o, code %o', service, error.message, error.code); - throw error; - }); + return app.engine + .run({ + id: container, + cmd: command, + compose: app.compose, + project: app.project, + opts: { + user, + cstdio: 'pipe', + silent: true, + noTTY: true, + services: [service], + }, + }) + .then((response) => { + log('%o healthcheck passed with output %o', service, command, response); + return { service, command, response }; + }) + .catch((error) => { + error.code = 1; + error.service = service; + log('%o healthcheck failed with error %o, code %o', service, error.message, error.code); + throw error; + }); }; // start by getting "legacy" healthchecks that are expressed in lando.info via the _service builder const legacyHealthchecks = _(_.get(app, 'info', [])) - .filter(info => _.has(info, 'healthcheck')) - .filter(info => info.api === 3) - .map(info => ({ + .filter((info) => _.has(info, 'healthcheck')) + .filter((info) => info.api === 3) + .map((info) => ({ container: app.containers[info.service], name: info.service, service: info.service, @@ -55,8 +56,8 @@ module.exports = async app => { // now get "new" healthchecks const newV3Healthchecks = _(_.get(app, 'parsedV3Services', [])) - .filter(service => _.has(service, 'healthcheck')) - .map(service => ({ + .filter((service) => _.has(service, 'healthcheck')) + .map((service) => ({ api: 3, container: app.containers[service.name], name: service.name, @@ -65,9 +66,9 @@ module.exports = async app => { })) .value(); const newV4Healthchecks = _(_.get(app, 'v4.services', [])) - .filter(service => _.has(service, 'healthcheck')) - .filter(service => service.canHealthcheck) - .map(service => ({ + .filter((service) => _.has(service, 'healthcheck')) + .filter((service) => service.canHealthcheck) + .map((service) => ({ api: 4, container: app.containers[service.name], name: service.name, @@ -79,67 +80,73 @@ module.exports = async app => { // now combine the two but give priority to the new one const healthchecks = _([...newV3Healthchecks, ...newV4Healthchecks, ...legacyHealthchecks]) .groupBy('container') - .map(checks => checks[0]) - .filter(check => !require('../utils/is-disabled')(check.command)) - .filter(check => { - const info = app.info.find(data => data.service === check.service); + .map((checks) => checks[0]) + .filter((check) => !require('../utils/is-disabled')(check.command)) + .filter((check) => { + const info = app.info.find((data) => data.service === check.service); return info.error === undefined; }) .value(); // put into checks format - const checks = _(healthchecks).map(healthcheck => ({ - type: 'healthcheck', - test: exec, - container: healthcheck.container, - service: healthcheck.service, - delay: healthcheck.delay, - retry: healthcheck.retry, - title: healthcheck.service, - args: [healthcheck.command, healthcheck.container, { - api: healthcheck.api, - log: app.log.debug, + const checks = _(healthchecks) + .map((healthcheck) => ({ + type: 'healthcheck', + test: exec, + container: healthcheck.container, service: healthcheck.service, - user: healthcheck.user, - }], - })) - .value(); + delay: healthcheck.delay, + retry: healthcheck.retry, + title: healthcheck.service, + args: [ + healthcheck.command, + healthcheck.container, + { + api: healthcheck.api, + log: app.log, + service: healthcheck.service, + user: healthcheck.user, + }, + ], + })) + .value(); // combine our checks into app.checks app.checks = [...app.checks, ...checks].filter(Boolean); // generate tasks - const tasks = _(checks).map(healthcheck => ({ - title: `Healthcheck ${healthcheck.container}`, - retry: healthcheck.retry, - task: async (ctx, task) => { - // add the metadata - ctx.data[healthcheck.service] = healthcheck; - - try { - await healthcheck.test(...healthcheck.args); - } catch (error) { - // assess retry situation - const {count} = task.isRetrying(); - // do different things depending on whether a retry is pending - if (count === healthcheck.retry) { - ctx.errors.push(error); - } else { - await require('delay')(healthcheck.delay + (100 * count)); + const tasks = _(checks) + .map((healthcheck) => ({ + title: `Healthcheck ${healthcheck.container}`, + retry: healthcheck.retry, + task: async (ctx, task) => { + // add the metadata + ctx.data[healthcheck.service] = healthcheck; + + try { + await healthcheck.test(...healthcheck.args); + } catch (error) { + // assess retry situation + const { count } = task.isRetrying(); + // do different things depending on whether a retry is pending + if (count === healthcheck.retry) { + ctx.errors.push(error); + } else { + await require('delay')(healthcheck.delay + 100 * count); + } + + throw error; + + // finally add a slight delay to help post-start events run without failure + // and to update the service info + } finally { + const service = _.find(app.info, { service: healthcheck.service }); + service.healthy = _.find(ctx.errors, { service: healthcheck.service }) === undefined; + await require('delay')(1000); } - - throw error; - - // finally add a slight delay to help post-start events run without failure - // and to update the service info - } finally { - const service = _.find(app.info, {service: healthcheck.service}); - service.healthy = _.find(ctx.errors, {service: healthcheck.service}) === undefined; - await require('delay')(1000); - } - }, - })) - .value(); + }, + })) + .value(); // add our listr2 check tasklist app.checks.push({ @@ -147,23 +154,27 @@ module.exports = async app => { test: async (tasks, options) => { if (tasks && tasks.length > 0) { // run tasks - const {errors} = await app.runTasks(tasks, options); + const { errors } = await app.runTasks(tasks, options); // if we have errors lets add relevant warnings if (errors && errors.length > 0) { - _.forEach(errors, error => { + _.forEach(errors, (error) => { // parse the message const message = _.trim(_.get(error, 'message', 'UNKNOWN ERROR')); // add the warning - app.addMessage({ - title: `The service "${error.service}" failed its healthcheck`, - type: 'warning', - detail: [ - `Failed with ${color.yellow(message)}`, - 'This may be ok but we recommend you run the command below to investigate:', - ], - command: `lando logs -s ${error.service}`, - }, error, true); + app.addMessage( + { + title: `The service "${error.service}" failed its healthcheck`, + type: 'warning', + detail: [ + `Failed with ${color.yellow(message)}`, + 'This may be ok but we recommend you run the command below to investigate:', + ], + command: `lando logs -s ${error.service}`, + }, + error, + true, + ); }); } @@ -172,17 +183,20 @@ module.exports = async app => { app.v4.updateComposeCache(); } }, - args: [tasks, { - renderer: 'dc2', - rendererOptions: { - header: 'Healthchecking', - states: { - COMPLETED: 'Passed', - STARTED: 'Running', - RETRY: 'Running', - FAILED: 'FAILED', + args: [ + tasks, + { + renderer: 'dc2', + rendererOptions: { + header: 'Healthchecking', + states: { + COMPLETED: 'Passed', + STARTED: 'Running', + RETRY: 'Running', + FAILED: 'FAILED', + }, }, }, - }], + ], }); }; diff --git a/hooks/app-add-hostnames.js b/hooks/app-add-hostnames.js index ddf6ada..fbfdb76 100644 --- a/hooks/app-add-hostnames.js +++ b/hooks/app-add-hostnames.js @@ -2,12 +2,12 @@ const _ = require('lodash'); -module.exports = async app => { - app.log.debug('adding hostnames to the app...'); - _.forEach(app.info, data => { +module.exports = async (app) => { + app.log('adding hostnames to the app...'); + _.forEach(app.info, (data) => { data.hostnames = _.get(data, 'hostnames', []); data.hostnames.push([data.service, app.project, 'internal'].join('.')); data.hostnames = _.uniq(data.hostnames); - app.log.debug('hostnames added to %s', data.service, data.hostnames); + app.log('hostnames added to %s', data.service, data.hostnames); }); }; diff --git a/hooks/app-add-proxy-2-landonet.js b/hooks/app-add-proxy-2-landonet.js index 831b251..f233423 100644 --- a/hooks/app-add-proxy-2-landonet.js +++ b/hooks/app-add-proxy-2-landonet.js @@ -11,36 +11,39 @@ module.exports = async (app, lando) => { const proxyContainer = lando.config.proxyContainer; // Make sure the proxy container exists before we proceed - return lando.engine.exists({id: proxyContainer}).then(exists => { + return lando.engine.exists({ id: proxyContainer }).then((exists) => { // if doesnt exist then bail if (!exists) return lando.Promise.resolve(); // Otherwise scan and add as needed - return lando.engine.scan({id: proxyContainer}).then(data => { + return lando.engine.scan({ id: proxyContainer }).then((data) => { // Get existing aliases and merge them into our new ones // @NOTE: Do we need to handle wildcards and paths? const aliasPath = `NetworkSettings.Networks.${lando.config.networkBridge}.Aliases`; const aliases = _(_.get(app, 'config.proxy', [])) - .map(route => route) + .map((route) => route) .flatten() - .map(entry => _.isString(entry) ? entry : entry.hostname) - .map(entry => _.first(entry.split(':'))) + .map((entry) => (_.isString(entry) ? entry : entry.hostname)) + .map((entry) => _.first(entry.split(':'))) .compact() - .thru(routes => routes.concat(_.get(data, aliasPath, []))) + .thru((routes) => routes.concat(_.get(data, aliasPath, []))) .uniq() .value(); // Disconnect so we can reconnect - return bridgeNet.disconnect({Container: proxyContainer, Force: true}) - // Only throw non not connected errors - .catch(error => { - if (!_.includes(error.message, 'is not connected to network')) throw error; - }) - // Connect - .then(() => { - bridgeNet.connect({Container: proxyContainer, EndpointConfig: {Aliases: aliases}}); - app.log.debug('aliased %j to the proxynet', aliases); - }); + return ( + bridgeNet + .disconnect({ Container: proxyContainer, Force: true }) + // Only throw non not connected errors + .catch((error) => { + if (!_.includes(error.message, 'is not connected to network')) throw error; + }) + // Connect + .then(() => { + bridgeNet.connect({ Container: proxyContainer, EndpointConfig: { Aliases: aliases } }); + app.log('aliased %j to the proxynet', aliases); + }) + ); }); }); }; diff --git a/hooks/app-add-recipes.js b/hooks/app-add-recipes.js index 1d700ad..22574b1 100644 --- a/hooks/app-add-recipes.js +++ b/hooks/app-add-recipes.js @@ -5,11 +5,11 @@ const _ = require('lodash'); module.exports = async (app, lando) => { if (_.has(app, 'config.recipe')) { // Throw a warning if recipe is not supported - if (_.isEmpty(_.find(lando.factory.get(), {name: app.config.recipe}))) { - app.log.warn('%s is not a supported recipe type.', app.config.recipe); + if (_.isEmpty(_.find(lando.factory.get(), { name: app.config.recipe }))) { + app.log('%s is not a supported recipe type.', app.config.recipe); } // Log da things - app.log.verbose('building %s recipe named %s', app.config.recipe, app.project); + app.log('building %s recipe named %s', app.config.recipe, app.project); // Build da things // @NOTE: this also gathers app.info and build steps const Recipe = lando.factory.get(app.config.recipe); @@ -20,10 +20,10 @@ module.exports = async (app, lando) => { // Cache dump our app tooling so we can use it in our entrypoint // @NOTE: we dump pre-merge so that tooling directly in the landofile is not mixed in - lando.cache.set(app.recipeCache, recipe, {persist: true}); + lando.cache.set(app.recipeCache, recipe, { persist: true }); // Merge stuff together correctly app.config.proxy = _.merge({}, recipe.proxy, _.get(app, 'config.proxy', {})); - app.config = lando.utils.merge({services: recipe.services, tooling: recipe.tooling}, app.config); + app.config = lando.utils.merge({ services: recipe.services, tooling: recipe.tooling }, app.config); } }; diff --git a/hooks/app-add-tooling.js b/hooks/app-add-tooling.js index 1efb80b..8a647d6 100644 --- a/hooks/app-add-tooling.js +++ b/hooks/app-add-tooling.js @@ -4,11 +4,11 @@ const _ = require('lodash'); module.exports = async (app, lando) => { if (!_.isEmpty(_.get(app, 'config.tooling', {}))) { - app.log.verbose('additional tooling detected'); + app.log('additional tooling detected'); // Add the tasks after we init the app - _.forEach(require('../utils/get-tooling-tasks')(app.config.tooling, app), task => { - app.log.debug('adding app cli task %s', task.name); + _.forEach(require('../utils/get-tooling-tasks')(app.config.tooling, app), (task) => { + app.log('adding app cli task %s', task.name); const injectable = _.has(app, 'engine') ? app : lando; app.tasks.push(require('../utils/build-tooling-task')(task, injectable)); }); diff --git a/hooks/app-add-url-scans.js b/hooks/app-add-url-scans.js index 48e2fe4..2d2c8af 100644 --- a/hooks/app-add-url-scans.js +++ b/hooks/app-add-url-scans.js @@ -5,25 +5,29 @@ const _ = require('lodash'); module.exports = async (app, lando) => { // get checks for each URL const checks = _(app.info) - .filter(service => !_.isEmpty(service.urls)) - .flatMap(service => _(service.urls) - .map(url => ({ - type: 'url-scan', - test: require('../utils/scanner'), - service: service.service, - delay: _.get(app, `config.services.${service.service}.scanner.delay`, 1000), - retry: _.get(app, `config.services.${service.service}.scanner.retry`, 25), - skip: _.get(app, `config.services.${service.service}.scanner`) === false || _.includes(url, '*'), - title: url, - args: [url, { - okCodes: _.get(app, `config.services.${service.service}.scanner.okCodes`, [300, 301, 302, 303, 304, 305, 306, 307, 308, 404]), // eslint-disable-line max-len - maxRedirects: _.get(app, `config.services.${service.service}.scanner.maxRedirects`, 0), - timeout: _.get(app, `config.services.${service.service}.scanner.timeout`, 10000), - log: app.log.debug, - path: _.get(app, `config.services.${service.service}.scanner.path`, '/'), - }], - })) - .value(), + .filter((service) => !_.isEmpty(service.urls)) + .flatMap((service) => + _(service.urls) + .map((url) => ({ + type: 'url-scan', + test: require('../utils/scanner'), + service: service.service, + delay: _.get(app, `config.services.${service.service}.scanner.delay`, 1000), + retry: _.get(app, `config.services.${service.service}.scanner.retry`, 25), + skip: _.get(app, `config.services.${service.service}.scanner`) === false || _.includes(url, '*'), + title: url, + args: [ + url, + { + okCodes: _.get(app, `config.services.${service.service}.scanner.okCodes`, [300, 301, 302, 303, 304, 305, 306, 307, 308, 404]), // eslint-disable-line max-len + maxRedirects: _.get(app, `config.services.${service.service}.scanner.maxRedirects`, 0), + timeout: _.get(app, `config.services.${service.service}.scanner.timeout`, 10000), + log: app.log, + path: _.get(app, `config.services.${service.service}.scanner.path`, '/'), + }, + ], + })) + .value(), ) .value(); @@ -32,13 +36,15 @@ module.exports = async (app, lando) => { // if we have the CLI then add more checks but as listr tasks const tasks = _(app.checks) - .filter(checks => checks.type === 'url-scan') + .filter((checks) => checks.type === 'url-scan') .groupBy('service') .map((tasks, name) => ({ title: lando.cli.chalk.cyan(`${_.upperCase(name)} URLS`), task: (ctx, task) => { - const subtasks = _(tasks).map(subtask => require('../utils/checks-to-tasks')(subtask)).value(); - return task.newListr(subtasks, {concurrent: true, exitOnError: false}); + const subtasks = _(tasks) + .map((subtask) => require('../utils/checks-to-tasks')(subtask)) + .value(); + return task.newListr(subtasks, { concurrent: true, exitOnError: false }); }, })) .value(); @@ -47,9 +53,12 @@ module.exports = async (app, lando) => { app.checks.push({ type: 'url-scan-tasks', test: app.runTasks.bind(app), - args: [tasks, { - renderer: 'lando', - rendererOptions: {level: 1}, - }], + args: [ + tasks, + { + renderer: 'lando', + rendererOptions: { level: 1 }, + }, + ], }); }; diff --git a/hooks/app-add-v3-services.js b/hooks/app-add-v3-services.js index fe36594..972d699 100644 --- a/hooks/app-add-v3-services.js +++ b/hooks/app-add-v3-services.js @@ -6,21 +6,23 @@ module.exports = async (app, lando) => { // add parsed services to app object so we can use them downstream app.cachedInfo = _.get(lando.cache.get(app.composeCache), 'info', []); app.parsedServices = require('../utils/parse-v3-services')(_.get(app, 'config.services', {}), app); - app.parsedV3Services = _(app.parsedServices).filter(service => service.api === 3).value(); - app.servicesList = app.parsedV3Services.map(service => service.name); + app.parsedV3Services = _(app.parsedServices) + .filter((service) => service.api === 3) + .value(); + app.servicesList = app.parsedV3Services.map((service) => service.name); // build each service - _.forEach(app.parsedV3Services, service => { + _.forEach(app.parsedV3Services, (service) => { // Throw a warning if service is not supported - if (_.isEmpty(_.find(lando.factory.get(), {api: 3, name: service.type}))) { - app.log.warn('%s is not a supported service type.', service.type); + if (_.isEmpty(_.find(lando.factory.get(), { api: 3, name: service.type }))) { + app.log('%s is not a supported service type.', service.type); } // Log da things - app.log.verbose('building v3 %s service %s', service.type, service.name); + app.log('building v3 %s service %s', service.type, service.name); // Build da things const Service = lando.factory.get(service.type, service.api); - const data = new Service(service.name, _.merge({}, service, {_app: app}), lando.factory); - const cachedInfo = _.find(app.cachedInfo, {service: service.name}) ?? {}; + const data = new Service(service.name, _.merge({}, service, { _app: app }), lando.factory); + const cachedInfo = _.find(app.cachedInfo, { service: service.name }) ?? {}; const info = _.merge({}, cachedInfo, data.info); // add da data @@ -30,21 +32,22 @@ module.exports = async (app, lando) => { // we need to add any "managed" services stealth added by service builders const managed = _(app.info) - .filter(service => service.managed && service.api === 3) - .filter(service => !_.includes(app.servicesList, service.service)) - .map(service => _.merge({}, service, { - _app: app, - app: app.name, - name: service.service, - home: lando.config.home, - project: app.project, - userConfRoot: lando.config.userConfRoot, - })) + .filter((service) => service.managed && service.api === 3) + .filter((service) => !_.includes(app.servicesList, service.service)) + .map((service) => + _.merge({}, service, { + _app: app, + app: app.name, + name: service.service, + home: lando.config.home, + project: app.project, + userConfRoot: lando.config.userConfRoot, + }), + ) .value(); - // add to our lists app.parsedServices = app.parsedServices.concat(managed); app.parsedV3Services = app.parsedV3Services.concat(managed); - app.servicesList = app.servicesList.concat(managed.map(service => service.name)); + app.servicesList = app.servicesList.concat(managed.map((service) => service.name)); }; diff --git a/hooks/app-add-v4-services.js b/hooks/app-add-v4-services.js index 54b0f50..adfe9e6 100644 --- a/hooks/app-add-v4-services.js +++ b/hooks/app-add-v4-services.js @@ -6,27 +6,27 @@ const path = require('path'); module.exports = async (app, lando) => { // add parsed services to app object so we can use them downstream app.v4.parsedConfig = _(require('../utils/parse-v4-services')(_.get(app, 'config.services', {}))) - .filter(service => service.api === 4) + .filter((service) => service.api === 4) .value(); - app.v4.servicesList = app.v4.parsedConfig.map(service => service.name); + app.v4.servicesList = app.v4.parsedConfig.map((service) => service.name); app.v4.cachedInfo = _.get(lando.cache.get(app.v4.composeCache), 'info', []); // if no service is set as the primary one lets set the first one as primary - if (_.find(app.v4.parsedConfig, service => service.primary === true) === undefined) { + if (_.find(app.v4.parsedConfig, (service) => service.primary === true) === undefined) { if (_.has(app, 'v4.parsedConfig[0].name')) app.v4.parsedConfig[0].primary = true; } // note the primary service in a more convenient place so we dont have to search for it all the time if (app.v4.servicesList.length > 0) { - app.v4.primaryService = _.find(app.v4.parsedConfig, service => service.primary === true); - app.log.debug('%s is the primary v4 service', app.v4.primaryService.name); + app.v4.primaryService = _.find(app.v4.parsedConfig, (service) => service.primary === true); + app.log('%s is the primary v4 service', app.v4.primaryService.name); } // instantiate each service - _.forEach(app.v4.parsedConfig, config => { + _.forEach(app.v4.parsedConfig, (config) => { // Throw a warning if builder is not supported - if (_.isEmpty(_.find(lando.factory.get(), {api: 4, name: config.builder}))) { - app.log.warn('%s is not a supported v4 builder.', config.builder); + if (_.isEmpty(_.find(lando.factory.get(), { api: 4, name: config.builder }))) { + app.log('%s is not a supported v4 builder.', config.builder); } // @TODO: @@ -35,7 +35,7 @@ module.exports = async (app, lando) => { // concept that lets the "entrypoint builder" // get any cached info so we can set that as a base in the service - const info = _(_.find(app.v4.cachedInfo, {service: config.name, api: 4})) + const info = _(_.find(app.v4.cachedInfo, { service: config.name, api: 4 })) .pick(['healthy', 'image', 'state', 'tag']) .value(); @@ -46,19 +46,24 @@ module.exports = async (app, lando) => { Service.orchestrator = lando.config.orchestratorBin; // instantiate - const service = new Service(config.name, { - ...{ - appRoot: app.root, - context: path.join(app.v4._dir, 'build-contexts', config.name), - debug: app.v4._debugShim, - info, - project: app.project, - tag: `${_.get(lando, 'product', 'lando')}/${app.name}-${app.id}-${config.name}:latest`, - tlvolumes: app.config.volumes, - tmpdir: path.join(app.v4._dir, 'tmp', config.name), + const service = new Service( + config.name, + { + ...{ + appRoot: app.root, + context: path.join(app.v4._dir, 'build-contexts', config.name), + debug: app.v4._debugShim, + info, + project: app.project, + tag: `${_.get(lando, 'product', 'lando')}/${app.name}-${app.id}-${config.name}:latest`, + tlvolumes: app.config.volumes, + tmpdir: path.join(app.v4._dir, 'tmp', config.name), + }, + ...config, }, - ...config, - }, app, lando); + app, + lando, + ); // push app.v4.services.push(service); diff --git a/hooks/app-check-for-updates.js b/hooks/app-check-for-updates.js index 078d873..d184253 100644 --- a/hooks/app-check-for-updates.js +++ b/hooks/app-check-for-updates.js @@ -2,16 +2,16 @@ module.exports = async (app, lando) => { if (lando.config.channel !== 'none' && !lando.cache.get('updates-2')) { - lando.log.debug('checking for updates...'); + lando.log('checking for updates...'); // add the plugins and install dir - const dir = lando.config.pluginDirs.find(dir => dir.type === require('../utils/get-plugin-type')()); + const dir = lando.config.pluginDirs.find((dir) => dir.type === require('../utils/get-plugin-type')()); lando.updates.plugins = lando.config.plugins; lando.updates.dir = dir ? dir.dir : undefined; const tasks = await lando.updates.getUpdateTasks(); // next check in a day const expires = Date.now() + 60 * 60 * 24 * 1000; - lando.log.debug('%s updates available, next check at %s', tasks.length, new Date(expires)); - lando.cache.set('updates-2', {updates: tasks.length, expires}, {persist: true}); + lando.log('%s updates available, next check at %s', tasks.length, new Date(expires)); + lando.cache.set('updates-2', { updates: tasks.length, expires }, { persist: true }); } }; diff --git a/hooks/app-check-ssh-keys.js b/hooks/app-check-ssh-keys.js index 466743e..e4e4677 100644 --- a/hooks/app-check-ssh-keys.js +++ b/hooks/app-check-ssh-keys.js @@ -8,15 +8,15 @@ module.exports = async (app, lando) => { // Get keys on host const sshDir = path.resolve(lando.config.home, '.ssh'); const keys = _(fs.readdirSync(sshDir)) - .filter(file => !_.includes(['config', 'known_hosts'], file)) - .filter(file => path.extname(file) !== '.pub') + .filter((file) => !_.includes(['config', 'known_hosts'], file)) + .filter((file) => path.extname(file) !== '.pub') .value(); // Determine the key size const keySize = _.size(_.get(app, 'config.keys', keys)); - app.log.verbose('analyzing user ssh keys... using %s of %s', keySize, _.size(keys)); - app.log.debug('key config... ', _.get(app, 'config.keys', 'none')); - app.log.silly('users keys', keys); + app.log('analyzing user ssh keys... using %s of %s', keySize, _.size(keys)); + app.log('key config... ', _.get(app, 'config.keys', 'none')); + app.log('users keys', keys); // Add a warning if we have more keys than the warning level if (keySize > lando.config.maxKeyWarning) { app.addMessage(require('../messages/max-key-tip')); diff --git a/hooks/app-find-localhosts.js b/hooks/app-find-localhosts.js index da4c0d6..5458e56 100644 --- a/hooks/app-find-localhosts.js +++ b/hooks/app-find-localhosts.js @@ -3,13 +3,13 @@ const _ = require('lodash'); // Helper to get http/https ports -const getHttpPorts = data => { +const getHttpPorts = (data) => { return _.uniq([ ..._.get(data, 'Config.Labels["io.lando.http-ports"]', '80,443').split(','), ..._.get(data, 'Config.Labels["dev.lando.http-ports"]', '').split(','), ]); }; -const getHttpsPorts = data => { +const getHttpsPorts = (data) => { return _.uniq([ ..._.get(data, 'Config.Labels["io.lando.https-ports"]', '443').split(','), ..._.get(data, 'Config.Labels["dev.lando.https-ports"]', '').split(','), @@ -17,29 +17,34 @@ const getHttpsPorts = data => { }; module.exports = async (app, lando) => { - app.log.verbose('attempting to find open services...'); - return app.engine.list({project: app.project}) - // Return running containers - .filter(container => app.engine.isRunning(container.id)) - // Make sure they are still a defined service (eg if the user changes their lando yml) - .filter(container => _.includes(app.services, container.service)) - // Inspect each and add new URLS - .map(container => app.engine.scan(container)) - // Scan all the http ports - .map(data => require('../utils/get-exposed-localhosts')( - data, - _.uniq([...getHttpPorts(data), ...getHttpsPorts(data)]), - getHttpsPorts(data), - lando.config.bindAddress, - )) - // add data to existing info - .map(data => { - // get info - const info = _.find(app.info, {service: data.service}); - // remove existing localhosts because they are probably stale - _.remove(info.urls, url => url.startsWith('http://localhost')); - _.remove(info.urls, url => url.startsWith('https://localhost')); - // and then reset - info.urls = _.uniq([...info.urls, ...data.urls]); - }); + app.log('attempting to find open services...'); + return ( + app.engine + .list({ project: app.project }) + // Return running containers + .filter((container) => app.engine.isRunning(container.id)) + // Make sure they are still a defined service (eg if the user changes their lando yml) + .filter((container) => _.includes(app.services, container.service)) + // Inspect each and add new URLS + .map((container) => app.engine.scan(container)) + // Scan all the http ports + .map((data) => + require('../utils/get-exposed-localhosts')( + data, + _.uniq([...getHttpPorts(data), ...getHttpsPorts(data)]), + getHttpsPorts(data), + lando.config.bindAddress, + ), + ) + // add data to existing info + .map((data) => { + // get info + const info = _.find(app.info, { service: data.service }); + // remove existing localhosts because they are probably stale + _.remove(info.urls, (url) => url.startsWith('http://localhost')); + _.remove(info.urls, (url) => url.startsWith('https://localhost')); + // and then reset + info.urls = _.uniq([...info.urls, ...data.urls]); + }) + ); }; diff --git a/hooks/app-init-proxy.js b/hooks/app-init-proxy.js index 4ada406..52694ac 100644 --- a/hooks/app-init-proxy.js +++ b/hooks/app-init-proxy.js @@ -6,24 +6,34 @@ const path = require('path'); module.exports = async (app, lando) => { if (lando.config.proxy === 'ON' && (!_.isEmpty(app.config.proxy) || !_.isEmpty(app.config.recipe))) { - app.log.verbose('proxy settings detected.'); + app.log('proxy settings detected.'); - lando.log.verbose('proxy is ON.'); - lando.log.verbose('Setting the default proxy certificate %s', lando.config.proxyDefaultCert); + lando.log('proxy is ON.'); + lando.log('Setting the default proxy certificate %s', lando.config.proxyDefaultCert); // Create needed directories - fs.mkdirSync(lando.config.proxyConfigDir, {recursive: true}); - const files = [{ - path: path.join(lando.config.proxyConfigDir, 'default-certs.yaml'), - data: {tls: {stores: {default: {defaultCertificate: { - certFile: lando.config.proxyDefaultCert, - keyFile: lando.config.proxyDefaultKey, - }}}}}, - }]; + fs.mkdirSync(lando.config.proxyConfigDir, { recursive: true }); + const files = [ + { + path: path.join(lando.config.proxyConfigDir, 'default-certs.yaml'), + data: { + tls: { + stores: { + default: { + defaultCertificate: { + certFile: lando.config.proxyDefaultCert, + keyFile: lando.config.proxyDefaultKey, + }, + }, + }, + }, + }, + }, + ]; // Finally add in custom config if we have it if (!_.isEmpty(lando.config.proxyCustom)) { - lando.log.verbose('adding custom proxy config'); - lando.log.debug('custom proxy config', lando.config.proxyCustom); + lando.log('adding custom proxy config'); + lando.log('custom proxy config', lando.config.proxyCustom); files.push({ path: path.join(lando.config.proxyConfigDir, 'user-custom.yaml'), data: lando.config.proxyCustom, @@ -31,6 +41,6 @@ module.exports = async (app, lando) => { } // Remove and redump all the files - _.forEach(files, file => lando.yaml.dump(file.path, file.data)); + _.forEach(files, (file) => lando.yaml.dump(file.path, file.data)); } }; diff --git a/hooks/app-load-legacy-sharing.js b/hooks/app-load-legacy-sharing.js deleted file mode 100644 index e1ed5e0..0000000 --- a/hooks/app-load-legacy-sharing.js +++ /dev/null @@ -1,107 +0,0 @@ -'use strict'; - -// Modules -const _ = require('lodash'); -const path = require('path'); -const toObject = require('../utils/to-object'); - -// Helper to get excludes -const getExcludes = (data = [], inverse = false) => _(data) - .filter(exclude => _.startsWith(exclude, '!') === inverse) - .map(exclude => _.trimStart(exclude, '!')) - .uniq() - .compact() - .value(); - -// Get directories to include -const getIncludeVolumes = (excludes = [], base = '/app', mount = 'cached') => _(excludes) - .map(exclude => `${base}/${exclude}:/app/${exclude}:${mount}`) - .value(); - -// Helper to get includes -const getIncludes = data => getExcludes(data, true); - -// Helper to get named volume -const getNamedVolumeName = exclude => 'exclude_' + path - .normalize(exclude).replace(/\W/g, '').split(path.sep).join('_'); - -// Helper to map exclude directories to named volume name -const getNamedVolumeNames = (excludes = []) => _(excludes) - .map(exclude => getNamedVolumeName(exclude)) - .value(); - -// Helper to get named volumes -const getNamedVolumes = (excludes = []) => _(excludes) - .thru(excludes => toObject(getNamedVolumeNames(excludes))) - .value(); - -// Helper to get popuylation command -const getPopCommand = (excludes = []) => _.compact(_.flatten([['/helpers/mounter.sh'], excludes])); - -// Get service volumes -const getServiceVolumes = (excludes = [], base = '/tmp') => _(excludes) - .map(exclude => ({mount: getNamedVolumeName(exclude), path: path.posix.join(base, exclude)})) - .map(exclude => `${exclude.mount}:${exclude.path}`) - .value(); - -// Helper to determine whether we should exclude -const shouldExclude = (excludes = []) => { - // Only do this on non linux - if (process.platform === 'linux') return false; - // Otherwise return if we have non-empty config - return !_.isEmpty(getExcludes(excludes)); -}; - -module.exports = (app, lando) => { - if (shouldExclude(_.get(app, 'config.excludes', []))) { - // Get our excludes - const excludes = getExcludes(app.config.excludes); - const includes = getIncludes(app.config.excludes, true); - - // If we have no build lock and cant use mutagen lets make sure we (re)populate our volumes - app.events.on('pre-start', 2, () => { - if (!lando.cache.get(`${app.name}.build.lock`)) { - const LandoMounter = lando.factory.get('_mounter'); - const mountData = new LandoMounter(lando.config, app.root, excludes); - const mountDir = path.join(lando.config.userConfRoot, 'mounter', app.name); - const mountFiles = lando.utils.dumpComposeData(mountData, mountDir); - const run = { - compose: mountFiles, - project: app.project, - cmd: getPopCommand(excludes), - opts: { - mode: 'attach', - services: ['mounter'], - autoRemove: true, - workdir: '/source', - }, - }; - return lando.engine.run(run) - // Destroy on fail - .catch(err => { - run.opts = {purge: true, mode: 'attach'}; - return lando.engine.stop(run).then(() => lando.engine.destroy(run)).then(() => lando.Promise.reject(err)); - }); - } - }); - - // Sharing is caring - app.events.on('post-init', () => { - const serviceExcludes = getServiceVolumes(excludes, '/app'); - const serviceIncludes = getIncludeVolumes(includes, app.root); - - // only allow excludes on non api4 services - const services = app.services.filter(service => { - const {api} = app.info.find(s => s.service === service) ?? {api: 3}; - return api !== 4; - }); - - app.add(new app.ComposeService('excludes', {}, { - volumes: getNamedVolumes(excludes), - services: toObject(services, { - volumes: _.compact(serviceExcludes.concat(serviceIncludes)), - }), - })); - }); - } -}; diff --git a/hooks/app-purge-compose-cache.js b/hooks/app-purge-compose-cache.js index f9e70ef..9e5ae58 100644 --- a/hooks/app-purge-compose-cache.js +++ b/hooks/app-purge-compose-cache.js @@ -13,13 +13,13 @@ module.exports = async (app, lando) => { // remove compose cache danglerz fs.readdirSync(app._dir) - .map(dangler => path.join(app._dir, dangler)) - .filter(dangler => !app.compose.includes(dangler)) - .map(dangler => { + .map((dangler) => path.join(app._dir, dangler)) + .filter((dangler) => !app.compose.includes(dangler)) + .map((dangler) => { try { remove(dangler); } catch { - app.log.info('Could not remove dangling compose file %s', dangler); + app.log('Could not remove dangling compose file %s', dangler); return dangler; } }); diff --git a/hooks/app-purge-metadata-cache.js b/hooks/app-purge-metadata-cache.js index 94190ab..851fa4f 100644 --- a/hooks/app-purge-metadata-cache.js +++ b/hooks/app-purge-metadata-cache.js @@ -1,6 +1,6 @@ 'use strict'; module.exports = async (app, lando) => { - app.log.debug('removing metadata cache...'); + app.log('removing metadata cache...'); lando.cache.remove(app.metaCache); }; diff --git a/hooks/app-purge-recipe-cache.js b/hooks/app-purge-recipe-cache.js index aee9f90..c2ac699 100644 --- a/hooks/app-purge-recipe-cache.js +++ b/hooks/app-purge-recipe-cache.js @@ -1,6 +1,6 @@ 'use strict'; module.exports = async (app, lando) => { - app.log.verbose('removing recipe cache...'); + app.log('removing recipe cache...'); lando.cache.remove(app.recipeCache); }; diff --git a/hooks/app-purge-v3-build-locks.js b/hooks/app-purge-v3-build-locks.js index a6ed492..a6a3814 100644 --- a/hooks/app-purge-v3-build-locks.js +++ b/hooks/app-purge-v3-build-locks.js @@ -3,5 +3,5 @@ module.exports = async (app, lando) => { lando.cache.remove(app.preLockfile); lando.cache.remove(app.postLockfile); - app.log.debug('removed v3 build locks'); + app.log('removed v3 build locks'); }; diff --git a/hooks/app-purge-v4-build-locks.js b/hooks/app-purge-v4-build-locks.js index 0bc5a06..dccc954 100644 --- a/hooks/app-purge-v4-build-locks.js +++ b/hooks/app-purge-v4-build-locks.js @@ -3,11 +3,11 @@ const _ = require('lodash'); module.exports = async (app, lando) => { - return lando.engine.list({project: app.project, all: true}).then(data => { + return lando.engine.list({ project: app.project, all: true }).then((data) => { if (_.isEmpty(data)) { lando.cache.remove(app.v4.preLockfile); lando.cache.remove(app.v4.postLockfile); - app.log.debug('removed v4 build locks'); + app.log('removed v4 build locks'); } }); }; diff --git a/hooks/app-refresh-v3-certs.js b/hooks/app-refresh-v3-certs.js index 3862b30..2fbc873 100644 --- a/hooks/app-refresh-v3-certs.js +++ b/hooks/app-refresh-v3-certs.js @@ -3,26 +3,27 @@ const _ = require('lodash'); module.exports = async (app, lando) => { - const buildServices = _.get(app, 'opts.services', app.services) - .filter(service => app.servicesList - .includes(service)); + const buildServices = _.get(app, 'opts.services', app.services).filter((service) => app.servicesList.includes(service)); - app.log.verbose('refreshing certificates...', buildServices); - app.events.on('post-start', 9999, () => lando.Promise.each(buildServices, service => { - return app.engine.run({ - id: app.containers[service], - cmd: 'mkdir -p /certs && /helpers/refresh-certs.sh > /certs/refresh.log', - compose: app.compose, - project: app.project, - opts: { - detach: true, - mode: 'attach', - user: 'root', - services: [service], - }, - }) - .catch(err => { - app.addMessage(require('../messages/service-not-running-error')(service), err); - }); - })); + app.log('refreshing certificates...', buildServices); + app.events.on('post-start', 9999, () => + lando.Promise.each(buildServices, (service) => { + return app.engine + .run({ + id: app.containers[service], + cmd: 'mkdir -p /certs && /helpers/refresh-certs.sh > /certs/refresh.log', + compose: app.compose, + project: app.project, + opts: { + detach: true, + mode: 'attach', + user: 'root', + services: [service], + }, + }) + .catch((err) => { + app.addMessage(require('../messages/service-not-running-error')(service), err); + }); + }), + ); }; diff --git a/hooks/app-reset-orchestrator.js b/hooks/app-reset-orchestrator.js index 0591c13..946876a 100644 --- a/hooks/app-reset-orchestrator.js +++ b/hooks/app-reset-orchestrator.js @@ -7,16 +7,9 @@ module.exports = async (app, lando) => { // because the entire lando 3 runtime was made in a bygone era when we never dreamed of doing stuff like this // we need this workaround if (lando._bootstrapLevel >= 3 && !app.engine.composeInstalled) { - app.engine = require('../utils/setup-engine')( - lando.config, - lando.cache, - lando.events, - app.log, - app.shell, - lando.config.instance, - ); + app.engine = require('../utils/setup-engine')(lando.config, lando.cache, lando.events, app.log, app.shell, lando.config.instance); } // log our sitch - app.log.debug('using docker-compose %s', lando.config.orchestratorBin); + app.log('using docker-compose %s', lando.config.orchestratorBin); }; diff --git a/hooks/app-run-events.js b/hooks/app-run-events.js index 9210861..59a0d57 100644 --- a/hooks/app-run-events.js +++ b/hooks/app-run-events.js @@ -7,12 +7,15 @@ module.exports = async (app, lando, cmds, data, event) => { // add perm sweeping to all v3 services if (!_.isEmpty(eventCommands)) { const permsweepers = _(eventCommands) - .filter(command => command.api === 3) - .map(command => ({id: command.id, services: _.get(command, 'opts.services', [])})) + .filter((command) => command.api === 3) + .map((command) => ({ id: command.id, services: _.get(command, 'opts.services', []) })) .uniqBy('id') .value(); - lando.log.debug('added preemptive perm sweeping to evented v3 services %j', permsweepers.map(s => s.id)); - _.forEach(permsweepers, ({id, services}) => { + lando.log( + 'added preemptive perm sweeping to evented v3 services %j', + permsweepers.map((s) => s.id), + ); + _.forEach(permsweepers, ({ id, services }) => { eventCommands.unshift({ id, cmd: '/helpers/user-perms.sh --silent', @@ -27,20 +30,23 @@ module.exports = async (app, lando, cmds, data, event) => { }); } const injectable = _.has(app, 'engine') ? app : lando; - return injectable.engine.run(eventCommands).catch(err => { + return injectable.engine.run(eventCommands).catch((err) => { const command = _.tail(event.split('-')).join('-'); if (app.addMessage) { const message = _.trim(_.get(err, 'message')) || 'UNKNOWN ERROR'; - app.addMessage({ - title: `The ${event} event has command(s) that failed!`, - type: 'warning', - detail: [ - `Event failed with: "${message}"`, - 'This **MAY** prevent your app from working.', - 'Check for errors above, fix them in your Landofile, and run the command again:', - ], - command: `lando ${command}`, - }, err); + app.addMessage( + { + title: `The ${event} event has command(s) that failed!`, + type: 'warning', + detail: [ + `Event failed with: "${message}"`, + 'This **MAY** prevent your app from working.', + 'Check for errors above, fix them in your Landofile, and run the command again:', + ], + command: `lando ${command}`, + }, + err, + ); } else { lando.exitCode = 12; } diff --git a/hooks/app-run-healthchecks.js b/hooks/app-run-healthchecks.js index 3bdb0f3..d748b55 100644 --- a/hooks/app-run-healthchecks.js +++ b/hooks/app-run-healthchecks.js @@ -5,19 +5,19 @@ const _ = require('lodash'); module.exports = async (app, lando) => { // new healthchecks if (_.get(lando, 'config.healthcheck', true) !== 'legacy') { - const healthchecks = _.find(app.checks, {type: 'healthcheck-tasks'}); + const healthchecks = _.find(app.checks, { type: 'healthcheck-tasks' }); if (healthchecks) await healthchecks.test(...healthchecks.args); - // legacy checks + // legacy checks } else { // get our healthchecks - const healthchecks = _.get(app, 'checks', []).filter(check => check.type === 'healthcheck'); + const healthchecks = _.get(app, 'checks', []).filter((check) => check.type === 'healthcheck'); // map into promises - const promises = healthchecks.map(async healthcheck => { + const promises = healthchecks.map(async (healthcheck) => { // get the info - const service = _.find(app.info, {service: healthcheck.service}); + const service = _.find(app.info, { service: healthcheck.service }); // the runner command - const runner = async (command, container, {service, user = 'root'} = {}) => { + const runner = async (command, container, { service, user = 'root' } = {}) => { try { await app.engine.run({ id: container, @@ -34,14 +34,14 @@ module.exports = async (app, lando) => { }); } catch (error) { console.log('Waiting until %s service is ready...', service); - app.log.debug('running healthcheck %s for %s...', command, service); + app.log('running healthcheck %s for %s...', command, service); throw error; } }; // wrap in a promise try { - const options = {max: healthcheck.retry, backoff: healthcheck.delay}; + const options = { max: healthcheck.retry, backoff: healthcheck.delay }; await lando.Promise.retry(async () => await runner(...healthcheck.args), options); service.healthy = true; } catch (error) { @@ -50,17 +50,15 @@ module.exports = async (app, lando) => { // parse the message const message = _.trim(_.get(error, 'message', 'UNKNOWN ERROR')); // add the warning - app.addMessage({ + app.addMessage( + { title: `The service "${service.service}" failed its healthcheck`, type: 'warning', - detail: [ - `Failed with "${message}"`, - 'This may be ok but we recommend you run the command below to investigate:', - ], + detail: [`Failed with "${message}"`, 'This may be ok but we recommend you run the command below to investigate:'], command: `lando logs -s ${service.service}`, }, - Error(`${service.service} reported as unhealthy.`, - )); + Error(`${service.service} reported as unhealthy.`), + ); } }); diff --git a/hooks/app-run-legacy-scanner.js b/hooks/app-run-legacy-scanner.js deleted file mode 100644 index a308e65..0000000 --- a/hooks/app-run-legacy-scanner.js +++ /dev/null @@ -1,30 +0,0 @@ -'use strict'; - -const _ = require('lodash'); - -// Helpers to get scannable or not scannable services -const getScannable = app => _.filter(app.info, service => { - const scanner = _.get(app, `config.services.${service.service}.scanner`, true); - return scanner || _.isObject(scanner); -}); -const getUnscannable = app => _.filter(app.info, service => { - return _.get(app, `config.services.${service.service}.scanner`, true) === false; -}); - -module.exports = async app => { - // Message to let the user know it could take a bit - console.log('Scanning to determine which services are ready... Please stand by...'); - // Filter out any services where the scanner might be disabled - return app.scanUrls(_.flatMap(getScannable(app), 'urls'), {max: 16}).then(urls => { - // Get data about our scanned urls - app.urls = urls; - // Add in unscannable ones if we have them - if (!_.isEmpty(getUnscannable(app))) { - app.urls = app.urls.concat(_.map(_.flatMap(getUnscannable(app), 'urls'), url => ({ - url, - status: true, - color: 'yellow', - }))); - } - }); -}; diff --git a/hooks/app-run-v3-build-steps.js b/hooks/app-run-v3-build-steps.js index c449818..8c2a0b0 100644 --- a/hooks/app-run-v3-build-steps.js +++ b/hooks/app-run-v3-build-steps.js @@ -3,30 +3,12 @@ const _ = require('lodash'); // Build keys -const preRootSteps = [ - 'build_as_root_internal', - 'build_as_root', - 'install_dependencies_as_root_internal', - 'install_dependencies_as_root', -]; -const preBuildSteps = [ - 'build_internal', - 'build', - 'install_dependencies_as_me_internal', - 'install_dependencies_as_me', -]; +const preRootSteps = ['build_as_root_internal', 'build_as_root', 'install_dependencies_as_root_internal', 'install_dependencies_as_root']; +const preBuildSteps = ['build_internal', 'build', 'install_dependencies_as_me_internal', 'install_dependencies_as_me']; + // Post app start build steps -const postRootSteps = [ - 'run_as_root_internal', - 'run_as_root', - 'extras', -]; -const postBuildSteps = [ - 'run_internal', - 'run_as_me_internal', - 'run', - 'run_as_me', -]; +const postRootSteps = ['run_as_root_internal', 'run_as_root', 'extras']; +const postBuildSteps = ['run_internal', 'run_as_me_internal', 'run', 'run_as_me']; module.exports = async (app, lando) => { // Add in build hashes @@ -36,19 +18,19 @@ module.exports = async (app, lando) => { // get v3 buildable services const buildServices = _.get(app, 'opts.services', app.services); const buildV3Services = _(app.parsedV3Services) - .filter(service => _.includes(buildServices, service.name)) - .map(service => service.name) + .filter((service) => _.includes(buildServices, service.name)) + .map((service) => service.name) .value(); - app.log.debug('going to build v3 services if applicable', buildV3Services); + app.log('going to build v3 services if applicable', buildV3Services); // Make sure containers for this app exist; if they don't and we have build locks, we need to kill them // @NOTE: this is need to make sure containers rebuild on a lando rebuild, its also for general cleanliness app.events.on('pre-start', () => { - return lando.engine.list({project: app.project, all: true}).then(data => { + return lando.engine.list({ project: app.project, all: true }).then((data) => { if (_.isEmpty(data)) { lando.cache.remove(app.preLockfile); lando.cache.remove(app.postLockfile); - app.log.debug('removed v3 build locks'); + app.log('removed v3 build locks'); } }); }); diff --git a/hooks/app-run-v3-secondary-sweep.js b/hooks/app-run-v3-secondary-sweep.js index 296a3a4..55b8f6f 100644 --- a/hooks/app-run-v3-secondary-sweep.js +++ b/hooks/app-run-v3-secondary-sweep.js @@ -4,27 +4,30 @@ const _ = require('lodash'); module.exports = async (app, lando) => { // scope app.nonRoot to v3 services only since this is not a workaround that v4 needs - app.nonRoot = _.get(app, 'nonRoot', []).filter(service => app.servicesList.includes(service)); + app.nonRoot = _.get(app, 'nonRoot', []).filter((service) => app.servicesList.includes(service)); // perm sweep non root if needed if (!_.isEmpty(app.nonRoot)) { - app.log.verbose('perm sweeping flagged non-root containers ...', app.nonRoot); - app.events.on('post-start', 1, () => lando.Promise.each(app.nonRoot, service => { - return app.engine.run({ - id: app.containers[service], - cmd: '/helpers/user-perms.sh --silent', - compose: app.compose, - project: app.project, - opts: { - detach: true, - mode: 'attach', - user: 'root', - services: [service], - }, - }) - .catch(err => { - app.addMessage(require('../messages/service-not-running-error')(service), err); - }); - })); + app.log('perm sweeping flagged non-root containers ...', app.nonRoot); + app.events.on('post-start', 1, () => + lando.Promise.each(app.nonRoot, (service) => { + return app.engine + .run({ + id: app.containers[service], + cmd: '/helpers/user-perms.sh --silent', + compose: app.compose, + project: app.project, + opts: { + detach: true, + mode: 'attach', + user: 'root', + services: [service], + }, + }) + .catch((err) => { + app.addMessage(require('../messages/service-not-running-error')(service), err); + }); + }), + ); } }; diff --git a/hooks/app-run-v4-build-app.js b/hooks/app-run-v4-build-app.js index 7bbb46b..03281e0 100644 --- a/hooks/app-run-v4-build-app.js +++ b/hooks/app-run-v4-build-app.js @@ -2,60 +2,70 @@ const _ = require('lodash'); -module.exports = async app => { +module.exports = async (app) => { // get buildable services const buildV4Services = _(app.v4.parsedConfig) - .filter(service => _.includes(_.get(app, 'opts.services', app.services), service.name)) - .map(service => service.name) + .filter((service) => _.includes(_.get(app, 'opts.services', app.services), service.name)) + .map((service) => service.name) .value(); // filter out any services that dont need to be built const services = _(app.v4.services) - .filter(service => _.includes(buildV4Services, service.id)) - .filter(service => typeof service.buildApp === 'function') - .filter(service => service?.info?.state?.IMAGE === 'BUILT') - .filter(service => service?.info?.state?.APP !== 'BUILT') + .filter((service) => _.includes(buildV4Services, service.id)) + .filter((service) => typeof service.buildApp === 'function') + .filter((service) => service?.info?.state?.IMAGE === 'BUILT') + .filter((service) => service?.info?.state?.APP !== 'BUILT') .value(); // start by getting existing storage - const estorage = _(await Promise.all(services.map(async service => await service.getStorageVolumes()))) + const estorage = _(await Promise.all(services.map(async (service) => await service.getStorageVolumes()))) .flatten() - .filter(volume => volume !== 'service') + .filter((volume) => volume !== 'service') .uniqBy('id') - .map(volume => volume.id) + .map((volume) => volume.id) .value(); - app.log.debug('found existing non-service scoped storage volumes %o', estorage); + app.log('found existing non-service scoped storage volumes %o', estorage); // and then new storage that needs to be created const cstorage = _(services) - .map(service => service.storage) + .map((service) => service.storage) .flatten() - .filter(volume => volume.type === 'volume') - .filter(volume => !estorage.includes(volume.id)) - .filter(volume => volume.scope !== 'service') - .filter(volume => volume?.labels?.['dev.lando.storage-volume'] === 'TRUE') + .filter((volume) => volume.type === 'volume') + .filter((volume) => !estorage.includes(volume.id)) + .filter((volume) => volume.scope !== 'service') + .filter((volume) => volume?.labels?.['dev.lando.storage-volume'] === 'TRUE') .groupBy('target') - .map(group => group[0]) + .map((group) => group[0]) .value(); - app.log.debug('missing storage volumes %o', cstorage.map(volume => volume.source)); + app.log( + 'missing storage volumes %o', + cstorage.map((volume) => volume.source), + ); // create any missing volumes - await Promise.all(cstorage.map(async volume => { - // if this iterates is it gauranteed that the below will always work? - const bengine = services[0].getBengine(); - await bengine.createVolume({Name: volume.source, Labels: volume.labels}); - app.log.debug('created %o storage volume %o with metadata %o', volume.scope, volume.source, volume.labels); - })); + await Promise.all( + cstorage.map(async (volume) => { + // if this iterates is it gauranteed that the below will always work? + const bengine = services[0].getBengine(); + await bengine.createVolume({ Name: volume.source, Labels: volume.labels }); + app.log('created %o storage volume %o with metadata %o', volume.scope, volume.source, volume.labels); + }), + ); // run all build services methods - app.log.debug('going to build v4 services', services.map(service => service.id)); - await Promise.all(services.map(async service => { - try { - await service.buildApp(); - } catch (error) { - // @TODO: improve this? - app.log.debug('app build error %o %o', error.message, error); - app.addMessage(require('../messages/app-build-v4-error')(error), error, true); - } - })); + app.log( + 'going to build v4 services', + services.map((service) => service.id), + ); + await Promise.all( + services.map(async (service) => { + try { + await service.buildApp(); + } catch (error) { + // @TODO: improve this? + app.log('app build error %o %o', error.message, error); + app.addMessage(require('../messages/app-build-v4-error')(error), error, true); + } + }), + ); }; diff --git a/hooks/app-run-v4-build-image.js b/hooks/app-run-v4-build-image.js index 83852b8..9b66034 100644 --- a/hooks/app-run-v4-build-image.js +++ b/hooks/app-run-v4-build-image.js @@ -5,24 +5,27 @@ const _ = require('lodash'); module.exports = async (app, lando) => { // get buildable services const buildV4Services = _(app.v4.parsedConfig) - .filter(service => _.includes(_.get(app, 'opts.services', app.services), service.name)) - .map(service => service.name) + .filter((service) => _.includes(_.get(app, 'opts.services', app.services), service.name)) + .map((service) => service.name) .value(); // filter out any services that dont need to be built const services = _(app.v4.services) - .filter(service => _.includes(buildV4Services, service.id)) - .filter(service => typeof service.buildImage === 'function') + .filter((service) => _.includes(buildV4Services, service.id)) + .filter((service) => typeof service.buildImage === 'function') .value(); - app.log.debug('going to build v4 images', services.map(service => service.id)); + app.log( + 'going to build v4 images', + services.map((service) => service.id), + ); // now build an array of promises with our services - const tasks = services.map(service => { + const tasks = services.map((service) => { const container = [app.project, service.id, '1'].join(lando.config.orchestratorSeparator); return { title: `Image for ${container}`, - task: async ctx => { + task: async (ctx) => { try { await service.buildImage(); } catch (error) { diff --git a/hooks/app-run-v4-destroy-service.js b/hooks/app-run-v4-destroy-service.js index 97ed3d5..47d84b3 100644 --- a/hooks/app-run-v4-destroy-service.js +++ b/hooks/app-run-v4-destroy-service.js @@ -8,29 +8,32 @@ module.exports = async (app, lando) => { // get destroyable services const buildV4Services = _(app.v4.parsedConfig) - .filter(service => _.includes(_.get(app, 'opts.services', app.services), service.name)) - .map(service => service.name) + .filter((service) => _.includes(_.get(app, 'opts.services', app.services), service.name)) + .map((service) => service.name) .value(); // filter out any services that dont need to be destroyed const services = _(app.v4.services) - .filter(service => _.includes(buildV4Services, service.id)) - .filter(service => typeof service.destroy === 'function') + .filter((service) => _.includes(buildV4Services, service.id)) + .filter((service) => typeof service.destroy === 'function') .value(); - app.log.debug('going to destroy v4 services', services.map(service => service.id)); + app.log( + 'going to destroy v4 services', + services.map((service) => service.id), + ); // now build an array of promises with our services - const tasks = services.map(service => { + const tasks = services.map((service) => { const container = [app.project, service.id, '1'].join(lando.config.orchestratorSeparator); return { title: `Container ${container}`, - task: async ctx => { + task: async (ctx) => { try { await service.destroy(); } catch (error) { - const err = require('../utils/make-error')({error}); - err.context = {id: container}; + const err = require('../utils/make-error')({ error }); + err.context = { id: container }; ctx.errors.push(err); throw err; } diff --git a/hooks/app-set-bind-address.js b/hooks/app-set-bind-address.js index 0f0963f..c6572bc 100644 --- a/hooks/app-set-bind-address.js +++ b/hooks/app-set-bind-address.js @@ -21,12 +21,14 @@ const normalizeBind = (bind, address = '127.0.0.1') => { }; module.exports = async (app, lando) => { - _.forEach(app.composeData, service => { - _.forEach(service.data, datum => { - _.forEach(datum.services, props => { + _.forEach(app.composeData, (service) => { + _.forEach(service.data, (datum) => { + _.forEach(datum.services, (props) => { if (!_.isEmpty(props.ports)) { - app.log.debug('ensuring exposed ports on %s are bound to %s', service.id, lando.config.bindAddress); - props.ports = _(props.ports).map(port => normalizeBind(port, lando.config.bindAddress)).value(); + app.log('ensuring exposed ports on %s are bound to %s', service.id, lando.config.bindAddress); + props.ports = _(props.ports) + .map((port) => normalizeBind(port, lando.config.bindAddress)) + .value(); } }); }); diff --git a/hooks/app-set-lando-info.js b/hooks/app-set-lando-info.js index 0d4c1bc..8d73701 100644 --- a/hooks/app-set-lando-info.js +++ b/hooks/app-set-lando-info.js @@ -2,11 +2,11 @@ const _ = require('lodash'); -module.exports = async app => { +module.exports = async (app) => { const info = require('../utils/to-object')(_.map(app.info, 'service'), {}); _.forEach(info, (value, key) => { - info[key] = _.find(app.info, {service: key}); + info[key] = _.find(app.info, { service: key }); }); - app.log.verbose('setting LANDO_INFO...'); + app.log('setting LANDO_INFO...'); app.env.LANDO_INFO = JSON.stringify(info); }; diff --git a/hooks/app-set-portforwards.js b/hooks/app-set-portforwards.js index 39a9420..1ffd933 100644 --- a/hooks/app-set-portforwards.js +++ b/hooks/app-set-portforwards.js @@ -3,20 +3,28 @@ const _ = require('lodash'); module.exports = async (app, lando) => { - app.log.verbose('discovering dynamic portforward info...'); - const forwarders = _.filter(app.info, service => _.get(service, 'external_connection.port', false)); - return lando.engine.list({project: app.project}) - .filter(service => _.includes(_.flatMap(forwarders, service => service.service), service.service)) - .map(service => ({ - id: service.id, - service: service.service, - internal: _.get(_.find(app.info, {service: service.service}), 'internal_connection.port'), - })) - .map(service => lando.engine.scan(service).then(data => { - const key = `NetworkSettings.Ports.${service.internal}/tcp`; - const port = _.filter(_.get(data, key, []), forward => forward.HostIp === lando.config.bindAddress); - if (_.has(port[0], 'HostPort')) { - _.set(_.find(app.info, {service: service.service}), 'external_connection.port', port[0].HostPort); - } - })); + app.log('discovering dynamic portforward info...'); + const forwarders = _.filter(app.info, (service) => _.get(service, 'external_connection.port', false)); + return lando.engine + .list({ project: app.project }) + .filter((service) => + _.includes( + _.flatMap(forwarders, (service) => service.service), + service.service, + ), + ) + .map((service) => ({ + id: service.id, + service: service.service, + internal: _.get(_.find(app.info, { service: service.service }), 'internal_connection.port'), + })) + .map((service) => + lando.engine.scan(service).then((data) => { + const key = `NetworkSettings.Ports.${service.internal}/tcp`; + const port = _.filter(_.get(data, key, []), (forward) => forward.HostIp === lando.config.bindAddress); + if (_.has(port[0], 'HostPort')) { + _.set(_.find(app.info, { service: service.service }), 'external_connection.port', port[0].HostPort); + } + }), + ); }; diff --git a/hooks/app-set-pullables.js b/hooks/app-set-pullables.js index 3ffd7b7..fe195dd 100644 --- a/hooks/app-set-pullables.js +++ b/hooks/app-set-pullables.js @@ -2,7 +2,7 @@ const _ = require('lodash'); -module.exports = async app => { +module.exports = async (app) => { // Determine local vs pullable services const whereats = _(_.get(app, 'config.services', {})) .map((data, service) => ({ @@ -12,9 +12,15 @@ module.exports = async app => { .value(); // Set local and pullys for downstream concerns - app.log.debug('determined pullable services', whereats); + app.log('determined pullable services', whereats); app.opts = _.merge({}, app.opts, { - pullable: _(whereats).filter(service => !service.isLocal).map('service').value(), - local: _(whereats).filter(service => service.isLocal).map('service').value(), + pullable: _(whereats) + .filter((service) => !service.isLocal) + .map('service') + .value(), + local: _(whereats) + .filter((service) => service.isLocal) + .map('service') + .value(), }); }; diff --git a/hooks/app-start-proxy.js b/hooks/app-start-proxy.js index 3db065c..7492fd2 100644 --- a/hooks/app-start-proxy.js +++ b/hooks/app-start-proxy.js @@ -10,43 +10,48 @@ const url = require('url'); /* * Helper to scanPorts */ -const scanPorts = (lando, status = {http: true, https: true}) => { - return lando.Promise.all([ - getFirstOpenPort(lando.scanUrls, lando.config.proxyScanHttp), - getFirstOpenPort(lando.scanUrls, lando.config.proxyScanHttps), - ]) - // @TODO: below could live in utils and would be easy to test - .then(results => ({http: results[0], https: results[1]})) - .then(ports => { - if (!status.http) delete ports.http; - if (!status.https) delete ports.https; - return ports; - }); +const scanPorts = (lando, status = { http: true, https: true }) => { + return ( + lando.Promise.all([ + getFirstOpenPort(lando.scanUrls, lando.config.proxyScanHttp), + getFirstOpenPort(lando.scanUrls, lando.config.proxyScanHttps), + ]) + // @TODO: below could live in utils and would be easy to test + .then((results) => ({ http: results[0], https: results[1] })) + .then((ports) => { + if (!status.http) delete ports.http; + if (!status.https) delete ports.https; + return ports; + }) + ); }; /* * Helper to find the ports we need for the proxy */ -const findProxyPorts = (lando, status) => lando.Promise.try(() => { - if (_.some(_.values(status))) { - return scanPorts(lando, status).then(ports => _.merge(lando.config.proxyCurrentPorts, ports)); - } else { - return lando.engine.list() - .filter(container => container.name === lando.config.proxyContainer) - .then(containers => _.isEmpty(containers) ? scanPorts(lando) : lando.config.proxyLastPorts); - } -}); +const findProxyPorts = (lando, status) => + lando.Promise.try(() => { + if (_.some(_.values(status))) { + return scanPorts(lando, status).then((ports) => _.merge(lando.config.proxyCurrentPorts, ports)); + } else { + return lando.engine + .list() + .filter((container) => container.name === lando.config.proxyContainer) + .then((containers) => (_.isEmpty(containers) ? scanPorts(lando) : lando.config.proxyLastPorts)); + } + }); -const getFirstOpenPort = (scanner, urls = []) => scanner(urls, {max: 1, waitCodes: []}) - .filter(url => url.status === false) - .map(port => _.last(port.url.split(':'))) - .then(ports => ports[0]); +const getFirstOpenPort = (scanner, urls = []) => + scanner(urls, { max: 1, waitCodes: [] }) + .filter((url) => url.status === false) + .map((port) => _.last(port.url.split(':'))) + .then((ports) => ports[0]); /* * Helper to get all ports */ const getAllPorts = (noHttp = false, noHttps = false, config) => { - const {proxyHttpPort, proxyHttpsPort, proxyHttpFallbacks, proxyHttpsFallbacks} = config; + const { proxyHttpPort, proxyHttpsPort, proxyHttpFallbacks, proxyHttpsFallbacks } = config; const ports = []; if (noHttp) { ports.push(proxyHttpPort); @@ -74,7 +79,7 @@ const getProxyRunner = (project, files) => ({ /* * Helper to get the trafix rule */ -const getRule = rule => { +const getRule = (rule) => { // we do this so getRule is backwards campatible with the older rule.host const host = rule.hostname ?? rule.host; @@ -92,17 +97,18 @@ const getRule = rule => { /* * Get a list of URLs and their counts */ -const getUrlsCounts = config => _(config) - .flatMap(service => service) - .map(url => parseUrl(url)) - .map(data => `${data.host}${data.pathname}`) - .countBy() - .value(); +const getUrlsCounts = (config) => + _(config) + .flatMap((service) => service) + .map((url) => parseUrl(url)) + .map((data) => `${data.host}${data.pathname}`) + .countBy() + .value(); /* * Helper to determine what ports have changed */ -const needsProtocolScan = (current, last, status = {http: true, https: true}) => { +const needsProtocolScan = (current, last, status = { http: true, https: true }) => { if (!last) return status; if (current.http === last.http) status.http = false; if (current.https === last.https) status.https = false; @@ -112,70 +118,77 @@ const needsProtocolScan = (current, last, status = {http: true, https: true}) => /* * Helper to parse a url */ -const normalizeRoutes = (services = {}) => Object.fromEntries(_.map(services, (routes, key) => { - const defaults = {port: '80', pathname: '/', middlewares: []}; - - // normalize routes - routes = routes.map(route => { - // if route is a string then - if (typeof route === 'string') route = {hostname: route}; - - // url parse hostname with wildcard stuff if needed - route.hostname = route.hostname.replace(/\*/g, '__wildcard__'); - - // if hostname does not start with http:// or https:// then prepend http - // @TODO: does this allow for protocol selection down the road? - if (!route.hostname.startsWith('http://') || !route.hostname.startsWith('https://')) { - route.hostname = `http://${route.hostname}`; - } - - // at this point we should be able to parse the hostname - // @TODO: do we need to try/catch this? - // @NOTE: lets hold off on URL.parse until more people reliable have a node20 ready cli - // const {hostname, port, pathname} = URL.parse(route.hostname); - const {hostname, port, pathname} = url.parse(route.hostname); - - // and rebase the whole thing - route = merge({}, [defaults, {port: _.isNil(port) ? '80' : port, pathname}, route, {hostname}], ['merge:key', 'replace']); - - // wildcard replacement back - route.hostname = route.hostname.replace(/__wildcard__/g, '*'); - - // generate an id based on protocol/hostname/path so we can groupby and dedupe - route.id = hasher(`${route.hostname}-${route.pathname}`); - - // and return - return route; - }); +const normalizeRoutes = (services = {}) => + Object.fromEntries( + _.map(services, (routes, key) => { + const defaults = { port: '80', pathname: '/', middlewares: [] }; + + // normalize routes + routes = routes.map((route) => { + // if route is a string then + if (typeof route === 'string') route = { hostname: route }; + + // url parse hostname with wildcard stuff if needed + route.hostname = route.hostname.replace(/\*/g, '__wildcard__'); + + // if hostname does not start with http:// or https:// then prepend http + // @TODO: does this allow for protocol selection down the road? + if (!route.hostname.startsWith('http://') || !route.hostname.startsWith('https://')) { + route.hostname = `http://${route.hostname}`; + } + + // at this point we should be able to parse the hostname + // @TODO: do we need to try/catch this? + // @NOTE: lets hold off on URL.parse until more people reliable have a node20 ready cli + // const {hostname, port, pathname} = URL.parse(route.hostname); + const { hostname, port, pathname } = url.parse(route.hostname); + + // and rebase the whole thing + route = merge({}, [defaults, { port: _.isNil(port) ? '80' : port, pathname }, route, { hostname }], ['merge:key', 'replace']); + + // wildcard replacement back + route.hostname = route.hostname.replace(/__wildcard__/g, '*'); + + // generate an id based on protocol/hostname/path so we can groupby and dedupe + route.id = hasher(`${route.hostname}-${route.pathname}`); + + // and return + return route; + }); - // merge together all routes with the same id - routes = _(_.groupBy(routes, 'id')).map(routes => merge({}, routes, ['merge:key', 'replace'])).value(); + // merge together all routes with the same id + routes = _(_.groupBy(routes, 'id')) + .map((routes) => merge({}, routes, ['merge:key', 'replace'])) + .value(); - // return - return [key, routes]; -})); + // return + return [key, routes]; + }), + ); /* * Parse urls into SANS */ -const parse2Sans = urls => _(urls) - .map(url => parseUrl(url).host) - .map((host, index) => `DNS.${10+index} = ${host}`) - .value() - .join('\n'); +const parse2Sans = (urls) => + _(urls) + .map((url) => parseUrl(url).host) + .map((host, index) => `DNS.${10 + index} = ${host}`) + .value() + .join('\n'); /* * Parse hosts for traefik */ -const parseConfig = (config, sslReady = []) => _(config) - .map((urls, service) => ({ - environment: { - LANDO_PROXY_NAMES: parse2Sans(urls), - }, - name: service, - labels: parseRoutes(service, urls, sslReady)})) - .value(); - +const parseConfig = (config, sslReady = []) => + _(config) + .map((urls, service) => ({ + environment: { + LANDO_PROXY_NAMES: parse2Sans(urls), + }, + name: service, + labels: parseRoutes(service, urls, sslReady), + })) + .value(); /* * Helper to parse the routes @@ -185,22 +198,22 @@ const parseRoutes = (service, urls = [], sslReady, labels = {}) => { const rules = _(urls).uniqBy('id').value(); // Add things into the labels - _.forEach(rules, rule => { + _.forEach(rules, (rule) => { // Add some default middleware - rule.middlewares.push({name: 'lando', key: 'headers.customrequestheaders.X-Lando', value: 'on'}); + rule.middlewares.push({ name: 'lando', key: 'headers.customrequestheaders.X-Lando', value: 'on' }); // Add in any path stripping middleware we need it if (rule.pathname.length > 1) { - rule.middlewares.push({name: 'stripprefix', key: 'stripprefix.prefixes', value: rule.pathname}); + rule.middlewares.push({ name: 'stripprefix', key: 'stripprefix.prefixes', value: rule.pathname }); } // Ensure we prefix all middleware with the ruleid rule.middlewares = _(rule.middlewares) - .map(middleware => _.merge({}, middleware, {name: `${rule.id}-${middleware.name}`})) + .map((middleware) => _.merge({}, middleware, { name: `${rule.id}-${middleware.name}` })) .value(); // Set up all the middlewares - _.forEach(rule.middlewares, m => { + _.forEach(rule.middlewares, (m) => { labels[`traefik.http.middlewares.${m.name}.${m.key}`] = m.value; }); @@ -213,7 +226,7 @@ const parseRoutes = (service, urls = [], sslReady, labels = {}) => { labels[`traefik.http.routers.${rule.id}.rule`] = getRule(rule); // Set none secure middlewares labels[`traefik.http.routers.${rule.id}.middlewares`] = _(_.map(rule.middlewares, 'name')) - .filter(name => !_.endsWith(name, '-secured')) + .filter((name) => !_.endsWith(name, '-secured')) .value() .join(','); @@ -240,118 +253,118 @@ module.exports = async (app, lando) => { // Only do things if the proxy is enabled if (lando.config.proxy === 'ON' && (!_.isEmpty(app.config.proxy) || !_.isEmpty(app.config.recipe))) { // generate proxy cert - await lando.generateCert('proxy._lando_', {domains: [ - `*.${lando.config.proxyDomain}`, - 'proxy._lando_.internal', - ]}); + await lando.generateCert('proxy._lando_', { domains: [`*.${lando.config.proxyDomain}`, 'proxy._lando_.internal'] }); // Determine what ports we need to discover const protocolStatus = needsProtocolScan(lando.config.proxyCurrentPorts, lando.config.proxyLastPorts); // And then discover! - return findProxyPorts(lando, protocolStatus).then(ports => { - // Fail immediately with a warning if we dont have the ports we need - if (_.isEmpty(ports.http) || _.isEmpty(ports.https)) { - const allPorts = getAllPorts(_.isEmpty(ports.http), _.isEmpty(ports.https), lando.config); - return Promise.reject(`Lando could not detect an open port amongst: ${allPorts}`); - } - - // Build the proxy - const LandoProxy = lando.factory.get('_proxy'); - const proxyData = new LandoProxy(ports.http, ports.https, lando.config); - const proxyFiles = lando.utils.dumpComposeData(proxyData, path.join(lando.config.userConfRoot, 'proxy')); - - // Start the proxy - return lando.engine.start(getProxyRunner(lando.config.proxyName, proxyFiles)).then(() => { - lando.cache.set(lando.config.proxyCache, ports, {persist: true}); - return ports; - }); - }) - - // Parse the proxy config to get traefix labels - .then(() => { - // normalize and merge proxy routes - app.config.proxy = normalizeRoutes(app.config.proxy); - - // log error for any duplicates across services - // @NOTE: this actually just calculates ALL occurences of a given hostname and not within each service - // but with the deduping in normalizeRoutes it probably works well enough for right now - const urlCounts = getUrlsCounts(app.config.proxy); - if (_.max(_.values(urlCounts)) > 1) { - app.log.error('You cannot assign url %s to more than one service!', _.findKey(urlCounts, c => c > 1)); - } - - // Get list of services that *should* have certs for SSL - const sslReady = _(_.get(app, 'config.services', [])) - .map((data, name) => _.merge({}, data, {name})) - .filter(data => data.ssl) - .map(data => data.name) - .value(); - - // Make sure we augment ssl ready if we have served by candidates - // and also add to their info eg hasCerts - const servedBy = _(app.info) - .filter(info => _.includes(sslReady, info.service)) - .filter(info => _.has(info, 'served_by') || _.has(info, 'ssl_served_by')) - .map(info => info.served_by || info.ssl_served_by) - .value(); - - // Add hasCerts to servedBys - _.forEach(servedBy, name => { - const service = _.find(app.info, {service: name}); - if (service) service.hasCerts = true; - }); - - // get new v4 ssl ready services - const sslReadyV4 = _(_.get(app, 'v4.services', [])) - .filter(data => data.certs) - .map(data => data.id) - .value(); - - // Parse config - return parseConfig(app.config.proxy, _.compact(_.flatten([sslReady, servedBy, sslReadyV4]))); - }) - - // Map to docker compose things - .map(service => { - // Throw error but proceed if we don't have the service - if (!_.includes(app.services, service.name)) { - app.addMessage(require('../messages/unknown-service-warning')(service.name)); - return {}; - } - - // Build out the docker compose augment and return - service.labels['traefik.enable'] = true; - service.labels['traefik.docker.network'] = lando.config.proxyNet; - service.environment.LANDO_PROXY_PASSTHRU = _.toString(lando.config.proxyPassThru); - const proxyVolume = `${lando.config.proxyName}_proxy_config`; - return { - services: _.set({}, service.name, { - networks: {'lando_proxyedge': {}}, - labels: service.labels, - environment: service.environment, - volumes: [ - `${proxyVolume}:/proxy_config`, - `${lando.config.userConfRoot}/scripts/proxy-certs.sh:/scripts/100-proxy-certs`, - ], - }), - networks: {'lando_proxyedge': {name: lando.config.proxyNet, external: true}}, - volumes: _.set({}, proxyVolume, {external: true}), - }; - }) - - // Add to our app - // @NOTE: we can't add this in the normal way since this happens AFTER our app - // has been initialized - .then(result => { - app.add(new app.ComposeService('proxy', {}, ...result)); - app.compose = lando.utils.dumpComposeData(app.composeData, app._dir); - app.log.debug('app now has proxy compose files', app.compose); - }) - - // Warn the user if this fails - .catch(error => { - if (!error.message || error.message === '') error.message = 'UNKNOWN ERROR'; - app.addWarning(require('../messages/cannot-start-proxy-warning')(error.message), error); - }); + return ( + findProxyPorts(lando, protocolStatus) + .then((ports) => { + // Fail immediately with a warning if we dont have the ports we need + if (_.isEmpty(ports.http) || _.isEmpty(ports.https)) { + const allPorts = getAllPorts(_.isEmpty(ports.http), _.isEmpty(ports.https), lando.config); + return Promise.reject(`Lando could not detect an open port amongst: ${allPorts}`); + } + + // Build the proxy + const LandoProxy = lando.factory.get('_proxy'); + const proxyData = new LandoProxy(ports.http, ports.https, lando.config); + const proxyFiles = lando.utils.dumpComposeData(proxyData, path.join(lando.config.userConfRoot, 'proxy')); + + // Start the proxy + return lando.engine.start(getProxyRunner(lando.config.proxyName, proxyFiles)).then(() => { + lando.cache.set(lando.config.proxyCache, ports, { persist: true }); + return ports; + }); + }) + + // Parse the proxy config to get traefix labels + .then(() => { + // normalize and merge proxy routes + app.config.proxy = normalizeRoutes(app.config.proxy); + + // log error for any duplicates across services + // @NOTE: this actually just calculates ALL occurences of a given hostname and not within each service + // but with the deduping in normalizeRoutes it probably works well enough for right now + const urlCounts = getUrlsCounts(app.config.proxy); + if (_.max(_.values(urlCounts)) > 1) { + app.log( + 'You cannot assign url %s to more than one service!', + _.findKey(urlCounts, (c) => c > 1), + ); + } + + // Get list of services that *should* have certs for SSL + const sslReady = _(_.get(app, 'config.services', [])) + .map((data, name) => _.merge({}, data, { name })) + .filter((data) => data.ssl) + .map((data) => data.name) + .value(); + + // Make sure we augment ssl ready if we have served by candidates + // and also add to their info eg hasCerts + const servedBy = _(app.info) + .filter((info) => _.includes(sslReady, info.service)) + .filter((info) => _.has(info, 'served_by') || _.has(info, 'ssl_served_by')) + .map((info) => info.served_by || info.ssl_served_by) + .value(); + + // Add hasCerts to servedBys + _.forEach(servedBy, (name) => { + const service = _.find(app.info, { service: name }); + if (service) service.hasCerts = true; + }); + + // get new v4 ssl ready services + const sslReadyV4 = _(_.get(app, 'v4.services', [])) + .filter((data) => data.certs) + .map((data) => data.id) + .value(); + + // Parse config + return parseConfig(app.config.proxy, _.compact(_.flatten([sslReady, servedBy, sslReadyV4]))); + }) + + // Map to docker compose things + .map((service) => { + // Throw error but proceed if we don't have the service + if (!_.includes(app.services, service.name)) { + app.addMessage(require('../messages/unknown-service-warning')(service.name)); + return {}; + } + + // Build out the docker compose augment and return + service.labels['traefik.enable'] = true; + service.labels['traefik.docker.network'] = lando.config.proxyNet; + service.environment.LANDO_PROXY_PASSTHRU = _.toString(lando.config.proxyPassThru); + const proxyVolume = `${lando.config.proxyName}_proxy_config`; + return { + services: _.set({}, service.name, { + networks: { lando_proxyedge: {} }, + labels: service.labels, + environment: service.environment, + volumes: [`${proxyVolume}:/proxy_config`, `${lando.config.userConfRoot}/scripts/proxy-certs.sh:/scripts/100-proxy-certs`], + }), + networks: { lando_proxyedge: { name: lando.config.proxyNet, external: true } }, + volumes: _.set({}, proxyVolume, { external: true }), + }; + }) + + // Add to our app + // @NOTE: we can't add this in the normal way since this happens AFTER our app + // has been initialized + .then((result) => { + app.add(new app.ComposeService('proxy', {}, ...result)); + app.compose = lando.utils.dumpComposeData(app.composeData, app._dir); + app.log('app now has proxy compose files', app.compose); + }) + + // Warn the user if this fails + .catch((error) => { + if (!error.message || error.message === '') error.message = 'UNKNOWN ERROR'; + app.addWarning(require('../messages/cannot-start-proxy-warning')(error.message), error); + }) + ); } }; diff --git a/hooks/app-v4-ready.js b/hooks/app-v4-ready.js index b08e2c1..0214dbc 100644 --- a/hooks/app-v4-ready.js +++ b/hooks/app-v4-ready.js @@ -2,28 +2,31 @@ const _ = require('lodash'); -module.exports = async app => { - _.forEach(app.v4.services.map(service => service.id), id => { - // remove v3 app mount - const mounts = _.find(app.composeData, compose => compose.id === 'mounts'); - mounts.data = mounts.data.map(datum => { - if (datum.services && datum.services[id]) datum.services[id] = {volumes: []}; - return datum; - }); +module.exports = async (app) => { + _.forEach( + app.v4.services.map((service) => service.id), + (id) => { + // remove v3 app mount + const mounts = _.find(app.composeData, (compose) => compose.id === 'mounts'); + mounts.data = mounts.data.map((datum) => { + if (datum.services && datum.services[id]) datum.services[id] = { volumes: [] }; + return datum; + }); - // remove v3 scripts mounts - // @TODO: other globals we should blow away? - const globals = _.find(app.composeData, compose => compose.id === 'globals'); - globals.data = globals.data.map(datum => { - if (datum.services && datum.services[id]) datum.services[id] = {...datum.services[id], volumes: []}; - return datum; - }); - }); + // remove v3 scripts mounts + // @TODO: other globals we should blow away? + const globals = _.find(app.composeData, (compose) => compose.id === 'globals'); + globals.data = globals.data.map((datum) => { + if (datum.services && datum.services[id]) datum.services[id] = { ...datum.services[id], volumes: [] }; + return datum; + }); + }, + ); // Log app.initialized = false; app.compose = require('../utils/dump-compose-data')(app.composeData, app._dir); - app.log.verbose('v4 app is ready!'); + app.log('v4 app is ready!'); app.initialized = true; return app.events.emit('ready-v4'); }; diff --git a/hooks/lando-autostart-engine.js b/hooks/lando-autostart-engine.js index eddef36..3702d4d 100644 --- a/hooks/lando-autostart-engine.js +++ b/hooks/lando-autostart-engine.js @@ -3,30 +3,32 @@ // if we at engine level bootsrap level or above then autostart the engine if we need to // @NOTE: for some reason _SOMETIMES_ autostarting before lando start produces an error but we are just // not going to address it in favor of lando 4 stuff -module.exports = async lando => { - if (lando._bootstrapLevel >= 3 && await lando.engine.daemon.isUp() === false) { - const debug = require('../utils/debug-shim')(lando.log); - const tasks = [{ - title: 'It seems Docker is not running, trying to start it up...', - retry: { - tries: 5, - delay: 1000, +module.exports = async (lando) => { + if (lando._bootstrapLevel >= 3 && (await lando.engine.daemon.isUp()) === false) { + const debug = lando.log; + const tasks = [ + { + title: 'It seems Docker is not running, trying to start it up...', + retry: { + tries: 5, + delay: 1000, + }, + task: async (ctx) => { + try { + await lando.engine.daemon.up(false); + await lando.shell.sh([`"${lando.engine.daemon.docker}"`, 'network', 'ls']); + } catch (error) { + ctx.errors.push(error); + debug('%j', error); + throw new Error('Could not automatically start Docker. Please manually start it to continue.'); + } + }, }, - task: async ctx => { - try { - await lando.engine.daemon.up(false); - await lando.shell.sh([`"${lando.engine.daemon.docker}"`, 'network', 'ls']); - } catch (error) { - ctx.errors.push(error); - debug('%j', error); - throw new Error('Could not automatically start Docker. Please manually start it to continue.'); - } - }, - }]; + ]; await lando.runTasks(tasks, { - listrOptions: {exitOnError: true}, + listrOptions: { exitOnError: true }, rendererOptions: { - pausedTimer: {condition: false}, + pausedTimer: { condition: false }, }, }); } diff --git a/hooks/lando-clean-networks.js b/hooks/lando-clean-networks.js index f487e54..22cc2bf 100644 --- a/hooks/lando-clean-networks.js +++ b/hooks/lando-clean-networks.js @@ -3,37 +3,41 @@ // Modules const _ = require('lodash'); -module.exports = async lando => lando.engine.getNetworks().then(networks => { - if (_.size(networks) >= lando.config.networkLimit) { - // Warn user about this action - lando.log.warn('Lando has detected you are at Docker\'s network limit!'); - lando.log.warn('Give us a moment as we try to make space by cleaning up old networks...'); - // Go through lando containers and add in networks - return lando.engine.list() - .filter(container => container.kind === 'app') - // And add them to our default list - .map(container => `${container.app}_default`) - .then(networks => { - const nets = _.uniq(networks).concat(['bridge', 'host', 'none', lando.config.networkBridge]); - if (_.has(lando, 'config.proxyNet')) nets.push(lando.config.proxyNet); - return nets; - }) - // Filter out landoy ones - .then(nets => _.filter(networks, network => !_.includes(nets, network.Name))) - // Inspect remaining networks to make sure we don't remove any with attached containers - .map(network => lando.engine.getNetwork(network.Id)) - .map(network => network.inspect()) - // Filter out any with containers - .filter(network => _.isEmpty(network.Containers)) - // Return the oldest 5 unused networks - // @TODO: what is the best assumption here? - .then(networks => _.slice(_.orderBy(networks, 'Created', 'asc'), 0, 5)) - // Get the Network object - .map(network => lando.engine.getNetwork(network.Id)) - // and remove it - .each(net => { - lando.log.warn('Removing old network %s', net.id); - net.remove(); - }); - } -}); +module.exports = async (lando) => + lando.engine.getNetworks().then((networks) => { + if (_.size(networks) >= lando.config.networkLimit) { + // Warn user about this action + lando.log("Lando has detected you are at Docker's network limit!"); + lando.log('Give us a moment as we try to make space by cleaning up old networks...'); + // Go through lando containers and add in networks + return ( + lando.engine + .list() + .filter((container) => container.kind === 'app') + // And add them to our default list + .map((container) => `${container.app}_default`) + .then((networks) => { + const nets = _.uniq(networks).concat(['bridge', 'host', 'none', lando.config.networkBridge]); + if (_.has(lando, 'config.proxyNet')) nets.push(lando.config.proxyNet); + return nets; + }) + // Filter out landoy ones + .then((nets) => _.filter(networks, (network) => !_.includes(nets, network.Name))) + // Inspect remaining networks to make sure we don't remove any with attached containers + .map((network) => lando.engine.getNetwork(network.Id)) + .map((network) => network.inspect()) + // Filter out any with containers + .filter((network) => _.isEmpty(network.Containers)) + // Return the oldest 5 unused networks + // @TODO: what is the best assumption here? + .then((networks) => _.slice(_.orderBy(networks, 'Created', 'asc'), 0, 5)) + // Get the Network object + .map((network) => lando.engine.getNetwork(network.Id)) + // and remove it + .each((net) => { + lando.log('Removing old network %s', net.id); + net.remove(); + }) + ); + } + }); diff --git a/hooks/lando-copy-v3-scripts.js b/hooks/lando-copy-v3-scripts.js index e378e35..539066d 100644 --- a/hooks/lando-copy-v3-scripts.js +++ b/hooks/lando-copy-v3-scripts.js @@ -3,13 +3,13 @@ const fs = require('fs'); const path = require('path'); -module.exports = async lando => { - return lando.Promise.map(lando.config.plugins, plugin => { +module.exports = async (lando) => { + return lando.Promise.map(lando.config.plugins, (plugin) => { if (fs.existsSync(plugin.scripts)) { const confDir = path.join(lando.config.userConfRoot, 'scripts'); const dest = require('../utils/move-config')(plugin.scripts, confDir); require('../utils/make-executable')(fs.readdirSync(dest), dest); - lando.log.debug('automoved scripts from %s to %s and set to mode 755', plugin.scripts, confDir); + lando.log('automoved scripts from %s to %s and set to mode 755', plugin.scripts, confDir); } }); }; diff --git a/hooks/lando-generate-tasks-cache.js b/hooks/lando-generate-tasks-cache.js index 728553d..bcfce9d 100644 --- a/hooks/lando-generate-tasks-cache.js +++ b/hooks/lando-generate-tasks-cache.js @@ -4,28 +4,31 @@ const _ = require('lodash'); const fs = require('fs'); const path = require('path'); -module.exports = async lando => { +module.exports = async (lando) => { // load in legacy inits await require('./lando-load-legacy-inits')(lando); // build the cache - return lando.Promise.resolve(lando.config.plugins) - // Make sure the tasks dir exists - .filter(plugin => fs.existsSync(plugin.tasks)) - // Get a list off full js files that exist in that dir - .map(plugin => _(fs.readdirSync(plugin.tasks)) - .map(file => path.join(plugin.tasks, file)) - .filter(path => _.endsWith(path, '.js')) - .value(), - ) - // Loadem and loggem - .then(tasks => _.flatten(tasks)) - .each(file => { - lando.tasks.push({...require(file)(lando, {}), file}); - lando.log.debug('autoloaded global task %s', path.basename(file, '.js')); - }) - // Reset the task cache - .then(() => { - lando.cache.set('_.tasks.cache', JSON.stringify(lando.tasks), {persist: true}); - }); + return ( + lando.Promise.resolve(lando.config.plugins) + // Make sure the tasks dir exists + .filter((plugin) => fs.existsSync(plugin.tasks)) + // Get a list off full js files that exist in that dir + .map((plugin) => + _(fs.readdirSync(plugin.tasks)) + .map((file) => path.join(plugin.tasks, file)) + .filter((path) => _.endsWith(path, '.js')) + .value(), + ) + // Loadem and loggem + .then((tasks) => _.flatten(tasks)) + .each((file) => { + lando.tasks.push({ ...require(file)(lando, {}), file }); + lando.log('autoloaded global task %s', path.basename(file, '.js')); + }) + // Reset the task cache + .then(() => { + lando.cache.set('_.tasks.cache', JSON.stringify(lando.tasks), { persist: true }); + }) + ); }; diff --git a/hooks/lando-get-compat.js b/hooks/lando-get-compat.js index 7acadcf..f116812 100644 --- a/hooks/lando-get-compat.js +++ b/hooks/lando-get-compat.js @@ -2,14 +2,14 @@ const _ = require('lodash'); -module.exports = async lando => { +module.exports = async (lando) => { // only run if engine bootstrap or above and if engine/orchestrator have been installed if (lando._bootstrapLevel >= 3) { - if (lando.engine.composeInstalled && lando.engine.dockerInstalled ) { - lando.engine.getCompatibility().then(results => { - lando.log.verbose('checking docker version compatibility...'); - lando.log.debug('compatibility results', _.keyBy(results, 'name')); - lando.cache.set('versions', _.assign(lando.versions, _.keyBy(results, 'name')), {persist: true}); + if (lando.engine.composeInstalled && lando.engine.dockerInstalled) { + lando.engine.getCompatibility().then((results) => { + lando.log('checking docker version compatibility...'); + lando.log('compatibility results', _.keyBy(results, 'name')); + lando.cache.set('versions', _.assign(lando.versions, _.keyBy(results, 'name')), { persist: true }); lando.versions = lando.cache.get('versions'); }); } diff --git a/hooks/lando-reset-orchestrator.js b/hooks/lando-reset-orchestrator.js index 85f71a8..81ac114 100644 --- a/hooks/lando-reset-orchestrator.js +++ b/hooks/lando-reset-orchestrator.js @@ -1,6 +1,6 @@ 'use strict'; -module.exports = async lando => { +module.exports = async (lando) => { // if we dont have an orchestrator bin yet then discover it if (!lando.config.orchestratorBin) lando.config.orchestratorBin = require('../utils/get-compose-x')(lando.config); @@ -18,5 +18,5 @@ module.exports = async lando => { } // log our sitch - lando.log.debug('using docker-compose %s', lando.config.orchestratorBin); + lando.log('using docker-compose %s', lando.config.orchestratorBin); }; diff --git a/hooks/lando-set-proxy-config.js b/hooks/lando-set-proxy-config.js index 46bf7e2..f4305dd 100644 --- a/hooks/lando-set-proxy-config.js +++ b/hooks/lando-set-proxy-config.js @@ -4,16 +4,17 @@ const _ = require('lodash'); const path = require('path'); const url = require('url'); -const ports2Urls = (ports, secure = false, hostname = '127.0.0.1') => _(ports) - .map(port => url.format({protocol: (secure) ? 'https' : 'http', hostname, port})) - .value(); +const ports2Urls = (ports, secure = false, hostname = '127.0.0.1') => + _(ports) + .map((port) => url.format({ protocol: secure ? 'https' : 'http', hostname, port })) + .value(); -module.exports = async lando => { - lando.log.verbose('building proxy config...'); +module.exports = async (lando) => { + lando.log('building proxy config...'); // Set some non dependent things const separator = lando.config.orchestratorSeparator; lando.config.proxyContainer = `${lando.config.proxyName}${separator}proxy${separator}1`; - lando.config.proxyCurrentPorts = {http: lando.config.proxyHttpPort, https: lando.config.proxyHttpsPort}; + lando.config.proxyCurrentPorts = { http: lando.config.proxyHttpPort, https: lando.config.proxyHttpsPort }; lando.config.proxyDir = path.join(lando.config.userConfRoot, 'proxy'); lando.config.proxyHttpPorts = _.flatten([lando.config.proxyHttpPort, lando.config.proxyHttpFallbacks]); lando.config.proxyHttpsPorts = _.flatten([lando.config.proxyHttpsPort, lando.config.proxyHttpsFallbacks]); diff --git a/hooks/lando-setup-build-engine-darwin.js b/hooks/lando-setup-build-engine-darwin.js index 6e1c0d2..2075d5b 100644 --- a/hooks/lando-setup-build-engine-darwin.js +++ b/hooks/lando-setup-build-engine-darwin.js @@ -7,7 +7,7 @@ const os = require('os'); const path = require('path'); const semver = require('semver'); -const {color} = require('listr2'); +const { color } = require('listr2'); const buildIds = { '4.37.2': '179585', @@ -38,7 +38,7 @@ const buildIds = { /* * Helper to get build engine id */ -const getId = version => { +const getId = (version) => { // if false return false // if version is an integer then assume its already the id @@ -47,11 +47,11 @@ const getId = version => { return buildIds[version]; }; -const getVersion = version => { +const getVersion = (version) => { // if version is not an integer then assume its already the version if (semver.valid(version) !== null) return version; // otherwise return the version that corresponds to the build id - return Object.keys(buildIds).find(key => buildIds[key] === version); + return Object.keys(buildIds).find((key) => buildIds[key] === version); }; /* @@ -65,25 +65,26 @@ const getEngineDownloadUrl = (id = '175267') => { /* * wrapper for docker-desktop install */ -const downloadDockerDesktop = (url, {debug, task}) => new Promise((resolve, reject) => { - const download = require('../utils/download-x')(url, {debug}); - // success - download.on('done', result => { - task.title = `Downloaded build engine`; - resolve(result); +const downloadDockerDesktop = (url, { debug, task }) => + new Promise((resolve, reject) => { + const download = require('../utils/download-x')(url, { debug }); + // success + download.on('done', (result) => { + task.title = `Downloaded build engine`; + resolve(result); + }); + // handle errors + download.on('error', (error) => { + reject(error); + }); + // update title to reflect download progress + download.on('progress', (progress) => { + task.title = `Downloading build engine ${color.dim(`[${progress.percentage}%]`)}`; + }); }); - // handle errors - download.on('error', error => { - reject(error); - }); - // update title to reflect download progress - download.on('progress', progress => { - task.title = `Downloading build engine ${color.dim(`[${progress.percentage}%]`)}`; - }); -}); module.exports = async (lando, options) => { - const debug = require('../utils/debug-shim')(lando.log); + const debug = lando.log; // if build engine is set to false allow it to be skipped // @NOTE: this is mostly for internal stuff if (options.buildEngine === false) return; @@ -110,10 +111,10 @@ module.exports = async (lando, options) => { // if we get here let's make sure the engine is on try { - await lando.engine.daemon.up({max: 1, backoff: 1000}); + await lando.engine.daemon.up({ max: 1, backoff: 1000 }); return true; } catch (error) { - lando.log.debug('docker install task has not run %j', error); + lando.log('docker install task has not run %j', error); return false; } }, @@ -123,18 +124,20 @@ module.exports = async (lando, options) => { // throw error if we cannot ping the download link await axios.head(url); // throw if user is not an admin - if (!await require('../utils/is-admin-user')()) { - throw new Error([ - `User "${os.userInfo().username}" does not have permission to install the build engine!`, - 'Contact your system admin for permission and then rerun setup.', - ].join(os.EOL)); + if (!(await require('../utils/is-admin-user')())) { + throw new Error( + [ + `User "${os.userInfo().username}" does not have permission to install the build engine!`, + 'Contact your system admin for permission and then rerun setup.', + ].join(os.EOL), + ); } return true; }, task: async (ctx, task) => { // download the installer - ctx.download = await downloadDockerDesktop(url, {ctx, debug, task}); + ctx.download = await downloadDockerDesktop(url, { ctx, debug, task }); // prompt for password if interactive if (ctx.password === undefined && lando.config.isInteractive) { @@ -142,8 +145,8 @@ module.exports = async (lando, options) => { type: 'password', name: 'password', message: `Enter computer password for ${lando.config.username} to install build engine`, - validate: async input => { - const options = {debug, ignoreReturnCode: true, password: input}; + validate: async (input) => { + const options = { debug, ignoreReturnCode: true, password: input }; const response = await require('../utils/run-elevated')(['echo', 'hello there'], options); if (response.code !== 0) return response.stderr; return true; @@ -162,7 +165,7 @@ module.exports = async (lando, options) => { if (options.debug || options.verbose > 0 || lando.debuggy) command.push('--debug'); // run - const result = await require('../utils/run-elevated')(command, {debug, password: ctx.password}); + const result = await require('../utils/run-elevated')(command, { debug, password: ctx.password }); result.download = ctx.download; // finish up diff --git a/hooks/lando-setup-build-engine-linux.js b/hooks/lando-setup-build-engine-linux.js index 8086b0d..0e5753b 100644 --- a/hooks/lando-setup-build-engine-linux.js +++ b/hooks/lando-setup-build-engine-linux.js @@ -4,28 +4,29 @@ const axios = require('../utils/get-axios')(); const os = require('os'); const path = require('path'); -const {color} = require('listr2'); - -const downloadDockerEngine = (url = 'https://get.docker.com', {debug, task}) => new Promise((resolve, reject) => { - const download = require('../utils/download-x')(url, {debug}); - - // success - download.on('done', result => { - task.title = `Downloaded build engine`; - resolve(result); - }); - // handle errors - download.on('error', error => { - reject(error); - }); - // update title to reflect download progress - download.on('progress', progress => { - task.title = `Downloading build engine ${color.dim(`[${progress.percentage}%]`)}`; +const { color } = require('listr2'); + +const downloadDockerEngine = (url = 'https://get.docker.com', { debug, task }) => + new Promise((resolve, reject) => { + const download = require('../utils/download-x')(url, { debug }); + + // success + download.on('done', (result) => { + task.title = `Downloaded build engine`; + resolve(result); + }); + // handle errors + download.on('error', (error) => { + reject(error); + }); + // update title to reflect download progress + download.on('progress', (progress) => { + task.title = `Downloading build engine ${color.dim(`[${progress.percentage}%]`)}`; + }); }); -}); module.exports = async (lando, options) => { - const debug = require('../utils/debug-shim')(lando.log); + const debug = lando.log; // if build engine is set to false allow it to be skipped // @NOTE: this is mostly for internal stuff if (options.buildEngine === false) return; @@ -46,10 +47,10 @@ module.exports = async (lando, options) => { // if we get here let's make sure the engine is on try { - await lando.engine.daemon.up({max: 1, backoff: 1000}); + await lando.engine.daemon.up({ max: 1, backoff: 1000 }); return true; } catch (error) { - lando.log.debug('docker install task has not run %j', error); + lando.log('docker install task has not run %j', error); return false; } }, @@ -59,18 +60,20 @@ module.exports = async (lando, options) => { // throw error if we cannot ping the download link await axios.head(url); // throw if user is not an admin - if (!await require('../utils/is-admin-user')()) { - throw new Error([ - `User "${lando.config.username}" does not have permission to install the build engine!`, - 'Contact your system admin for permission and then rerun setup.', - ].join(os.EOL)); + if (!(await require('../utils/is-admin-user')())) { + throw new Error( + [ + `User "${lando.config.username}" does not have permission to install the build engine!`, + 'Contact your system admin for permission and then rerun setup.', + ].join(os.EOL), + ); } return true; }, task: async (ctx, task) => { // download the installer - ctx.download = await downloadDockerEngine(url, {ctx, debug, task}); + ctx.download = await downloadDockerEngine(url, { ctx, debug, task }); // prompt for password if interactive and we dont have it if (ctx.password === undefined && lando.config.isInteractive) { @@ -78,8 +81,8 @@ module.exports = async (lando, options) => { type: 'password', name: 'password', message: `Enter computer password for ${lando.config.username} to install the build engine`, - validate: async input => { - const options = {debug, ignoreReturnCode: true, password: input}; + validate: async (input) => { + const options = { debug, ignoreReturnCode: true, password: input }; const response = await require('../utils/run-elevated')(['echo', 'hello there'], options); if (response.code !== 0) return response.stderr; return true; @@ -96,7 +99,7 @@ module.exports = async (lando, options) => { if (options.debug || options.verbose > 0 || lando.debuggy) command.push('--debug'); // run - const result = await require('../utils/run-elevated')(command, {debug, password: ctx.password}); + const result = await require('../utils/run-elevated')(command, { debug, password: ctx.password }); result.download = ctx.download; // finish up @@ -118,7 +121,7 @@ module.exports = async (lando, options) => { requiresRestart: true, task: async (ctx, task) => { // check one last time incase this was added by a dependee or otherwise - if (require('../utils/is-group-member')('docker')) return {code: 0}; + if (require('../utils/is-group-member')('docker')) return { code: 0 }; // prompt for password if interactive and we dont have it if (ctx.password === undefined && lando.config.isInteractive) { @@ -126,8 +129,8 @@ module.exports = async (lando, options) => { type: 'password', name: 'password', message: `Enter computer password for ${lando.config.username} to add them to docker group`, - validate: async input => { - const options = {debug, ignoreReturnCode: true, password: input}; + validate: async (input) => { + const options = { debug, ignoreReturnCode: true, password: input }; const response = await require('../utils/run-elevated')(['echo', 'hello there'], options); if (response.code !== 0) return response.stderr; return true; @@ -137,7 +140,7 @@ module.exports = async (lando, options) => { const script = path.join(lando.config.userConfRoot, 'scripts', 'add-to-group.sh'); const command = [script, '--user', lando.config.username, '--group', 'docker']; - const response = await require('../utils/run-elevated')(command, {debug, password: ctx.password}); + const response = await require('../utils/run-elevated')(command, { debug, password: ctx.password }); task.title = `Added ${lando.config.username} to docker group`; return response; }, diff --git a/hooks/lando-setup-build-engine-win32.js b/hooks/lando-setup-build-engine-win32.js index 18f7307..53c25c1 100644 --- a/hooks/lando-setup-build-engine-win32.js +++ b/hooks/lando-setup-build-engine-win32.js @@ -6,8 +6,8 @@ const getDockerDesktopBin = require('../utils/get-docker-desktop-x'); const os = require('os'); const path = require('path'); const semver = require('semver'); -const {color} = require('listr2'); -const {nanoid} = require('nanoid'); +const { color } = require('listr2'); +const { nanoid } = require('nanoid'); const buildIds = { '4.37.1': '178610', @@ -40,18 +40,18 @@ const buildIds = { /* * Helper to get build engine id */ -const getId = version => { +const getId = (version) => { // if version is an integer then assume its already the id if (semver.valid(version) === null && Number.isInteger(parseInt(version))) return version; // otherwise return that corresponding build-id return buildIds[version]; }; -const getVersion = version => { +const getVersion = (version) => { // if version is not an integer then assume its already the version if (semver.valid(version) !== null) return version; // otherwise return the version that corresponds to the build id - return Object.keys(buildIds).find(key => buildIds[key] === version); + return Object.keys(buildIds).find((key) => buildIds[key] === version); }; /* @@ -65,30 +65,31 @@ const getEngineDownloadUrl = (id = '175267') => { /* * wrapper for docker-desktop install */ -const downloadDockerDesktop = (url, {debug, task, ctx}) => new Promise((resolve, reject) => { - const download = require('../utils/download-x')(url, { - debug, - dest: path.join(os.tmpdir(), `${nanoid()}.exe`), +const downloadDockerDesktop = (url, { debug, task, ctx }) => + new Promise((resolve, reject) => { + const download = require('../utils/download-x')(url, { + debug, + dest: path.join(os.tmpdir(), `${nanoid()}.exe`), + }); + + // success + download.on('done', (result) => { + task.title = `Downloaded build engine`; + resolve(result); + }); + // handle errors + download.on('error', (error) => { + ctx.errors.push(error); + reject(error); + }); + // update title to reflect download progress + download.on('progress', (progress) => { + task.title = `Downloading build engine ${color.dim(`[${progress.percentage}%]`)}`; + }); }); - // success - download.on('done', result => { - task.title = `Downloaded build engine`; - resolve(result); - }); - // handle errors - download.on('error', error => { - ctx.errors.push(error); - reject(error); - }); - // update title to reflect download progress - download.on('progress', progress => { - task.title = `Downloading build engine ${color.dim(`[${progress.percentage}%]`)}`; - }); -}); - module.exports = async (lando, options) => { - const debug = require('../utils/debug-shim')(lando.log); + const debug = lando.log; debug.enabled = lando.debuggy; // if build engine is set to false allow it to be skipped @@ -117,10 +118,10 @@ module.exports = async (lando, options) => { // if we get here let's make sure the engine is on try { - await lando.engine.daemon.up({max: 5, backoff: 1000}); + await lando.engine.daemon.up({ max: 5, backoff: 1000 }); return true; } catch (error) { - lando.log.debug('docker install task has not run %j', error); + lando.log('docker install task has not run %j', error); return false; } }, @@ -134,14 +135,14 @@ module.exports = async (lando, options) => { }, requiresRestart: async () => { // if wsl is not installed then this requires a restart - const {installed, features} = await require('../utils/get-wsl-status')({debug}); + const { installed, features } = await require('../utils/get-wsl-status')({ debug }); const restart = !installed || !features; debug('wsl installed=%o, features=%o, restart %o', installed, features, restart ? 'required' : 'not required'); return restart; }, task: async (ctx, task) => { // download the installer - ctx.download = await downloadDockerDesktop(url, {ctx, debug, task}); + ctx.download = await downloadDockerDesktop(url, { ctx, debug, task }); // script const script = path.join(lando.config.userConfRoot, 'scripts', 'install-docker-desktop.ps1'); // args @@ -151,7 +152,7 @@ module.exports = async (lando, options) => { // run install command task.title = `Installing build engine ${color.dim('(this may take a minute)')}`; - const result = await require('../utils/run-powershell-script')(script, args, {debug}); + const result = await require('../utils/run-powershell-script')(script, args, { debug }); result.download = ctx.download; // finish up @@ -173,10 +174,10 @@ module.exports = async (lando, options) => { hasRun: async () => require('../utils/is-group-member')('docker-users'), task: async (ctx, task) => { // check one last time incase this was added by a dependee or otherwise - if (require('../utils/is-group-member')('docker-users')) return {code: 0}; + if (require('../utils/is-group-member')('docker-users')) return { code: 0 }; const command = ['net', 'localgroup', 'docker-users', lando.config.username, '/ADD']; - const {code, stdout, stderr} = await require('../utils/run-elevated')(command, {ignoreReturnCode: true, debug}); + const { code, stdout, stderr } = await require('../utils/run-elevated')(command, { ignoreReturnCode: true, debug }); // fail on anything except 1378 which is user already exists if (code !== 0 && (!stderr.includes('1378') || !stderr.includes('already a member'))) { @@ -188,8 +189,7 @@ module.exports = async (lando, options) => { } task.title = `Added ${lando.config.username} to docker-users`; - return {code, stdout, stderr}; + return { code, stdout, stderr }; }, }); }; - diff --git a/hooks/lando-setup-build-engine-wsl.js b/hooks/lando-setup-build-engine-wsl.js index bdc85b5..6b3477f 100644 --- a/hooks/lando-setup-build-engine-wsl.js +++ b/hooks/lando-setup-build-engine-wsl.js @@ -8,8 +8,8 @@ const path = require('path'); const semver = require('semver'); const wslpath = require('../utils/winpath-2-wslpath'); -const {color} = require('listr2'); -const {nanoid} = require('nanoid'); +const { color } = require('listr2'); +const { nanoid } = require('nanoid'); const buildIds = { '4.37.1': '178610', @@ -42,18 +42,18 @@ const buildIds = { /* * Helper to get build engine id */ -const getId = version => { +const getId = (version) => { // if version is an integer then assume its already the id if (semver.valid(version) === null && Number.isInteger(parseInt(version))) return version; // otherwise return that corresponding build-id return buildIds[version]; }; -const getVersion = version => { +const getVersion = (version) => { // if version is not an integer then assume its already the version if (semver.valid(version) !== null) return version; // otherwise return the version that corresponds to the build id - return Object.keys(buildIds).find(key => buildIds[key] === version); + return Object.keys(buildIds).find((key) => buildIds[key] === version); }; /* @@ -67,30 +67,31 @@ const getEngineDownloadUrl = (id = '175267') => { /* * wrapper for docker-desktop install */ -const downloadDockerDesktop = (url, {debug, dest, task, ctx}) => new Promise((resolve, reject) => { - const download = require('../utils/download-x')(url, { - debug, - dest: path.posix.join(dest, `${nanoid()}.exe`), +const downloadDockerDesktop = (url, { debug, dest, task, ctx }) => + new Promise((resolve, reject) => { + const download = require('../utils/download-x')(url, { + debug, + dest: path.posix.join(dest, `${nanoid()}.exe`), + }); + + // success + download.on('done', (result) => { + task.title = `Downloaded build engine`; + resolve(result); + }); + // handle errors + download.on('error', (error) => { + ctx.errors.push(error); + reject(error); + }); + // update title to reflect download progress + download.on('progress', (progress) => { + task.title = `Downloading build engine ${color.dim(`[${progress.percentage}%]`)}`; + }); }); - // success - download.on('done', result => { - task.title = `Downloaded build engine`; - resolve(result); - }); - // handle errors - download.on('error', error => { - ctx.errors.push(error); - reject(error); - }); - // update title to reflect download progress - download.on('progress', progress => { - task.title = `Downloading build engine ${color.dim(`[${progress.percentage}%]`)}`; - }); -}); - module.exports = async (lando, options) => { - const debug = require('../utils/debug-shim')(lando.log); + const debug = lando.log; debug.enabled = lando.debuggy; // if build engine is set to false allow it to be skipped @@ -119,10 +120,10 @@ module.exports = async (lando, options) => { // if we get here let's make sure the engine is on try { - await lando.engine.daemon.up({max: 3, backoff: 1000}); + await lando.engine.daemon.up({ max: 3, backoff: 1000 }); return true; } catch (error) { - lando.log.debug('docker install task has not run %j', error); + lando.log('docker install task has not run %j', error); return false; } }, @@ -136,12 +137,12 @@ module.exports = async (lando, options) => { }, task: async (ctx, task) => { // get tmp dir from windows side - const winTmpDir = getWinEnvar('TEMP', {debug}); + const winTmpDir = getWinEnvar('TEMP', { debug }); const dest = wslpath(winTmpDir); debug('resolved win dir %o to wsl path %o', winTmpDir, dest); // download the installer - ctx.download = await downloadDockerDesktop(url, {ctx, debug, dest, task}); + ctx.download = await downloadDockerDesktop(url, { ctx, debug, dest, task }); ctx.download.windest = path.win32.join(winTmpDir, path.basename(ctx.download.dest)); // script @@ -153,7 +154,7 @@ module.exports = async (lando, options) => { // run install command task.title = `Installing build engine ${color.dim('(this may take a minute)')}`; - const result = await require('../utils/run-powershell-script')(script, args, {debug}); + const result = await require('../utils/run-powershell-script')(script, args, { debug }); result.download = ctx.download; // finish up @@ -176,7 +177,7 @@ module.exports = async (lando, options) => { hasRun: async () => require('../utils/is-group-member')('docker'), task: async (ctx, task) => { // check one last time incase this was added by a dependee or otherwise - if (require('../utils/is-group-member')('docker')) return {code: 0}; + if (require('../utils/is-group-member')('docker')) return { code: 0 }; // prompt for password if interactive and we dont have it if (ctx.password === undefined && lando.config.isInteractive) { @@ -184,8 +185,8 @@ module.exports = async (lando, options) => { type: 'password', name: 'password', message: `Enter computer password for ${lando.config.username} to add them to docker group`, - validate: async input => { - const options = {debug, ignoreReturnCode: true, password: input}; + validate: async (input) => { + const options = { debug, ignoreReturnCode: true, password: input }; const response = await require('../utils/run-elevated')(['echo', 'hello there'], options); if (response.code !== 0) return response.stderr; return true; @@ -195,10 +196,9 @@ module.exports = async (lando, options) => { const script = path.join(lando.config.userConfRoot, 'scripts', 'add-to-group.sh'); const command = [script, '--user', lando.config.username, '--group', 'docker']; - const response = await require('../utils/run-elevated')(command, {debug, password: ctx.password}); + const response = await require('../utils/run-elevated')(command, { debug, password: ctx.password }); task.title = `Added ${lando.config.username} to docker group`; return response; }, }); }; - diff --git a/hooks/lando-setup-check.js b/hooks/lando-setup-check.js index 13f47e4..cfffc05 100644 --- a/hooks/lando-setup-check.js +++ b/hooks/lando-setup-check.js @@ -1,13 +1,13 @@ 'use strict'; -module.exports = async lando => { +module.exports = async (lando) => { // fetch the command we are running const command = lando?.config?.command?._?.[0] ?? 'unknown'; // only run if engine bootstrap or above and if engine/orchestrator have been installed if (lando._bootstrapLevel >= 3 && command !== 'setup') { - lando.log.verbose('build-engine exists: %s', lando.engine.dockerInstalled); - lando.log.verbose('orchestrator exists: %s', lando.engine.composeInstalled); + lando.log('build-engine exists: %s', lando.engine.dockerInstalled); + lando.log('orchestrator exists: %s', lando.engine.composeInstalled); // if we cannot even locate the buld engine then go into run setup // @NOTE: this is mostly a catch-all fail-safe fall-back in case something diff --git a/hooks/lando-setup-common-plugins.js b/hooks/lando-setup-common-plugins.js index 68bff03..a48604c 100644 --- a/hooks/lando-setup-common-plugins.js +++ b/hooks/lando-setup-common-plugins.js @@ -14,6 +14,6 @@ module.exports = async (lando, options) => { } // otherwise proceed - lando.log.debug('rebased install plugins %o on common ones %o', options.plugins, lando.config.setup.commonPlugins); + lando.log('rebased install plugins %o on common ones %o', options.plugins, lando.config.setup.commonPlugins); options.plugins = merge({}, lando.config.setup.commonPlugins, options.plugins); }; diff --git a/hooks/lando-setup-create-ca-wsl.js b/hooks/lando-setup-create-ca-wsl.js index 0c4c131..b1dad0f 100644 --- a/hooks/lando-setup-create-ca-wsl.js +++ b/hooks/lando-setup-create-ca-wsl.js @@ -6,25 +6,25 @@ const path = require('path'); const wslpath = require('../utils/winpath-2-wslpath'); const remove = require('../utils/remove'); -module.exports = async lando => { - const {caCert, caKey} = lando.config; +module.exports = async (lando) => { + const { caCert, caKey } = lando.config; // if we dont have any CA stuff, lets see if we can get them from windows // @NOTE: we preempt like this so our setup tasks will asses install successfully if (lando.config.os.landoPlatform === 'wsl' && !fs.existsSync(caCert) && !fs.existsSync(caKey)) { - const debug = require('../utils/debug-shim')(lando.log); + const debug = lando.log; const winHome = getWinEnvar('USERPROFILE'); const winCertsDir = wslpath(path.join(winHome, '.lando', 'certs')); const wcaCert = path.join(winCertsDir, path.basename(caCert)); const wcaKey = path.join(winCertsDir, path.basename(caKey)); // if it makes sense to copy then lets to it - if (fs.existsSync(wcaCert) && fs.existsSync(wcaKey) && require('../utils/validate-ca')(wcaCert, wcaKey, {debug})) { + if (fs.existsSync(wcaCert) && fs.existsSync(wcaKey) && require('../utils/validate-ca')(wcaCert, wcaKey, { debug })) { fs.copyFileSync(wcaCert, caCert); fs.copyFileSync(wcaKey, caKey); debug('copied existing and valid CA from %o to %o', wcaCert, caCert); - // otherwise lets purge + // otherwise lets purge } else { remove(wcaCert); remove(wcaKey); diff --git a/hooks/lando-setup-create-ca.js b/hooks/lando-setup-create-ca.js index 499dd9b..e568c5a 100644 --- a/hooks/lando-setup-create-ca.js +++ b/hooks/lando-setup-create-ca.js @@ -7,9 +7,9 @@ const wslpath = require('../utils/winpath-2-wslpath'); const remove = require('../utils/remove'); module.exports = async (lando, options) => { - const debug = require('../utils/debug-shim')(lando.log); + const debug = lando.log; - const {caCert, caKey} = lando.config; + const { caCert, caKey } = lando.config; // create CA options.tasks.push({ @@ -20,10 +20,10 @@ module.exports = async (lando, options) => { 'NOT INSTALLED': 'Will create Lando Development Certificate Authority (CA)', }, hasRun: async () => { - if ([caCert, caKey].some(file => !fs.existsSync(file))) return false; + if ([caCert, caKey].some((file) => !fs.existsSync(file))) return false; // check if the ca is valid and has a matching key - if (!require('../utils/validate-ca')(caCert, caKey, {debug})) { + if (!require('../utils/validate-ca')(caCert, caKey, { debug })) { remove(caCert); remove(caKey); return false; @@ -34,10 +34,10 @@ module.exports = async (lando, options) => { }, task: async (ctx, task) => { const write = require('../utils/write-file'); - const {createCA} = require('mkcert'); + const { createCA } = require('mkcert'); // generate the CA and KEY - const {cert, key} = await createCA({ + const { cert, key } = await createCA({ organization: 'Lando Development CA', countryCode: 'US', state: 'California', diff --git a/hooks/lando-setup-install-ca-darwin.js b/hooks/lando-setup-install-ca-darwin.js index 491516b..56f9160 100644 --- a/hooks/lando-setup-install-ca-darwin.js +++ b/hooks/lando-setup-install-ca-darwin.js @@ -11,9 +11,9 @@ const path = require('path'); * @return {Promise} */ module.exports = async (lando, options) => { - const debug = require('../utils/debug-shim')(lando.log); + const debug = lando.log; - const {caCert} = lando.config; + const { caCert } = lando.config; // Skip the installation of the CA if set in options if (options.skipInstallCa) return; @@ -57,7 +57,7 @@ module.exports = async (lando, options) => { if (!lando.config.isInteractive) args.push('--non-interactive'); // Run the installation command - const result = await require('../utils/run-command')(script, args, {debug}); + const result = await require('../utils/run-command')(script, args, { debug }); // Update task title on successful installation task.title = 'Installed Lando Development Certificate Authority (CA)'; diff --git a/hooks/lando-setup-install-ca-linux.js b/hooks/lando-setup-install-ca-linux.js index 3c611c0..c5d754d 100644 --- a/hooks/lando-setup-install-ca-linux.js +++ b/hooks/lando-setup-install-ca-linux.js @@ -12,9 +12,9 @@ const os = require('os'); * @return {Promise} */ module.exports = async (lando, options) => { - const debug = require('../utils/debug-shim')(lando.log); + const debug = lando.log; - const {caCert} = lando.config; + const { caCert } = lando.config; // Skip the installation of the CA if set in options if (options.skipInstallCa) return; @@ -44,11 +44,13 @@ module.exports = async (lando, options) => { }, canRun: async () => { // Check for admin privileges - if (!await require('../utils/is-admin-user')()) { - throw new Error([ - `User "${lando.config.username}" does not have permission to trust the CA!`, - 'Contact your system admin for permission and then rerun setup.', - ].join(os.EOL)); + if (!(await require('../utils/is-admin-user')())) { + throw new Error( + [ + `User "${lando.config.username}" does not have permission to trust the CA!`, + 'Contact your system admin for permission and then rerun setup.', + ].join(os.EOL), + ); } return true; @@ -62,8 +64,8 @@ module.exports = async (lando, options) => { type: 'password', name: 'password', message: `Enter computer password for ${lando.config.username} to install the CA`, - validate: async input => { - const options = {debug, ignoreReturnCode: true, password: input}; + validate: async (input) => { + const options = { debug, ignoreReturnCode: true, password: input }; const response = await require('../utils/run-elevated')(['echo', 'Validating elevated access'], options); if (response.code !== 0) return response.stderr; return true; @@ -79,7 +81,7 @@ module.exports = async (lando, options) => { if (options.debug || options.verbose > 0 || lando.debuggy) command.push('--debug'); // Execute the installation command with elevated privileges - const result = await require('../utils/run-elevated')(command, {debug, password: ctx.password}); + const result = await require('../utils/run-elevated')(command, { debug, password: ctx.password }); // Update task title on successful installation task.title = 'Installed Lando Development Certificate Authority (CA)'; diff --git a/hooks/lando-setup-install-ca-win32.js b/hooks/lando-setup-install-ca-win32.js index 18c08e5..bdeef8c 100644 --- a/hooks/lando-setup-install-ca-win32.js +++ b/hooks/lando-setup-install-ca-win32.js @@ -11,9 +11,9 @@ const path = require('path'); * @return {Promise} */ module.exports = async (lando, options) => { - const debug = require('../utils/debug-shim')(lando.log); + const debug = lando.log; - const {caCert} = lando.config; + const { caCert } = lando.config; // Skip the installation of the CA if set in options if (options.skipInstallCa) return; @@ -56,7 +56,7 @@ module.exports = async (lando, options) => { if (!lando.config.isInteractive) args.push('-NonInteractive'); // Run the installation command - const result = await require('../utils/run-powershell-script')(script, args, {debug}); + const result = await require('../utils/run-powershell-script')(script, args, { debug }); // Update task title on successful installation task.title = 'Installed Lando Development Certificate Authority (CA)'; diff --git a/hooks/lando-setup-install-ca-wsl.js b/hooks/lando-setup-install-ca-wsl.js index 7dfd91e..2f84e43 100644 --- a/hooks/lando-setup-install-ca-wsl.js +++ b/hooks/lando-setup-install-ca-wsl.js @@ -12,9 +12,9 @@ const path = require('path'); * @return {Promise} */ module.exports = async (lando, options) => { - const debug = require('../utils/debug-shim')(lando.log); + const debug = lando.log; - const {caCert} = lando.config; + const { caCert } = lando.config; // Skip the installation of the CA if set in options if (options.skipInstallCa) return; @@ -34,7 +34,7 @@ module.exports = async (lando, options) => { debug('computed sha1 fingerprint %o for ca %o', fingerprint, caCert); // get fingerprints - const linuxfps = await require('../utils/get-system-cas')({platform: 'linux'}); + const linuxfps = await require('../utils/get-system-cas')({ platform: 'linux' }); // check if we have it in both return linuxfps.includes(fingerprint); @@ -45,11 +45,13 @@ module.exports = async (lando, options) => { }, canRun: async () => { // Check for admin privileges - if (!await require('../utils/is-admin-user')()) { - throw new Error([ - `User "${lando.config.username}" does not have permission to trust the CA!`, - 'Contact your system admin for permission and then rerun setup.', - ].join(os.EOL)); + if (!(await require('../utils/is-admin-user')())) { + throw new Error( + [ + `User "${lando.config.username}" does not have permission to trust the CA!`, + 'Contact your system admin for permission and then rerun setup.', + ].join(os.EOL), + ); } return true; @@ -63,8 +65,8 @@ module.exports = async (lando, options) => { type: 'password', name: 'password', message: `Enter computer password for ${lando.config.username} to install the CA`, - validate: async input => { - const options = {debug, ignoreReturnCode: true, password: input}; + validate: async (input) => { + const options = { debug, ignoreReturnCode: true, password: input }; const response = await require('../utils/run-elevated')(['echo', 'Validating elevated access'], options); if (response.code !== 0) return response.stderr; return true; @@ -80,7 +82,7 @@ module.exports = async (lando, options) => { if (options.debug || options.verbose > 0 || lando.debuggy) command.push('--debug'); // Execute the installation command with elevated privileges - const result = await require('../utils/run-elevated')(command, {debug, password: ctx.password}); + const result = await require('../utils/run-elevated')(command, { debug, password: ctx.password }); // Update task title on successful installation task.title = 'Installed Lando Development Certificate Authority (CA) to Linux store'; @@ -127,7 +129,7 @@ module.exports = async (lando, options) => { if (!lando.config.isInteractive) args.push('-NonInteractive'); // Run the installation command - const result = await require('../utils/run-powershell-script')(script, args, {debug}); + const result = await require('../utils/run-powershell-script')(script, args, { debug }); // Update task title on successful installation task.title = 'Installed Lando Development Certificate Authority (CA) to Windows store'; diff --git a/hooks/lando-setup-landonet.js b/hooks/lando-setup-landonet.js index b882e0f..8355383 100644 --- a/hooks/lando-setup-landonet.js +++ b/hooks/lando-setup-landonet.js @@ -13,14 +13,15 @@ const getDockerDesktopBin = require('../utils/get-docker-desktop-x'); * @return {Promise} */ module.exports = async (lando, options) => { - const debug = require('../utils/debug-shim')(lando.log); + const debug = lando.log; // skip the installation of the network if set if (options.skipNetworking) return; // we need access to dat socket for this to work - const dependsOn = ['linux', 'wsl'] - .includes(lando.config.os.landoPlatform) ? ['setup-build-engine-group', 'setup-build-engine'] : ['setup-build-engine']; + const dependsOn = ['linux', 'wsl'].includes(lando.config.os.landoPlatform) + ? ['setup-build-engine-group', 'setup-build-engine'] + : ['setup-build-engine']; options.tasks.push({ title: `Creating Landonet`, @@ -43,7 +44,7 @@ module.exports = async (lando, options) => { // otherwise attempt to sus things out try { - await lando.engine.daemon.up({max: 10, backoff: 1000}); + await lando.engine.daemon.up({ max: 10, backoff: 1000 }); const landonet = lando.engine.getNetwork(lando.config.networkBridge); await landonet.inspect(); return lando.versions.networking > 1; @@ -58,27 +59,29 @@ module.exports = async (lando, options) => { const daemon = new LandoDaemon(lando.cache, lando.events, undefined, lando.log); // we need docker up for this - await daemon.up({max: 5, backoff: 1000}); + await daemon.up({ max: 5, backoff: 1000 }); // if we are v1 then disconnect and remove for upgrade if (lando.versions.networking === 1) { const landonet = lando.engine.getNetwork(lando.config.networkBridge); - await landonet.inspect() - .then(data => _.keys(data.Containers)) - .each(id => landonet.disconnect({Container: id, Force: true})) + await landonet + .inspect() + .then((data) => _.keys(data.Containers)) + .each((id) => landonet.disconnect({ Container: id, Force: true })) .then(() => landonet.remove()) - .catch(error => { + .catch((error) => { debug('error disconnecting from old landonet %o %o', error.message, error.stack); }); } // create landonet2 - await lando.engine.getNetworks() - .then(networks => _.some(networks, network => network.Name === lando.config.networkBridge)) - .then(exists => { + await lando.engine + .getNetworks() + .then((networks) => _.some(networks, (network) => network.Name === lando.config.networkBridge)) + .then((exists) => { if (!exists) { return lando.engine.createNetwork(lando.config.networkBridge).then(() => { - lando.cache.set('versions', _.merge({}, lando.versions, {networking: 2}), {persist: true}); + lando.cache.set('versions', _.merge({}, lando.versions, { networking: 2 }), { persist: true }); lando.versions = lando.cache.get('versions'); debug('created %o with version info %o', lando.config.networkBridge, lando.versions.networking); }); diff --git a/hooks/lando-setup-orchestrator.js b/hooks/lando-setup-orchestrator.js index d01dc77..af9ab36 100644 --- a/hooks/lando-setup-orchestrator.js +++ b/hooks/lando-setup-orchestrator.js @@ -42,12 +42,12 @@ const getComposeDownloadDest = (base, version = '2.31.0') => { }; module.exports = async (lando, options) => { - const debug = require('../utils/debug-shim')(lando.log); - const {color} = require('listr2'); + const debug = lando.log; + const { color } = require('listr2'); // get stuff from config/opts - const {orchestratorBin, userConfRoot} = lando.config; - const {orchestrator} = options; + const { orchestratorBin, userConfRoot } = lando.config; + const { orchestrator } = options; // if orchestrator engine is set to false allow it to be skipped // @NOTE: this is mostly for internal stuff @@ -70,21 +70,22 @@ module.exports = async (lando, options) => { // true if we get here return true; }, - task: async (ctx, task) => new Promise((resolve, reject) => { - const download = require('../utils/download-x')(url, {debug, dest, test: ['--version']}); - // success - download.on('done', data => { - task.title = `Installed orchestrator (Docker Compose) to ${dest}`; - resolve(data); - }); - // handle errors - download.on('error', error => { - reject(error); - }); - // update title to reflect download progress - download.on('progress', progress => { - task.title = `Downloading orchestrator ${color.dim(`[${progress.percentage}%]`)}`; - }); - }), + task: async (ctx, task) => + new Promise((resolve, reject) => { + const download = require('../utils/download-x')(url, { debug, dest, test: ['--version'] }); + // success + download.on('done', (data) => { + task.title = `Installed orchestrator (Docker Compose) to ${dest}`; + resolve(data); + }); + // handle errors + download.on('error', (error) => { + reject(error); + }); + // update title to reflect download progress + download.on('progress', (progress) => { + task.title = `Downloading orchestrator ${color.dim(`[${progress.percentage}%]`)}`; + }); + }), }); }; diff --git a/lib/app.js b/lib/app.js index f1dc77a..5d2fef2 100644 --- a/lib/app.js +++ b/lib/app.js @@ -22,7 +22,7 @@ const initAndReport = (app, method = 'start') => { */ const loadPlugins = async (app, lando) => { // find the plugins that have an app.js - const plugins = app.plugins.registry.filter(plugin => _.has(plugin, 'app')); + const plugins = app.plugins.registry.filter((plugin) => _.has(plugin, 'app')); // LOADEM! for await (const p of plugins) { // load ig @@ -45,10 +45,10 @@ const loadPlugins = async (app, lando) => { module.exports = class App { constructor(name, config, lando = {}) { const AsyncEvents = require('./events'); - const Log = require('./logger'); - const scan = require('../utils/legacy-scan'); const Shell = require('./shell'); + const debug = require('../components/debug.js').default; + /** * The apps name * @@ -102,21 +102,14 @@ module.exports = class App { * @since 3.0.0 * @alias app.shell */ - this.log = new Log(_.merge({}, lando.config, {logName: this.name})); + this.log = debug(`lando:${this.project}`); this.shell = new Shell(this.log); - this.engine = require('../utils/setup-engine')( - lando.config, - lando.cache, - lando.events, - this.log, - this.shell, - lando.config.instance, - ); + this.engine = require('../utils/setup-engine')(lando.config, lando.cache, lando.events, this.log, this.shell, lando.config.instance); this.metrics = require('../utils/setup-metrics')(this.log, lando.config); this.Promise = lando.Promise; this.events = new AsyncEvents(this.log); - this.scanUrls = scan(this.log); + // this.scanUrls = scan(this.log); /** * The apps configuration @@ -180,12 +173,11 @@ module.exports = class App { addMessage(message, error = null, hide = false) { // Do special handling if this is a warning or error if (error && ['warning', 'warn', 'error'].includes(message.type)) this.addWarning(message, error, hide); - else { // otherwise normal stuff - this.log.verbose(message.title); + this.log(message.title); // Finish by pushing the warning - this.messages.push(_.merge({}, message, {severity: message.type || 'tip'})); + this.messages.push(_.merge({}, message, { severity: message.type || 'tip' })); } } @@ -195,17 +187,17 @@ module.exports = class App { addWarning(message, error = null, hide = false) { // Do special handling if this is an error if (error) { - if (!hide) this.log.error(error.message || error); - this.log.debug(error); - this.metrics.report('error', {message: error.message || error}, this._lando.cache.get('report_errors')); + if (!hide) this.log(error.message || error); + this.log(error); + this.metrics.report('error', { message: error.message || error }, this._lando.cache.get('report_errors')); this._lando.exitCode = error.code ?? 17; - // Otherwise just verbose log it + // Otherwise just verbose log it } else { - this.log.verbose(message.title); + this.log(message.title); } // Finish by pushing the warning - this.messages.push(_.merge({}, message, {severity: (error) ? 'error' : 'warning'})); + this.messages.push(_.merge({}, message, { severity: error ? 'error' : 'warning' })); } /** @@ -228,32 +220,33 @@ module.exports = class App { */ destroy() { // Start it off - this.log.info('destroying app...'); - return initAndReport(this, 'destroy') - - /** - * Event that runs before an app is destroyed. - * - * @since 3.0.0 - * @alias app.events:pre-destroy - * @event pre_destroy - */ - .then(() => this.events.emit('pre-destroy')) - - // Make sure app is stopped. - .then(() => this.stop(true)) - // Uninstall app. - .then(() => this.uninstall(true)) - - /** - * Event that runs after an app is destroyed. - * - * @since 3.0.0 - * @alias app.events:post-destroy - * @event post_destroy - */ - .then(() => this.events.emit('post-destroy')) - .then(() => this.log.info('destroyed app.')); + this.log('destroying app...'); + return ( + initAndReport(this, 'destroy') + /** + * Event that runs before an app is destroyed. + * + * @since 3.0.0 + * @alias app.events:pre-destroy + * @event pre_destroy + */ + .then(() => this.events.emit('pre-destroy')) + + // Make sure app is stopped. + .then(() => this.stop(true)) + // Uninstall app. + .then(() => this.uninstall(true)) + + /** + * Event that runs after an app is destroyed. + * + * @since 3.0.0 + * @alias app.events:post-destroy + * @event post_destroy + */ + .then(() => this.events.emit('post-destroy')) + .then(() => this.log('destroyed app.')) + ); } /** @@ -269,7 +262,7 @@ module.exports = class App { * @fires ready * @return {Promise} A Promise. */ - init({noEngine = false} = {}) { + init({ noEngine = false } = {}) { // We should only need to initialize once, if we have just go right to app ready if (this.initialized) return this.events.emit('ready', this); // Get compose data if we have any, otherwise set to [] @@ -278,7 +271,7 @@ module.exports = class App { // Validate and set env files this.envFiles = require('../utils/normalize-files')(_.get(this, 'config.env_file', []), this.root); // Log some things - this.log.verbose('initiatilizing app at %s...', this.root); + this.log('initiatilizing app at %s...', this.root); /** * Event that allows altering of the app object right before it is @@ -292,89 +285,89 @@ module.exports = class App { * @event pre_init * @property {App} app The app instance. */ - return loadPlugins(this, this._lando).then(() => this.events.emit('pre-init', this)) - - // Actually assemble this thing so its ready for that engine - .then(() => { - // Get all the services - this.services = require('../utils/get-app-services')(this.composeData); - // add double properties because we have weird differnces between cli getApp and core getApp - this.allServices = this.services; - this.sapis = require('../utils/get-service-apis')(this); - // Merge whatever we have thus far together - this.info = require('../utils/get-app-info-defaults')(this); - // finally just make a list of containers - const separator = _.get(this, '_config.orchestratorSeparator', '_'); - this.containers = _(this.info) - .map(service => ([service.service, `${this.project}${separator}${service.service}${separator}1`])) - .fromPairs() - .value(); - }) - /** - * Event that allows altering of the app object right after it has been - * full initialized and all its plugins have been loaded. - * - * @since 3.0.0 - * @alias app.events:post-init - * @event post_init - * @property {App} app The app instance. - */ - .then(() => this.events.emit('post-init', this)) - - // special event for post-init stuff that requires the engine - // @NOTE: dont ask, just continuing to work around v3-wasnt-intended-to-do-this problems - .then(() => noEngine === true ? undefined : this.events.emit('post-init-engine', this)) - // Finish up - .then(() => { - // Front load our app mounts - this.add(new this.ComposeService('mounts', {}, {services: require('../utils/get-app-mounts')(this)}), true); - // Then front load our globals - this.add(new this.ComposeService('globals', {}, {services: require('../utils/get-app-globals')(this)}), true); - // Take the big dump of all our compose stuff - this.compose = require('../utils/dump-compose-data')(this.composeData, this._dir); - - // group the services by their api - this.serviceGroups = _.groupBy(this.info, 'api'); - // rename the "undefined" key so it makes more sense and ensure all groups are at least defined - this.serviceGroups.compose = _.get(this, 'serviceGroups.undefined', []); - this.serviceGroups['3'] = _.get(this, 'serviceGroups.3', []); - this.serviceGroups['4'] = _.get(this, 'serviceGroups.4', []); - delete this.serviceGroups.undefined; - - - // accomodate a higher service API if we can - if (this.serviceGroups.compose.length === 0 - && this.serviceGroups['3'].length === 0 - && this.serviceGroups['4'].length > 0) { - this._serviceApi = 4; - } - - // reset the default service to the primary v4 service if we only have v4 services - if (this._serviceApi === 4) this._defaultService = this.v4.primaryService.name; - // reset the default service to the first v3 service if there is no appserver - else if (this.serviceGroups['3'].length > 0 && !_.find(this.serviceGroups['3'], {service: 'appserver'})) { - this._defaultService = this.serviceGroups['3'][0].service; - // reset the default service to the first compose service if there is no appserver - } else if (this.serviceGroups.compose.length > 0 && !_.find(this.serviceGroups.compose, {service: 'appserver'})) { - this._defaultService = this.serviceGroups.compose[0].service; - } - - // Log - this.initialized = true; - this.log.verbose('app is ready!'); - }) - /** - * Event that runs when the app is ready for action - * - * @since 3.0.0 - * @alias app.events:ready - * @event ready - * @property {App} app The app instance. - */ - .then(() => this.events.emit('ready', this)) - - // @NOTE: dont ask, just continuing to work around v3-wasnt-intended-to-do-this problems - .then(() => noEngine === true ? undefined : this.events.emit('ready-engine', this)); + return ( + loadPlugins(this, this._lando) + .then(() => this.events.emit('pre-init', this)) + + // Actually assemble this thing so its ready for that engine + .then(() => { + // Get all the services + this.services = require('../utils/get-app-services')(this.composeData); + // add double properties because we have weird differnces between cli getApp and core getApp + this.allServices = this.services; + this.sapis = require('../utils/get-service-apis')(this); + // Merge whatever we have thus far together + this.info = require('../utils/get-app-info-defaults')(this); + // finally just make a list of containers + const separator = _.get(this, '_config.orchestratorSeparator', '_'); + this.containers = _(this.info) + .map((service) => [service.service, `${this.project}${separator}${service.service}${separator}1`]) + .fromPairs() + .value(); + }) + /** + * Event that allows altering of the app object right after it has been + * full initialized and all its plugins have been loaded. + * + * @since 3.0.0 + * @alias app.events:post-init + * @event post_init + * @property {App} app The app instance. + */ + .then(() => this.events.emit('post-init', this)) + + // special event for post-init stuff that requires the engine + // @NOTE: dont ask, just continuing to work around v3-wasnt-intended-to-do-this problems + .then(() => (noEngine === true ? undefined : this.events.emit('post-init-engine', this))) + // Finish up + .then(() => { + // Front load our app mounts + this.add(new this.ComposeService('mounts', {}, { services: require('../utils/get-app-mounts')(this) }), true); + // Then front load our globals + this.add(new this.ComposeService('globals', {}, { services: require('../utils/get-app-globals')(this) }), true); + // Take the big dump of all our compose stuff + this.compose = require('../utils/dump-compose-data')(this.composeData, this._dir); + + // group the services by their api + this.serviceGroups = _.groupBy(this.info, 'api'); + // rename the "undefined" key so it makes more sense and ensure all groups are at least defined + this.serviceGroups.compose = _.get(this, 'serviceGroups.undefined', []); + this.serviceGroups['3'] = _.get(this, 'serviceGroups.3', []); + this.serviceGroups['4'] = _.get(this, 'serviceGroups.4', []); + delete this.serviceGroups.undefined; + + // accomodate a higher service API if we can + if (this.serviceGroups.compose.length === 0 && this.serviceGroups['3'].length === 0 && this.serviceGroups['4'].length > 0) { + this._serviceApi = 4; + } + + // reset the default service to the primary v4 service if we only have v4 services + if (this._serviceApi === 4) this._defaultService = this.v4.primaryService.name; + // reset the default service to the first v3 service if there is no appserver + else if (this.serviceGroups['3'].length > 0 && !_.find(this.serviceGroups['3'], { service: 'appserver' })) { + this._defaultService = this.serviceGroups['3'][0].service; + // reset the default service to the first compose service if there is no appserver + } else if (this.serviceGroups.compose.length > 0 && !_.find(this.serviceGroups.compose, { service: 'appserver' })) { + this._defaultService = this.serviceGroups.compose[0].service; + } + + // Log + this.initialized = true; + this.log('app is ready!'); + }) + /** + * Event that runs when the app is ready for action + * + * @since 3.0.0 + * @alias app.events:ready + * @event ready + * @property {App} app The app instance. + */ + .then(() => this.events.emit('ready', this)) + + // @NOTE: dont ask, just continuing to work around v3-wasnt-intended-to-do-this problems + .then(() => (noEngine === true ? undefined : this.events.emit('ready-engine', this))) + ); } /** @@ -398,43 +391,44 @@ module.exports = class App { */ rebuild() { // Start it off - this.log.info('rebuilding app...'); - return initAndReport(this, 'rebuild') - - /** - * Event that runs before an app is rebuilt. - * - * @alias app.events:pre-rebuild - * @event pre_rebuild - */ - .then(() => this.events.emit('pre-rebuild')) - // Stop app. - .then(() => this.stop(true)) - // Uninstall app - .then(() => this.uninstall()) - // Repull/build components. - .then(() => this.engine.build(this)) - // Install app. - .then(() => this.start()) - /** - * Event that runs after an app is rebuilt. - * - * @since 3.0.0 - * @alias app.events:post-rebuild - * @event post_rebuild - */ - .then(() => this.events.emit('post-rebuild')) - .then(() => this.log.info('rebuilt app.')); + this.log('rebuilding app...'); + return ( + initAndReport(this, 'rebuild') + /** + * Event that runs before an app is rebuilt. + * + * @alias app.events:pre-rebuild + * @event pre_rebuild + */ + .then(() => this.events.emit('pre-rebuild')) + // Stop app. + .then(() => this.stop(true)) + // Uninstall app + .then(() => this.uninstall()) + // Repull/build components. + .then(() => this.engine.build(this)) + // Install app. + .then(() => this.start()) + /** + * Event that runs after an app is rebuilt. + * + * @since 3.0.0 + * @alias app.events:post-rebuild + * @event post_rebuild + */ + .then(() => this.events.emit('post-rebuild')) + .then(() => this.log('rebuilt app.')) + ); } - /* - * @TODO - */ + /* + * @TODO + */ reset() { this.initialized = false; } - /** + /** * Stops and then starts an app. * * This just runs `app.stop` and `app.start` in succession. @@ -450,27 +444,25 @@ module.exports = class App { */ restart() { // Start it off - this.log.info('restarting app...'); + this.log('restarting app...'); // stop/start return this.stop() - .then(() => this.start()) - .then(() => this.log.info('restarted app.')); + .then(() => this.start()) + .then(() => this.log('restarted app.')); } // run tasks async runTasks(tasks, options = {}) { // some defaults - const defaults = {rendererOptions: {log: this.log.debug}}; + const defaults = { rendererOptions: { log: this.log } }; // dc2 renderer has some special treatment if (options.renderer === 'dc2') { - options = _.merge({}, {debug: 'dc2-debug', fallbackRenderer: 'simple'}, options); + options = _.merge({}, { debug: 'dc2-debug', fallbackRenderer: 'simple' }, options); } // set to the debug renderer if we are in debug mode - if (this._config.logLevelConsole > 3 - || this._config.logLevelConsole === 'debug' - || this._config.logLevelConsole === 'silly') { + if (this._config.logLevelConsole > 3 || this._config.logLevelConsole === 'debug' || this._config.logLevelConsole === 'silly') { options.renderer = options.debug || 'debug'; } @@ -494,36 +486,37 @@ module.exports = class App { */ start() { // Log - this.log.info('starting app...'); - return initAndReport(this) - - /** - * Event that runs before an app starts up. - * - * This is useful if you want to start up any support services before an app - * stars. - * - * @since 3.0.0 - * @alias app.events:pre-start - * @event pre_start - */ - .then(() => this.events.emit('pre-start')) - - // Start core containers - .then(() => this.engine.start(this)) - - /** - * Event that runs after an app is started. - * - * This is useful if you want to perform additional operations after an app - * starts such as running additional build commands. - * - * @since 3.0.0 - * @alias app.events:post-start - * @event post_start - */ - .then(() => this.events.emit('post-start')) - .then(() => this.log.info('started app.')); + this.log('starting app...'); + return ( + initAndReport(this) + /** + * Event that runs before an app starts up. + * + * This is useful if you want to start up any support services before an app + * stars. + * + * @since 3.0.0 + * @alias app.events:pre-start + * @event pre_start + */ + .then(() => this.events.emit('pre-start')) + + // Start core containers + .then(() => this.engine.start(this)) + + /** + * Event that runs after an app is started. + * + * This is useful if you want to perform additional operations after an app + * starts such as running additional build commands. + * + * @since 3.0.0 + * @alias app.events:post-start + * @event post_start + */ + .then(() => this.events.emit('post-start')) + .then(() => this.log('started app.')) + ); } /** @@ -540,30 +533,31 @@ module.exports = class App { */ stop(kill = false) { // Stop it! - this.log.info('stopping app...'); - return initAndReport(this, 'stop') - - /** - * Event that runs before an app stops. - * - * @since 3.0.0 - * @alias app.events:pre-stop - * @event pre_stop - */ - .then(() => this.events.emit('pre-stop')) - - // Stop components. - .then(() => this.engine.stop({...this, kill})) - - /** - * Event that runs after an app stop. - * - * @since 3.0.0 - * @alias app.events:post-stop - * @event post_stop - */ - .then(() => this.events.emit('post-stop')) - .then(() => this.log.info('stopped app.')); + this.log('stopping app...'); + return ( + initAndReport(this, 'stop') + /** + * Event that runs before an app stops. + * + * @since 3.0.0 + * @alias app.events:pre-stop + * @event pre_stop + */ + .then(() => this.events.emit('pre-stop')) + + // Stop components. + .then(() => this.engine.stop({ ...this, kill })) + + /** + * Event that runs after an app stop. + * + * @since 3.0.0 + * @alias app.events:post-stop + * @event post_stop + */ + .then(() => this.events.emit('post-stop')) + .then(() => this.log('stopped app.')) + ); } /** @@ -581,36 +575,37 @@ module.exports = class App { */ uninstall(purge = false) { // Cleaning up - this.log.info('uninstalling app...'); - return initAndReport(this, 'uninstall') - - /** - * Event that runs before an app is uninstalled. - * - * This is useful if you want to add or remove parts of the uninstall process. - * For example, it might be nice to persist a container whose data you do not - * want to replace in a rebuild and that cannot persist easily with a volume. - * - * @since 3.0.0 - * @alias app.events:pre-uninstall - * @event pre_uninstall - */ - .then(() => this.events.emit('pre-uninstall')) - - // Kill components. - .then(() => this.engine.destroy(_.merge({}, this, {opts: {purge}}))) - - /** - * Event that runs after an app is uninstalled. - * - * This is useful if you want to do some additional cleanup steps after an - * app is uninstalled such as invalidating any cached data. - * - * @since 3.0.0 - * @alias app.events:post-uninstall - * @event post_uninstall - */ - .then(() => this.events.emit('post-uninstall')) - .then(() => this.log.info('uninstalled app.')); + this.log('uninstalling app...'); + return ( + initAndReport(this, 'uninstall') + /** + * Event that runs before an app is uninstalled. + * + * This is useful if you want to add or remove parts of the uninstall process. + * For example, it might be nice to persist a container whose data you do not + * want to replace in a rebuild and that cannot persist easily with a volume. + * + * @since 3.0.0 + * @alias app.events:pre-uninstall + * @event pre_uninstall + */ + .then(() => this.events.emit('pre-uninstall')) + + // Kill components. + .then(() => this.engine.destroy(_.merge({}, this, { opts: { purge } }))) + + /** + * Event that runs after an app is uninstalled. + * + * This is useful if you want to do some additional cleanup steps after an + * app is uninstalled such as invalidating any cached data. + * + * @since 3.0.0 + * @alias app.events:post-uninstall + * @event post_uninstall + */ + .then(() => this.events.emit('post-uninstall')) + .then(() => this.log('uninstalled app.')) + ); } }; diff --git a/lib/art.js b/lib/art.js index bac4ca4..df4b407 100644 --- a/lib/art.js +++ b/lib/art.js @@ -10,12 +10,12 @@ const os = require('os'); /* * Helper to stylize code or a command */ -const codeMe = text => `Run ${chalk.bold(text)}`; +const codeMe = (text) => `Run ${chalk.bold(text)}`; /* * Helper to stylize an italicize */ -const italicize = name => chalk.italic(name); +const italicize = (name) => chalk.italic(name); /* * determines the "best" header message to display @@ -25,19 +25,16 @@ const getHeader = (messages = []) => { if (!Array.isArray(messages)) messages = []; // gather all the types - const types = messages.map(message => message.type); + const types = messages.map((message) => message.type); // error if (types.includes('error')) return chalk.red(niceFont('UH OH!', 'ANSI Shadow')); - // warning else if (types.includes('warning')) return chalk.yellow(niceFont('Warning!', 'Small Slant')); else if (types.includes('warn')) return chalk.yellow(niceFont('Warning!', 'Small Slant')); - // tip/info else if (types.includes('info')) return chalk.cyan(niceFont('Boomshakalaka!!!!', 'Small Slant')); else if (types.includes('tip')) return chalk.cyan(niceFont('Boomshakalaka!!!!', 'Small Slant')); - // everything else else return chalk.magenta(niceFont('Boomshakalaka!!!!', 'Small Slant')); }; @@ -45,26 +42,26 @@ const getHeader = (messages = []) => { const getStyle = (type = 'tip') => { switch (type) { case 'error': - return {color: 'red', figure: figures.cross}; + return { color: 'red', figure: figures.cross }; case 'warn': case 'warning': - return {color: 'yellow', figure: figures.warning}; + return { color: 'yellow', figure: figures.warning }; case 'info': case 'tip': default: - return {color: 'cyan', figure: figures.info}; + return { color: 'cyan', figure: figures.info }; } }; /* * Helper to stylize a warning message */ -const statusMessage = ({title, type = 'info', detail = [], command, url} = {}) => { +const statusMessage = ({ title, type = 'info', detail = [], command, url } = {}) => { const style = getStyle(type); const message = [chalk[style.color](`${style.figure} ${title}`)]; // if we have detail add that - if (detail.length > 0) detail.map(line => message.push(` ${line}`)); + if (detail.length > 0) detail.map((line) => message.push(` ${line}`)); // if we have a url then add that if (url) message.push(` ${chalk.green(url)}`); @@ -74,71 +71,69 @@ const statusMessage = ({title, type = 'info', detail = [], command, url} = {}) = message.push(''); // return - return message.map(line => ` ${line}`).join(os.EOL); + return message.map((line) => ` ${line}`).join(os.EOL); }; /* * Helper to show that an app has started */ -exports.appDestroy = ({name, phase = 'pre'} = {}) => { +exports.appDestroy = ({ name, phase = 'pre' } = {}) => { switch (phase) { case 'abort': return chalk.yellow('DESTRUCTION AVERTED!'); case 'pre': return chalk.cyan(`Preparing to consign ${italicize(name)} to the dustbin of history...`); case 'post': - return [ - chalk.red(`The app known as ${italicize(name)} has paid the ${chalk.bold('IRON PRICE')}. App destroyed!`), - ].join(os.EOL); + return [chalk.red(`The app known as ${italicize(name)} has paid the ${chalk.bold('IRON PRICE')}. App destroyed!`)].join(os.EOL); } }; /* * Helper to show that an app has restarted */ -exports.appRebuild = ({name, phase = 'pre', messages = []} = {}) => { +exports.appRebuild = ({ name, phase = 'pre', messages = [] } = {}) => { switch (phase) { case 'abort': return chalk.yellow('REBUILD ABORTED!'); case 'error': - return exports.appStart({name, phase: 'error', messages}); + return exports.appStart({ name, phase: 'error', messages }); case 'pre': return chalk.cyan('Rising anew like a fire phoenix from the ashes! Rebuilding app...'); case 'post': - return exports.appStart({name, phase: 'post'}); + return exports.appStart({ name, phase: 'post' }); case 'post_legacy': - return exports.appStart({name, phase: 'post_legacy'}); + return exports.appStart({ name, phase: 'post_legacy' }); case 'report': - return exports.appStart({name, phase: 'report', messages}); + return exports.appStart({ name, phase: 'report', messages }); case 'report_legacy': - return exports.appStart({name, phase: 'report_legacy', messages}); + return exports.appStart({ name, phase: 'report_legacy', messages }); } }; /* * Helper to show that an app has restarted */ -exports.appRestart = ({name, phase = 'pre', messages = []} = {}) => { +exports.appRestart = ({ name, phase = 'pre', messages = [] } = {}) => { switch (phase) { case 'error': - return exports.appStart({name, phase: 'error', messages}); + return exports.appStart({ name, phase: 'error', messages }); case 'pre': return chalk.cyan('Stopping and restarting your app...Shiny!'); case 'post': - return exports.appStart({name, phase: 'post'}); + return exports.appStart({ name, phase: 'post' }); case 'post_legacy': - return exports.appStart({name, phase: 'post_legacy'}); + return exports.appStart({ name, phase: 'post_legacy' }); case 'report': - return exports.appStart({name, phase: 'report', messages}); + return exports.appStart({ name, phase: 'report', messages }); case 'report_legacy': - return exports.appStart({name, phase: 'report_legacy', messages}); + return exports.appStart({ name, phase: 'report_legacy', messages }); } }; /* * Helper to show that an app has started */ -exports.appStart = ({name, phase = 'pre', messages = []} = {}) => { +exports.appStart = ({ name, phase = 'pre', messages = [] } = {}) => { switch (phase) { case 'error': return [ @@ -175,14 +170,7 @@ exports.appStart = ({name, phase = 'pre', messages = []} = {}) => { '', ].join(os.EOL); case 'post_legacy': - return [ - '', - getHeader(messages), - '', - 'Your app has started up correctly.', - 'Here are some vitals:', - '', - ].join(os.EOL); + return ['', getHeader(messages), '', 'Your app has started up correctly.', 'Here are some vitals:', ''].join(os.EOL); case 'report_legacy': { const reportLegacy = [ '', @@ -193,7 +181,7 @@ exports.appStart = ({name, phase = 'pre', messages = []} = {}) => { ]; // Add in all our messages - _.forEach(messages, message => { + _.forEach(messages, (message) => { reportLegacy.push(statusMessage(message)); }); @@ -213,7 +201,7 @@ exports.appStart = ({name, phase = 'pre', messages = []} = {}) => { ]; // Add in all our messages - _.forEach(messages, message => { + _.forEach(messages, (message) => { report.push(statusMessage(message)); }); @@ -228,7 +216,7 @@ exports.appStart = ({name, phase = 'pre', messages = []} = {}) => { /* * Helper to show that an app has stopped */ -exports.appStop = ({name, phase = 'pre'} = {}) => { +exports.appStop = ({ name, phase = 'pre' } = {}) => { switch (phase) { case 'pre': return chalk.cyan(`This party's over :( Stopping app ${italicize(name)}`); @@ -240,15 +228,16 @@ exports.appStop = ({name, phase = 'pre'} = {}) => { /* * Helper to show that a first error has occurred */ -exports.crash = () => [ - '', - chalk.red(niceFont('CRASH!!!', 'ANSI Shadow')), - '', - 'Would you like to report it, and subsequent crashes, to Lando?', - '', - 'This data is only used by the Lando team to ensure the application runs as well as it can.', - chalk.green('For more details check out https://docs.lando.dev/privacy/'), -].join(os.EOL); +exports.crash = () => + [ + '', + chalk.red(niceFont('CRASH!!!', 'ANSI Shadow')), + '', + 'Would you like to report it, and subsequent crashes, to Lando?', + '', + 'This data is only used by the Lando team to ensure the application runs as well as it can.', + chalk.green('For more details check out https://docs.lando.dev/privacy/'), + ].join(os.EOL); /* * Helper to show status of experimental toggle @@ -256,51 +245,43 @@ exports.crash = () => [ exports.experimental = (on = false) => { switch (on) { case true: - return [ - '', - chalk.green(niceFont('Activated!!!', 'Small Slant')), - chalk.magenta('Experimental features are now ON'), - '', - ].join(os.EOL); + return ['', chalk.green(niceFont('Activated!!!', 'Small Slant')), chalk.magenta('Experimental features are now ON'), ''].join(os.EOL); case false: - return [ - '', - chalk.red(niceFont('Deactivated!', 'Small Slant')), - chalk.grey('Experimental features are now OFF'), - '', - ].join(os.EOL); + return ['', chalk.red(niceFont('Deactivated!', 'Small Slant')), chalk.grey('Experimental features are now OFF'), ''].join(os.EOL); } }; /* * Helper to show init header */ -exports.init = () => [ - '', - chalk.green(niceFont('Now we\'re', 'Small Slant')), - chalk.magenta(niceFont('COOKING WITH FIRE!', 'Small Slant')), - 'Your app has been initialized!', - '', - `Go to the directory where your app was initialized and run ${codeMe('lando start')} to get rolling.`, - 'Check the LOCATION printed below if you are unsure where to go.', - '', - 'Oh... and here are some vitals:', - '', -].join(os.EOL); +exports.init = () => + [ + '', + chalk.green(niceFont("Now we're", 'Small Slant')), + chalk.magenta(niceFont('COOKING WITH FIRE!', 'Small Slant')), + 'Your app has been initialized!', + '', + `Go to the directory where your app was initialized and run ${codeMe('lando start')} to get rolling.`, + 'Check the LOCATION printed below if you are unsure where to go.', + '', + 'Oh... and here are some vitals:', + '', + ].join(os.EOL); /* * Helper to show new content */ -exports.newContent = (type = 'guide') => [ - '', - chalk.green(niceFont(`New ${type} has been...`, 'Small Slant')), - chalk.magenta(niceFont('Created!', 'Small Slant')), - '', - `Make sure you have run ${codeMe('lando start')} to get the docs running locally.`, - '', - 'Oh... and here are some vitals about your new content:', - '', -].join(os.EOL); +exports.newContent = (type = 'guide') => + [ + '', + chalk.green(niceFont(`New ${type} has been...`, 'Small Slant')), + chalk.magenta(niceFont('Created!', 'Small Slant')), + '', + `Make sure you have run ${codeMe('lando start')} to get the docs running locally.`, + '', + 'Oh... and here are some vitals about your new content:', + '', + ].join(os.EOL); exports.setupHeader = (bengine = process.landoPlatform === 'linux' || process.platform === 'linux' ? 'Engine' : 'Desktop') => ` ${chalk.magenta(niceFont('Lando Setup!', 'Small Slant'))} @@ -341,15 +322,10 @@ ${chalk.magenta(`${figures.squareSmallFilled} GitHub - https://github.com/lando/ /* * Helper to show status of secret toggle */ -exports.poweroff = ({phase = 'pre'} = {}) => { +exports.poweroff = ({ phase = 'pre' } = {}) => { switch (phase) { case 'pre': - return [ - '', - chalk.cyan('NO!! SHUT IT ALL DOWN!!!'), - chalk.magenta(niceFont('Powering off...', 'Small Slant')), - '', - ].join(os.EOL); + return ['', chalk.cyan('NO!! SHUT IT ALL DOWN!!!'), chalk.magenta(niceFont('Powering off...', 'Small Slant')), ''].join(os.EOL); case 'post': return chalk.green('Lando containers have been spun down.'); } @@ -358,14 +334,14 @@ exports.poweroff = ({phase = 'pre'} = {}) => { /* * Helper to show status of secret toggle */ -exports.print = ({text, color = 'white'} = {}) => { +exports.print = ({ text, color = 'white' } = {}) => { return chalk[color](text); }; /* * Helper to show status of secret toggle */ -exports.printFont = ({text, color = 'magenta', font = 'Small Slant'} = {}) => { +exports.printFont = ({ text, color = 'magenta', font = 'Small Slant' } = {}) => { return chalk[color](niceFont(text, font)); }; @@ -430,74 +406,28 @@ exports.secretToggle = (on = false) => { '', ].join(os.EOL); case false: - return [ - '', - chalk.red(niceFont('Deactivated!', 'Small Slant')), - chalk.grey('The secret toggle is now OFF'), - '', - ].join(os.EOL); + return ['', chalk.red(niceFont('Deactivated!', 'Small Slant')), chalk.grey('The secret toggle is now OFF'), ''].join(os.EOL); } }; /* * Helper to show status of secret toggle */ -exports.secretToggleDenied = (on = false) => [ - '', - chalk.red(niceFont('Toggle Denied!', 'Small Slant', on)), - '', - chalk.magenta('You can only toggle the secret toggle when running Lando from source'), - 'See https://docs.lando.dev/contrib/activate.html', - '', -].join(os.EOL); - -/* - * Sharing under construction - */ -exports.shareWait = () => [ - '', - chalk.red(niceFont('OFFLINE!!!', 'ANSI Shadow')), - '', - 'localtunnel.me has finally sunsetted it\'s free service. Lando thanks them for their great and free service.', - '', - 'We are hard at work on a new sharing solution but it is not quite ready!', - '', - 'Due to our massive user base we might not be able to offer free sharing to all users.', - 'So, if you are interested in using our new sharing service we recommend you sponsor at the link below!', - chalk.green('https://lando.dev/sponsor'), - '', -].join(os.EOL); - -/* - * Helper to show status of secret toggle - */ -exports.sudoRun = () => [ - chalk.red('Lando should never ever ever be run as root...'), - chalk.magenta(niceFont('like ever!!!', 'Small Slant')), -].join(os.EOL); +exports.secretToggleDenied = (on = false) => + [ + '', + chalk.red(niceFont('Toggle Denied!', 'Small Slant', on)), + '', + chalk.magenta('You can only toggle the secret toggle when running Lando from source'), + 'See https://docs.lando.dev/contrib/activate.html', + '', + ].join(os.EOL); /* * Helper to show status of secret toggle */ -exports.tunnel = ({url, phase = 'pre'} = {}) => { - switch (phase) { - case 'pre': - return chalk.cyan('About to share your app to a whole new world!'); - case 'post': - return [ - '', - chalk.magenta(niceFont('Connected!!!', 'Small Slant')), - 'A tunnel to your local Lando app been established.', - '', - 'Here is your public url:', - chalk.green(url), - '', - 'Press any key to close the tunnel...', - ].join(os.EOL); - case 'closed': - return chalk.green('Tunnel closed!'); - } -}; +exports.sudoRun = () => + [chalk.red('Lando should never ever ever be run as root...'), chalk.magenta(niceFont('like ever!!!', 'Small Slant'))].join(os.EOL); exports.badToken = () => { return statusMessage({ diff --git a/lib/cache.js b/lib/cache.js index a03dead..8082c7f 100644 --- a/lib/cache.js +++ b/lib/cache.js @@ -4,23 +4,24 @@ const _ = require('lodash'); const fs = require('fs'); const jsonfile = require('jsonfile'); -const Log = require('./logger'); const NodeCache = require('node-cache'); const os = require('os'); const path = require('path'); +const debug = require('../_new/lib/debug.js').default; + /* * Creates a new Cache instance. */ class Cache extends NodeCache { - constructor({log = new Log(), cacheDir = path.join(os.tmpdir(), '.cache')} = {}) { + constructor({ log = debug('lando:cache'), cacheDir = path.join(os.tmpdir(), '.cache') } = {}) { // Get the nodecache opts super(); // Set some things this.log = log; this.cacheDir = cacheDir; // Ensure the cache dir exists - fs.mkdirSync(this.cacheDir, {recursive: true}); + fs.mkdirSync(this.cacheDir, { recursive: true }); } /** @@ -43,7 +44,7 @@ class Cache extends NodeCache { * // Add an object to the cache for five seconds * lando.cache.set('mykey', data, {ttl: 5}); */ - set(key, data, {persist = false, ttl = 0} = {}) { + set(key, data, { persist = false, ttl = 0 } = {}) { // Unsafe cache key patterns const patterns = { controlRe: /[\x00-\x1f\x80-\x9f]/g, // eslint-disable-line no-control-regex @@ -52,15 +53,15 @@ class Cache extends NodeCache { windowsReservedRe: /^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i, windowsTrailingRe: /[. ]+$/, }; - _.map(patterns, pattern => { + _.map(patterns, (pattern) => { if (key.match(pattern)) throw new Error(`Invalid cache key: ${key}`); }); // Try to set cache if (this.__set(key, data, ttl)) { - this.log.debug('Cached %j with key %s for %j', data, key, {persist, ttl}); + this.log('cached %j with key %o for %o', data, key, { persist, ttl }); } else { - this.log.debug('Failed to cache %j with key %s', data, key); + this.log('failed to cache %j with key %o', data, key); } // And add to file if we have persistence @@ -84,14 +85,14 @@ class Cache extends NodeCache { // Return result if its in memcache if (memResult) { - this.log.debug('Retrieved from memcache with key %s', key); + this.log('retrieved from memcache with key %o', key); return memResult; } else { try { - this.log.debug('Trying to retrieve from file cache with key %s', key); + this.log('trying to retrieve from file cache with key %o', key); return jsonfile.readFileSync(path.join(this.cacheDir, key)); } catch (e) { - this.log.debug('File cache miss with key %s', key); + this.log('file cache miss with key %o', key); } } } @@ -108,14 +109,14 @@ class Cache extends NodeCache { */ remove(key) { // Try to get cache - if (this.__del(key)) this.log.debug('Removed key %s from memcache.', key); - else this.log.debug('Failed to remove key %s from memcache.', key); + if (this.__del(key)) this.log('removed key %o from memcache.', key); + else this.log('failed to remove key %o from memcache.', key); // Also remove file if applicable try { fs.unlinkSync(path.join(this.cacheDir, key)); } catch (e) { - this.log.debug('No file cache with key %s', key); + this.log('no file cache with key %o', key); } } } diff --git a/lib/cli.js b/lib/cli.js index 91af821..7946e3b 100644 --- a/lib/cli.js +++ b/lib/cli.js @@ -149,7 +149,7 @@ module.exports = class Cli { // when packaged this resolves symlinks and gives you the actual absolute path of the binary // when run from source it gives you the path to js entrypoint const file = packaged ? process.execPath : _.get(process, 'mainModule.filename', process.argv[1]); - const entrypoint = packaged ? _.get(process, 'env._') ?? file : process.argv[1] ?? _.get(process, 'env._'); + const entrypoint = packaged ? (_.get(process, 'env._') ?? file) : (process.argv[1] ?? _.get(process, 'env._')); // this is just the default place to install the lando binaries // @NOTE: in lando 4 we need some kind of "system wide/root" location for this eg /usr/local/bin? @@ -158,12 +158,12 @@ module.exports = class Cli { // if the cli is running from source (eg a git repo) or not const args = process.execArgv; const source = fs.existsSync(path.join(srcRoot, '.git', 'HEAD')); - const commit = source ? require('../utils/get-commit-hash')(srcRoot, {short: true}) : false; + const commit = source ? require('../utils/get-commit-hash')(srcRoot, { short: true }) : false; const coreBase = this.coreBase === path.resolve(__dirname, '..'); const slim = !fs.existsSync(path.resolve(__dirname, '..', 'FATCORE')); // put it all together - const cli = {args, commit, coreBase, dev, entrypoint, file, installPath, packaged, plugin: srcRoot, slim, source}; + const cli = { args, commit, coreBase, dev, entrypoint, file, installPath, packaged, plugin: srcRoot, slim, source }; this.debug('using cli config %o', cli); const config = { @@ -181,7 +181,7 @@ module.exports = class Cli { landoFile: '.lando.yml', landoFileConfig: appConfig, leia: _.has(process, 'env.LEIA_PARSER_RUNNING'), - logLevelConsole: (this.argv().verbose) ? this.argv().verbose + 1 : this.logLevel, + logLevelConsole: this.argv().verbose ? this.argv().verbose + 1 : this.logLevel, logDir: path.join(this.userConfRoot, 'logs'), mode: 'cli', packaged, @@ -189,14 +189,14 @@ module.exports = class Cli { pluginConfigFile: path.join(this.userConfRoot, 'plugin-auth.json'), pluginDirs: [ // src locations - {path: path.join(srcRoot, 'node_modules', '@lando'), subdir: '.', namespace: '@lando'}, + { path: path.join(srcRoot, 'node_modules', '@lando'), subdir: '.', namespace: '@lando' }, // system locations - {path: path.join(getSysDataPath('lando'), 'plugins'), subdir: '.', type: 'system'}, - {path: path.join(getSysDataPath('lando'), 'plugins', '@lando'), subdir: '.', namespace: '@lando', type: 'system-lando'}, + { path: path.join(getSysDataPath('lando'), 'plugins'), subdir: '.', type: 'system' }, + { path: path.join(getSysDataPath('lando'), 'plugins', '@lando'), subdir: '.', namespace: '@lando', type: 'system-lando' }, // user locations - {path: path.join(this.userConfRoot, 'global-plugins', '@lando'), subdir: '.', namespace: '@lando'}, - {path: this.userConfRoot, subdir: 'plugins', type: 'user'}, - {path: path.join(this.userConfRoot, 'plugins', '@lando'), subdir: '.', namespace: '@lando', type: 'user-lando'}, + { path: path.join(this.userConfRoot, 'global-plugins', '@lando'), subdir: '.', namespace: '@lando' }, + { path: this.userConfRoot, subdir: 'plugins', type: 'user' }, + { path: path.join(this.userConfRoot, 'plugins', '@lando'), subdir: '.', namespace: '@lando', type: 'user-lando' }, ], preLandoFiles: ['.lando.base.yml', '.lando.dist.yml', '.lando.recipe.yml', '.lando.upstream.yml'], postLandoFiles: ['.lando.local.yml', '.lando.user.yml'], @@ -221,8 +221,8 @@ module.exports = class Cli { /* * Format data */ - formatData(data, {path = '', format = 'default', filter = []} = {}, opts = {}) { - return formatters.formatData(data, {path, format, filter}, opts); + formatData(data, { path = '', format = 'default', filter = [] } = {}, opts = {}) { + return formatters.formatData(data, { path, format, filter }, opts); } /* @@ -241,7 +241,7 @@ module.exports = class Cli { } isDebug() { - const {debug, verbose} = this.argv(); + const { debug, verbose } = this.argv(); return debug ? 1 + verbose : 0 + verbose; } @@ -266,27 +266,29 @@ module.exports = class Cli { // if report_errors is not set but -y was passed in then set it here to avoid the prompt below if (_.isNil(lando.cache.get('report_errors')) && yes) { - lando.cache.set('report_errors', yes, {persist: true}); + lando.cache.set('report_errors', yes, { persist: true }); } // Ask question if we haven't sent error reporting yet and the terminal is capable of answering - return lando.Promise.try(() => { - if (_.isNil(lando.cache.get('report_errors')) && require('is-interactive')()) { - const inquirer = require('inquirer'); - console.error(this.makeArt('crash')); - const test = { - name: 'reportErrors', - type: 'confirm', - default: true, - message: 'Send crash reports?', - }; - return inquirer.prompt([test]).then(answers => { - lando.cache.set('report_errors', answers.reportErrors, {persist: true}); - }); - } - }) - // Report error if user has error reporting on - .then(() => handler.handle(error, lando.cache.get('report_errors')).then(code => process.exit(code))); + return ( + lando.Promise.try(() => { + if (_.isNil(lando.cache.get('report_errors')) && require('is-interactive')()) { + const inquirer = require('inquirer'); + console.error(this.makeArt('crash')); + const test = { + name: 'reportErrors', + type: 'confirm', + default: true, + message: 'Send crash reports?', + }; + return inquirer.prompt([test]).then((answers) => { + lando.cache.set('report_errors', answers.reportErrors, { persist: true }); + }); + } + }) + // Report error if user has error reporting on + .then(() => handler.handle(error, lando.cache.get('report_errors')).then((code) => process.exit(code))) + ); } /* @@ -299,18 +301,19 @@ module.exports = class Cli { // basic usage const usage = [`${this.chalk.green('Usage:')}${EOL} ${$0} [args] [options]`]; // add experimental mode info - if (userConfig.experimental) usage.push(`${this.makeArt('print', {text: '(experimental mode)', color: 'magenta'})}`); + if (userConfig.experimental) usage.push(`${this.makeArt('print', { text: '(experimental mode)', color: 'magenta' })}`); // Yargs! - yargs.usage(usage.join(' ')) + yargs + .usage(usage.join(' ')) .demandCommand(1, 'You need at least one command before moving on') .example(`${$0} start`, 'Runs lando start') .example(`${$0} rebuild --help`, 'Gets help about using the lando rebuild command') .example(`${$0} destroy -y --debug`, 'Runs lando destroy non-interactively and with maximum verbosity') .example(`${$0} --clear`, 'Clears the lando tasks cache') - .parserConfiguration({'populate--': true}) + .parserConfiguration({ 'populate--': true }) .recommendCommands() - .wrap(yargs.terminalWidth() * 0.70) + .wrap(yargs.terminalWidth() * 0.7) .option('channel', globalOptions.channel) .option('clear', globalOptions.clear) .option('debug', globalOptions.debug) @@ -320,10 +323,12 @@ module.exports = class Cli { .option('help', globalOptions.help) .option('verbose', globalOptions.verbose) .version(false) - .middleware([(argv => { - argv._app = config; - argv._yargs = yargs; - })]); + .middleware([ + (argv) => { + argv._app = config; + argv._yargs = yargs; + }, + ]); // manually set scriptname if needed if ($0 !== '$0') yargs.scriptName($0); @@ -335,13 +340,13 @@ module.exports = class Cli { } // Loop through the tasks and add them to the CLI - _.forEach(_.sortBy(tasks, 'command'), task => { + _.forEach(_.sortBy(tasks, 'command'), (task) => { if (_.has(task, 'handler')) yargs.command(task); else yargs.command(this.parseToYargs(task, config)); }); // Show help unless this is a delegation command - const current = _.find(tasks, {command: yargs.argv._[0]}); + const current = _.find(tasks, { command: yargs.argv._[0] }); if ((yargs.argv.help || yargs.argv.lando) && _.get(current, 'delegate', false) === false) { yargs.showHelp('log'); process.exit(0); @@ -351,7 +356,6 @@ module.exports = class Cli { yargs.argv; } - /** * Returns some cli "art" * @@ -384,20 +388,13 @@ module.exports = class Cli { * // Add a task to the yargs CLI * yargs.command(lando.tasks.parseToYargs(task)); */ - parseToYargs({ - command, - describe, - examples = [], - file = undefined, - options = {}, - positionals = {}, - run = {}, - level = 'app', - usage = undefined, - } = {}, config = {}) { - const handler = argv => { + parseToYargs( + { command, describe, examples = [], file = undefined, options = {}, positionals = {}, run = {}, level = 'app', usage = undefined } = {}, + config = {}, + ) { + const handler = (argv) => { // Immediately build some arg data set opts and interactive options - const data = {options: argv, inquiry: formatters.getInteractive(options, argv)}; + const data = { options: argv, inquiry: formatters.getInteractive(options, argv) }; // Remove legacy secret toggle if still there const secretToggleFile = path.join(this.defaultConfig().userConfRoot, 'secret-toggle'); if (fs.existsSync(secretToggleFile)) fs.unlinkSync(secretToggleFile); @@ -411,99 +408,107 @@ module.exports = class Cli { lando.appConfig = config; // Handle uncaught things - _.forEach(['unhandledRejection', 'uncaughtException'], exception => { - process.on(exception, error => this.handleError(error, lando.error, this.isDebug(), lando)); + _.forEach(['unhandledRejection', 'uncaughtException'], (exception) => { + process.on(exception, (error) => this.handleError(error, lando.error, this.isDebug(), lando)); }); // run the bootstrap - return lando.bootstrap(level) - /** - * Event that allows altering of argv or inquirer before interactive prompts - * are run - * - * You will want to replace CMD with the actual task name eg `task-start-answers`. - * - * @since 3.0.0 - * @event task_CMD_answers - * @property {Object} answers argv and inquirer questions - */ - .then(() => lando.events.emit('cli-answers', data, argv._[0])) - .then(() => lando.events.emit(`cli-${argv._[0]}-answers`, data, argv._[0])) - - // Attempt to filter out questions that have already been answered - // Prompt the use for feedback if needed and sort by weight - .then(() => formatters.handleInteractive(data.inquiry, data.options, command, lando, file)) - - /** - * Event that allows final altering of answers before the task runs - * - * You will want to replace CMD with the actual task name eg `task-start-run`. - * - * @since 3.0.0 - * @event task_CMD_run - * @property {Object} answers object - */ - .then(answers => lando.events.emit('cli-run', _.merge(data.options, answers), argv._[0])) - .then(() => lando.events.emit(`cli-${argv._[0]}-run`, data, argv._[0])) - - // Find and run the task, unless we already have one - // @TODO: somehow handle when commands break eg change task name, malformed tasks - .then(() => { - // if run is already a function - if (_.isFunction(run)) return run(data.options, lando, config); - // if we have a task then do that - else if (file && fs.existsSync(file)) return require(file)(lando, config).run(data.options); - // error? - throw new Error(`Could not locate a runner for ${command}!`); - }) - - // Add a final event for other stuff - .then(() => lando.events.emit('before-end')) - - // Handle all other errors eg likely things that happen pre bootstrap - .catch(error => this.handleError(error, lando.error, this.isDebug(), lando)) - // If we caught an error that resulted in an error code lets make sure we exit non0 - .finally(() => process.exit(_.get(lando, 'exitCode', 0))); + return ( + lando + .bootstrap(level) + /** + * Event that allows altering of argv or inquirer before interactive prompts + * are run + * + * You will want to replace CMD with the actual task name eg `task-start-answers`. + * + * @since 3.0.0 + * @event task_CMD_answers + * @property {Object} answers argv and inquirer questions + */ + .then(() => lando.events.emit('cli-answers', data, argv._[0])) + .then(() => lando.events.emit(`cli-${argv._[0]}-answers`, data, argv._[0])) + + // Attempt to filter out questions that have already been answered + // Prompt the use for feedback if needed and sort by weight + .then(() => formatters.handleInteractive(data.inquiry, data.options, command, lando, file)) + + /** + * Event that allows final altering of answers before the task runs + * + * You will want to replace CMD with the actual task name eg `task-start-run`. + * + * @since 3.0.0 + * @event task_CMD_run + * @property {Object} answers object + */ + .then((answers) => lando.events.emit('cli-run', _.merge(data.options, answers), argv._[0])) + .then(() => lando.events.emit(`cli-${argv._[0]}-run`, data, argv._[0])) + + // Find and run the task, unless we already have one + // @TODO: somehow handle when commands break eg change task name, malformed tasks + .then(() => { + // if run is already a function + if (_.isFunction(run)) return run(data.options, lando, config); + // if we have a task then do that + else if (file && fs.existsSync(file)) return require(file)(lando, config).run(data.options); + // error? + throw new Error(`Could not locate a runner for ${command}!`); + }) + + // Add a final event for other stuff + .then(() => lando.events.emit('before-end')) + + // Handle all other errors eg likely things that happen pre bootstrap + .catch((error) => this.handleError(error, lando.error, this.isDebug(), lando)) + // If we caught an error that resulted in an error code lets make sure we exit non0 + .finally(() => process.exit(_.get(lando, 'exitCode', 0))) + ); }; // Return our yarg command - return {command, describe, handler, builder: yargs => { - // ensure options is an object if it isnt - if (!_.isPlainObject(options)) options = {}; - - // if we have options then let is sort and add them - if (Object.keys(options).length > 0) { - for (const [option, config] of Object.entries(formatters.sortOptions(options))) { - yargs.option(option, config); + return { + command, + describe, + handler, + builder: (yargs) => { + // ensure options is an object if it isnt + if (!_.isPlainObject(options)) options = {}; + + // if we have options then let is sort and add them + if (Object.keys(options).length > 0) { + for (const [option, config] of Object.entries(formatters.sortOptions(options))) { + yargs.option(option, config); + } + } + + // ditto for positionals + if (Object.keys(positionals).length > 0) { + for (const [arg, config] of Object.entries(formatters.sortOptions(positionals))) { + yargs.positional(arg, config); + } + } + + // examples are also good! + for (const example of examples) { + if (typeof example === 'string') yargs.example(example); + else yargs.example(...example); } - } - // ditto for positionals - if (Object.keys(positionals).length > 0) { - for (const [arg, config] of Object.entries(formatters.sortOptions(positionals))) { - yargs.positional(arg, config); + // and also allow usage + if (usage) { + const prefix = [`$0 ${command}`]; + // add description if available + if (describe) prefix.push(describe); + // and put it 2getha + yargs.usage([...prefix, `${this.chalk.green('Usage:')}${EOL} ${usage}`].join(`${EOL}${EOL}`)); } - } - - // examples are also good! - for (const example of examples) { - if (typeof example === 'string') yargs.example(example); - else yargs.example(...example); - } - - // and also allow usage - if (usage) { - const prefix = [`$0 ${command}`]; - // add description if available - if (describe) prefix.push(describe); - // and put it 2getha - yargs.usage([...prefix, `${this.chalk.green('Usage:')}${EOL} ${usage}`].join(`${EOL}${EOL}`)); - } - }}; + }, + }; } - prettify(data, {arraySeparator = ', '} = {}) { - return require('../utils/prettify')(data, {arraySeparator}); + prettify(data, { arraySeparator = ', ' } = {}) { + return require('../utils/prettify')(data, { arraySeparator }); } /* @@ -513,7 +518,7 @@ module.exports = class Cli { const yargonaut = require('yargonaut'); yargonaut.style('green').errorsStyle('red'); const yargs = require('yargs'); - const {clear, channel, experimental, secretToggle} = yargs.argv; + const { clear, channel, experimental, secretToggle } = yargs.argv; // Handle global flag error conditions first if (secretToggle && this.defaultConfig().packaged) { @@ -521,7 +526,7 @@ module.exports = class Cli { process.exit(1); } if (channel && !_.includes(globalOptions.channel.choices, channel)) { - console.error(this.makeArt('print', {text: `Unknown release channel: ${channel}`, color: 'red'})); + console.error(this.makeArt('print', { text: `Unknown release channel: ${channel}`, color: 'red' })); process.exit(1); } @@ -529,17 +534,17 @@ module.exports = class Cli { const userConfig = this.updateUserConfig(); if (clear) console.log('Lando has cleared the tasks cache!'); if (channel) { - this.updateUserConfig({channel: channel}); + this.updateUserConfig({ channel: channel }); const updateFile = path.join(this.defaultConfig().userConfRoot, 'cache', 'updates'); if (fs.existsSync(updateFile)) fs.unlinkSync(updateFile); console.log(this.makeArt('releaseChannel', channel)); } if (experimental) { - this.updateUserConfig({experimental: !userConfig.experimental}); + this.updateUserConfig({ experimental: !userConfig.experimental }); console.log(this.makeArt('experimental', !userConfig.experimental)); } if (secretToggle) { - this.updateUserConfig({alliance: !userConfig.alliance}); + this.updateUserConfig({ alliance: !userConfig.alliance }); console.log(this.makeArt('secretToggle', !userConfig.alliance)); } if (clear || channel || experimental || secretToggle) { @@ -558,7 +563,7 @@ module.exports = class Cli { const Yaml = require(`../lib/yaml`); const yaml = new Yaml(); const configFile = path.join(this.defaultConfig().userConfRoot, 'config.yml'); - const config = (fs.existsSync(configFile)) ? yaml.load(configFile) : {}; + const config = fs.existsSync(configFile) ? yaml.load(configFile) : {}; const file = yaml.dump(configFile, _.assign({}, config, data)); return yaml.load(file); } diff --git a/lib/config.js b/lib/config.js index c9725ea..1e098d9 100644 --- a/lib/config.js +++ b/lib/config.js @@ -18,7 +18,7 @@ exports.getEngineConfig = (...args) => require('../utils/get-engine-config')(... /* * @TODO */ -exports.getOclifCacheDir = (...args) => require('../utils/get-cache-dir')(...args); +exports.getOclifCacheDir = (...args) => require('../utils/get-cache-dir copy')(...args); /** * Filter process.env by a given prefix diff --git a/lib/daemon.js b/lib/daemon.js index 938beff..3875208 100644 --- a/lib/daemon.js +++ b/lib/daemon.js @@ -10,12 +10,13 @@ const semver = require('semver'); const Cache = require('./cache'); const Events = require('./events'); -const Log = require('./logger'); const Promise = require('./promise'); const Shell = require('./shell'); const shell = new Shell(); +const debug = require('../_new/lib/debug.js'); + // Constants const MACOS_BASE = '/Applications/Docker.app'; const WSL_DOCKER = '/Docker/host/bin/docker.exe'; @@ -39,32 +40,33 @@ const buildDockerCmd = (cmd, scriptsDir) => { /* * Helper to build mac docker version get command */ -const getMacProp = prop => shell.sh(['defaults', 'read', `${MACOS_BASE}/Contents/Info.plist`, prop]) - .then(data => _.trim(data)) - .catch(() => null); +const getMacProp = (prop) => + shell + .sh(['defaults', 'read', `${MACOS_BASE}/Contents/Info.plist`, prop]) + .then((data) => _.trim(data)) + .catch(() => null); /* * Creates a new Daemon instance. */ module.exports = class LandoDaemon { constructor( - cache = new Cache(), - events = new Events(), - docker = require('../utils/get-docker-x')(), - log = new Log(), - context = 'node', - compose = require('../utils/get-compose-x')(), - orchestratorVersion = '2.31.0', - userConfRoot = path.join(os.homedir(), '.lando'), + cache = new Cache(), + events = new Events(), + docker = require('../utils/get-docker-x')(), + debug = debug('lando:daemon'), + context = 'node', + compose = require('../utils/get-compose-x')(), + orchestratorVersion = '2.31.0', + userConfRoot = path.join(os.homedir(), '.lando'), ) { this.cache = cache; this.compose = compose; - this.debug = require('../utils/debug-shim')(log); + this.debug = debug; this.orchestratorVersion = orchestratorVersion; this.context = context; this.docker = docker; this.events = events; - this.log = log; this.scriptsDir = path.join(userConfRoot, 'scripts'); this.isRunning = false; this.platform = process.landoPlatform ?? process.platform; @@ -79,11 +81,9 @@ module.exports = class LandoDaemon { * @return {Promise} A Promise. */ async up(retry = true, password) { - const debug = require('../utils/debug-shim')(this.log); - // backwards compat - if (retry === true) retry = {max: 25, backoff: 1000}; - else if (retry === false) retry = {max: 0}; + if (retry === true) retry = { max: 25, backoff: 1000 }; + else if (retry === false) retry = { max: 0 }; /* * Not officially documented event that allows you to do some things before @@ -100,7 +100,7 @@ module.exports = class LandoDaemon { // retry func const starter = async () => { - return await this.isUp().then(async isUp => { + return await this.isUp().then(async (isUp) => { // if we are already up then we are done if (isUp) return Promise.resolve(); @@ -109,30 +109,30 @@ module.exports = class LandoDaemon { // docker engine case 'linux': { const lscript = path.join(this.scriptsDir, 'docker-engine-start.sh'); - if (password) await require('../utils/run-elevated')([lscript], {debug, password}); - else await require('../utils/run-command')(lscript, {debug}); + if (password) await require('../utils/run-elevated')([lscript], { debug: this.debug, password }); + else await require('../utils/run-command')(lscript, { debug: this.debug }); break; } // docker desktop case 'darwin': { // get version information - const {desktop} = await this.getVersions(); + const { desktop } = await this.getVersions(); // if desktop version is >=4.37.1 then use docker desktop cli - if (semver.gte(desktop, '4.37.0', {includePrerelease: true, loose: true})) { - await require('../utils/run-command')(this.docker, ['desktop', 'start', '--timeout', '300'], {debug: this.debug}); + if (semver.gte(desktop, '4.37.0', { includePrerelease: true, loose: true })) { + await require('../utils/run-command')(this.docker, ['desktop', 'start', '--timeout', '300'], { debug: this.debug }); - // otherwise mac fallback + // otherwise mac fallback } else { - await require('../utils/run-command')('open', [MACOS_BASE], {debug: this.debug}); + await require('../utils/run-command')('open', [MACOS_BASE], { debug: this.debug }); } break; } case 'win32': case 'wsl': { const wscript = path.join(this.scriptsDir, 'docker-desktop-start.ps1'); - await require('../utils/run-powershell-script')(wscript, undefined, {debug: this.debug}); + await require('../utils/run-powershell-script')(wscript, undefined, { debug: this.debug }); await require('delay')(2000); break; } @@ -169,43 +169,49 @@ module.exports = class LandoDaemon { * @since 3.0.0 * @event pre_engine_down */ - return this.events.emit('pre-engine-down') - .then(() => { - // Automatically return true if we are in browsery context and on linux because - // this requires SUDO and because the daemon should always be running on nix - if (this.context !== 'node' && this.platform === 'linux') return Promise.resolve(true); + return ( + this.events + .emit('pre-engine-down') + .then(() => { + // Automatically return true if we are in browsery context and on linux because + // this requires SUDO and because the daemon should always be running on nix + if (this.context !== 'node' && this.platform === 'linux') return Promise.resolve(true); - // Automatically return if we are on Windows or Darwin because we don't - // ever want to automatically turn the VM off since users might be using - // D4M/W for other things. - // - // For now we will be shutting down any services via relevant event hooks - // that bind to critical/common ports on 127.0.0.1/localhost e.g. 80/443/53 - // - // @todo: When/if we can run our own isolated docker daemon we can change - // this back. - if (this.platform === 'darwin' || this.platform === 'win32' || this.platform === 'wsl') { - return Promise.resolve(true); - } + // Automatically return if we are on Windows or Darwin because we don't + // ever want to automatically turn the VM off since users might be using + // D4M/W for other things. + // + // For now we will be shutting down any services via relevant event hooks + // that bind to critical/common ports on 127.0.0.1/localhost e.g. 80/443/53 + // + // @todo: When/if we can run our own isolated docker daemon we can change + // this back. + if (this.platform === 'darwin' || this.platform === 'win32' || this.platform === 'wsl') { + return Promise.resolve(true); + } - // Shut provider down if its status is running. - return this.isUp(this.log, this.cache, this.docker).then(isUp => { - if (isUp) return shell.sh(buildDockerCmd('stop', this.scriptsDir, this.docker), {mode: 'collect'}); - }) + // Shut provider down if its status is running. + return ( + this.isUp(this.debug, this.cache, this.docker) + .then((isUp) => { + if (isUp) return shell.sh(buildDockerCmd('stop', this.scriptsDir, this.docker), { mode: 'collect' }); + }) - // Wrap errors. - .catch(err => { - throw new Error(err, 'Error while shutting down.'); - }); - }) - /* - * Event that allows you to do some things after the docker engine is booted - * up. - * - * @since 3.0.0 - * @event post_engine_down - */ - .then(() => this.events.emit('post-engine-down')); + // Wrap errors. + .catch((err) => { + throw new Error(err, 'Error while shutting down.'); + }) + ); + }) + /* + * Event that allows you to do some things after the docker engine is booted + * up. + * + * @since 3.0.0 + * @event post_engine_down + */ + .then(() => this.events.emit('post-engine-down')) + ); } /* @@ -219,13 +225,13 @@ module.exports = class LandoDaemon { if (cache.get('engineup') === true) return Promise.resolve(true); // on wsl lets rework docker to avoid perm issues on the socket? - if (this.platform === 'wsl' && fs.existsSync(WSL_DOCKER) ) docker = WSL_DOCKER; + if (this.platform === 'wsl' && fs.existsSync(WSL_DOCKER)) docker = WSL_DOCKER; // Return true if we get a zero response and cache the result try { - await require('../utils/run-command')(docker, ['ps'], {debug: this.debug}); + await require('../utils/run-command')(docker, ['ps'], { debug: this.debug }); this.debug('engine is up.'); - cache.set('engineup', true, {ttl: 5}); + cache.set('engineup', true, { ttl: 5 }); this.isRunning = true; return Promise.resolve(true); } catch (error) { @@ -239,27 +245,32 @@ module.exports = class LandoDaemon { */ async getVersions() { // presumably if we get this far orchestratorVersion is set and orchestratorBin exists - const versions = {compose: this.orchestratorVersion, desktop: false, engine: false}; + const versions = { compose: this.orchestratorVersion, desktop: false, engine: false }; // try to get either the desktop or engine switch (this.platform) { case 'darwin': - return getMacProp('CFBundleShortVersionString').then(version => ({...versions, desktop: version})); + return getMacProp('CFBundleShortVersionString').then((version) => ({ ...versions, desktop: version })); case 'linux': { const cmd = [`"${this.docker}"`, 'version', '--format', '{{.Server.Version}}']; - return shell.sh(cmd).catch(() => '18.0.0').then(version => ({...versions, engine: version})); + return shell + .sh(cmd) + .catch(() => '18.0.0') + .then((version) => ({ ...versions, engine: version })); } case 'win32': case 'wsl': { - const componentsVersionFile = this.platform === 'win32' - ? path.resolve(getDockerBinPath('win32'), '..', 'componentsVersion.json') : '/Docker/host/componentsVersion.json'; + const componentsVersionFile = + this.platform === 'win32' + ? path.resolve(getDockerBinPath('win32'), '..', 'componentsVersion.json') + : '/Docker/host/componentsVersion.json'; // if cvf doesnt exist then just set it to something high and dont worry about it? if (!fs.existsSync(componentsVersionFile)) { versions.desktop = 'skip'; - // If we found one, use it but allow for a fallback in case these keys change + // If we found one, use it but allow for a fallback in case these keys change } else { - const {appVersion, Version, Informational} = require(componentsVersionFile); + const { appVersion, Version, Informational } = require(componentsVersionFile); versions.desktop = appVersion ?? Version ?? Informational; } diff --git a/lib/engine.js b/lib/engine.js index b86c919..c7e3fa9 100644 --- a/lib/engine.js +++ b/lib/engine.js @@ -16,13 +16,8 @@ module.exports = class Engine { this.docker = docker; this.daemon = daemon; this.compose = compose; - this.engineCmd = (name, data, run = () => router[name](data, this.compose, this.docker)) => router.eventWrapper( - name, - daemon, - daemon.events, - data, - run, - ); + this.engineCmd = (name, data, run = () => router[name](data, this.compose, this.docker)) => + router.eventWrapper(name, daemon, daemon.events, data, run); // Determine install status this.composeInstalled = fs.existsSync(config.orchestratorBin); this.dockerInstalled = this.daemon.docker !== false; @@ -75,7 +70,7 @@ module.exports = class Engine { * return lando.engine.build(app); */ build(data) { - return this.engineCmd('build', data, data => router.build(data, this.compose)); + return this.engineCmd('build', data, (data) => router.build(data, this.compose)); } /** @@ -183,17 +178,20 @@ module.exports = class Engine { // normalize supported versions stuff supportedVersions = _(supportedVersions) - .map((data, name) => _.merge({}, data, {name})) - .map(data => ([data.name, { - satisfies: data.satisfies || `${data.min} - ${data.max}`, - link: data.link[this.platform], - tested: data.tested || 'x.x.x', - recommendUpdate: data.recommendUpdate || 'x.x.x', - }])) + .map((data, name) => _.merge({}, data, { name })) + .map((data) => [ + data.name, + { + satisfies: data.satisfies || `${data.min} - ${data.max}`, + link: data.link[this.platform], + tested: data.tested || 'x.x.x', + recommendUpdate: data.recommendUpdate || 'x.x.x', + }, + ]) .fromPairs() .value(); - return this.daemon.getVersions().then(versions => { + return this.daemon.getVersions().then((versions) => { // Remove the things we don't need depending on platform // @TODO: Should daemon.getVersions just do this automatically? if (this.platform === 'linux') delete versions.desktop; @@ -204,22 +202,23 @@ module.exports = class Engine { if (versions?.desktop === 'skip') delete versions.desktop; // do the version comparison - return _(versions).map((version, name) => { - const reqs = supportedVersions[name]; - return { - name, - link: reqs.link, - satisfied: require('../utils/is-compatible-version')(version, reqs), - untested: !require('../utils/is-compatible-version')(version, {...reqs, satisfies: reqs.tested}), - rupdate: require('../utils/is-compatible-version')(version, {...reqs, satisfies: reqs.recommendUpdate}), - wants: reqs.satisfies, - tested: reqs.tested, - update: reqs.recommendUpdate, - dockerVersion: true, - version: semver.clean(version), - }; - }) - .value(); + return _(versions) + .map((version, name) => { + const reqs = supportedVersions[name]; + return { + name, + link: reqs.link, + satisfied: require('../utils/is-compatible-version')(version, reqs), + untested: !require('../utils/is-compatible-version')(version, { ...reqs, satisfies: reqs.tested }), + rupdate: require('../utils/is-compatible-version')(version, { ...reqs, satisfies: reqs.recommendUpdate }), + wants: reqs.satisfies, + tested: reqs.tested, + update: reqs.recommendUpdate, + dockerVersion: true, + version: semver.clean(version), + }; + }) + .value(); }); } @@ -268,7 +267,7 @@ module.exports = class Engine { * }); */ isRunning(data) { - return this.engineCmd('isRunning', data, data => this.docker.isRunning(data)); + return this.engineCmd('isRunning', data, (data) => this.docker.isRunning(data)); } /** @@ -288,7 +287,7 @@ module.exports = class Engine { * }); */ list(options = {}, separator = this.separator) { - return this.engineCmd('list', options, options => this.docker.list(options, separator)); + return this.engineCmd('list', options, (options) => this.docker.list(options, separator)); } /** @@ -311,7 +310,7 @@ module.exports = class Engine { * return lando.engine.logs(app); */ logs(data) { - return this.engineCmd('logs', data, data => router.logs(data, this.compose)); + return this.engineCmd('logs', data, (data) => router.logs(data, this.compose)); } /** @@ -444,7 +443,7 @@ module.exports = class Engine { if (_.has(data, 'opts.services') && _.get(data, 'opts.services', []).length === 0) return Promise.resolve(); else if (_.has(data, 'services') && _.get(data, 'services', []).length === 0) return Promise.resolve(); // otherwise we should be able to do something? - return this.engineCmd('start', data, data => router.start(data, this.compose)); + return this.engineCmd('start', data, (data) => router.start(data, this.compose)); } /** @@ -496,4 +495,3 @@ module.exports = class Engine { return this.engineCmd('stop', data); } }; - diff --git a/lib/error.js b/lib/error.js index 7f289e2..3eb1a18 100644 --- a/lib/error.js +++ b/lib/error.js @@ -1,11 +1,11 @@ 'use strict'; // Modules -const Log = require('./logger'); +const debug = require('../components/debug.js'); const Metrics = require('./metrics'); module.exports = class ErrorHandler { - constructor(log = new Log(), metrics = new Metrics()) { + constructor(log = debug, metrics = new Metrics()) { this.log = log; this.metrics = metrics; } @@ -25,7 +25,7 @@ module.exports = class ErrorHandler { * const argv = lando.tasks.argv(); * @todo make this static and then fix all call sites */ - handle({message, stack, code = 1, hide = false, verbose = 0} = {}, report = true) { + handle({ message, stack, code = 1, hide = false, verbose = 0 } = {}, report = true) { // if code is not an integer then just make it 1 if (!Number.isInteger(code)) { message = `${message} ${code}`; @@ -34,13 +34,14 @@ module.exports = class ErrorHandler { // Log error or not if (!hide) { - if (verbose > 0) this.log.error(stack); - else this.log.error(message); + if (verbose > 0) this.log(stack); + else this.log(message); } // Report error if we can - return Promise.resolve().then(() => { - if (report) return this.metrics.report('error', {message: message, stack: stack}); - }) - .then(() => code); + return Promise.resolve() + .then(() => { + if (report) return this.metrics.report('error', { message: message, stack: stack }); + }) + .then(() => code); } }; diff --git a/lib/events.js b/lib/events.js index fe30e48..5be2935 100644 --- a/lib/events.js +++ b/lib/events.js @@ -2,25 +2,24 @@ // Modules. const _ = require('lodash'); - -const {nanoid} = require('nanoid'); +const { nanoid } = require('nanoid'); const EventEmitter = require('events').EventEmitter; -const Log = require('./logger'); + +const debug = require('../_new/lib/debug.js'); const Promise = require('./promise'); /* * Creates a new Events instance. */ class AsyncEvents extends EventEmitter { - constructor(log = new Log()) { + constructor(log = debug) { // Get the event emitter stuffs super(); // Set things this.log = log; this._listeners = []; } - /** * Our overridden event on method. * @@ -53,9 +52,9 @@ class AsyncEvents extends EventEmitter { } // Store - this._listeners.push({name, priority, fn, id: nanoid()}); + this._listeners.push({ name, priority, fn, id: nanoid() }); // Log - this.log.silly('loading event %s priority %s', name, priority); + this.log('loading event %s priority %s', name, priority); // Call originl on method. return this.__on(name, fn); } @@ -96,39 +95,41 @@ class AsyncEvents extends EventEmitter { // Grab priority sorted listeners for this event const evnts = _(this._listeners) // Filter by name - .filter(listener => listener.name === name) + .filter((listener) => listener.name === name) // Sort by priority .sortBy('priority') // Return value .value(); // Map to array of func - const fns = _.map(evnts, evnt => ({fn: evnt.fn, id: evnt.id})); + const fns = _.map(evnts, (evnt) => ({ fn: evnt.fn, id: evnt.id })); // Log non engine events so we can keep things quiet - this.log.debug('emitting event %s', name); - this.log.silly('event %s has %s listeners', name, fns.length); + this.log('emitting event %s', name); + this.log('event %s has %s listeners', name, fns.length); // Make listener functions to a promise in series. - return Promise.each(fns, listener => { - const {fn, id} = listener; - // Clone function arguments. - const fnArgs = args.slice(); - // Add listener function to front of arguments. - fnArgs.unshift(fn); - // If its a onetimer then remove it from listeners - if (fn.name && fn.name.includes('onceWrapper')) { - this._listeners = this._listeners.filter(listener => listener.id !== id); - } - // Apply function that calls the listener function and returns a promise. - return handle.apply(self, fnArgs); - }) - - // Make sure to wait for all mappings. - .all() - - // Return true if event had listeners just like the original emit function. - .return(!!fns.length); + return ( + Promise.each(fns, (listener) => { + const { fn, id } = listener; + // Clone function arguments. + const fnArgs = args.slice(); + // Add listener function to front of arguments. + fnArgs.unshift(fn); + // If its a onetimer then remove it from listeners + if (fn.name && fn.name.includes('onceWrapper')) { + this._listeners = this._listeners.filter((listener) => listener.id !== id); + } + // Apply function that calls the listener function and returns a promise. + return handle.apply(self, fnArgs); + }) + + // Make sure to wait for all mappings. + .all() + + // Return true if event had listeners just like the original emit function. + .return(!!fns.length) + ); } removeAllListeners() { diff --git a/lib/lando.js b/lib/lando.js index 496dadd..624b1a9 100644 --- a/lib/lando.js +++ b/lib/lando.js @@ -14,11 +14,11 @@ const BOOTSTRAP_LEVELS = { }; // Default version information -const DEFAULT_VERSIONS = {networking: 1}; +const DEFAULT_VERSIONS = { networking: 1 }; // Helper to resolve setup tasks for uniqueness and these things const resolveSetupTasks = (tasks = []) => { - tasks = _.uniqBy(tasks, task => { + tasks = _.uniqBy(tasks, (task) => { if (task.multiple === true) return Math.random(); else return task.id; }); @@ -29,7 +29,7 @@ const resolveSetupTasks = (tasks = []) => { /* * Helper to bootstrap plugins */ -const bootstrapConfig = async lando => { +const bootstrapConfig = async (lando) => { const Plugins = require('./plugins'); lando.plugins = new Plugins(lando.log); lando.versions = _.merge({}, DEFAULT_VERSIONS, lando.cache.get('versions')); @@ -39,17 +39,17 @@ const bootstrapConfig = async lando => { // Load in experimental features if (lando.config.experimental) { const experimentalPluginPath = path.join(__dirname, '..', 'experimental'); - lando.config.pluginDirs.push({path: experimentalPluginPath, subdir: '.'}); + lando.config.pluginDirs.push({ path: experimentalPluginPath, subdir: '.' }); } // Find the plugins const plugins = lando.plugins.find(lando.config.pluginDirs, lando.config); // if we dont have core in this list somewhere that is a huge mistake and lets make sure we load it - if (!plugins.find(plugin => plugin.name === '@lando/core')) { + if (!plugins.find((plugin) => plugin.name === '@lando/core')) { // ensure coreBase is set lando.config.coreBase = lando.config.coreBase ?? path.resolve(__dirname, '..'); - lando.log.debug('no core detected loading from %o', lando.config.coreBase); + lando.log('no core detected loading from %o', lando.config.coreBase); // core const core = { @@ -76,13 +76,13 @@ const bootstrapConfig = async lando => { } // make sure we remove duplicate "local" plugins so lando.config does not show them twice - const removed = _.remove(lando.config.plugins, plugin => { - if (plugin.type === 'local') return _.size(_.filter(lando.config.plugins, p => p.name === plugin.name)) > 1; + const removed = _.remove(lando.config.plugins, (plugin) => { + if (plugin.type === 'local') return _.size(_.filter(lando.config.plugins, (p) => p.name === plugin.name)) > 1; return false; }); // log - if (!_.isEmpty(removed)) lando.log.debug('removed duplicate plugin entries %o', removed); + if (!_.isEmpty(removed)) lando.log('removed duplicate plugin entries %o', removed); // he who remains return plugins; @@ -91,7 +91,7 @@ const bootstrapConfig = async lando => { /* * Helper to bootstrap tasks */ -const bootstrapTasks = async lando => { +const bootstrapTasks = async (lando) => { // if we already have cached tasks tehn load that if (!lando.cache.get('_.tasks.cache')) await require('../hooks/lando-generate-tasks-cache')(lando); // push it @@ -101,33 +101,25 @@ const bootstrapTasks = async lando => { /* * Helper to bootstrap engine */ -const bootstrapEngine = lando => { +const bootstrapEngine = (lando) => { const Shell = require('./shell'); lando.shell = new Shell(lando.log); - lando.scanUrls = require('../utils/legacy-scan')(lando.log); - lando.engine = require('../utils/setup-engine')( - lando.config, - lando.cache, - lando.events, - lando.log, - lando.shell, - lando.config.instance, - ); + lando.engine = require('../utils/setup-engine')(lando.config, lando.cache, lando.events, lando.log, lando.shell, lando.config.instance); lando.utils = _.merge({}, require('./utils'), require('./config')); // if we have not wiped the scripts dir to accomodate https://github.com/docker/for-mac/issues/6614#issuecomment-1382224436 // then lets do that here if (!lando.cache.get('VIRTUOFSNUKE1')) { - const {rimrafSync} = require('rimraf'); + const { rimrafSync } = require('rimraf'); rimrafSync(path.join(lando.config.userConfRoot, 'scripts')); - lando.cache.set('VIRTUOFSNUKE1', 'yes', {persist: true}); + lando.cache.set('VIRTUOFSNUKE1', 'yes', { persist: true }); } }; /* * Helper to bootstrap app stuffs */ -const bootstrapApp = lando => { +const bootstrapApp = (lando) => { const Factory = require('./factory'); const Yaml = require('./yaml'); lando.factory = new Factory(); @@ -135,21 +127,21 @@ const bootstrapApp = lando => { // start with legacy builder discovery const legacyBuilders = _(['compose', 'types', 'services', 'recipes']) - .flatMap(type => _.map(lando.config.plugins, plugin => plugin[type])) - .filter(dir => fs.existsSync(dir)) - .flatMap(dir => glob.sync(path.join(dir, '*', 'builder.js'))) - .map(file => lando.factory.add(file).name) + .flatMap((type) => _.map(lando.config.plugins, (plugin) => plugin[type])) + .filter((dir) => fs.existsSync(dir)) + .flatMap((dir) => glob.sync(path.join(dir, '*', 'builder.js'))) + .map((file) => lando.factory.add(file).name) .value(); - _.forEach(legacyBuilders, builder => lando.log.debug('autoloaded legacy builder %s', builder)); + _.forEach(legacyBuilders, (builder) => lando.log('autoloaded legacy builder %s', builder)); // then move to legacy builders we can lazy load from builders const legacyItems = _(['builders']) - .flatMap(type => _.map(lando.config.plugins, plugin => plugin[type])) - .filter(dir => fs.existsSync(dir)) - .flatMap(dir => fs.readdirSync(dir).map(file => path.join(dir, file))) - .map(file => lando.factory.add(file)) + .flatMap((type) => _.map(lando.config.plugins, (plugin) => plugin[type])) + .filter((dir) => fs.existsSync(dir)) + .flatMap((dir) => fs.readdirSync(dir).map((file) => path.join(dir, file))) + .map((file) => lando.factory.add(file)) .value(); - _.forEach(legacyItems, ({name, api}) => lando.log.debug('autodiscovered legacy api %s builder %s', api, name)); + _.forEach(legacyItems, ({ name, api }) => lando.log('autodiscovered legacy api %s builder %s', api, name)); // @TODO: when we have new 4ish services/recipes we need to do below // @TODO: load all non builder.js files in the "services" directory @@ -161,11 +153,16 @@ const bootstrapApp = lando => { */ const bootstrapRouter = async (level, lando) => { switch (level) { - case 'config': return await bootstrapConfig(lando); - case 'tasks': return bootstrapTasks(lando); - case 'engine': return bootstrapEngine(lando); - case 'app': return bootstrapApp(lando); - default: return true; + case 'config': + return await bootstrapConfig(lando); + case 'tasks': + return bootstrapTasks(lando); + case 'engine': + return bootstrapEngine(lando); + case 'app': + return bootstrapApp(lando); + default: + return true; } }; @@ -202,15 +199,14 @@ module.exports = class Lando { this.config = require('../utils/build-config')(options); this.Promise = require('./promise'); this.tasks = []; + const debug = require('../components/debug.js').default; const AsyncEvents = require('./events'); - const Log = require('./logger'); const ErrorHandler = require('./error'); const UpdateManager = require('./updates'); this.cache = require('../utils/setup-cache')(this.log, this.config); - this.log = new Log(this.config); + this.log = debug('lando'); this.metrics = require('../utils/setup-metrics')(this.log, this.config); - this.error = new ErrorHandler(this.log, this.metrics), - this.events = new AsyncEvents(this.log); + ((this.error = new ErrorHandler(this.log, this.metrics)), (this.events = new AsyncEvents(this.log))); this.user = require('./user'); // updater is more complex now @@ -219,14 +215,15 @@ module.exports = class Lando { channel: this.config.channel, cli: _.get(this, 'config.cli'), config: getPluginConfig(this.config.pluginConfigFile, this.config.pluginConfig), - debug: require('../utils/debug-shim')(this.log), + debug: this.log, }); // helper just to determine whether we are "debuggy" or not - this.debuggy = this.config.logLevelConsole > 2 - || this.config.logLevelConsole === 'verbose' - || this.config.logLevelConsole === 'debug' - || this.config.logLevelConsole === 'silly'; + this.debuggy = + this.config.logLevelConsole > 2 || + this.config.logLevelConsole === 'verbose' || + this.config.logLevelConsole === 'debug' || + this.config.logLevelConsole === 'silly'; } /** @@ -273,15 +270,15 @@ module.exports = class Lando { */ bootstrap(level = 'app') { // Log that we've begun - this.log.verbose('starting bootstrap at level %s...', level); - this.log.silly('it\'s not particularly silly, is it?'); + this.log('starting bootstrap at level %s...', level); + this.log("it's not particularly silly, is it?"); // @TODO TEST THE BELOW BIG TIMEZ const bootstraps = _.slice(_.keys(BOOTSTRAP_LEVELS), 0, BOOTSTRAP_LEVELS[level]); // Loop through our bootstrap levels - return this.Promise.each(bootstraps, level => { - this.log.verbose('%s bootstrap beginning...', level); + return this.Promise.each(bootstraps, (level) => { + this.log('%s bootstrap beginning...', level); this._bootstrap = level; this._bootstrapLevel = this.BOOTSTRAP_LEVELS[level]; @@ -333,90 +330,90 @@ module.exports = class Lando { * // My codes * }); */ - return this.events.emit(`pre-bootstrap-${level}`, this) - - // Call the things that should happen at each level - .then(() => bootstrapRouter(level, this)) - - /** - * Event that runs after we bootstrap config - * - * @since 3.0.0 - * @alias lando.events:post-bootstrap-config - * @event post_bootstrap_config - * @property {Lando} lando The Lando object - * @example - * lando.events.on('post-bootstrap-config', lando => { - * // My codes - * }); - */ - /** - * Event that runs after we bootstrap tasks - * - * @since 3.0.0 - * @alias lando.events:post-bootstrap-tasks - * @event post_bootstrap_tasks - * @property {Lando} lando The Lando object - * @example - * lando.events.on('post-bootstrap-tasks', lando => { - * // My codes - * }); - */ - /** - * Event that runs after we bootstrap the engine - * - * @since 3.0.0 - * @alias lando.events:post-bootstrap-engine - * @event post_bootstrap_engine - * @property {Lando} lando The Lando object - * @example - * lando.events.on('post-bootstrap-engine', lando => { - * // My codes - * }); - */ - /** - * Event that runs after we bootstrap the app - * - * @since 3.0.0 - * @alias lando.events:post-bootstrap-app - * @event post_bootstrap_app - * @property {Lando} lando The Lando object - * @example - * lando.events.on('post-bootstrap-app', lando => { - * // My codes - * }); - */ - .then(() => this.events.emit(`post-bootstrap-${level}`, this)) - // Log the doneness - .then(() => this.log.verbose('%s bootstrap completed.', level)); + return ( + this.events + .emit(`pre-bootstrap-${level}`, this) + + // Call the things that should happen at each level + .then(() => bootstrapRouter(level, this)) + + /** + * Event that runs after we bootstrap config + * + * @since 3.0.0 + * @alias lando.events:post-bootstrap-config + * @event post_bootstrap_config + * @property {Lando} lando The Lando object + * @example + * lando.events.on('post-bootstrap-config', lando => { + * // My codes + * }); + */ + /** + * Event that runs after we bootstrap tasks + * + * @since 3.0.0 + * @alias lando.events:post-bootstrap-tasks + * @event post_bootstrap_tasks + * @property {Lando} lando The Lando object + * @example + * lando.events.on('post-bootstrap-tasks', lando => { + * // My codes + * }); + */ + /** + * Event that runs after we bootstrap the engine + * + * @since 3.0.0 + * @alias lando.events:post-bootstrap-engine + * @event post_bootstrap_engine + * @property {Lando} lando The Lando object + * @example + * lando.events.on('post-bootstrap-engine', lando => { + * // My codes + * }); + */ + /** + * Event that runs after we bootstrap the app + * + * @since 3.0.0 + * @alias lando.events:post-bootstrap-app + * @event post_bootstrap_app + * @property {Lando} lando The Lando object + * @example + * lando.events.on('post-bootstrap-app', lando => { + * // My codes + * }); + */ + .then(() => this.events.emit(`post-bootstrap-${level}`, this)) + // Log the doneness + .then(() => this.log('%s bootstrap completed.', level)) + ); }) - .then(() => this.log.verbose('bootstrap completed.')) - .then(() => this.events.emit(`post-bootstrap`, this)) - .then(() => this.events.emit(`almost-ready`, this)) - .then(() => this.events.emit(`ready`, this)) - .then(() => this); + .then(() => this.log('bootstrap completed.')) + .then(() => this.events.emit(`post-bootstrap`, this)) + .then(() => this.events.emit(`almost-ready`, this)) + .then(() => this.events.emit(`ready`, this)) + .then(() => this); } - async generateCert(name, { - caCert = this.config.caCert, - caKey = this.config.caKey, - domains = [], - organization = 'Lando Alliance', - validity = 365, - } = {}) { + async generateCert( + name, + { caCert = this.config.caCert, caKey = this.config.caKey, domains = [], organization = 'Lando Alliance', validity = 365 } = {}, + ) { const read = require('../utils/read-file'); const write = require('../utils/write-file'); - const {createCert} = require('mkcert'); + const { createCert } = require('mkcert'); // compute const certPath = path.join(this.config.userConfRoot, 'certs', `${name}.crt`); const keyPath = path.join(this.config.userConfRoot, 'certs', `${name}.key`); // push localhost and 127.0.0.1 to domains domains.push('127.0.0.1', 'localhost'); - this.log.debug('received cert request for %o with names %j using CA %o', name, domains, caCert); + this.log('received cert request for %o with names %j using CA %o', name, domains, caCert); // generate cert - const {cert, key} = await createCert({ + const { cert, key } = await createCert({ ca: { cert: read(caCert), key: read(caKey), @@ -431,8 +428,8 @@ module.exports = class Lando { // and, presumably the cost is low? write(certPath, cert); write(keyPath, key); - this.log.debug('generated cert/key pair %o %o', certPath, keyPath); - return {certPath, keyPath}; + this.log('generated cert/key pair %o %o', certPath, keyPath); + return { certPath, keyPath }; } /** @@ -456,20 +453,22 @@ module.exports = class Lando { // Grab lando files for this app const fileNames = _.flatten([this.config.preLandoFiles, [this.config.landoFile], this.config.postLandoFiles]); const landoFiles = getLandoFiles(fileNames, startFrom); + + // @TODO; this needs to end up in the CLI // Return warning if we find nothing if (_.isEmpty(landoFiles)) { if (warn) { - this.log.warn('could not find app in this dir or a reasonable amount of directories above it!'); + console.warn('could not find app in this dir or a reasonable amount of directories above it!'); } return; } // Load the config and augment so we can get an App - const config = lmerge({}, ..._.map(landoFiles, file => yaml.load(file))); - this.log.info('loading app %s from config files', config.name, landoFiles); + const config = lmerge({}, ..._.map(landoFiles, (file) => yaml.load(file))); + this.log('loading app %s from config files', config.name, landoFiles); // Return us some app! const App = require('./app'); - return new App(config.name, _.merge({}, config, {files: landoFiles}), this); + return new App(config.name, _.merge({}, config, { files: landoFiles }), this); } async getInstallPluginsStatus(options = this.config.setup) { @@ -478,38 +477,40 @@ module.exports = class Lando { // reset Plugin static defaults for v3 purposes Plugin.config = getPluginConfig(this.config.pluginConfigFile, this.config.pluginConfig); - Plugin.debug = require('../utils/debug-shim')(this.log); + Plugin.debug = this.log; // attempt to compute the destination to install the plugin - const {dir} = this.config.pluginDirs.find(dir => dir.type === require('../utils/get-plugin-type')()); + const { dir } = this.config.pluginDirs.find((dir) => dir.type === require('../utils/get-plugin-type')()); // event that lets plugins modify the status check await this.events.emit('pre-install-plugins', options); // prep tasks const plugins = require('../utils/parse-to-plugin-strings')(options.plugins); - const results = await Promise.all(plugins.map(async plugin => { - const {description, canInstall, isInstalled} = require('../utils/get-plugin-add-task')(plugin, {dir, Plugin}); - // lets also check for any internal instances of the plugin so we dont reinstall - const parsed = require('../utils/parse-package-name')(plugin); - const inCore = path.resolve(__dirname, '..', 'plugins', parsed.package); - - // lets start optimistically - const status = {description, state: 'INSTALLED', version: plugin, id: parsed.name}; - - // and slowly spiral down - if (await isInstalled() === false && await isInstalled(inCore) === false) { - try { - await canInstall(); - status.state = 'NOT INSTALLED'; - } catch (error) { - status.state = 'CANNOT INSTALL'; - status.comment = error.message; + const results = await Promise.all( + plugins.map(async (plugin) => { + const { description, canInstall, isInstalled } = require('../utils/get-plugin-add-task')(plugin, { dir, Plugin }); + // lets also check for any internal instances of the plugin so we dont reinstall + const parsed = require('../utils/parse-package-name')(plugin); + const inCore = path.resolve(__dirname, '..', 'plugins', parsed.package); + + // lets start optimistically + const status = { description, state: 'INSTALLED', version: plugin, id: parsed.name }; + + // and slowly spiral down + if ((await isInstalled()) === false && (await isInstalled(inCore)) === false) { + try { + await canInstall(); + status.state = 'NOT INSTALLED'; + } catch (error) { + status.state = 'CANNOT INSTALL'; + status.comment = error.message; + } } - } - return status; - })); + return status; + }), + ); // set plugins much with the results await this.events.emit('post-install-plugins', results); @@ -523,21 +524,21 @@ module.exports = class Lando { // reset Plugin static defaults for v3 purposes Plugin.config = getPluginConfig(this.config.pluginConfigFile, this.config.pluginConfig); - Plugin.debug = require('../utils/debug-shim')(this.log); + Plugin.debug = this.log; // attempt to compute the destination to install the plugin - const {dir} = this.config.pluginDirs.find(dir => dir.type === require('../utils/get-plugin-type')()); + const { dir } = this.config.pluginDirs.find((dir) => dir.type === require('../utils/get-plugin-type')()); // event that lets plugins modify the install await this.events.emit('pre-install-plugins', options); // prep tasks const tasks = require('../utils/parse-to-plugin-strings')(options.plugins) - .map(plugin => require('../utils/get-plugin-add-task')(plugin, {dir, Plugin})) - .map(task => require('../utils/parse-setup-task')({...task, count: false})); + .map((plugin) => require('../utils/get-plugin-add-task')(plugin, { dir, Plugin })) + .map((task) => require('../utils/parse-setup-task')({ ...task, count: false })); // try to fetch the plugins - const {data, errors, results, total} = await this.runTasks(tasks, { + const { data, errors, results, total } = await this.runTasks(tasks, { renderer: 'dc2', rendererOptions: { header: 'Installing Plugins', @@ -551,28 +552,26 @@ module.exports = class Lando { }); // event that lets plugins modify the output - await this.events.emit('post-install-plugins', {data, errors, results, total}); + await this.events.emit('post-install-plugins', { data, errors, results, total }); - this.log.debug('installed %s of %s plugins with %s errors', results.length, total, errors.length); + this.log('installed %s of %s plugins with %s errors', results.length, total, errors.length); // return - return {data, errors, results, total}; + return { data, errors, results, total }; } // run tasks async runTasks(tasks, options = {}) { // some defaults - const defaults = {rendererOptions: {log: this.log.debug}}; + const defaults = { rendererOptions: { log: this.log } }; // dc2 renderer has some special treatment if (options.renderer === 'dc2') { - options = _.merge({}, {debug: 'dc2-debug', fallbackRenderer: 'simple'}, options); + options = _.merge({}, { debug: 'dc2-debug', fallbackRenderer: 'simple' }, options); } // set to the debug renderer if we are in debug mode - if (this.config.logLevelConsole > 3 - || this.config.logLevelConsole === 'debug' - || this.config.logLevelConsole === 'silly') { + if (this.config.logLevelConsole > 3 || this.config.logLevelConsole === 'debug' || this.config.logLevelConsole === 'silly') { options.renderer = options.debug || 'debug'; } @@ -593,14 +592,14 @@ module.exports = class Lando { // setup async setup(options = this.config.setup) { // merge needed defaults into options - options = _.merge({tasks: [], plugins: {}}, options); + options = _.merge({ tasks: [], plugins: {} }, options); // collect our things - const data = {errors: [], results: [], restart: false, total: 0}; + const data = { errors: [], results: [], restart: false, total: 0 }; // if we should add plugins then install them if (options.installPlugins) { - const {errors, results, total} = await this.installPlugins(options); + const { errors, results, total } = await this.installPlugins(options); data.errors = [...data.errors, ...errors]; data.results = [...data.results, ...results]; data.total = data.total + total; @@ -615,38 +614,35 @@ module.exports = class Lando { // if we should run setup tasks if (options.installTasks) { // wrap the tasks - options.tasks = resolveSetupTasks(options.tasks.map(task => require('../utils/parse-setup-task')(task))); + options.tasks = resolveSetupTasks(options.tasks.map((task) => require('../utils/parse-setup-task')(task))); // and then run them - const {errors, results, total} = await this.runTasks(options.tasks, - { - concurrent: true, - exitOnError: false, - renderer: 'dc2', - rendererOptions: { - header: 'Running Setup Tasks', - states: { - COMPLETED: 'Completed', - STARTED: 'Running', - FAILED: 'FAILED', - }, + const { errors, results, total } = await this.runTasks(options.tasks, { + concurrent: true, + exitOnError: false, + renderer: 'dc2', + rendererOptions: { + header: 'Running Setup Tasks', + states: { + COMPLETED: 'Completed', + STARTED: 'Running', + FAILED: 'FAILED', }, }, - ); + }); data.errors = [...data.errors, ...errors]; data.results = [...data.results, ...results]; data.total = data.total + total; - this.log.debug('ran %s of %s tasks with %s errors', results.length, results.length, errors.length); + this.log('ran %s of %s tasks with %s errors', results.length, results.length, errors.length); } // assess restart situation // @NOTE: we do not allow restarts on CI or non-interactive environments - data.restart = this.config.isInteractive - && !_.has(process, 'env.CI') - && data.results.length > 0 - && options.tasks - .filter(task => task.enabled) - .some(task => task.requiresRestart === true); + data.restart = + this.config.isInteractive && + !_.has(process, 'env.CI') && + data.results.length > 0 && + options.tasks.filter((task) => task.enabled).some((task) => task.requiresRestart === true); // post setup event await this.events.emit('post-setup', data); @@ -659,31 +655,33 @@ module.exports = class Lando { // pre setup event to mutate the setup tasks await this.events.emit('pre-setup', options); - const results = await Promise.all(options.tasks.map(async task => { - // break it up - const {id, canRun, comments, description, hasRun, requiresRestart, version} = require('../utils/parse-setup-task')(task); // eslint-disable-line max-len - // lets start optimistically - const status = {version, description, id, state: 'INSTALLED'}; - // and slowly spiral down - // @TODO: woiuld be great if hasRun could also return a "comment" eg - // "installed but slightly above desired range" - if (await hasRun() === false) { - try { - await canRun(); - status.state = 'NOT INSTALLED'; - if (comments['NOT INSTALLED']) status.comment = comments['NOT INSTALLED']; - } catch (error) { - status.state = 'CANNOT INSTALL'; - status.comment = error.message; + const results = await Promise.all( + options.tasks.map(async (task) => { + // break it up + const { id, canRun, comments, description, hasRun, requiresRestart, version } = require('../utils/parse-setup-task')(task); // eslint-disable-line max-len + // lets start optimistically + const status = { version, description, id, state: 'INSTALLED' }; + // and slowly spiral down + // @TODO: woiuld be great if hasRun could also return a "comment" eg + // "installed but slightly above desired range" + if ((await hasRun()) === false) { + try { + await canRun(); + status.state = 'NOT INSTALLED'; + if (comments['NOT INSTALLED']) status.comment = comments['NOT INSTALLED']; + } catch (error) { + status.state = 'CANNOT INSTALL'; + status.comment = error.message; + } } - } - // if requires restart is a function then run it to reset teh task - if (typeof requiresRestart === 'function') status.restart = await requiresRestart({}, task); - else status.restart = requiresRestart; + // if requires restart is a function then run it to reset teh task + if (typeof requiresRestart === 'function') status.restart = await requiresRestart({}, task); + else status.restart = requiresRestart; - return status; - })); + return status; + }), + ); // pre setup event to mutate the setup tasks await this.events.emit('post-setup', results); diff --git a/lib/logger.js b/lib/logger.js deleted file mode 100644 index 110ea35..0000000 --- a/lib/logger.js +++ /dev/null @@ -1,230 +0,0 @@ -'use strict'; - -// Modules -const _ = require('lodash'); -const fs = require('fs'); -const path = require('path'); -const serialize = require('winston/lib/winston/common').serialize; -const winston = require('winston'); -const util = require('util'); - -// Constants -const logLevels = { - '0': 'error', - '1': 'warn', - '2': 'info', - '3': 'verbose', - '4': 'debug', - '5': 'silly', -}; -const logColors = { - error: 'bgRed', - warn: 'bgYellow', - info: 'bold', - verbose: 'gray', - debug: 'dim', - silly: 'blue', - timestamp: 'magenta', - lando: 'cyan', - app: 'green', - extra: 'dim', -}; -const userLevels = ['warn', 'error']; - -// Rewriters -const keySanitizer = sanitizeKey => (level, msg, meta) => { - // start with a deep clone of meta so we dont mutate important underlying data - const data = _.cloneDeep(meta); - // change data as needed - _.forEach(data, (value, key) => { - if (sanitizeKey instanceof RegExp && sanitizeKey.test(key)) data[key] = '****'; - else if (sanitizeKey === key) data[key] = '****'; - }); - - return data; -}; - - -/** - * Logs a debug message. - * - * Debug messages are intended to communicate lifecycle milestones and events that are relevant to developers - * - * @since 3.0.0 - * @function - * @name lando.log.debug - * @alias lando.log.debug - * @param {String} msg A string that will be passed into nodes core `utils.format()` - * @param {...Any} [values] Values to be passed `utils.format()` - * @example - * // Log a debug message - * lando.log.debug('All details about docker inspect %j', massiveObject); - */ -/** - * Logs an error message. - * - * Errors are intended to communicate there is a serious problem with the application - * - * @since 3.0.0 - * @function - * @name lando.log.error - * @alias lando.log.error - * @param {String} msg A string that will be passed into nodes core `utils.format()` - * @param {...Any} [values] Values to be passed `utils.format()` - * @example - * // Log an error message - * lando.log.error('This is an err with details %s', err); - */ -/** - * Logs an info message. - * - * Info messages are intended to communicate lifecycle milestones and events that are relevant to users - * - * @since 3.0.0 - * @function - * @name lando.log.info - * @alias lando.log.info - * @param {String} msg A string that will be passed into nodes core `utils.format()` - * @param {...Any} [values] Values to be passed `utils.format()` - * @example - * // Log an info message - * lando.log.info('It is happening!'); - */ -/** - * Logs a silly message. - * - * Silly messages are meant for hardcore debugging - * - * @since 3.0.0 - * @function - * @name lando.log.silly - * @alias lando.log.silly - * @param {String} msg A string that will be passed into nodes core `utils.format()` - * @param {...Any} [values] Values to be passed `utils.format()` - * @example - * // Log a silly message - * lando.log.silly('All details about all the things', unreasonablySizedObject); - * - * // Log a silly message - * lando.log.silly('If you are seeing this you have delved too greedily and too deep and likely have awoken something.'); - */ -/** - * Logs a verbose message. - * - * Verbose messages are intended to communicate extra information to the user and basics to a developer. They sit somewhere - * in between info and debug - * - * @since 3.0.0 - * @function - * @name lando.log.verbose - * @alias lando.log.verbose - * @param {String} msg A string that will be passed into nodes core `utils.format()` - * @param {...Any} [values] Values to be passed `utils.format()` - * @example - * // Log a verbose message - * lando.log.verbose('Config file %j loaded from %d', config, directory); - */ -/** - * Logs a warning message. - * - * Warnings are intended to communicate you _might_ have a problem. - * - * @since 3.0.0 - * @function - * @name lando.log.warn - * @alias lando.log.warn - * @param {String} msg A string that will be passed into nodes core `utils.format()` - * @param {...Any} [values] Values to be passed `utils.format()` - * @example - * // Log a warning message - * lando.log.warning('Something is up with app %s in directory %s', appName, dir); - */ -module.exports = class Log extends winston.Logger { - constructor({logDir, extra, logLevelConsole = 'warn', logLevel = 'debug', logName = 'lando'} = {}) { - // If loglevelconsole is numeric lets map it! - if (_.isInteger(logLevelConsole)) logLevelConsole = logLevels[logLevelConsole]; - - // The default console transport - const transports = [ - new winston.transports.Console({ - timestamp: () => Date.now(), - formatter: options => { - // Get da prefixes - const element = (logName === 'lando') ? 'lando' : logName; - const elementColor = (logName === 'lando') ? 'lando' : 'app'; - - // approximate debug mod timestamp - const curr = Number(new Date()); - const ms = curr - (this.lasttime || curr); - this.lasttime = curr; - - // build useful things first - const prefix = winston.config.colorize(elementColor, element.toLowerCase()); - const level = winston.config.colorize(options.level, options.level.toUpperCase()); - const msg = util.format(options.message); - const meta = serialize(options.meta); - const timestamp = winston.config.colorize(elementColor, `+${ms}ms`); - - // If this is a warning or error and we aren't verbose then we have more "normal" output - if (_.includes(userLevels, options.level) && _.includes(userLevels, logLevelConsole)) { - return [level, '==>', msg].join(' '); - } - - // debug output - const output = [prefix, msg, meta, timestamp]; - // if we have extra stuff - if (typeof extra === 'string') output.splice(1, 0, winston.config.colorize('extra', extra.toLowerCase())); - // if error or warning then try to make it more obvious by splicing in the level - if (_.includes(userLevels, options.level)) output.splice(1, 0, level); - // return - return ` ${output.join(' ')}`; - }, - label: logName, - level: logLevelConsole, - colorize: true, - stderrLevels: ['error', 'info', 'verbose', 'debug', 'silly'], - }), - ]; - - // If we have a log path then let's add in some file transports - if (logDir) { - // Ensure the log dir actually exists - fs.mkdirSync(logDir, {recursive: true}); - // Add in our generic and error logs - transports.push(new winston.transports.File({ - name: 'error-file', - label: logName, - level: 'warn', - maxSize: 500000, - maxFiles: 2, - filename: path.join(logDir, `${logName}-error.log`), - })); - transports.push(new winston.transports.File({ - name: 'log-file', - label: logName, - level: logLevel, - maxSize: 500000, - maxFiles: 3, - filename: path.join(logDir, `${logName}.log`), - })); - } - // Get the winston logger - super({transports: transports, exitOnError: true, colors: logColors}); - - // set initial timestamp - this.lasttime = Date.now(); - // Extend with special lando things - this.sanitizedKeys = ['auth', 'token', 'password', 'key', 'api_key', 'secret', 'machine_token']; - // Loop through our sanitizedKeys and add sanitation - _.forEach(this.sanitizedKeys, key => this.rewriters.push(keySanitizer(key))); - - // save the initial config for shiming - this.shim = {logDir, extra, logLevelConsole, logLevel, logName}; - } - - // Method to help other things add sanitizations - alsoSanitize(key) { - this.sanitizedKeys.push(key); - this.rewriters.push(keySanitizer(key)); - } -}; diff --git a/lib/metrics.js b/lib/metrics.js index 4333129..ca44596 100644 --- a/lib/metrics.js +++ b/lib/metrics.js @@ -3,10 +3,11 @@ const _ = require('lodash'); const cleanStack = require('clean-stacktrace'); const getAxios = require('../utils/get-axios'); -const Log = require('./logger'); const path = require('path'); const Promise = require('./promise'); +const debug = require('../components/debug.js'); + /* * Helper to cleanse path */ @@ -18,7 +19,7 @@ const cleanLine = (line = '') => { /* * Helper to sanitize data */ -const cleanseData = data => { +const cleanseData = (data) => { if (!_.isEmpty(data.stack)) data.stack = cleanStack(data.stack, cleanLine); if (!_.isEmpty(data.message)) data.message = cleanLine(data.message); return data; @@ -28,7 +29,7 @@ const cleanseData = data => { * Creates a new Metrics thing. */ module.exports = class Metrics { - constructor({id = 'unknown', log = new Log(), endpoints = [], data = {}} = {}) { + constructor({ id = 'unknown', log = debug, endpoints = [], data = {} } = {}) { this.id = id; this.log = log; this.endpoints = endpoints; @@ -40,27 +41,29 @@ module.exports = class Metrics { const log = this.log; const id = this.id; // Attempt to sanitize merged data as much as possible - const send = cleanseData(_.merge({}, this.data, data, {action, created: new Date().toJSON()})); + const send = cleanseData(_.merge({}, this.data, data, { action, created: new Date().toJSON() })); // Start the reporting chain - return Promise.resolve(this.endpoints) - // Filter out any inactive endpoints - .filter(endpoint => endpoint.report) - // Get the client and report - .map(endpoint => { - // Log the attempt - log.verbose('reporting %s action to', action, this.endpoints); - log.debug('reporting data', send); + return ( + Promise.resolve(this.endpoints) + // Filter out any inactive endpoints + .filter((endpoint) => endpoint.report) + // Get the client and report + .map((endpoint) => { + // Log the attempt + log('reporting %s action to', action, this.endpoints); + log('reporting data', send); - const agent = getAxios({baseURL: endpoint.url}); + const agent = getAxios({ baseURL: endpoint.url }); - // Post the data - return agent.post('/metrics/v2/' + id, send).catch(error => { - const url = _.get(endpoint, 'url', 'unknown'); - const status = _.get(error, 'response.status', 'unknown'); - const reason = _.get(error, 'response.statusText', 'unknown'); - const message = _.get(error, 'response.data.message', 'unknown'); - log.debug('metrics post to %s failed with %s (%s) %s', url, status, reason, message); - }); - }); + // Post the data + return agent.post('/metrics/v2/' + id, send).catch((error) => { + const url = _.get(endpoint, 'url', 'unknown'); + const status = _.get(error, 'response.status', 'unknown'); + const reason = _.get(error, 'response.statusText', 'unknown'); + const message = _.get(error, 'response.data.message', 'unknown'); + log('metrics post to %s failed with %s (%s) %s', url, status, reason, message); + }); + }) + ); } }; diff --git a/lib/plugins.js b/lib/plugins.js index 99dc78c..203c63e 100644 --- a/lib/plugins.js +++ b/lib/plugins.js @@ -4,30 +4,19 @@ const _ = require('lodash'); const fs = require('fs'); const glob = require('glob'); -const Log = require('./logger'); const path = require('path'); -const resolver = (process.platform === 'win32') ? path.win32.resolve : path.posix.resolve; +const debug = require('../components/debug.js').default; + +const resolver = process.platform === 'win32' ? path.win32.resolve : path.posix.resolve; // List of autoload locations to scan for -const autoLoaders = [ - 'app.js', - 'builders', - 'compose', - 'inits', - 'methods', - 'scripts', - 'services', - 'sources', - 'recipes', - 'tasks', - 'types', -]; +const autoLoaders = ['app.js', 'builders', 'compose', 'inits', 'methods', 'scripts', 'services', 'sources', 'recipes', 'tasks', 'types']; // eslint-disable-next-line const dynamicRequire = () => (typeof __webpack_require__ === 'function' ? __non_webpack_require__ : require); // Helper to build out a fully fleshed plugin object -const buildPlugin = (file, namespace)=> ({ +const buildPlugin = (file, namespace) => ({ name: _.compact([namespace, _.last(resolver(path.dirname(file)).split(path.sep))]).join('/'), path: file, dir: path.dirname(file), @@ -37,7 +26,7 @@ const buildPlugin = (file, namespace)=> ({ * @TODO */ module.exports = class Plugins { - constructor(log = new Log()) { + constructor(log = debug('lando:plugins')) { this.registry = []; this.log = log; } @@ -56,9 +45,9 @@ module.exports = class Plugins { // proceed sir return _(autoLoaders) - .map(thing => path.join(plugin.searchDir, thing)) - .filter(path => fs.existsSync(path)) - .keyBy(file => path.basename(_.last(file.split(path.sep)), '.js')) + .map((thing) => path.join(plugin.searchDir, thing)) + .filter((path) => fs.existsSync(path)) + .keyBy((file) => path.basename(_.last(file.split(path.sep)), '.js')) .value(); } @@ -73,55 +62,60 @@ module.exports = class Plugins { * @param {Array} [options.plugins=[]] Array of additional plugins to consider loading * @return {Array} Array of plugin metadata */ - find(dirs, {disablePlugins = [], plugins = []} = {}) { - return _(dirs) - // Map string usage to object and set path - .map(data => { - // Map string to object - if (_.isString(data)) data = {path: path.join(data)}; - // Assemble the dir to scan - data.dir = path.join(data.path, _.get(data, 'subdir', 'plugins')); - return data; - }) + find(dirs, { disablePlugins = [], plugins = [] } = {}) { + return ( + _(dirs) + // Map string usage to object and set path + .map((data) => { + // Map string to object + if (_.isString(data)) data = { path: path.join(data) }; + // Assemble the dir to scan + data.dir = path.join(data.path, _.get(data, 'subdir', 'plugins')); + return data; + }) - // Start by scanning for plugins - .filter(data => fs.existsSync(data.dir)) - .flatMap(data => _.merge({}, data, {plugins: glob.sync(path.join(data.dir, '*', 'index.js'))})) - .flatMap(data => _.map(data.plugins, plugin => buildPlugin(plugin, data.namespace))) + // Start by scanning for plugins + .filter((data) => fs.existsSync(data.dir)) + .flatMap((data) => _.merge({}, data, { plugins: glob.sync(path.join(data.dir, '*', 'index.js')) })) + .flatMap((data) => _.map(data.plugins, (plugin) => buildPlugin(plugin, data.namespace))) - // This is a dumb filter to check that external "@lando" plugins have a plugin.yml - // We do this to prevent things like @lando/vuepress-theme-default-plus from being from being loaded as plugins - // @NOTE: in Lando 4 we we will explicitly look for a manifest file, that may be plugin.yml or something else. - .filter(data => { - if (_.includes(path.normalize(data.dir), path.normalize(path.join('node_modules', '@lando')))) { - return fs.existsSync(path.join(data.dir, 'plugin.yml')); - } else if (_.includes(path.normalize(data.dir), path.normalize(path.join('plugins', 'lando-')))) { - return fs.existsSync(path.join(data.dir, 'plugin.yml')); - } else return true; - }) - // Then mix in any local ones that are passed in - .thru(candidates => candidates.concat(_(plugins) - // Start by filtering out non-local ones - .filter(plugin => plugin.type === 'local') - // Manually map into plugin object - .map(plugin => ({name: plugin.name, path: path.join(plugin.path, 'index.js'), dir: plugin.path})) - // Filter again to make sure we have an index.js - .filter(plugin => fs.existsSync(plugin.path)) - .value(), - )) - // Then remove any that are flagged as disabled - .filter(plugin => !_.includes(disablePlugins, plugin.name)) - // Then load the correct one based on the ordering - .groupBy('name') - .map(plugins => _.last(plugins)) - .map(plugin => _.merge({}, plugin, this.discover(plugin))) - // because all of this is now a mess we need to make @lando/core is first in the list - .thru(plugins => { - const core = _.remove(plugins, {name: '@lando/core'}); - if (core[0]) plugins.unshift(core[0]); - return plugins; - }) - .value(); + // This is a dumb filter to check that external "@lando" plugins have a plugin.yml + // We do this to prevent things like @lando/vuepress-theme-default-plus from being from being loaded as plugins + // @NOTE: in Lando 4 we we will explicitly look for a manifest file, that may be plugin.yml or something else. + .filter((data) => { + if (_.includes(path.normalize(data.dir), path.normalize(path.join('node_modules', '@lando')))) { + return fs.existsSync(path.join(data.dir, 'plugin.yml')); + } else if (_.includes(path.normalize(data.dir), path.normalize(path.join('plugins', 'lando-')))) { + return fs.existsSync(path.join(data.dir, 'plugin.yml')); + } else return true; + }) + // Then mix in any local ones that are passed in + .thru((candidates) => + candidates.concat( + _(plugins) + // Start by filtering out non-local ones + .filter((plugin) => plugin.type === 'local') + // Manually map into plugin object + .map((plugin) => ({ name: plugin.name, path: path.join(plugin.path, 'index.js'), dir: plugin.path })) + // Filter again to make sure we have an index.js + .filter((plugin) => fs.existsSync(plugin.path)) + .value(), + ), + ) + // Then remove any that are flagged as disabled + .filter((plugin) => !_.includes(disablePlugins, plugin.name)) + // Then load the correct one based on the ordering + .groupBy('name') + .map((plugins) => _.last(plugins)) + .map((plugin) => _.merge({}, plugin, this.discover(plugin))) + // because all of this is now a mess we need to make @lando/core is first in the list + .thru((plugins) => { + const core = _.remove(plugins, { name: '@lando/core' }); + if (core[0]) plugins.unshift(core[0]); + return plugins; + }) + .value() + ); } /** @@ -139,20 +133,20 @@ module.exports = class Plugins { try { plugin.data = dynamicRequire()(file)(...injected); } catch (e) { - this.log.error('problem loading plugin %o from %o: %o', plugin.name, file, e.stack); + this.log('problem loading plugin %o from %o: %o', plugin.name, file, e.stack); } // Register, log, return this.registry.push(plugin); - this.log.debug('plugin %o loaded from %s', plugin.name, file); - this.log.silly('plugin %o has', plugin.name, plugin.data); + this.log('plugin %o loaded from %o', plugin.name, file); + this.log('plugin %o has', plugin.name, plugin.data); // merge promise magix so we can await or not return require('./../utils/merge-promise')(plugin, async () => { // if plugin.data is not a promise then just return plugin - if (_.get(plugin, 'data.constructor.name') !== 'Promise') return {...plugin}; + if (_.get(plugin, 'data.constructor.name') !== 'Promise') return { ...plugin }; // otherwise ASYNCIT - return plugin.data.then(data => ({...plugin, data})); + return plugin.data.then((data) => ({ ...plugin, data })); }); } }; diff --git a/lib/shell.js b/lib/shell.js index 9dccabf..a0cc5b5 100644 --- a/lib/shell.js +++ b/lib/shell.js @@ -3,7 +3,6 @@ // Modules const _ = require('lodash'); const child = require('child_process'); -const Log = require('./logger'); const _shell = require('shelljs'); const path = require('path'); const parse = require('yargs-parser'); @@ -12,63 +11,65 @@ const Promise = require('./promise'); const stdoutStream = require('through'); const stderrStream = require('through'); +const debug = require('../_new/lib/debug.js').default; + /* * Helper to parse a command into useful metadataz */ -const parseCmd = meta => _.merge({}, meta, { - bin: _.trimEnd(path.basename(_.first(meta._), '"')), - cmd: meta._[1], - args: _.drop(meta._, 2), -}); +const parseCmd = (meta) => + _.merge({}, meta, { + bin: _.trimEnd(path.basename(_.first(meta._), '"')), + cmd: meta._[1], + args: _.drop(meta._, 2), + }); /* * Helper to parse and add a command to our running process log */ -const addCommand = ({cmd, id, mode = 'exec', process = {}} = {}) => _.merge({}, - parseCmd(parse(cmd)), {id, mode, process}, -); +const addCommand = ({ cmd, id, mode = 'exec', process = {} } = {}) => _.merge({}, parseCmd(parse(cmd)), { id, mode, process }); /* * Helper to promisify the exec */ -const exec = (cmd, opts) => new Promise(resolve => { - _shell.exec(cmd.join(' '), opts, (code, stdout, stderr) => { - resolve({code, stdout, stderr}); +const exec = (cmd, opts) => + new Promise((resolve) => { + _shell.exec(cmd.join(' '), opts, (code, stdout, stderr) => { + resolve({ code, stdout, stderr }); + }); }); -}); /* * Handle the spawn function */ -const spawn = (run, {stdio}, silent = false, shell, stdout = '', stderr = '') => { +const spawn = (run, { stdio }, silent = false, shell, stdout = '', stderr = '') => { // Run the spawn - return new Promise(resolve => { + return new Promise((resolve) => { if (stdio === 'pipe' || stdio[1] === 'pipe') { - run.stdout.on('data', buffer => { + run.stdout.on('data', (buffer) => { shell.stdout.write(buffer); if (!silent) process.stdout.write(buffer); stdout = stdout + String(buffer); }); } if (stdio === 'pipe' || stdio[2] === 'pipe') { - run.stderr.on('data', buffer => { + run.stderr.on('data', (buffer) => { shell.stderr.write(buffer); if (!silent) process.stderr.write(buffer); stderr = stderr + String(buffer); }); } - run.on('error', buffer => { + run.on('error', (buffer) => { stderr = stderr + String(buffer); }); - run.on('close', code => { - resolve({code, stdout, stderr}); + run.on('close', (code) => { + resolve({ code, stdout, stderr }); }); }); }; // We make this module into a function so we can pass in a logger module.exports = class Shell { - constructor(log = new Log()) { + constructor(log = debug('lando:shell')) { this.log = log; this.running = []; this.stdout = stdoutStream(); @@ -82,9 +83,9 @@ module.exports = class Shell { * @alias lando.shell.get * @return {Array} An array of the currently running processes */ - get() { + get() { return this.running; - } + } /** * Runs a command. @@ -119,52 +120,54 @@ module.exports = class Shell { * console.log(results); * }); */ - sh(cmd, {mode = 'exec', detached = false, cwd = process.cwd(), cstdio = 'inherit', silent = false} = {}) { + sh(cmd, { mode = 'exec', detached = false, cwd = process.cwd(), cstdio = 'inherit', silent = false } = {}) { // Log more because this shit important! const id = _.uniqueId('pid'); // Basically just remove the options so things are readable in debug mode const strippedCmd = _.compact(parse(cmd)._.concat(parse(cmd).c)).join(' '); - this.log.debug('process %s running %s', id, strippedCmd, {cstdio, silent, mode, detached}); - this.log.silly('process %s full command, running', id, parse(cmd)); + this.log('process %s running %s', id, strippedCmd, { cstdio, silent, mode, detached }); + this.log('process %s full command, running', id, parse(cmd)); // Promise it - return Promise.try(() => { - // Immediately exec if we can - if (mode === 'exec' && detached === false) { - // Add a record of this process while its running - // @NOTE: sadly we can't really do much here in terms of manipulating the process - this.running.push(addCommand({cmd, id, mode})); - return exec(cmd, _.merge({}, {silent: true}, {cwd, detached, mode})); - } + return ( + Promise.try(() => { + // Immediately exec if we can + if (mode === 'exec' && detached === false) { + // Add a record of this process while its running + // @NOTE: sadly we can't really do much here in terms of manipulating the process + this.running.push(addCommand({ cmd, id, mode })); + return exec(cmd, _.merge({}, { silent: true }, { cwd, detached, mode })); + } - // Determine stdio - const stdio = (process.lando === 'node') ? {stdio: cstdio} : {stdio: ['ignore', 'pipe', 'pipe']}; - // Get the run spawn so we can add it - const run = child.spawn(_.first(cmd), _.tail(cmd), _.merge({}, {detached, cwd}, stdio)); - // Add a record of this process while its running - this.running.push(addCommand({cmd, id, mode, process: run})); - return spawn(run, stdio, silent, this); - }) + // Determine stdio + const stdio = process.lando === 'node' ? { stdio: cstdio } : { stdio: ['ignore', 'pipe', 'pipe'] }; + // Get the run spawn so we can add it + const run = child.spawn(_.first(cmd), _.tail(cmd), _.merge({}, { detached, cwd }, stdio)); + // Add a record of this process while its running + this.running.push(addCommand({ cmd, id, mode, process: run })); + return spawn(run, stdio, silent, this); + }) - // Assess the results - .then(({code, stdout, stderr}) => { - // if this is an error and stderr is empty use the last few lines of STDOUT - if (code !== 0 && _.isEmpty(stderr)) stderr = _.trim(_.last(_.compact(stdout.split(os.EOL)))); - // Log - this.log.debug('process %s finished with exit code %s', id, code); - this.log.silly('process %s had output', id, {stdout, stderr}); - // Return - _.remove(this.running, proc => proc.id === id); + // Assess the results + .then(({ code, stdout, stderr }) => { + // if this is an error and stderr is empty use the last few lines of STDOUT + if (code !== 0 && _.isEmpty(stderr)) stderr = _.trim(_.last(_.compact(stdout.split(os.EOL)))); + // Log + this.log('process %s finished with exit code %s', id, code); + this.log('process %s had output', id, { stdout, stderr }); + // Return + _.remove(this.running, (proc) => proc.id === id); - // if non-zero - if (code !== 0) { - const error = new Error(stderr ?? stdout); - error.code = code; - return Promise.reject(error); - } else { - return Promise.resolve(stdout); - } - }); + // if non-zero + if (code !== 0) { + const error = new Error(stderr ?? stdout); + error.code = code; + return Promise.reject(error); + } else { + return Promise.resolve(stdout); + } + }) + ); } /** diff --git a/lib/utils.js b/lib/utils.js index 9f9a808..cff31d4 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -2,7 +2,7 @@ // Modules const _ = require('lodash'); -const {color} = require('listr2'); +const { color } = require('listr2'); // @NOTE: this file exists for backwards compatibility @@ -20,12 +20,12 @@ const getHealth = (info, data) => { /* * Returns a CLI table with app start metadata info */ -const startTable = (app, {legacyScanner = false} = {}) => { +const startTable = (app, { legacyScanner = false } = {}) => { const data = { name: app.name, location: app.root, services: _(app.info) - .map(info => getHealth(info, info.service)) + .map((info) => getHealth(info, info.service)) .values() .join(', '), }; @@ -34,9 +34,9 @@ const startTable = (app, {legacyScanner = false} = {}) => { // Categorize and colorize URLS if and as appropriate // add legacy scanner info if appropriate if (legacyScanner) { - _.forEach(app.info, info => { + _.forEach(app.info, (info) => { if (_.has(info, 'urls') && !_.isEmpty(info.urls)) { - urls[info.service] = _.filter(app.urls, item => { + urls[info.service] = _.filter(app.urls, (item) => { item.theme = color[item.color](item.url); return _.includes(info.urls, item.url); }); @@ -48,7 +48,7 @@ const startTable = (app, {legacyScanner = false} = {}) => { data[service + ' urls'] = _.map(items, 'theme'); }); - // add placeholder URLS for non le + // add placeholder URLS for non le } else { data.urls = ''; } @@ -60,7 +60,7 @@ const startTable = (app, {legacyScanner = false} = {}) => { /* * Helper to parse metrics data */ -const metricsParse = app => { +const metricsParse = (app) => { // Metadata to report. const data = { app: _.get(app, 'id', 'unknown'), @@ -69,11 +69,11 @@ const metricsParse = app => { // build an array of services to send as well if we can, prefer info since it has combined v3 and v4 stuff if (!_.isEmpty(app.info)) { - data.services = _.map(_.get(app, 'info'), service => _.pick(service, ['api', 'type', 'version'])); + data.services = _.map(_.get(app, 'info'), (service) => _.pick(service, ['api', 'type', 'version'])); - // otherwise lets use the older config.services + // otherwise lets use the older config.services } else if (_.has(app, 'config.services')) { - data.services = _.map(_.get(app, 'config.services'), service => service.type); + data.services = _.map(_.get(app, 'config.services'), (service) => service.type); } // Return @@ -96,7 +96,7 @@ module.exports = { getId: (...args) => require('../utils/get-container-id')(...args), getInfoDefaults: (...args) => require('../utils/get-app-info-defaults')(...args), getServices: (...args) => require('../utils/get-app-services')(...args), - getUser: (...args) => ('../utils/get-user')(...args), + getUser: (...args) => '../utils/get-user'(...args), loadComposeFiles: (...args) => require('../utils/load-compose-files')(...args), makeExecutable: (...args) => require('../utils/make-executable')(...args), moveConfig: (...args) => require('../utils/move-config')(...args), @@ -107,7 +107,8 @@ module.exports = { validateFiles: (...args) => require('../utils/normalize-files')(...args), // these are new and useful v4 thing - debugShim: (...args) => require('../utils/debug-shim')(...args), + // @TODO: fix below? should just be backwards compat lando.log? + debugShim: (...args) => require('debug')(...args), downloadX: (...args) => require('../utils/download-x')(...args), getAxios: (...args) => require('../utils/get-axios')(...args), getJsYaml: () => require('js-yaml'), diff --git a/lib/yaml.js b/lib/yaml.js index 0755385..ac702cc 100644 --- a/lib/yaml.js +++ b/lib/yaml.js @@ -5,13 +5,13 @@ const fs = require('fs'); const path = require('path'); const yaml = require('../components/yaml'); -const Log = require('./logger'); +const debug = require('../_new/lib/debug.js'); /* * Creates a new yaml instance. */ module.exports = class Yaml { - constructor(log = new Log()) { + constructor(log = debug) { this.log = log; } @@ -30,7 +30,7 @@ module.exports = class Yaml { try { return yaml.load(fs.readFileSync(file)); } catch (e) { - this.log.error('Problem parsing %s with %s', file, e.message); + this.log('Problem parsing %o with %o', file, e.message); } } @@ -45,7 +45,7 @@ module.exports = class Yaml { */ dump(file, data = {}) { // Make sure we have a place to store these files - fs.mkdirSync(path.dirname(file), {recursive: true}); + fs.mkdirSync(path.dirname(file), { recursive: true }); // Remove any properties that might be bad and dump data = JSON.parse(JSON.stringify(data)); // And dump diff --git a/netlify.toml b/netlify.toml index a185871..c1da03d 100644 --- a/netlify.toml +++ b/netlify.toml @@ -1,10 +1,10 @@ [build] base = "./" publish = "./docs/.vitepress/dist" - command = "npx mvb docs" + command = "bunx mvb docs" [context.deploy-preview] - command = "npm run docs:build" + command = "bun run docs:build" # https://github.com/munter/netlify-plugin-checklinks#readme [[context.deploy-preview.plugins]] diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index b2a3b41..0000000 --- a/package-lock.json +++ /dev/null @@ -1,15768 +0,0 @@ -{ - "name": "@lando/core", - "version": "4.0.0-unstable.8", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@lando/core", - "version": "4.0.0-unstable.4", - "license": "MIT", - "dependencies": { - "@lando/argv": "^1.2.0", - "@npmcli/agent": "^2.2.2", - "@npmcli/arborist": "^6.2.9", - "@oclif/core": "^3.27.0", - "@octokit/rest": "^19", - "axios": "^1.5.1", - "bluebird": "^3.4.1", - "chalk": "^4.1.2", - "clean-stacktrace": "^1.1.0", - "cli-table": "^0.3.11", - "cli-table3": "^0.6.5", - "cli-truncate": "2.1.0", - "copy-dir": "^0.4.0", - "debug": "^4.3.4", - "delay": "^5", - "dockerfile-generator": "^5.0.0", - "dockerfile-utils": "^0.15.0", - "dockerode": "^2.4.2", - "enquirer": "^2.4.1", - "figlet": "^1.8.0", - "figures": "^3.2.0", - "fs-extra": "^11.1.1", - "glob": "^7.1.3", - "inquirer": "^6.5.2", - "inquirer-autocomplete-prompt": "^1.4.0", - "is-class": "^0.0.9", - "is-docker": "^2.2.1", - "is-interactive": "^1", - "is-root": "^2", - "js-yaml": "^4.1.0", - "jsonfile": "^2.4.0", - "listr2": "^6.6.1", - "lodash": "^4.17.21", - "log-update": "4.0.0", - "mac-ca": "^3.1.0", - "mkcert": "^3.2.0", - "nanoid": "^3", - "node-cache": "^4.1.1", - "node-forge": "^1.3.1", - "npm-package-arg": "^11.0.1", - "npm-profile": "^9.0.0", - "object-hash": "^1.1.8", - "pacote": "^15.1.3", - "rimraf": "^4.1.1", - "semver": "^7.3.2", - "shelljs": "^0.8.4", - "slugify": "^1.6.5", - "string-argv": "0.1.1", - "strip-ansi": "^6.0.1", - "sudo-block": "^2.0.0", - "system-ca": "^2.0.0", - "through": "^2.3.8", - "valid-path": "^2.1.0", - "valid-url": "^1.0.9", - "win-ca": "^3.5.1", - "winston": "2.4.5", - "wrap-ansi": "7.0.0", - "yargonaut": "^1.1.4", - "yargs": "^15.4.1", - "yargs-parser": "^11.1.1" - }, - "bin": { - "lando": "bin/lando" - }, - "devDependencies": { - "@babel/eslint-parser": "^7.16.0", - "@lando/leia": "^1.0.0-beta.4", - "@lando/vitepress-theme-default-plus": "^1.1.1", - "@yao-pkg/pkg": "^5.16.1", - "chai": "^4.3.4", - "chai-as-promised": "^7.1.1", - "chai-events": "^0.0.1", - "eslint": "^7.32.0", - "eslint-config-google": "^0.9.1", - "eslint-plugin-vue": "^8.0.3", - "mocha": "^9.1.2", - "mock-fs": "^5.4.0", - "nyc": "^15.1.0", - "sinon": "^4.3.0", - "sinon-chai": "^2.14.0", - "ua-parser-js": "^1.0.39", - "vitepress": "^1.5.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@algolia/abtesting": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.12.0.tgz", - "integrity": "sha512-EfW0bfxjPs+C7ANkJDw2TATntfBKsFiy7APh+KO0pQ8A6HYa5I0NjFuCGCXWfzzzLXNZta3QUl3n5Kmm6aJo9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/autocomplete-core": { - "version": "1.17.9", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.9.tgz", - "integrity": "sha512-O7BxrpLDPJWWHv/DLA9DRFWs+iY1uOJZkqUwjS5HSZAGcl0hIVCQ97LTLewiZmZ402JYUrun+8NqFP+hCknlbQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-plugin-algolia-insights": "1.17.9", - "@algolia/autocomplete-shared": "1.17.9" - } - }, - "node_modules/@algolia/autocomplete-plugin-algolia-insights": { - "version": "1.17.9", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.9.tgz", - "integrity": "sha512-u1fEHkCbWF92DBeB/KHeMacsjsoI0wFhjZtlCq2ddZbAehshbZST6Hs0Avkc0s+4UyBGbMDnSuXHLuvRWK5iDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-shared": "1.17.9" - }, - "peerDependencies": { - "search-insights": ">= 1 < 3" - } - }, - "node_modules/@algolia/autocomplete-preset-algolia": { - "version": "1.17.9", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.9.tgz", - "integrity": "sha512-Na1OuceSJeg8j7ZWn5ssMu/Ax3amtOwk76u4h5J4eK2Nx2KB5qt0Z4cOapCsxot9VcEN11ADV5aUSlQF4RhGjQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-shared": "1.17.9" - }, - "peerDependencies": { - "@algolia/client-search": ">= 4.9.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" - } - }, - "node_modules/@algolia/autocomplete-shared": { - "version": "1.17.9", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.9.tgz", - "integrity": "sha512-iDf05JDQ7I0b7JEA/9IektxN/80a2MZ1ToohfmNS3rfeuQnIKI3IJlIafD0xu4StbtQTghx9T3Maa97ytkXenQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@algolia/client-search": ">= 4.9.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" - } - }, - "node_modules/@algolia/client-abtesting": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.46.0.tgz", - "integrity": "sha512-eG5xV8rujK4ZIHXrRshvv9O13NmU/k42Rnd3w43iKH5RaQ2zWuZO6Q7XjaoJjAFVCsJWqRbXzbYyPGrbF3wGNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-analytics": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.46.0.tgz", - "integrity": "sha512-AYh2uL8IUW9eZrbbT+wZElyb7QkkeV3US2NEKY7doqMlyPWE8lErNfkVN1NvZdVcY4/SVic5GDbeDz2ft8YIiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-common": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.46.0.tgz", - "integrity": "sha512-0emZTaYOeI9WzJi0TcNd2k3SxiN6DZfdWc2x2gHt855Jl9jPUOzfVTL6gTvCCrOlT4McvpDGg5nGO+9doEjjig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-insights": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.46.0.tgz", - "integrity": "sha512-wrBJ8fE+M0TDG1As4DDmwPn2TXajrvmvAN72Qwpuv8e2JOKNohF7+JxBoF70ZLlvP1A1EiH8DBu+JpfhBbNphQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-personalization": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.46.0.tgz", - "integrity": "sha512-LnkeX4p0ENt0DoftDJJDzQQJig/sFQmD1eQifl/iSjhUOGUIKC/7VTeXRcKtQB78naS8njUAwpzFvxy1CDDXDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-query-suggestions": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.46.0.tgz", - "integrity": "sha512-aF9tc4ex/smypXw+W3lBPB1jjKoaGHpZezTqofvDOI/oK1dR2sdTpFpK2Ru+7IRzYgwtRqHF3znmTlyoNs9dpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-search": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.46.0.tgz", - "integrity": "sha512-22SHEEVNjZfFWkFks3P6HilkR3rS7a6GjnCIqR22Zz4HNxdfT0FG+RE7efTcFVfLUkTTMQQybvaUcwMrHXYa7Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/ingestion": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.46.0.tgz", - "integrity": "sha512-2LT0/Z+/sFwEpZLH6V17WSZ81JX2uPjgvv5eNlxgU7rPyup4NXXfuMbtCJ+6uc4RO/LQpEJd3Li59ke3wtyAsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/monitoring": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.46.0.tgz", - "integrity": "sha512-uivZ9wSWZ8mz2ZU0dgDvQwvVZV8XBv6lYBXf8UtkQF3u7WeTqBPeU8ZoeTyLpf0jAXCYOvc1mAVmK0xPLuEwOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/recommend": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.46.0.tgz", - "integrity": "sha512-O2BB8DuySuddgOAbhyH4jsGbL+KyDGpzJRtkDZkv091OMomqIA78emhhMhX9d/nIRrzS1wNLWB/ix7Hb2eV5rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/requester-browser-xhr": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.46.0.tgz", - "integrity": "sha512-eW6xyHCyYrJD0Kjk9Mz33gQ40LfWiEA51JJTVfJy3yeoRSw/NXhAL81Pljpa0qslTs6+LO/5DYPZddct6HvISQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.46.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/requester-fetch": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.46.0.tgz", - "integrity": "sha512-Vn2+TukMGHy4PIxmdvP667tN/MhS7MPT8EEvEhS6JyFLPx3weLcxSa1F9gVvrfHWCUJhLWoMVJVB2PT8YfRGcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.46.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/requester-node-http": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.46.0.tgz", - "integrity": "sha512-xaqXyna5yBZ+r1SJ9my/DM6vfTqJg9FJgVydRJ0lnO+D5NhqGW/qaRG/iBGKr/d4fho34el6WakV7BqJvrl/HQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.46.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", - "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", - "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.4", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/eslint-parser": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.28.5.tgz", - "integrity": "sha512-fcdRcWahONYo+JRnJg1/AekOacGvKx12Gu0qXJXFi2WBqQA1i7+O5PaxRB7kxE/Op94dExnCiiar6T09pvdHpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || >=14.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" - } - }, - "node_modules/@babel/eslint-parser/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", - "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.5", - "@babel/types": "^7.28.5", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", - "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", - "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.5" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", - "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.5", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "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==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@docsearch/css": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.9.0.tgz", - "integrity": "sha512-cQbnVbq0rrBwNAKegIac/t6a8nWoUAn8frnkLFW6YARaRmAQr5/Eoe6Ln2fqkUCZ40KpdrKbpSAmgrkviOxuWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@docsearch/js": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.9.0.tgz", - "integrity": "sha512-4bKHcye6EkLgRE8ze0vcdshmEqxeiJM77M0JXjef7lrYZfSlMunrDOCqyLjiZyo1+c0BhUqA2QpFartIjuHIjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docsearch/react": "3.9.0", - "preact": "^10.0.0" - } - }, - "node_modules/@docsearch/react": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.9.0.tgz", - "integrity": "sha512-mb5FOZYZIkRQ6s/NWnM98k879vu5pscWqTLubLFBO87igYYT4VzVazh4h5o/zCvTIZgEt3PvsCOMOswOUo9yHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-core": "1.17.9", - "@algolia/autocomplete-preset-algolia": "1.17.9", - "@docsearch/css": "3.9.0", - "algoliasearch": "^5.14.2" - }, - "peerDependencies": { - "@types/react": ">= 16.8.0 < 20.0.0", - "react": ">= 16.8.0 < 20.0.0", - "react-dom": ">= 16.8.0 < 20.0.0", - "search-insights": ">= 1 < 3" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "search-insights": { - "optional": true - } - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "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": "MIT", - "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/@eslint/eslintrc/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/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "license": "MIT" - }, - "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==", - "deprecated": "Use @eslint/config-array instead", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@iconify-json/simple-icons": { - "version": "1.2.61", - "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.61.tgz", - "integrity": "sha512-DG6z3VEAxtDEw/SuZssZ/E8EvhjBhFQqxpEo3uckRKiia3LfZHmM4cx4RsaO2qX1Bqo9uadR5c/hYavvUQVuHw==", - "dev": true, - "license": "CC0-1.0", - "dependencies": { - "@iconify/types": "*" - } - }, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz", - "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==", - "license": "ISC" - }, - "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": "ISC", - "dependencies": { - "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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/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/@istanbuljs/load-nyc-config/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/load-nyc-config/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/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, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "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", - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@lando/argv": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@lando/argv/-/argv-1.2.0.tgz", - "integrity": "sha512-Usr0FuXfzDezQG7ZSuaaMNoF9v/YsavgnclQqTBzV48oku/vi9fiKttlaSoXOQ1UPrC1KPC/ean1ZrDnZqcosw==", - "license": "MIT", - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@lando/chai": { - "name": "chai", - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", - "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@lando/leia": { - "version": "1.0.0-beta.4", - "resolved": "https://registry.npmjs.org/@lando/leia/-/leia-1.0.0-beta.4.tgz", - "integrity": "sha512-mJ6ZR8KuB8HmsThV2A0VfRhinJ517TmRR6kw8hux/O0zCwyd7peFK/8ASkkahC2Pni1CwDIApVu1q7d/LX68Fg==", - "dev": true, - "license": "GPL-3.0", - "dependencies": { - "@lando/argv": "^1.0.6", - "@lando/chai": "npm:chai@^4.4.1", - "@oclif/command": "^1.8.0", - "@oclif/config": "^1.17.0", - "@oclif/errors": "^1.3.5", - "@oclif/plugin-help": "^3.2.3", - "chalk": "^4.1.2", - "command-line-test": "^1.0.10", - "debug": "^4.3.2", - "detect-newline": "^3.1.0", - "dot": "^1.1.2", - "fs-extra": "^7.0.1", - "glob": "^7.1.3", - "lodash": "^4.17.11", - "marked": "^4.0.10", - "mocha": "^9.2.2", - "object-hash": "^2.2.0" - }, - "bin": { - "leia": "bin/leia" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@lando/leia/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@lando/leia/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@lando/leia/node_modules/object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/@lando/leia/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, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/@lando/vitepress-theme-default-plus": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@lando/vitepress-theme-default-plus/-/vitepress-theme-default-plus-1.1.1.tgz", - "integrity": "sha512-DcwDvsUHJ8n9ofKRgclbkEXGl5DglzUSQdXNEY1MvoSMKGDTP/iZUXR5acZk6gsOmaUyQ3/vBRrIjXUvCsC1vQ==", - "dev": true, - "license": "GPL-3.0", - "dependencies": { - "@docsearch/js": "^3.5.2", - "axios": "^1.7.7", - "colorette": "^2.0.20", - "debug": "^4.3.2", - "es-semver": "^1.0.1", - "fast-glob": "^3.3.2", - "feed": "^4.2.2", - "fs-extra": "^11.2.0", - "generate-robotstxt": "^8.0.3", - "gravatar-url": "^4.0.1", - "gray-matter": "^4.0.3", - "js-yaml": "^4.1.0", - "lodash-es": "^4.17.21", - "markdown-it-container": "^4.0.0", - "nanoid": "^5.0.4", - "node-html-parser": "^6.1.12", - "sass": "^1.69.7", - "timeago.js": "^4.0.2", - "vitepress-plugin-tabs": "^0.5.0", - "vue": "^3.4.15", - "yargs-parser": "^21.1.1" - }, - "bin": { - "multiversion-vitepress-build": "bin/mvb.js", - "mvb": "bin/mvb.js" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@lando/vitepress-theme-default-plus/node_modules/nanoid": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.6.tgz", - "integrity": "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^18 || >=20" - } - }, - "node_modules/@lando/vitepress-theme-default-plus/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { - "version": "5.1.1-v1", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", - "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-scope": "5.1.1" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@npmcli/agent": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz", - "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==", - "license": "ISC", - "dependencies": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.3" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/agent/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/@npmcli/arborist": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-6.5.1.tgz", - "integrity": "sha512-cdV8pGurLK0CifZRilMJbm2CZ3H4Snk8PAqOngj5qmgFLjEllMLvScSZ3XKfd+CK8fo/hrPHO9zazy9OYdvmUg==", - "license": "ISC", - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/fs": "^3.1.0", - "@npmcli/installed-package-contents": "^2.0.2", - "@npmcli/map-workspaces": "^3.0.2", - "@npmcli/metavuln-calculator": "^5.0.0", - "@npmcli/name-from-folder": "^2.0.0", - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^4.0.0", - "@npmcli/query": "^3.1.0", - "@npmcli/run-script": "^6.0.0", - "bin-links": "^4.0.1", - "cacache": "^17.0.4", - "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^6.1.1", - "json-parse-even-better-errors": "^3.0.0", - "json-stringify-nice": "^1.1.4", - "minimatch": "^9.0.0", - "nopt": "^7.0.0", - "npm-install-checks": "^6.2.0", - "npm-package-arg": "^10.1.0", - "npm-pick-manifest": "^8.0.1", - "npm-registry-fetch": "^14.0.3", - "npmlog": "^7.0.1", - "pacote": "^15.0.8", - "parse-conflict-json": "^3.0.0", - "proc-log": "^3.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.2", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^10.0.1", - "treeverse": "^3.0.0", - "walk-up-path": "^3.0.1" - }, - "bin": { - "arborist": "bin/index.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/arborist/node_modules/npm-package-arg": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", - "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", - "license": "ISC", - "dependencies": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/fs": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", - "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", - "license": "ISC", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", - "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", - "license": "ISC", - "dependencies": { - "@npmcli/promise-spawn": "^6.0.0", - "lru-cache": "^7.4.4", - "npm-pick-manifest": "^8.0.0", - "proc-log": "^3.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/@npmcli/installed-package-contents": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz", - "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==", - "license": "ISC", - "dependencies": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "bin": { - "installed-package-contents": "bin/index.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/map-workspaces": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.6.tgz", - "integrity": "sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==", - "license": "ISC", - "dependencies": { - "@npmcli/name-from-folder": "^2.0.0", - "glob": "^10.2.2", - "minimatch": "^9.0.0", - "read-package-json-fast": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/map-workspaces/node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/map-workspaces/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/metavuln-calculator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-5.0.1.tgz", - "integrity": "sha512-qb8Q9wIIlEPj3WeA1Lba91R4ZboPL0uspzV0F9uwP+9AYMVB2zOoa7Pbk12g6D2NHAinSbHh6QYmGuRyHZ874Q==", - "license": "ISC", - "dependencies": { - "cacache": "^17.0.0", - "json-parse-even-better-errors": "^3.0.0", - "pacote": "^15.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "license": "MIT", - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@npmcli/move-file/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/name-from-folder": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz", - "integrity": "sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/node-gyp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", - "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha512-lRCEGdHZomFsURroh522YvA/2cVb9oPIJrjHanCJZkiasz1BzcnLr3tBJhlV7S86MBJBuAQ33is2D60YitZL2Q==", - "license": "ISC", - "dependencies": { - "@npmcli/git": "^4.1.0", - "glob": "^10.2.2", - "hosted-git-info": "^6.1.1", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", - "proc-log": "^3.0.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/package-json/node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/package-json/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/promise-spawn": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", - "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", - "license": "ISC", - "dependencies": { - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/query": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/query/-/query-3.1.0.tgz", - "integrity": "sha512-C/iR0tk7KSKGldibYIB9x8GtO/0Bd0I2mhOaDb8ucQL/bQVTmGoeREaFj64Z5+iCBRf3dQfed0CjJL7I8iTkiQ==", - "license": "ISC", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/redact": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-2.0.1.tgz", - "integrity": "sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw==", - "license": "ISC", - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/run-script": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", - "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", - "license": "ISC", - "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/promise-spawn": "^6.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^3.0.0", - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@oclif/command": { - "version": "1.8.36", - "resolved": "https://registry.npmjs.org/@oclif/command/-/command-1.8.36.tgz", - "integrity": "sha512-/zACSgaYGtAQRzc7HjzrlIs14FuEYAZrMOEwicRoUnZVyRunG4+t5iSEeQu0Xy2bgbCD0U1SP/EdeNZSTXRwjQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "license": "MIT", - "dependencies": { - "@oclif/config": "^1.18.2", - "@oclif/errors": "^1.3.6", - "@oclif/help": "^1.0.1", - "@oclif/parser": "^3.8.17", - "debug": "^4.1.1", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@oclif/config": "^1" - } - }, - "node_modules/@oclif/config": { - "version": "1.18.17", - "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.18.17.tgz", - "integrity": "sha512-k77qyeUvjU8qAJ3XK3fr/QVAqsZO8QOBuESnfeM5HHtPNLSyfVcwiMM2zveSW5xRdLSG3MfV8QnLVkuyCL2ENg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "license": "MIT", - "dependencies": { - "@oclif/errors": "^1.3.6", - "@oclif/parser": "^3.8.17", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-wsl": "^2.1.1", - "tslib": "^2.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@oclif/core": { - "version": "3.27.0", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-3.27.0.tgz", - "integrity": "sha512-Fg93aNFvXzBq5L7ztVHFP2nYwWU1oTCq48G0TjF/qC1UN36KWa2H5Hsm72kERd5x/sjy2M2Tn4kDEorUlpXOlw==", - "license": "MIT", - "dependencies": { - "@types/cli-progress": "^3.11.5", - "ansi-escapes": "^4.3.2", - "ansi-styles": "^4.3.0", - "cardinal": "^2.1.1", - "chalk": "^4.1.2", - "clean-stack": "^3.0.1", - "cli-progress": "^3.12.0", - "color": "^4.2.3", - "debug": "^4.3.5", - "ejs": "^3.1.10", - "get-package-type": "^0.1.0", - "globby": "^11.1.0", - "hyperlinker": "^1.0.0", - "indent-string": "^4.0.0", - "is-wsl": "^2.2.0", - "js-yaml": "^3.14.1", - "minimatch": "^9.0.4", - "natural-orderby": "^2.0.3", - "object-treeify": "^1.1.33", - "password-prompt": "^1.1.3", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "supports-color": "^8.1.1", - "supports-hyperlinks": "^2.2.0", - "widest-line": "^3.1.0", - "wordwrap": "^1.0.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@oclif/core/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@oclif/core/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@oclif/errors": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/@oclif/errors/-/errors-1.3.6.tgz", - "integrity": "sha512-fYaU4aDceETd89KXP+3cLyg9EHZsLD3RxF2IU9yxahhBpspWjkWi3Dy3bTgcwZ3V47BgxQaGapzJWDM33XIVDQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^3.0.0", - "fs-extra": "^8.1", - "indent-string": "^4.0.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@oclif/errors/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@oclif/errors/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@oclif/errors/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, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/@oclif/help": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/@oclif/help/-/help-1.0.15.tgz", - "integrity": "sha512-Yt8UHoetk/XqohYX76DfdrUYLsPKMc5pgkzsZVHDyBSkLiGRzujVaGZdjr32ckVZU9q3a47IjhWxhip7Dz5W/g==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "license": "MIT", - "dependencies": { - "@oclif/config": "1.18.16", - "@oclif/errors": "1.3.6", - "chalk": "^4.1.2", - "indent-string": "^4.0.0", - "lodash": "^4.17.21", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "widest-line": "^3.1.0", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@oclif/help/node_modules/@oclif/config": { - "version": "1.18.16", - "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.18.16.tgz", - "integrity": "sha512-VskIxVcN22qJzxRUq+raalq6Q3HUde7sokB7/xk5TqRZGEKRVbFeqdQBxDWwQeudiJEgcNiMvIFbMQ43dY37FA==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "license": "MIT", - "dependencies": { - "@oclif/errors": "^1.3.6", - "@oclif/parser": "^3.8.16", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-wsl": "^2.1.1", - "tslib": "^2.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@oclif/help/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, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/linewrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@oclif/linewrap/-/linewrap-1.0.0.tgz", - "integrity": "sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw==", - "dev": true, - "license": "ISC" - }, - "node_modules/@oclif/parser": { - "version": "3.8.17", - "resolved": "https://registry.npmjs.org/@oclif/parser/-/parser-3.8.17.tgz", - "integrity": "sha512-l04iSd0xoh/16TGVpXb81Gg3z7tlQGrEup16BrVLsZBK6SEYpYHRJZnM32BwZrHI97ZSFfuSwVlzoo6HdsaK8A==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "license": "MIT", - "dependencies": { - "@oclif/errors": "^1.3.6", - "@oclif/linewrap": "^1.0.0", - "chalk": "^4.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@oclif/plugin-help": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-3.3.1.tgz", - "integrity": "sha512-QuSiseNRJygaqAdABYFWn/H1CwIZCp9zp/PLid6yXvy6VcQV7OenEFF5XuYaCvSARe2Tg9r8Jqls5+fw1A9CbQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oclif/command": "^1.8.15", - "@oclif/config": "1.18.2", - "@oclif/errors": "1.3.5", - "@oclif/help": "^1.0.1", - "chalk": "^4.1.2", - "indent-string": "^4.0.0", - "lodash": "^4.17.21", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "widest-line": "^3.1.0", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@oclif/plugin-help/node_modules/@oclif/config": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.18.2.tgz", - "integrity": "sha512-cE3qfHWv8hGRCP31j7fIS7BfCflm/BNZ2HNqHexH+fDrdF2f1D5S8VmXWLC77ffv3oDvWyvE9AZeR0RfmHCCaA==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "license": "MIT", - "dependencies": { - "@oclif/errors": "^1.3.3", - "@oclif/parser": "^3.8.0", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-wsl": "^2.1.1", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@oclif/plugin-help/node_modules/@oclif/errors": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@oclif/errors/-/errors-1.3.5.tgz", - "integrity": "sha512-OivucXPH/eLLlOT7FkCMoZXiaVYf8I/w1eTAM1+gKzfhALwWTusxEx7wBmW0uzvkSg/9ovWLycPaBgJbM3LOCQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^3.0.0", - "fs-extra": "^8.1", - "indent-string": "^4.0.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@oclif/plugin-help/node_modules/@oclif/errors/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, - "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_modules/@oclif/plugin-help/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@oclif/plugin-help/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@oclif/plugin-help/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, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/@oclif/plugin-help/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, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@octokit/auth-token": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz", - "integrity": "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/core": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz", - "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==", - "license": "MIT", - "dependencies": { - "@octokit/auth-token": "^3.0.0", - "@octokit/graphql": "^5.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/endpoint": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz", - "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/graphql": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz", - "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==", - "license": "MIT", - "dependencies": { - "@octokit/request": "^6.0.0", - "@octokit/types": "^9.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "18.1.1", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz", - "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==", - "license": "MIT" - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz", - "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==", - "license": "MIT", - "dependencies": { - "@octokit/tsconfig": "^1.0.2", - "@octokit/types": "^9.2.3" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": ">=4" - } - }, - "node_modules/@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "license": "MIT", - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.2.3.tgz", - "integrity": "sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^10.0.0" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", - "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^18.0.0" - } - }, - "node_modules/@octokit/request": { - "version": "6.2.8", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz", - "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==", - "license": "MIT", - "dependencies": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/request-error": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", - "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^9.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/rest": { - "version": "19.0.13", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.13.tgz", - "integrity": "sha512-/EzVox5V9gYGdbAI+ovYj3nXQT1TtTHRT+0eZPcuC05UFSWO3mdO9UY1C0i2eLF9Un1ONJkAk+IEtYGAC+TahA==", - "license": "MIT", - "dependencies": { - "@octokit/core": "^4.2.1", - "@octokit/plugin-paginate-rest": "^6.1.2", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^7.1.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/tsconfig": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-1.0.2.tgz", - "integrity": "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==", - "license": "MIT" - }, - "node_modules/@octokit/types": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", - "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^18.0.0" - } - }, - "node_modules/@parcel/watcher": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", - "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^1.0.3", - "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "node-addon-api": "^7.0.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.1", - "@parcel/watcher-darwin-arm64": "2.5.1", - "@parcel/watcher-darwin-x64": "2.5.1", - "@parcel/watcher-freebsd-x64": "2.5.1", - "@parcel/watcher-linux-arm-glibc": "2.5.1", - "@parcel/watcher-linux-arm-musl": "2.5.1", - "@parcel/watcher-linux-arm64-glibc": "2.5.1", - "@parcel/watcher-linux-arm64-musl": "2.5.1", - "@parcel/watcher-linux-x64-glibc": "2.5.1", - "@parcel/watcher-linux-x64-musl": "2.5.1", - "@parcel/watcher-win32-arm64": "2.5.1", - "@parcel/watcher-win32-ia32": "2.5.1", - "@parcel/watcher-win32-x64": "2.5.1" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", - "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", - "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", - "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", - "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", - "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", - "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", - "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", - "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", - "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", - "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", - "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", - "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", - "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher/node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz", - "integrity": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.3.tgz", - "integrity": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz", - "integrity": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz", - "integrity": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.3.tgz", - "integrity": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.3.tgz", - "integrity": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.3.tgz", - "integrity": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.3.tgz", - "integrity": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz", - "integrity": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz", - "integrity": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.3.tgz", - "integrity": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.3.tgz", - "integrity": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.3.tgz", - "integrity": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.3.tgz", - "integrity": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.3.tgz", - "integrity": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.3.tgz", - "integrity": "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.3.tgz", - "integrity": "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.3.tgz", - "integrity": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.3.tgz", - "integrity": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.3.tgz", - "integrity": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.3.tgz", - "integrity": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz", - "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@shikijs/core": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-2.5.0.tgz", - "integrity": "sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/engine-javascript": "2.5.0", - "@shikijs/engine-oniguruma": "2.5.0", - "@shikijs/types": "2.5.0", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4", - "hast-util-to-html": "^9.0.4" - } - }, - "node_modules/@shikijs/engine-javascript": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-2.5.0.tgz", - "integrity": "sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/types": "2.5.0", - "@shikijs/vscode-textmate": "^10.0.2", - "oniguruma-to-es": "^3.1.0" - } - }, - "node_modules/@shikijs/engine-oniguruma": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-2.5.0.tgz", - "integrity": "sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/types": "2.5.0", - "@shikijs/vscode-textmate": "^10.0.2" - } - }, - "node_modules/@shikijs/langs": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-2.5.0.tgz", - "integrity": "sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/types": "2.5.0" - } - }, - "node_modules/@shikijs/themes": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-2.5.0.tgz", - "integrity": "sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/types": "2.5.0" - } - }, - "node_modules/@shikijs/transformers": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-2.5.0.tgz", - "integrity": "sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/core": "2.5.0", - "@shikijs/types": "2.5.0" - } - }, - "node_modules/@shikijs/types": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-2.5.0.tgz", - "integrity": "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - } - }, - "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/@sigstore/bundle": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.1.0.tgz", - "integrity": "sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==", - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.2.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/protobuf-specs": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", - "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", - "license": "Apache-2.0", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/sign": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-1.0.0.tgz", - "integrity": "sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==", - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^1.1.0", - "@sigstore/protobuf-specs": "^0.2.0", - "make-fetch-happen": "^11.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/sign/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==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/@sigstore/sign/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "license": "MIT", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@sigstore/sign/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@sigstore/sign/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/@sigstore/sign/node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "license": "ISC", - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/sign/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/@sigstore/sign/node_modules/minipass-fetch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", - "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", - "license": "MIT", - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/@sigstore/sign/node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/@sigstore/sign/node_modules/socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "license": "MIT", - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@sigstore/tuf": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", - "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==", - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.2.0", - "tuf-js": "^1.1.7" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/commons/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, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@sinonjs/formatio": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz", - "integrity": "sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "samsam": "1.3.0" - } - }, - "node_modules/@sinonjs/samsam": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", - "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^1.3.0", - "array-from": "^2.1.1", - "lodash": "^4.17.15" - } - }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz", - "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==", - "dev": true, - "license": "(Unlicense OR Apache-2.0)" - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tufjs/canonical-json": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", - "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", - "license": "MIT", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@tufjs/models": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", - "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", - "license": "MIT", - "dependencies": { - "@tufjs/canonical-json": "1.0.0", - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@types/cli-progress": { - "version": "3.11.6", - "resolved": "https://registry.npmjs.org/@types/cli-progress/-/cli-progress-3.11.6.tgz", - "integrity": "sha512-cE3+jb9WRlu+uOSAugewNpITJDt1VF8dHOopPO4IABFc3SXYL5WE/+PTz/FCdZRRfIujiWW3n3aMbv1eIGVRWA==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/linkify-it": "^5", - "@types/mdurl": "^2" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "24.10.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", - "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", - "license": "MIT", - "dependencies": { - "undici-types": "~7.16.0" - } - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "dev": true, - "license": "MIT" - }, - "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/@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, - "license": "MIT" - }, - "node_modules/@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true, - "license": "ISC" - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "dev": true, - "license": "ISC" - }, - "node_modules/@vitejs/plugin-vue": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", - "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0", - "vue": "^3.2.25" - } - }, - "node_modules/@vue/compiler-core": { - "version": "3.5.25", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.25.tgz", - "integrity": "sha512-vay5/oQJdsNHmliWoZfHPoVZZRmnSWhug0BYT34njkYTPqClh3DNWLkZNJBVSjsNMrg0CCrBfoKkjZQPM/QVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.5", - "@vue/shared": "3.5.25", - "entities": "^4.5.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.1" - } - }, - "node_modules/@vue/compiler-dom": { - "version": "3.5.25", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.25.tgz", - "integrity": "sha512-4We0OAcMZsKgYoGlMjzYvaoErltdFI2/25wqanuTu+S4gismOTRTBPi4IASOjxWdzIwrYSjnqONfKvuqkXzE2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-core": "3.5.25", - "@vue/shared": "3.5.25" - } - }, - "node_modules/@vue/compiler-sfc": { - "version": "3.5.25", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.25.tgz", - "integrity": "sha512-PUgKp2rn8fFsI++lF2sO7gwO2d9Yj57Utr5yEsDf3GNaQcowCLKL7sf+LvVFvtJDXUp/03+dC6f2+LCv5aK1ag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.5", - "@vue/compiler-core": "3.5.25", - "@vue/compiler-dom": "3.5.25", - "@vue/compiler-ssr": "3.5.25", - "@vue/shared": "3.5.25", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.21", - "postcss": "^8.5.6", - "source-map-js": "^1.2.1" - } - }, - "node_modules/@vue/compiler-ssr": { - "version": "3.5.25", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.25.tgz", - "integrity": "sha512-ritPSKLBcParnsKYi+GNtbdbrIE1mtuFEJ4U1sWeuOMlIziK5GtOL85t5RhsNy4uWIXPgk+OUdpnXiTdzn8o3A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.5.25", - "@vue/shared": "3.5.25" - } - }, - "node_modules/@vue/devtools-api": { - "version": "7.7.9", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.9.tgz", - "integrity": "sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/devtools-kit": "^7.7.9" - } - }, - "node_modules/@vue/devtools-kit": { - "version": "7.7.9", - "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.9.tgz", - "integrity": "sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/devtools-shared": "^7.7.9", - "birpc": "^2.3.0", - "hookable": "^5.5.3", - "mitt": "^3.0.1", - "perfect-debounce": "^1.0.0", - "speakingurl": "^14.0.1", - "superjson": "^2.2.2" - } - }, - "node_modules/@vue/devtools-shared": { - "version": "7.7.9", - "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.9.tgz", - "integrity": "sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "rfdc": "^1.4.1" - } - }, - "node_modules/@vue/reactivity": { - "version": "3.5.25", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.25.tgz", - "integrity": "sha512-5xfAypCQepv4Jog1U4zn8cZIcbKKFka3AgWHEFQeK65OW+Ys4XybP6z2kKgws4YB43KGpqp5D/K3go2UPPunLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/shared": "3.5.25" - } - }, - "node_modules/@vue/runtime-core": { - "version": "3.5.25", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.25.tgz", - "integrity": "sha512-Z751v203YWwYzy460bzsYQISDfPjHTl+6Zzwo/a3CsAf+0ccEjQ8c+0CdX1WsumRTHeywvyUFtW6KvNukT/smA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/reactivity": "3.5.25", - "@vue/shared": "3.5.25" - } - }, - "node_modules/@vue/runtime-dom": { - "version": "3.5.25", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.25.tgz", - "integrity": "sha512-a4WrkYFbb19i9pjkz38zJBg8wa/rboNERq3+hRRb0dHiJh13c+6kAbgqCPfMaJ2gg4weWD3APZswASOfmKwamA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/reactivity": "3.5.25", - "@vue/runtime-core": "3.5.25", - "@vue/shared": "3.5.25", - "csstype": "^3.1.3" - } - }, - "node_modules/@vue/server-renderer": { - "version": "3.5.25", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.25.tgz", - "integrity": "sha512-UJaXR54vMG61i8XNIzTSf2Q7MOqZHpp8+x3XLGtE3+fL+nQd+k7O5+X3D/uWrnQXOdMw5VPih+Uremcw+u1woQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-ssr": "3.5.25", - "@vue/shared": "3.5.25" - }, - "peerDependencies": { - "vue": "3.5.25" - } - }, - "node_modules/@vue/shared": { - "version": "3.5.25", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.25.tgz", - "integrity": "sha512-AbOPdQQnAnzs58H2FrrDxYj/TJfmeS2jdfEEhgiKINy+bnOANmVizIEgq1r+C5zsbs6l1CCQxtcj71rwNQ4jWg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vueuse/core": { - "version": "12.8.2", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.8.2.tgz", - "integrity": "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/web-bluetooth": "^0.0.21", - "@vueuse/metadata": "12.8.2", - "@vueuse/shared": "12.8.2", - "vue": "^3.5.13" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/integrations": { - "version": "12.8.2", - "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-12.8.2.tgz", - "integrity": "sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vueuse/core": "12.8.2", - "@vueuse/shared": "12.8.2", - "vue": "^3.5.13" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "async-validator": "^4", - "axios": "^1", - "change-case": "^5", - "drauu": "^0.4", - "focus-trap": "^7", - "fuse.js": "^7", - "idb-keyval": "^6", - "jwt-decode": "^4", - "nprogress": "^0.2", - "qrcode": "^1.5", - "sortablejs": "^1", - "universal-cookie": "^7" - }, - "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": { - "optional": true - } - } - }, - "node_modules/@vueuse/metadata": { - "version": "12.8.2", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.8.2.tgz", - "integrity": "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/shared": { - "version": "12.8.2", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.8.2.tgz", - "integrity": "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==", - "dev": true, - "license": "MIT", - "dependencies": { - "vue": "^3.5.13" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@yao-pkg/pkg": { - "version": "5.16.1", - "resolved": "https://registry.npmjs.org/@yao-pkg/pkg/-/pkg-5.16.1.tgz", - "integrity": "sha512-crUlnNFSReFNFuXDc4f3X2ignkFlc9kmEG7Bp/mJMA1jYyqR0lqjZGLgrSDYTYiNsYud8AzgA3RY1DrMdcUZWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/generator": "^7.23.0", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "@yao-pkg/pkg-fetch": "3.5.16", - "into-stream": "^6.0.0", - "minimist": "^1.2.6", - "multistream": "^4.1.0", - "picocolors": "^1.1.0", - "picomatch": "^4.0.2", - "prebuild-install": "^7.1.1", - "resolve": "^1.22.0", - "stream-meter": "^1.0.4", - "tinyglobby": "^0.2.9" - }, - "bin": { - "pkg": "lib-es5/bin.js" - } - }, - "node_modules/@yao-pkg/pkg-fetch": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@yao-pkg/pkg-fetch/-/pkg-fetch-3.5.16.tgz", - "integrity": "sha512-mCnZvZz0/Ylpk4TGyt34pqWJyBGYJM8c3dPoMRV8Knodv2QhcYS4iXb5kB/JNWkrRtCKukGZIKkMLXZ3TQlzPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.6", - "picocolors": "^1.1.0", - "progress": "^2.0.3", - "semver": "^7.3.5", - "tar-fs": "^2.1.1", - "yargs": "^16.2.0" - }, - "bin": { - "pkg-fetch": "lib-es5/bin.js" - } - }, - "node_modules/@yao-pkg/pkg-fetch/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": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/@yao-pkg/pkg-fetch/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, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/@yao-pkg/pkg-fetch/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@yao-pkg/pkg-fetch/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, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/@yao-pkg/pkg-fetch/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, - "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" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@yao-pkg/pkg-fetch/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==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "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", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/agentkeepalive": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", - "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", - "license": "MIT", - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/aggregate-error/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==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "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/algoliasearch": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.46.0.tgz", - "integrity": "sha512-7ML6fa2K93FIfifG3GMWhDEwT5qQzPTmoHKCTvhzGEwdbQ4n0yYUWZlLYT75WllTGJCJtNUI0C1ybN4BCegqvg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/abtesting": "1.12.0", - "@algolia/client-abtesting": "5.46.0", - "@algolia/client-analytics": "5.46.0", - "@algolia/client-common": "5.46.0", - "@algolia/client-insights": "5.46.0", - "@algolia/client-personalization": "5.46.0", - "@algolia/client-query-suggestions": "5.46.0", - "@algolia/client-search": "5.46.0", - "@algolia/ingestion": "1.46.0", - "@algolia/monitoring": "1.46.0", - "@algolia/recommend": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "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", - "engines": { - "node": ">=6" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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", - "engines": { - "node": ">=8" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==", - "license": "MIT" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "default-require-extensions": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/aproba": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", - "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==", - "license": "ISC" - }, - "node_modules/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true, - "license": "MIT" - }, - "node_modules/are-we-there-yet": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-4.0.2.tgz", - "integrity": "sha512-ncSWAawFhKMJDTdoAeOV+jyW1VCMj5QIAwULIBV0SSR7B/RLPPEQiknKcg/RIIZlUQrxELpsxMiTUoAQ4sIUyg==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "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/array-from": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", - "integrity": "sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==", - "dev": true, - "license": "MIT" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "license": "MIT" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axios": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", - "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.0" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/baseline-browser-mapping": { - "version": "2.9.4", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.4.tgz", - "integrity": "sha512-ZCQ9GEWl73BVm8bu5Fts8nt7MHdbt5vY9bP6WGnUh+r3l8M7CgfyTlwsgCbMC66BNxPr6Xoce3j66Ms5YUQTNA==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, - "node_modules/before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "license": "Apache-2.0" - }, - "node_modules/bin-links": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-4.0.4.tgz", - "integrity": "sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA==", - "license": "ISC", - "dependencies": { - "cmd-shim": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "read-cmd-shim": "^4.0.0", - "write-file-atomic": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "file-uri-to-path": "1.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==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "license": "MIT" - }, - "node_modules/blueimp-md5": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz", - "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==", - "dev": true, - "license": "MIT" - }, - "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==", - "dev": true, - "license": "ISC" - }, - "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.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==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true, - "license": "ISC" - }, - "node_modules/browserslist": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "license": "MIT", - "dependencies": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "node_modules/buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "license": "MIT" - }, - "node_modules/buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", - "license": "MIT" - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, - "node_modules/cacache": { - "version": "17.1.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", - "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^7.7.1", - "minipass": "^7.0.3", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/cacache/node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/caching-transform/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==", - "dev": true, - "license": "ISC" - }, - "node_modules/caching-transform/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, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001759", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001759.tgz", - "integrity": "sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", - "license": "MIT", - "dependencies": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - }, - "bin": { - "cdl": "bin/cdl.js" - } - }, - "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": "4.5.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", - "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chai-as-promised": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.2.tgz", - "integrity": "sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw==", - "dev": true, - "license": "WTFPL", - "dependencies": { - "check-error": "^1.0.2" - }, - "peerDependencies": { - "chai": ">= 2.1.2 < 6" - } - }, - "node_modules/chai-events": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/chai-events/-/chai-events-0.0.1.tgz", - "integrity": "sha512-z0T88ZW4syURwNVRtQDtb9yPDJDr0YTJlOOskgcMOYvwRQfBjiLotzQGi1J4PyRavLxAR5wp9V3aNph8hO4Ymw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chai": "^3.5.0" - } - }, - "node_modules/chai-events/node_modules/chai": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", - "integrity": "sha512-eRYY0vPS2a9zt5w5Z0aCeWbrXTEyvk7u/Xf71EzNObrjSCPgMm1Nku/D/u2tiqHBX5j40wWhj54YJLtgn8g55A==", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^1.0.1", - "deep-eql": "^0.1.3", - "type-detect": "^1.0.0" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/chai-events/node_modules/deep-eql": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", - "integrity": "sha512-6sEotTRGBFiNcqVoeHwnfopbSpi5NbH1VWJmYCVkmxMmaVTT0bUTrNaGyBwhgP4MZL012W/mkzIn3Da+iDYweg==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-detect": "0.1.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/chai-events/node_modules/deep-eql/node_modules/type-detect": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", - "integrity": "sha512-5rqszGVwYgBoDkIm2oUtvkfZMQ0vk29iDMU0W2qCa3rG0vPDNczCMT4hV/bLBgLg8k8ri6+u3Zbt+S/14eMzlA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/chai-events/node_modules/type-detect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", - "integrity": "sha512-f9Uv6ezcpvCQjJU0Zqbg+65qdcszv3qUQsZfjdRbWiZ7AMenrX1u0lNk9EoWWX6e1F+NULyg27mtdeZ5WhpljA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk/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==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "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==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "license": "MIT" - }, - "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-func-name": "^2.0.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/clean-stack": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz", - "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clean-stacktrace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/clean-stacktrace/-/clean-stacktrace-1.1.0.tgz", - "integrity": "sha512-S8H9ouQL4PYkf/HM7498vxcAIMo9RgUf4rEuP9HrG6+FeRQ+dHV28c8iKGfmDSq/UQU0fnFiTDV/XCyfQz+U8g==", - "license": "MIT", - "dependencies": { - "stack-utils-node-internals": "^1.0.1" - } - }, - "node_modules/cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "license": "MIT", - "dependencies": { - "restore-cursor": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-progress": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz", - "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==", - "license": "MIT", - "dependencies": { - "string-width": "^4.2.3" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-table": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.11.tgz", - "integrity": "sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==", - "dependencies": { - "colors": "1.0.3" - }, - "engines": { - "node": ">= 0.2.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==", - "license": "MIT", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate/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==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "license": "ISC" - }, - "node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/cliui/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==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/cmd-shim": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-6.0.3.tgz", - "integrity": "sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "license": "ISC", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "license": "MIT" - }, - "node_modules/colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", - "license": "MIT", - "engines": { - "node": ">=0.1.90" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.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==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/command-line-test": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/command-line-test/-/command-line-test-1.0.10.tgz", - "integrity": "sha512-osdAsKGgEG457KlkGCMS4dPi7zJPPh8pZURhAmBcS3jO+prfYlQ6K0XagfGRGT1ztxfV2flNfBnGQz7kzHDlew==", - "dev": true, - "license": "MIT" - }, - "node_modules/commander": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", - "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "node_modules/common-ancestor-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", - "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", - "license": "ISC" - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "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==", - "license": "MIT" - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "engines": [ - "node >= 0.8" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "license": "ISC" - }, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/copy-anything": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz", - "integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-what": "^5.2.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/copy-dir": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/copy-dir/-/copy-dir-0.4.0.tgz", - "integrity": "sha512-mIefrD97nE1XX2th570tR5UQvW6/92czEPGe+oTtrxPAJl+KOKLpzcRa+e38WEpmt/IUN1n65KvRMzPblR+fDQ==", - "license": "MIT", - "dependencies": { - "mkdir-p": "~0.0.4" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, - "node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "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==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "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==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/cycle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", - "integrity": "sha512-TVF6svNzeQCOpjCqsy0/CSy8VgObG3wXusJ73xW2GbG5rGx7lC8zxDSURicsXI2UsGdi2L0QNRCi745/wUDvsA==", - "engines": { - "node": ">=0.4.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", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "dev": true, - "license": "MIT", - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-eql": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", - "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/default-require-extensions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", - "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "strip-bom": "^4.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delay": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", - "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "license": "MIT" - }, - "node_modules/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "license": "ISC" - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "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==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/docker-modem": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-1.0.9.tgz", - "integrity": "sha512-lVjqCSCIAUDZPAZIeyM125HXfNvOmYYInciphNrLrylUtKyW66meAjSPXWchKVzoIYZx69TPnAepVSSkeawoIw==", - "license": "Apache-2.0", - "dependencies": { - "debug": "^3.2.6", - "JSONStream": "1.3.2", - "readable-stream": "~1.0.26-4", - "split-ca": "^1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/docker-modem/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/docker-modem/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "license": "MIT" - }, - "node_modules/docker-modem/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/docker-modem/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "license": "MIT" - }, - "node_modules/dockerfile-ast": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/dockerfile-ast/-/dockerfile-ast-0.6.1.tgz", - "integrity": "sha512-m3rH2qHHU2pSTCppXgJT+1KLxhvkdROOxVPof5Yz4IPGSw6K+x0B0/RFdYgXN5zsIUTlbOSRyfDCv3/uVhnNmg==", - "license": "MIT", - "dependencies": { - "vscode-languageserver-textdocument": "^1.0.8", - "vscode-languageserver-types": "^3.17.3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/dockerfile-generator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/dockerfile-generator/-/dockerfile-generator-5.0.3.tgz", - "integrity": "sha512-Tc3OY/gP9DSPwbB+9DAaG01usN67bY2yBYHJGAYq7sgMEAOnETKVDaEqfTqRIRGvyTbP+jz9JQTUoTihQZqhUQ==", - "license": "MIT", - "dependencies": { - "jsonschema": "^1.4.0" - } - }, - "node_modules/dockerfile-utils": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/dockerfile-utils/-/dockerfile-utils-0.15.0.tgz", - "integrity": "sha512-hV2OExB797C3/GlOloywmMZzu3MPmzMziGuCaPWh/m9qHgTyfN4+EI3b6xhHDXy78PU0GqwvHnZVX7wfpqOCkg==", - "license": "MIT", - "dependencies": { - "dockerfile-ast": "0.6.1", - "vscode-languageserver-textdocument": "^1.0.8", - "vscode-languageserver-types": "^3.17.3" - }, - "bin": { - "dockerfile-utils": "bin/dockerfile-utils" - }, - "engines": { - "node": "*" - } - }, - "node_modules/dockerode": { - "version": "2.5.8", - "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-2.5.8.tgz", - "integrity": "sha512-+7iOUYBeDTScmOmQqpUYQaE7F4vvIt6+gIZNHWhqAQEI887tiPFB9OvXI/HzQYqfUNvukMK+9myLW63oTJPZpw==", - "license": "Apache-2.0", - "dependencies": { - "concat-stream": "~1.6.2", - "docker-modem": "^1.0.8", - "tar-fs": "~1.16.3" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/dockerode/node_modules/bl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", - "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", - "license": "MIT", - "dependencies": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/dockerode/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "license": "ISC" - }, - "node_modules/dockerode/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/dockerode/node_modules/pump": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", - "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/dockerode/node_modules/tar-fs": { - "version": "1.16.6", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.6.tgz", - "integrity": "sha512-JkOgFt3FxM/2v2CNpAVHqMW2QASjc/Hxo7IGfNd3MHaDYSW/sBFiS7YVmmhmr8x6vwN1VFQDQGdT2MWpmIuVKA==", - "license": "MIT", - "dependencies": { - "chownr": "^1.0.1", - "mkdirp": "^0.5.1", - "pump": "^1.0.0", - "tar-stream": "^1.1.2" - } - }, - "node_modules/dockerode/node_modules/tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "license": "MIT", - "dependencies": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "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": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "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==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dot/-/dot-1.1.3.tgz", - "integrity": "sha512-/nt74Rm+PcfnirXGEdhZleTwGC2LMnuKTeeTIlI82xb5loBBoXNYzr2ezCroPSMtilK8EZIfcNZwOcHN+ib1Lg==", - "dev": true, - "engines": [ - "node >=0.2.6" - ], - "license": "MIT", - "bin": { - "dottojs": "bin/dot-packer" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "license": "Apache-2.0", - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.266", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.266.tgz", - "integrity": "sha512-kgWEglXvkEfMH7rxP5OSZZwnaDWT7J9EoZCujhnpLbfi0bbNtRkgdX2E3gt0Uer11c61qCYktB3hwkAS325sJg==", - "dev": true, - "license": "ISC" - }, - "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==", - "license": "MIT" - }, - "node_modules/emoji-regex-xs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", - "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==", - "dev": true, - "license": "MIT" - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/encoding/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==", - "license": "MIT", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "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" - }, - "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==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "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" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "license": "MIT" - }, - "node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-semver": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-semver/-/es-semver-1.0.1.tgz", - "integrity": "sha512-SSQuJFYpMRCAYZFk2p5Y7/xP2Kbs9bJsdQoGt05IzLGWemMzEKvJWVI+qATFVABJbIhuZd1cEKXczxNG3KgvlQ==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", - "dev": true, - "license": "MIT", - "dependencies": { - "@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": "^10.12.0 || >=12.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-google": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.9.1.tgz", - "integrity": "sha512-5A83D+lH0PA81QMESKbLJd/a3ic8tPZtwUmqNrxMRo54nfFaUvtt89q/+icQ+fd66c2xQHn0KyFkzJDoAUfpZA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "eslint": ">=4.1.1" - } - }, - "node_modules/eslint-plugin-vue": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-8.7.1.tgz", - "integrity": "sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-utils": "^3.0.0", - "natural-compare": "^1.4.0", - "nth-check": "^2.0.1", - "postcss-selector-parser": "^6.0.9", - "semver": "^7.3.5", - "vue-eslint-parser": "^8.0.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/eslint-plugin-vue/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": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "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": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "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": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "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": "Apache-2.0", - "engines": { - "node": ">=4" - } - }, - "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": "Apache-2.0", - "engines": { - "node": ">=10" - } - }, - "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, - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/eslint/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/eslint/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "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": "BSD-2-Clause", - "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "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": "Apache-2.0", - "engines": { - "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==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "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": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "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": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "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, - "license": "MIT" - }, - "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": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "license": "MIT" - }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "dev": true, - "license": "(MIT OR WTFPL)", - "engines": { - "node": ">=6" - } - }, - "node_modules/exponential-backoff": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", - "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", - "license": "Apache-2.0" - }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "license": "MIT", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eyes": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==", - "engines": { - "node": "> 0.1.90" - } - }, - "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, - "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" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "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, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/feed": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", - "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "xml-js": "^1.6.11" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/figlet": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.9.4.tgz", - "integrity": "sha512-uN6QE+TrzTAHC1IWTyrc4FfGo2KH/82J8Jl1tyKB7+z5DBit/m3D++Iu5lg91qJMnQQ3vpJrj5gxcK/pk4R9tQ==", - "license": "MIT", - "dependencies": { - "commander": "^14.0.0" - }, - "bin": { - "figlet": "bin/index.js" - }, - "engines": { - "node": ">= 17.0.0" - } - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "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", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "license": "MIT", - "optional": true - }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "license": "MIT", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "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, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "license": "BSD-3-Clause", - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, - "license": "ISC" - }, - "node_modules/focus-trap": { - "version": "7.6.6", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.6.tgz", - "integrity": "sha512-v/Z8bvMCajtx4mEXmOo7QEsIzlIOqRXTIwgUfsFOF9gEsespdbD0AkPIka1bSXZ8Y8oZ+2IVDQZePkTfEHZl7Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "tabbable": "^6.3.0" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/foreground-child/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==", - "dev": true, - "license": "ISC" - }, - "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "node_modules/fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "license": "MIT" - }, - "node_modules/fs-extra": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", - "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs-extra/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/fs-minipass": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "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==", - "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==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "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==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true, - "license": "MIT" - }, - "node_modules/gauge": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-5.0.2.tgz", - "integrity": "sha512-pMaFftXPtiGIHCJHdcUUx9Rby/rFT/Kkt3fIIGCs+9PMDIljSyRiqraTlxNtBReJRDfUefpa263RQ3vnp5G/LQ==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^4.0.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/generate-robotstxt": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/generate-robotstxt/-/generate-robotstxt-8.0.3.tgz", - "integrity": "sha512-iD//oAVKcHOCz9M0IiT3pyUiF2uN1qvL3qaTA8RGLz7NU7l0XVwyzd3rN+tzhB657DNUgrygXt9w8+0zkTMFrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cosmiconfig": "^6.0.0", - "fs-extra": "^9.0.0", - "ip-regex": "^4.1.0", - "is-absolute-url": "^3.0.3", - "meow": "^7.0.1", - "resolve-from": "^5.0.0" - }, - "bin": { - "generate-robotstxt": "dist/cli.js" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/generate-robotstxt/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/generate-robotstxt/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "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", - "engines": { - "node": ">=6.9.0" - } - }, - "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==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "dev": true, - "license": "MIT" - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globals/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 OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "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" - } - }, - "node_modules/globby/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "license": "ISC" - }, - "node_modules/gravatar-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/gravatar-url/-/gravatar-url-4.0.1.tgz", - "integrity": "sha512-AiU83cghGg2D8vAUwrMXCByejkkm4RtLwMNGmPU7VhqBYhsxcBCV0SAzRpYNbUCpTci5v46J/KFKPmDYaG2oyA==", - "dev": true, - "license": "MIT", - "dependencies": { - "md5-hex": "^4.0.0", - "type-fest": "^1.0.2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/gravatar-url/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gray-matter": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", - "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-yaml": "^3.13.1", - "kind-of": "^6.0.2", - "section-matter": "^1.0.0", - "strip-bom-string": "^1.0.0" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/gray-matter/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/gray-matter/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.x" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "license": "ISC" - }, - "node_modules/hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hasha/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 OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.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==", - "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" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "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/hosted-git-info": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.3.tgz", - "integrity": "sha512-HVJyzUrLIL1c0QmviVh5E8VGyUS7xCFPS6yydaVd1UegW+ibV/CohqTH9MkOLDp5o+rb82DMo77PTuc9F/8GKw==", - "license": "ISC", - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "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/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/http-cache-semantics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", - "license": "BSD-2-Clause" - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/hyperlinker": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hyperlinker/-/hyperlinker-1.0.0.tgz", - "integrity": "sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "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, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/ignore-walk": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz", - "integrity": "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==", - "license": "ISC", - "dependencies": { - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/immutable": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.4.tgz", - "integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==", - "dev": true, - "license": "MIT" - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "license": "ISC" - }, - "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.", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "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/inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "license": "MIT", - "dependencies": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/inquirer-autocomplete-prompt": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/inquirer-autocomplete-prompt/-/inquirer-autocomplete-prompt-1.4.0.tgz", - "integrity": "sha512-qHgHyJmbULt4hI+kCmwX92MnSxDs/Yhdt4wPA30qnoa01OF6uTXV8yvH4hKXgdaTNmkZ9D01MHjqKYEuJN+ONw==", - "license": "ISC", - "dependencies": { - "ansi-escapes": "^4.3.1", - "chalk": "^4.0.0", - "figures": "^3.2.0", - "run-async": "^2.4.0", - "rxjs": "^6.6.2" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "inquirer": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/inquirer/node_modules/ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/inquirer/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==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/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==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/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==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/inquirer/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/inquirer/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/inquirer/node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "license": "MIT", - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/string-width/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/string-width/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/inquirer/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==", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/into-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", - "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ip-address": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", - "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/ip-regex": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", - "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-class": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/is-class/-/is-class-0.0.9.tgz", - "integrity": "sha512-kUfRnejcRC9YLgblxoJ76dp9gZ3vMKTrDS5I6z2UVMOsHHSImNKCJocjQTkZr38PwiSZ9LVklaHEENaVYeFTXg==", - "license": "MIT" - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-electron": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.2.tgz", - "integrity": "sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==", - "license": "MIT" - }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "license": "MIT", - "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": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.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==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "license": "MIT" - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "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": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true, - "license": "MIT" - }, - "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, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-what": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-5.5.0.tgz", - "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "license": "MIT" - }, - "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", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "append-transform": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/istanbul-lib-processinfo": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", - "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", - "dev": true, - "license": "ISC", - "dependencies": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.3", - "istanbul-lib-coverage": "^3.2.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-processinfo/node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-processinfo/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "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==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jake": { - "version": "10.9.4", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", - "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", - "license": "Apache-2.0", - "dependencies": { - "async": "^3.2.6", - "filelist": "^1.0.4", - "picocolors": "^1.1.1" - }, - "bin": { - "jake": "bin/cli.js" - }, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-parse-even-better-errors": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", - "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", - "license": "MIT", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "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, - "license": "MIT" - }, - "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": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stringify-nice": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", - "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==", - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "engines": [ - "node >= 0.2.0" - ], - "license": "MIT" - }, - "node_modules/jsonschema": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.5.0.tgz", - "integrity": "sha512-K+A9hhqbn0f3pJX17Q/7H6yQfD/5OXgdrR5UE12gMXCiN9D5Xq2o5mddV2QEcX/bjla99ASsAAQUyMCCRWAEhw==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/JSONStream": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.2.tgz", - "integrity": "sha512-mn0KSip7N4e0UDPZHnqDsHECo5uGQrixQKnAskOM1BIB8hd7QKbd6il8IPRPudPHOeHiECoCFqhyMaRO9+nWyA==", - "license": "(MIT OR Apache-2.0)", - "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/just-diff": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-6.0.2.tgz", - "integrity": "sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA==", - "license": "MIT" - }, - "node_modules/just-diff-apply": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-5.5.0.tgz", - "integrity": "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==", - "license": "MIT" - }, - "node_modules/just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", - "dev": true, - "license": "MIT" - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "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, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "license": "MIT" - }, - "node_modules/listr2": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-6.6.1.tgz", - "integrity": "sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==", - "license": "MIT", - "dependencies": { - "cli-truncate": "^3.1.0", - "colorette": "^2.0.20", - "eventemitter3": "^5.0.1", - "log-update": "^5.0.1", - "rfdc": "^1.3.0", - "wrap-ansi": "^8.1.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" - }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } - } - }, - "node_modules/listr2/node_modules/ansi-escapes": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", - "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", - "license": "MIT", - "dependencies": { - "type-fest": "^1.0.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/listr2/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/listr2/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/listr2/node_modules/cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", - "license": "MIT", - "dependencies": { - "restore-cursor": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/listr2/node_modules/cli-truncate": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", - "license": "MIT", - "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/listr2/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/listr2/node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/listr2/node_modules/log-update": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", - "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", - "license": "MIT", - "dependencies": { - "ansi-escapes": "^5.0.0", - "cli-cursor": "^4.0.0", - "slice-ansi": "^5.0.0", - "strip-ansi": "^7.0.1", - "wrap-ansi": "^8.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/listr2/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==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/listr2/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/listr2/node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/listr2/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==", - "license": "ISC" - }, - "node_modules/listr2/node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/listr2/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/listr2/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/listr2/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/listr2/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "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, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", - "dev": true, - "license": "MIT" - }, - "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, - "license": "MIT" - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true, - "license": "MIT" - }, - "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, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "license": "MIT", - "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/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-update/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==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/log-update/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/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==", - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-update/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==", - "license": "ISC" - }, - "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==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lolex": { - "version": "2.7.5", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.5.tgz", - "integrity": "sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/mac-ca": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/mac-ca/-/mac-ca-3.1.3.tgz", - "integrity": "sha512-yAdth+3TAfAyYYxNlnIJxKJbNOVvn9ZiQ1C9XJAj8ThKBBd5hu581sFjld3wr4DSrHcQwn7rt+t6dLiB+vFEFQ==", - "license": "BSD-3-Clause", - "dependencies": { - "node-forge": "^1.3.1", - "undici": "^6.16.1" - } - }, - "node_modules/macos-export-certificate-and-key": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/macos-export-certificate-and-key/-/macos-export-certificate-and-key-1.2.4.tgz", - "integrity": "sha512-y5QZEywlBNKd+EhPZ1Hz1FmDbbeQKtuVHJaTlawdl7vXw9bi/4tJB2xSMwX4sMVcddy3gbQ8K0IqXAi2TpDo2g==", - "hasInstallScript": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "bindings": "^1.5.0", - "node-addon-api": "^4.3.0" - } - }, - "node_modules/macos-export-certificate-and-key/node_modules/node-addon-api": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", - "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", - "license": "MIT", - "optional": true - }, - "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/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, - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", - "license": "ISC", - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", - "license": "ISC", - "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/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==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/cacache": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", - "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/make-fetch-happen/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "license": "MIT", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/make-fetch-happen/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/make-fetch-happen/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-fetch-happen/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/make-fetch-happen/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/make-fetch-happen/node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/make-fetch-happen/node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/make-fetch-happen/node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/make-fetch-happen/node_modules/socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "license": "MIT", - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/make-fetch-happen/node_modules/ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", - "license": "ISC", - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/unique-filename": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", - "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", - "license": "ISC", - "dependencies": { - "unique-slug": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/unique-slug": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", - "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/markdown-it-container": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/markdown-it-container/-/markdown-it-container-4.0.0.tgz", - "integrity": "sha512-HaNccxUH0l7BNGYbFbjmGpf5aLHAMTinqRZQAEQbMr2cdD3z91Q6kIo1oUn1CQndkT03jat6ckrdRYuwwqLlQw==", - "dev": true, - "license": "MIT" - }, - "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "dev": true, - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/md5-hex": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-4.0.0.tgz", - "integrity": "sha512-di38zHPn4Tz8LCb5Lz8SpLb/20Hv23aPXpF4Bq1mR5r9JuCZQ/JpcDUxFfZF9Ur5GiUvqS5NQOkR+fm5cYZ0IQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "blueimp-md5": "^2.18.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "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==", - "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" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "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": { - "@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/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==", - "dev": true, - "license": "ISC" - }, - "node_modules/meow/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": "BSD-2-Clause", - "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/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/meow/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, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/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, - "license": "ISC", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "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==", - "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" - } - }, - "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==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "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==", - "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" - } - }, - "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==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "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==", - "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==", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-collect/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-collect/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", - "license": "MIT", - "dependencies": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/minipass-fetch/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-fetch/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-flush/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/minipass-json-stream": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.2.tgz", - "integrity": "sha512-myxeeTm57lYs8pH2nxPzmEEg8DGIgW+9mv6D4JZD2pa81I/OBjeU7PtICXV6c9eRGTA5JMDsuIPUZRCyBMYNhg==", - "license": "MIT", - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/minipass-json-stream/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-json-stream/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "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/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "dev": true, - "license": "MIT" - }, - "node_modules/mkcert": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mkcert/-/mkcert-3.2.0.tgz", - "integrity": "sha512-026Eivq9RoOjOuLJGzbhGwXUAjBxRX11Z7Jbm4/7lqT/Av+XNy9SPrJte6+UpEt7i+W3e/HZYxQqlQcqXZWSzg==", - "license": "MIT", - "dependencies": { - "commander": "^11.0.0", - "node-forge": "^1.3.1" - }, - "bin": { - "mkcert": "dist/cli.js" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/mkcert/node_modules/commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", - "license": "MIT", - "engines": { - "node": ">=16" - } - }, - "node_modules/mkdir-p": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mkdir-p/-/mkdir-p-0.0.7.tgz", - "integrity": "sha512-VkWaZNxDgZle/aJAemUAWdyYX7geyuleKYFfRejf/pFKjxBDbWrMAy41ijg5EiI1U00WR9JcvynuDedE/fTxLA==", - "license": "MIT" - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true, - "license": "MIT" - }, - "node_modules/mocha": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", - "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.3", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "4.2.1", - "ms": "2.1.3", - "nanoid": "3.3.1", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.2.0", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/mocha/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", - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/mocha/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, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/mocha/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/mocha/node_modules/debug/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, - "license": "MIT" - }, - "node_modules/mocha/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "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" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/mocha/node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mocha/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/mocha/node_modules/minimatch": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", - "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", - "dev": true, - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/mocha/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, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/mocha/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, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/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, - "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" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/mock-fs": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-5.5.0.tgz", - "integrity": "sha512-d/P1M/RacgM3dB0sJ8rjeRNXxtapkPCUnMGmIN0ixJ16F/E4GUZCvWcSGfWGz8eaXYvn1s9baUwNjI4LOPEjiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - } - }, - "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/multistream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz", - "integrity": "sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "once": "^1.4.0", - "readable-stream": "^3.6.0" - } - }, - "node_modules/multistream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", - "license": "ISC" - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/napi-build-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", - "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/natural-orderby": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-2.0.3.tgz", - "integrity": "sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/nise": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.3.tgz", - "integrity": "sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/formatio": "^3.2.1", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "lolex": "^5.0.1", - "path-to-regexp": "^1.7.0" - } - }, - "node_modules/nise/node_modules/@sinonjs/formatio": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz", - "integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^1", - "@sinonjs/samsam": "^3.1.0" - } - }, - "node_modules/nise/node_modules/lolex": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", - "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/node-abi": { - "version": "3.85.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.85.0.tgz", - "integrity": "sha512-zsFhmbkAzwhTft6nd3VxcG0cvJsT70rL+BIGHWVq5fi6MwGrHwzqKaxXE+Hl2GmnGItnDKPPkO5/LQqjVkIdFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/node-cache": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-4.2.1.tgz", - "integrity": "sha512-BOb67bWg2dTyax5kdef5WfU3X8xu4wPg+zHzkvls0Q/QpYycIFRLEEIdAx9Wma43DxG6Qzn4illdZoYseKWa4A==", - "license": "MIT", - "dependencies": { - "clone": "2.x", - "lodash": "^4.17.15" - }, - "engines": { - "node": ">= 0.4.6" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-forge": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.3.tgz", - "integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==", - "license": "(BSD-3-Clause OR GPL-2.0)", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-gyp": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", - "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^12.13 || ^14.13 || >=16" - } - }, - "node_modules/node-gyp/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==", - "license": "ISC" - }, - "node_modules/node-gyp/node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/node-gyp/node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/node-gyp/node_modules/nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", - "license": "ISC", - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/node-gyp/node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/node-gyp/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/node-gyp/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/node-gyp/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==", - "license": "ISC" - }, - "node_modules/node-gyp/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/node-html-parser": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.13.tgz", - "integrity": "sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==", - "dev": true, - "license": "MIT", - "dependencies": { - "css-select": "^5.1.0", - "he": "1.2.0" - } - }, - "node_modules/node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "process-on-spawn": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nopt": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", - "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", - "license": "ISC", - "dependencies": { - "abbrev": "^2.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", - "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "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, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-bundled": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz", - "integrity": "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==", - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-install-checks": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", - "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", - "license": "BSD-2-Clause", - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-normalize-package-bin": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", - "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-package-arg": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", - "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", - "license": "ISC", - "dependencies": { - "hosted-git-info": "^7.0.0", - "proc-log": "^4.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm-package-arg/node_modules/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", - "license": "ISC", - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm-package-arg/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/npm-package-arg/node_modules/proc-log": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", - "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-packlist": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", - "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", - "license": "ISC", - "dependencies": { - "ignore-walk": "^6.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-pick-manifest": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.2.tgz", - "integrity": "sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==", - "license": "ISC", - "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^10.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-pick-manifest/node_modules/npm-package-arg": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", - "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", - "license": "ISC", - "dependencies": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-profile": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/npm-profile/-/npm-profile-9.0.2.tgz", - "integrity": "sha512-4S/fd/PNyGgjaGolsdUJFsnfEb+AxJzrrZC3I9qbTYZJ3PJy8T46tIWXA4pBoaeiGh2M2GRvK1K/xMQe1Xgbvw==", - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^17.0.0", - "proc-log": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm-profile/node_modules/cacache": { - "version": "18.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz", - "integrity": "sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==", - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm-profile/node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm-profile/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm-profile/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/npm-profile/node_modules/make-fetch-happen": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz", - "integrity": "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==", - "license": "ISC", - "dependencies": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", - "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "proc-log": "^4.2.0", - "promise-retry": "^2.0.1", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm-profile/node_modules/minipass-collect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", - "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/npm-profile/node_modules/minipass-fetch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", - "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", - "license": "MIT", - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/npm-profile/node_modules/npm-registry-fetch": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-17.1.0.tgz", - "integrity": "sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==", - "license": "ISC", - "dependencies": { - "@npmcli/redact": "^2.0.0", - "jsonparse": "^1.3.1", - "make-fetch-happen": "^13.0.0", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minizlib": "^2.1.2", - "npm-package-arg": "^11.0.0", - "proc-log": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm-profile/node_modules/proc-log": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", - "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-registry-fetch": { - "version": "14.0.5", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", - "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", - "license": "ISC", - "dependencies": { - "make-fetch-happen": "^11.0.0", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^10.0.0", - "proc-log": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-registry-fetch/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==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/npm-registry-fetch/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "license": "MIT", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm-registry-fetch/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm-registry-fetch/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "license": "ISC", - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-registry-fetch/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm-registry-fetch/node_modules/minipass-fetch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", - "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", - "license": "MIT", - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/npm-registry-fetch/node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/npm-registry-fetch/node_modules/npm-package-arg": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", - "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", - "license": "ISC", - "dependencies": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-registry-fetch/node_modules/socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "license": "MIT", - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npmlog": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-7.0.1.tgz", - "integrity": "sha512-uJ0YFk/mCQpLBt+bxN88AKd+gyqZvZDbtiNxk6Waqcj2aPRyfVx8ITawkyQynxUagInjdYT1+qj4NfA5KJJUxg==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^4.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^5.0.0", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "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==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "bin": { - "nyc": "bin/nyc.js" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/nyc/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true, - "license": "MIT" - }, - "node_modules/nyc/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/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, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nyc/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/nyc/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==", - "dev": true, - "license": "ISC" - }, - "node_modules/object-hash": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", - "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==", - "license": "MIT", - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/object-treeify": { - "version": "1.1.33", - "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-1.1.33.tgz", - "integrity": "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "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==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/oniguruma-to-es": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-3.1.1.tgz", - "integrity": "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex-xs": "^1.0.0", - "regex": "^6.0.1", - "regex-recursion": "^6.0.2" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "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.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-is-promise": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", - "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "license": "BlueOak-1.0.0" - }, - "node_modules/pacote": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", - "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", - "license": "ISC", - "dependencies": { - "@npmcli/git": "^4.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/promise-spawn": "^6.0.1", - "@npmcli/run-script": "^6.0.0", - "cacache": "^17.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^5.0.0", - "npm-package-arg": "^10.0.0", - "npm-packlist": "^7.0.0", - "npm-pick-manifest": "^8.0.0", - "npm-registry-fetch": "^14.0.0", - "proc-log": "^3.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^6.0.0", - "read-package-json-fast": "^3.0.0", - "sigstore": "^1.3.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "lib/bin.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/pacote/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/pacote/node_modules/npm-package-arg": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", - "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", - "license": "ISC", - "dependencies": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "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, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parent-require": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parent-require/-/parent-require-1.0.0.tgz", - "integrity": "sha512-2MXDNZC4aXdkkap+rBBMv0lUsfJqvX5/2FiYYnfCnorZt3Pk06/IOR5KeaoghgS2w07MLWgjbsnyaq6PdHn2LQ==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/parse-conflict-json": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz", - "integrity": "sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw==", - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "just-diff": "^6.0.0", - "just-diff-apply": "^5.2.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.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==", - "dev": true, - "license": "MIT", - "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/parse-json/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==", - "dev": true, - "license": "MIT" - }, - "node_modules/password-prompt": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/password-prompt/-/password-prompt-1.1.3.tgz", - "integrity": "sha512-HkrjG2aJlvF0t2BMH0e2LB/EHf3Lcq3fNMzy4GYHcQblAvOl+QQji1Lx7WRBMqpVK8p+KR7bCg7oqAMXtdgqyw==", - "license": "0BSD", - "dependencies": { - "ansi-escapes": "^4.3.2", - "cross-spawn": "^7.0.3" - } - }, - "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==", - "license": "MIT", - "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": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/path-to-regexp": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", - "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/path-to-regexp/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true, - "license": "MIT" - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/perfect-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", - "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", - "dev": true, - "license": "MIT" - }, - "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/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "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": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "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, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/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, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "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.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/preact": { - "version": "10.28.0", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.28.0.tgz", - "integrity": "sha512-rytDAoiXr3+t6OIP3WGlDd0ouCUG1iCWzkcY3++Nreuoi17y6T5i/zRhe6uYfoVcxq6YU+sBtJouuRDsq8vvqA==", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, - "node_modules/prebuild-install": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", - "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", - "dev": true, - "license": "MIT", - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^2.0.0", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "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, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/process-on-spawn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.1.0.tgz", - "integrity": "sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "fromentries": "^1.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "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, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise-all-reject-late": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz", - "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==", - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/promise-call-limit": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-1.0.2.tgz", - "integrity": "sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA==", - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "license": "ISC" - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/property-information": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", - "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "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" - } - ], - "license": "MIT" - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-cmd-shim": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz", - "integrity": "sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-package-json": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", - "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", - "deprecated": "This package is no longer supported. Please use @npmcli/package-json instead.", - "license": "ISC", - "dependencies": { - "glob": "^10.2.2", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-package-json-fast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", - "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-package-json/node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/read-package-json/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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/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/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": { - "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/read-pkg-up/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "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 OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "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, - "license": "ISC" - }, - "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": "BSD-2-Clause", - "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/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "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 OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "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" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/readdirp/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", - "license": "MIT", - "dependencies": { - "esprima": "~4.0.0" - } - }, - "node_modules/regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/regex/-/regex-6.0.1.tgz", - "integrity": "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "regex-utilities": "^2.3.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "regex-utilities": "^2.3.0" - } - }, - "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/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", - "dev": true, - "license": "ISC", - "dependencies": { - "es6-error": "^4.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "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==", - "license": "MIT", - "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, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "license": "ISC" - }, - "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "license": "MIT", - "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/restore-cursor/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==", - "license": "ISC" - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "license": "MIT" - }, - "node_modules/rimraf": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", - "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", - "license": "ISC", - "dependencies": { - "glob": "^9.2.0" - }, - "bin": { - "rimraf": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "9.3.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", - "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "minimatch": "^8.0.2", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", - "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/rollup": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz", - "integrity": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.53.3", - "@rollup/rollup-android-arm64": "4.53.3", - "@rollup/rollup-darwin-arm64": "4.53.3", - "@rollup/rollup-darwin-x64": "4.53.3", - "@rollup/rollup-freebsd-arm64": "4.53.3", - "@rollup/rollup-freebsd-x64": "4.53.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.53.3", - "@rollup/rollup-linux-arm-musleabihf": "4.53.3", - "@rollup/rollup-linux-arm64-gnu": "4.53.3", - "@rollup/rollup-linux-arm64-musl": "4.53.3", - "@rollup/rollup-linux-loong64-gnu": "4.53.3", - "@rollup/rollup-linux-ppc64-gnu": "4.53.3", - "@rollup/rollup-linux-riscv64-gnu": "4.53.3", - "@rollup/rollup-linux-riscv64-musl": "4.53.3", - "@rollup/rollup-linux-s390x-gnu": "4.53.3", - "@rollup/rollup-linux-x64-gnu": "4.53.3", - "@rollup/rollup-linux-x64-musl": "4.53.3", - "@rollup/rollup-openharmony-arm64": "4.53.3", - "@rollup/rollup-win32-arm64-msvc": "4.53.3", - "@rollup/rollup-win32-ia32-msvc": "4.53.3", - "@rollup/rollup-win32-x64-gnu": "4.53.3", - "@rollup/rollup-win32-x64-msvc": "4.53.3", - "fsevents": "~2.3.2" - } - }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "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" - } - ], - "license": "MIT", - "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==", - "license": "Apache-2.0", - "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==", - "license": "0BSD" - }, - "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==", - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/samsam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", - "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", - "deprecated": "This package has been deprecated in favour of @sinonjs/samsam", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/sass": { - "version": "1.94.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.94.2.tgz", - "integrity": "sha512-N+7WK20/wOr7CzA2snJcUSSNTCzeCGUTFY3OgeQP3mZ1aj9NMQ0mSTXwlrnd89j33zzQJGqIN52GIOmYrfq46A==", - "dev": true, - "license": "MIT", - "dependencies": { - "chokidar": "^4.0.0", - "immutable": "^5.0.2", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=14.0.0" - }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" - } - }, - "node_modules/sass/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/sass/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/sax": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.3.tgz", - "integrity": "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/search-insights": { - "version": "2.17.3", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", - "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/section-matter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", - "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "extend-shallow": "^2.0.1", - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "license": "ISC" - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "license": "BSD-3-Clause", - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/shiki": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-2.5.0.tgz", - "integrity": "sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/core": "2.5.0", - "@shikijs/engine-javascript": "2.5.0", - "@shikijs/engine-oniguruma": "2.5.0", - "@shikijs/langs": "2.5.0", - "@shikijs/themes": "2.5.0", - "@shikijs/types": "2.5.0", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sigstore": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz", - "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==", - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^1.1.0", - "@sigstore/protobuf-specs": "^0.2.0", - "@sigstore/sign": "^1.0.0", - "@sigstore/tuf": "^1.0.3", - "make-fetch-happen": "^11.0.1" - }, - "bin": { - "sigstore": "bin/sigstore.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/sigstore/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==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/sigstore/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "license": "MIT", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/sigstore/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/sigstore/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/sigstore/node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "license": "ISC", - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/sigstore/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/sigstore/node_modules/minipass-fetch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", - "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", - "license": "MIT", - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/sigstore/node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/sigstore/node_modules/socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "license": "MIT", - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/simple-swizzle": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", - "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", - "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", - "license": "MIT" - }, - "node_modules/sinon": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-4.5.0.tgz", - "integrity": "sha512-trdx+mB0VBBgoYucy6a9L7/jfQOmvGeaKZT4OOJ+lPAtI8623xyGr8wLiE4eojzBS8G9yXbhx42GHUOVLr4X2w==", - "deprecated": "16.1.1", - "dev": true, - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/formatio": "^2.0.0", - "diff": "^3.1.0", - "lodash.get": "^4.4.2", - "lolex": "^2.2.0", - "nise": "^1.2.0", - "supports-color": "^5.1.0", - "type-detect": "^4.0.5" - } - }, - "node_modules/sinon-chai": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.14.0.tgz", - "integrity": "sha512-9stIF1utB0ywNHNT7RgiXbdmen8QDCRsrTjw+G9TgKt1Yexjiv8TOWZ6WHsTPz57Yky3DIswZvEqX8fpuHNDtQ==", - "dev": true, - "license": "(BSD-2-Clause OR WTFPL)", - "peerDependencies": { - "chai": ">=1.9.2 <5", - "sinon": "^1.4.0 || ^2.1.0 || ^3.0.0 || ^4.0.0" - } - }, - "node_modules/sinon/node_modules/diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/sinon/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/sinon/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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==", - "license": "MIT", - "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/slugify": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", - "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", - "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", - "license": "MIT", - "dependencies": { - "ip-address": "^10.0.1", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, - "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": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/spawn-wrap/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/spawn-wrap/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==", - "dev": true, - "license": "ISC" - }, - "node_modules/spawn-wrap/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, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "license": "CC-BY-3.0" - }, - "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==", - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.22", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", - "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", - "license": "CC0-1.0" - }, - "node_modules/speakingurl": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", - "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "license": "MIT", - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/split-ca": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz", - "integrity": "sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==", - "license": "ISC" - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "license": "BSD-3-Clause" - }, - "node_modules/ssri": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", - "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/stack-utils-node-internals": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stack-utils-node-internals/-/stack-utils-node-internals-1.0.1.tgz", - "integrity": "sha512-lMuPPh5lj8Nj+vGsxnrp5LRamN5SF++yJE+skeXz9Chy/Uw93BzxzrnQ/8BLOIKKVsJ44bleARrfSUh3ZGdMZw==", - "license": "MIT" - }, - "node_modules/stream-meter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz", - "integrity": "sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "readable-stream": "^2.1.4" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string-argv": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.1.1.tgz", - "integrity": "sha512-El1Va5ehZ0XTj3Ekw4WFidXvTmt9SrC0+eigdojgtJMVtPkF0qbBe9fyNSl9eQf+kUHnTSQxdQYzuHfZy8V+DQ==", - "license": "MIT", - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "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", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "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", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "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, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/sudo-block": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sudo-block/-/sudo-block-2.0.0.tgz", - "integrity": "sha512-BtQhz9xtBrwznoyakSOqj9posQoQjeyN0guytNriU6CnAcjF18WkPaN45xM1tLkwNLRBFK7tZUQDIE+iEOzayg==", - "license": "MIT", - "dependencies": { - "chalk": "^2.1.0", - "is-docker": "^1.0.0", - "is-root": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/sudo-block/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==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/sudo-block/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==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/sudo-block/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==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/sudo-block/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/sudo-block/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/sudo-block/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/sudo-block/node_modules/is-docker": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-1.1.0.tgz", - "integrity": "sha512-ZEpopPu+bLIb/x3IF9wXxRdAW74e/ity1XGRxpznAaABKhc8mmtRamRB2l71CSs1YMS8FQxDK/vPK10XlhzG2A==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sudo-block/node_modules/is-root": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-1.0.0.tgz", - "integrity": "sha512-1d50EJ7ipFxb9bIx213o6KPaJmHN8f+nR48UZWxWVzDx+NA3kpscxi02oQX3rGkEaLBi9m3ZayHngQc3+bBX9w==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sudo-block/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==", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/superjson": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.6.tgz", - "integrity": "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "copy-anything": "^4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "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==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/system-ca": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/system-ca/-/system-ca-2.0.1.tgz", - "integrity": "sha512-9ZDV9yl8ph6Op67wDGPr4LykX86usE9x3le+XZSHfVMiiVJ5IRgmCWjLgxyz35ju9H3GDIJJZm4ogAeIfN5cQQ==", - "license": "Apache-2.0", - "optionalDependencies": { - "macos-export-certificate-and-key": "^1.2.0", - "win-export-certificate-and-key": "^2.1.0" - } - }, - "node_modules/tabbable": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.3.0.tgz", - "integrity": "sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/table": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", - "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "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, - "license": "MIT" - }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar-fs": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", - "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-fs/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true, - "license": "ISC" - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "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, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "license": "MIT" - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "license": "MIT" - }, - "node_modules/timeago.js": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/timeago.js/-/timeago.js-4.0.2.tgz", - "integrity": "sha512-a7wPxPdVlQL7lqvitHGGRsofhdwtkoSXPGATFuSOA2i1ZNQEPLrGnj68vOp2sOJTCFAQVXPeNMX/GctBaO9L2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-buffer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", - "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", - "license": "MIT", - "dependencies": { - "isarray": "^2.0.5", - "safe-buffer": "^5.2.1", - "typed-array-buffer": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/to-buffer/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "license": "MIT" - }, - "node_modules/to-buffer/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" - } - ], - "license": "MIT" - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "node_modules/treeverse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-3.0.0.tgz", - "integrity": "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "license": "0BSD" - }, - "node_modules/tuf-js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", - "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", - "license": "MIT", - "dependencies": { - "@tufjs/models": "1.0.4", - "debug": "^4.3.4", - "make-fetch-happen": "^11.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/tuf-js/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==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/tuf-js/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "license": "MIT", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/tuf-js/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/tuf-js/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/tuf-js/node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "license": "ISC", - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/tuf-js/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/tuf-js/node_modules/minipass-fetch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", - "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", - "license": "MIT", - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/tuf-js/node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/tuf-js/node_modules/socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "license": "MIT", - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "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, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", - "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", - "dev": true, - "license": "MIT", - "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==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "license": "MIT" - }, - "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, - "license": "MIT", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/ua-parser-js": { - "version": "1.0.41", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.41.tgz", - "integrity": "sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - }, - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - } - ], - "license": "MIT", - "bin": { - "ua-parser-js": "script/cli.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/undici": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.22.0.tgz", - "integrity": "sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==", - "license": "MIT", - "engines": { - "node": ">=18.17" - } - }, - "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "license": "MIT" - }, - "node_modules/unique-filename": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", - "license": "ISC", - "dependencies": { - "unique-slug": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/unique-slug": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "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/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", - "license": "ISC" - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.2.tgz", - "integrity": "sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.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, - "license": "BSD-2-Clause", - "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": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", - "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", - "dev": true, - "license": "MIT" - }, - "node_modules/valid-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/valid-path/-/valid-path-2.1.0.tgz", - "integrity": "sha512-hYanLM6kqE7zLl0oykV//2q3meRgYGOtS2lgChozuWjjghSqR8xwc3199bDGUFPwszk/MhvHhyVys8HdHU9buw==", - "license": "MIT", - "dependencies": { - "is-glob": "^4.0.3" - } - }, - "node_modules/valid-url": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", - "integrity": "sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==" - }, - "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==", - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "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==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vite": { - "version": "5.4.21", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", - "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vitepress": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.6.4.tgz", - "integrity": "sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docsearch/css": "3.8.2", - "@docsearch/js": "3.8.2", - "@iconify-json/simple-icons": "^1.2.21", - "@shikijs/core": "^2.1.0", - "@shikijs/transformers": "^2.1.0", - "@shikijs/types": "^2.1.0", - "@types/markdown-it": "^14.1.2", - "@vitejs/plugin-vue": "^5.2.1", - "@vue/devtools-api": "^7.7.0", - "@vue/shared": "^3.5.13", - "@vueuse/core": "^12.4.0", - "@vueuse/integrations": "^12.4.0", - "focus-trap": "^7.6.4", - "mark.js": "8.11.1", - "minisearch": "^7.1.1", - "shiki": "^2.1.0", - "vite": "^5.4.14", - "vue": "^3.5.13" - }, - "bin": { - "vitepress": "bin/vitepress.js" - }, - "peerDependencies": { - "markdown-it-mathjax3": "^4", - "postcss": "^8" - }, - "peerDependenciesMeta": { - "markdown-it-mathjax3": { - "optional": true - }, - "postcss": { - "optional": true - } - } - }, - "node_modules/vitepress-plugin-tabs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/vitepress-plugin-tabs/-/vitepress-plugin-tabs-0.5.0.tgz", - "integrity": "sha512-SIhFWwGsUkTByfc2b279ray/E0Jt8vDTsM1LiHxmCOBAEMmvzIBZSuYYT1DpdDTiS3SuJieBheJkYnwCq/yD9A==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "vitepress": "^1.0.0-rc.27", - "vue": "^3.3.8" - } - }, - "node_modules/vitepress/node_modules/@algolia/autocomplete-core": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.7.tgz", - "integrity": "sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-plugin-algolia-insights": "1.17.7", - "@algolia/autocomplete-shared": "1.17.7" - } - }, - "node_modules/vitepress/node_modules/@algolia/autocomplete-plugin-algolia-insights": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.7.tgz", - "integrity": "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-shared": "1.17.7" - }, - "peerDependencies": { - "search-insights": ">= 1 < 3" - } - }, - "node_modules/vitepress/node_modules/@algolia/autocomplete-preset-algolia": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.7.tgz", - "integrity": "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-shared": "1.17.7" - }, - "peerDependencies": { - "@algolia/client-search": ">= 4.9.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" - } - }, - "node_modules/vitepress/node_modules/@algolia/autocomplete-shared": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz", - "integrity": "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@algolia/client-search": ">= 4.9.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" - } - }, - "node_modules/vitepress/node_modules/@docsearch/css": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.8.2.tgz", - "integrity": "sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/vitepress/node_modules/@docsearch/js": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.8.2.tgz", - "integrity": "sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docsearch/react": "3.8.2", - "preact": "^10.0.0" - } - }, - "node_modules/vitepress/node_modules/@docsearch/react": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.8.2.tgz", - "integrity": "sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-core": "1.17.7", - "@algolia/autocomplete-preset-algolia": "1.17.7", - "@docsearch/css": "3.8.2", - "algoliasearch": "^5.14.2" - }, - "peerDependencies": { - "@types/react": ">= 16.8.0 < 19.0.0", - "react": ">= 16.8.0 < 19.0.0", - "react-dom": ">= 16.8.0 < 19.0.0", - "search-insights": ">= 1 < 3" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "search-insights": { - "optional": true - } - } - }, - "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", - "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", - "license": "MIT" - }, - "node_modules/vscode-languageserver-types": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", - "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", - "license": "MIT" - }, - "node_modules/vue": { - "version": "3.5.25", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.25.tgz", - "integrity": "sha512-YLVdgv2K13WJ6n+kD5owehKtEXwdwXuj2TTyJMsO7pSeKw2bfRNZGjhB7YzrpbMYj5b5QsUebHpOqR3R3ziy/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.5.25", - "@vue/compiler-sfc": "3.5.25", - "@vue/runtime-dom": "3.5.25", - "@vue/server-renderer": "3.5.25", - "@vue/shared": "3.5.25" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/vue-eslint-parser": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz", - "integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.2", - "eslint-scope": "^7.0.0", - "eslint-visitor-keys": "^3.1.0", - "espree": "^9.0.0", - "esquery": "^1.4.0", - "lodash": "^4.17.21", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=6.0.0" - } - }, - "node_modules/vue-eslint-parser/node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/vue-eslint-parser/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/vue-eslint-parser/node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/vue-eslint-parser/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/walk-up-path": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", - "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==", - "license": "ISC" - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "license": "ISC" - }, - "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "license": "MIT", - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/win-ca": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/win-ca/-/win-ca-3.5.1.tgz", - "integrity": "sha512-RNy9gpBS6cxWHjfbqwBA7odaHyT+YQNhtdpJZwYCFoxB/Dq22oeOZ9YCXMwjhLytKpo7JJMnKdJ/ve7N12zzfQ==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "is-electron": "^2.2.0", - "make-dir": "^1.3.0", - "node-forge": "^1.2.1", - "split": "^1.0.1" - } - }, - "node_modules/win-ca/node_modules/make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "license": "MIT", - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/win-export-certificate-and-key": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/win-export-certificate-and-key/-/win-export-certificate-and-key-2.1.0.tgz", - "integrity": "sha512-WeMLa/2uNZcS/HWGKU2G1Gzeh3vHpV/UFvwLhJLKxPHYFAbubxxVcJbqmPXaqySWK1Ymymh16zKK5WYIJ3zgzA==", - "hasInstallScript": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "win32" - ], - "dependencies": { - "bindings": "^1.5.0", - "node-addon-api": "^3.1.0" - } - }, - "node_modules/win-export-certificate-and-key/node_modules/node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "license": "MIT", - "optional": true - }, - "node_modules/winston": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.5.tgz", - "integrity": "sha512-TWoamHt5yYvsMarGlGEQE59SbJHqGsZV8/lwC+iCcGeAe0vUaOh+Lv6SYM17ouzC/a/LB1/hz/7sxFBtlu1l4A==", - "license": "MIT", - "dependencies": { - "async": "~1.0.0", - "colors": "1.0.x", - "cycle": "1.0.x", - "eyes": "0.1.x", - "isstream": "0.1.x", - "stack-trace": "0.0.x" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/winston/node_modules/async": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", - "integrity": "sha512-5mO7DX4CbJzp9zjaFXusQQ4tzKJARjNB1Ih1pVBi8wkbmXy/xzIDgEMXxWePLzt2OdFwaxfneIlT1nCiXubrPQ==", - "license": "MIT" - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "license": "MIT" - }, - "node_modules/workerpool": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", - "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", - "dev": true, - "license": "Apache-2.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==", - "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_modules/wrap-ansi-cjs": { - "name": "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==", - "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_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", - "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/xml-js": { - "version": "1.6.11", - "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", - "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "sax": "^1.2.4" - }, - "bin": { - "xml-js": "bin/cli.js" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "license": "ISC" - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "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, - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargonaut": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/yargonaut/-/yargonaut-1.1.4.tgz", - "integrity": "sha512-rHgFmbgXAAzl+1nngqOcwEljqHGG9uUZoPjsdZEs1w5JW9RXYzrSvH/u70C1JE5qFi0qjsdhnUX/dJRpWqitSA==", - "license": "Apache-2.0", - "dependencies": { - "chalk": "^1.1.1", - "figlet": "^1.1.1", - "parent-require": "^1.0.0" - } - }, - "node_modules/yargonaut/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yargonaut/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yargonaut/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yargonaut/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/yargonaut/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yargonaut/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "license": "MIT", - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "license": "ISC", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "license": "MIT", - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs-unparser/node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs-unparser/node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/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==", - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/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==", - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/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==", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs/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==", - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/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==", - "license": "ISC", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - } - } -} diff --git a/package.json b/package.json index f576340..130f9a0 100644 --- a/package.json +++ b/package.json @@ -7,86 +7,41 @@ "repository": "lando/core", "bugs": "https://github.com/lando/core-next/issues/new/choose", "homepage": "https://github.com/lando/core-next", + "type": "module", "keywords": [ "lando", "lando-plugin" ], "engines": { - "node": ">=20.0.0" + "bun": ">=1.3.4" }, - "babel": {}, "lando": {}, "main": "lib/lando.js", "bin": { "lando": "./bin/lando" }, - "nyc": { - "include": [ - "builders/**/*.js", - "components/**/*.js", - "hooks/**/*.js", - "lib/**/*.js", - "recipes/**/*.js", - "renderers/**/*.js", - "services/**/*.js", - "types/**/*.js", - "utils/**/*.js" - ], - "exclude": [ - "test/**" - ], - "cache": true, - "all": true + "oclif": { + "bin": "lando", + "dirname": "lando", + "name": "@lando/core", + "topicSeparator": ":" }, "scripts": { - "coverage": "nyc report --reporter=text-lcov | coveralls", "docs:build": "VPL_MVB_VERSION=$(git describe --tags --always --abbrev=1 --match=\"v[0-9].*\") vitepress build docs && npm run docs:rename-sitemap", "docs:dev": "VPL_BASE_URL=http://localhost:5173 VPL_MVB_VERSION=$(git describe --tags --always --abbrev=1 --match=\"v[0-9].*\") vitepress dev docs", - "docs:mvb": "npx mvb docs && npm run docs:rename-sitemap", + "docs:mvb": "mvb docs && bun run docs:rename-sitemap", "docs:preview": "vitepress preview docs", - "docs:rename-sitemap": "node docs/.vitepress/rename-sitemap.js", - "lint": "eslint . --ext .js --ext .mjs ", - "pkg": "pkg --config package.json --output dist/lando ---targets node20 --options 'dns-result-order=ipv4first' bin/lando", + "docs:rename-sitemap": "bun docs/.vitepress/rename-sitemap.js", + "lint": "eslint . bin/lando", + "pkg": "bun run scripts/build.js", "test:unit": "nyc --reporter=html --reporter=text mocha --timeout 5000 test/**/*.spec.js", "test:leia": "leia \"examples/**/README.md\" -c 'Destroy tests' --stdin", - "test": "npm run lint && npm run test:unit" - }, - "pkg": { - "outputPath": "dist", - "assets": [ - "FATCORE", - "config.yml", - "package.json", - "scripts/**/*", - "plugins/**/*", - "node_modules/figlet/fonts/Small Slant.flf", - "node_modules/figlet/fonts/ANSI Shadow.flf" - ], - "scripts": [ - "app.js", - "index.js", - "bin/**/*.js", - "builders/**/*.js", - "components/**/*.js", - "experimental/**/*.js", - "hooks/**/*.js", - "inits/**/*.js", - "lib/**/*.js", - "messages/**/*.js", - "packages/**/*.js", - "plugins/**/*.js", - "renderers/**/*.js", - "sources/**/*.js", - "tasks/**/*.js", - "utils/**/*.js", - "node_modules/axios/dist/node/axios.cjs" - ] + "test": "bun run lint && bun run test:unit" }, "dependencies": { "@lando/argv": "^1.2.0", - "@npmcli/agent": "^2.2.2", "@npmcli/arborist": "^6.2.9", - "@oclif/core": "^3.27.0", + "@oclif/core": "^4.8.0", "@octokit/rest": "^19", "axios": "^1.5.1", "bluebird": "^3.4.1", @@ -109,17 +64,19 @@ "inquirer": "^6.5.2", "inquirer-autocomplete-prompt": "^1.4.0", "is-class": "^0.0.9", - "is-docker": "^2.2.1", - "is-interactive": "^1", - "is-root": "^2", - "js-yaml": "^4.1.0", + "is-docker": "^4.0.0", + "is-interactive": "^2.0.0", + "is-root": "^3.0.0", + "js-yaml": "^4.1.1", "jsonfile": "^2.4.0", + "kebabcase-keys": "^1.0.0", "listr2": "^6.6.1", - "lodash": "^4.17.21", + "lodash-es": "^4.17.21", "log-update": "4.0.0", "mac-ca": "^3.1.0", "mkcert": "^3.2.0", "nanoid": "^3", + "nconf": "^0.13.0", "node-cache": "^4.1.1", "node-forge": "^1.3.1", "npm-package-arg": "^11.0.1", @@ -138,29 +95,35 @@ "valid-path": "^2.1.0", "valid-url": "^1.0.9", "win-ca": "^3.5.1", - "winston": "2.4.5", "wrap-ansi": "7.0.0", + "yaml": "^2.8.2", "yargonaut": "^1.1.4", "yargs": "^15.4.1", "yargs-parser": "^11.1.1" }, "devDependencies": { - "@babel/eslint-parser": "^7.16.0", + "@eslint/js": "^9.39.2", "@lando/leia": "^1.0.0-beta.4", "@lando/vitepress-theme-default-plus": "^1.1.1", - "@yao-pkg/pkg": "^5.16.1", "chai": "^4.3.4", "chai-as-promised": "^7.1.1", "chai-events": "^0.0.1", - "eslint": "^7.32.0", - "eslint-config-google": "^0.9.1", - "eslint-plugin-vue": "^8.0.3", + "eslint": "^9.14.0", + "eslint-config-flat-gitignore": "^2.1.0", + "eslint-config-prettier": "^10.1.1", + "eslint-import-resolver-exports": "^1.0.0-beta.5", + "eslint-import-resolver-typescript-bun": "^0.0.104", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-prettier": "^5.2.3", + "eslint-plugin-vue": "^10.0.0", + "globals": "^16.5.0", "mocha": "^9.1.2", "mock-fs": "^5.4.0", "nyc": "^15.1.0", + "prettier": "^3.5.3", "sinon": "^4.3.0", "sinon-chai": "^2.14.0", "ua-parser-js": "^1.0.39", - "vitepress": "^1.5.0" + "vitepress": "^1.6.4" } } diff --git a/scripts/build.js b/scripts/build.js new file mode 100644 index 0000000..7c0f9b0 --- /dev/null +++ b/scripts/build.js @@ -0,0 +1,64 @@ +/* eslint-disable no-console */ +import { build } from 'bun'; + +import Debug from 'debug'; +import chalk from 'chalk'; +import argv from '@lando/argv'; + +import getCommitHash from '../_new/utils/get-commit-hash.js'; +import isDevVersion from '../_new/utils/is-dev-version.js'; + +import { version } from '../package.json'; + +// colors +const blue = chalk.blue; +const green = chalk.green; +const error = chalk.red.bold; +const warn = chalk.yellow.bold; + +const debug = Debug('@lando/bun-build'); +const entrypoints = ['./bin/lando.js']; +const options = { + compile: { + outfile: './dist/lando', + }, + // minify: true, +}; + +const buildenv = { + __BUILD_IS_COMPILED__: JSON.stringify(true), + __BUILD_COMMIT__: JSON.stringify(getCommitHash('./', { short: true })), + __BUILD_DEV__: JSON.stringify(isDevVersion(version)), + __BUILD_TIME__: JSON.stringify(new Date().toISOString()), + __BUILD_VERSION__: JSON.stringify(version), +}; + +// enable debugging if applicable +if (argv.hasOption('--debug') || process.env.RUNNER_DEBUG == 1) Debug.enable('*'); + +// attempt the build +console.log(`${blue('compiling')} ${green(entrypoints)}...`); +debug('building %o with options %O and build vars %O', entrypoints, options, buildenv); + +const { success, logs, outputs } = await build({ entrypoints, ...options, define: buildenv }); + +debug('build completed with %s and logs %O', success ? green('success') : error('failure'), logs); + +// @NOTE: outputs doent play nice in debug so we do it this way instead +if (debug.enabled) console.log(outputs); + +// print error messages and exit +if (!success) { + for (const message of logs) console.error(error(message)); + process.exit(47); +} + +// success +console.log(logs.length > 0 ? `${warn('success')}! with warnings...` : chalk.green.bold('success!')); + +// print warnings if applicable +if (logs.length > 0) for (const message of logs) console.warn(message); + +// dest +console.log(); +console.log(`built to ${green(options.compile.outfile)}`); diff --git a/tasks/exec.js b/tasks/exec.js index 4844b53..fc07f02 100644 --- a/tasks/exec.js +++ b/tasks/exec.js @@ -5,7 +5,7 @@ const fs = require('fs'); const path = require('path'); const _ = require('lodash'); -const {color} = require('listr2'); +const { color } = require('listr2'); // @TODO: when we have a file for recipes/compose we can set choices on service @@ -34,7 +34,7 @@ module.exports = (lando, config = lando.appConfig) => ({ alias: ['u'], }, }, - run: async options => { + run: async (options) => { // construct a minapp from various places const minapp = !_.isEmpty(config) ? config : lando.appConfig; @@ -54,13 +54,13 @@ module.exports = (lando, config = lando.appConfig) => ({ // Load only what we need so we don't pay the appinit penalty if (!_.isEmpty(_.get(app, 'config.events', []))) { _.forEach(app.config.events, (cmds, name) => { - app.events.on(name, 9999, async data => await require('../hooks/app-run-events')(app, lando, cmds, data)); + app.events.on(name, 9999, async (data) => await require('../hooks/app-run-events')(app, lando, cmds, data)); }); } // nice things const aservices = app?.config?.allServices ?? app?.allServices ?? []; - const choices = `[${color.green('choices:')} ${aservices.map(service => `"${service}"`).join(', ')}]`; + const choices = `[${color.green('choices:')} ${aservices.map((service) => `"${service}"`).join(', ')}]`; // gather our options options.service = options._[1]; @@ -83,7 +83,7 @@ module.exports = (lando, config = lando.appConfig) => ({ throw new Error('You must specify a command! See usage above.'); } - // collect, usage throw + // collect, usage throw } catch (error) { if (options?._yargs?.showHelp) options._yargs.showHelp(); console.log(''); @@ -116,8 +116,8 @@ module.exports = (lando, config = lando.appConfig) => ({ // ensure all v3 services have their appMount set to /app // @TODO: do we still need this? const v3Mounts = _(_.get(app, 'info', [])) - .filter(service => service.api !== 4) - .map(service => ([service.service, service.appMount || '/app'])) + .filter((service) => service.api !== 4) + .map((service) => [service.service, service.appMount || '/app']) .fromPairs() .value(); app.mounts = _.merge({}, v3Mounts, app.mounts); @@ -136,12 +136,12 @@ module.exports = (lando, config = lando.appConfig) => ({ // try to run it try { - lando.log.debug('running exec command %o on %o', runner.cmd, runner.id); + lando.log('running exec command %o on %o', runner.cmd, runner.id); await require('../utils/build-docker-exec')(lando, 'inherit', runner); - // error + // error } catch (error) { - return lando.engine.isRunning(runner.id).then(isRunning => { + return lando.engine.isRunning(runner.id).then((isRunning) => { if (!isRunning) { throw new Error(`Looks like your app is stopped! ${color.bold('lando start')} it up to exec your heart out.`); } else { @@ -150,7 +150,7 @@ module.exports = (lando, config = lando.appConfig) => ({ } }); - // finally + // finally } finally { await app.events.emit('post-exec', config); } diff --git a/tasks/plugin-add.js b/tasks/plugin-add.js index 33a7cf6..50dcb83 100644 --- a/tasks/plugin-add.js +++ b/tasks/plugin-add.js @@ -1,8 +1,8 @@ 'use strict'; -module.exports = lando => { +module.exports = (lando) => { // the default install directory - const {dir} = lando.config.pluginDirs.find(dir => dir.type === require('../utils/get-plugin-type')()); + const { dir } = lando.config.pluginDirs.find((dir) => dir.type === require('../utils/get-plugin-type')()); return { command: 'plugin-add', @@ -50,7 +50,7 @@ module.exports = lando => { hidden: true, }, }, - run: async options => { + run: async (options) => { const getPluginConfig = require('../utils/get-plugin-config'); const lopts2Popts = require('../utils/lopts-2-popts'); const merge = require('../utils/merge'); @@ -58,26 +58,23 @@ module.exports = lando => { const Plugin = require('../components/plugin'); // normalize incoming options on top of any managed or user plugin config we already have - options.config = merge({}, [ - getPluginConfig(lando.config.pluginConfigFile, lando.config.pluginConfig), - lopts2Popts(options), - ]); + options.config = merge({}, [getPluginConfig(lando.config.pluginConfigFile, lando.config.pluginConfig), lopts2Popts(options)]); // reset Plugin static defaults for v3 purposes Plugin.config = options.config; - Plugin.debug = require('../utils/debug-shim')(lando.log); + Plugin.debug = lando.log; Plugin.fetchConfig.namespace = options.fetchNamespace; Plugin.fetchConfig.excludeDeps = options.removeDependency; // merge plugins together const plugins = options._.slice(1); - lando.log.debug('attempting to install plugins %j', plugins); + lando.log('attempting to install plugins %j', plugins); // prep listr things - const tasks = plugins.map(plugin => require('../utils/get-plugin-add-task')(plugin, {dir: options.dir, Plugin})); + const tasks = plugins.map((plugin) => require('../utils/get-plugin-add-task')(plugin, { dir: options.dir, Plugin })); // try to fetch the plugins - const {errors, results, total} = await lando.runTasks(tasks, { + const { errors, results, total } = await lando.runTasks(tasks, { renderer: 'lando', rendererOptions: { level: 0, @@ -94,7 +91,7 @@ module.exports = lando => { // if we have errors then lets print them out if (errors.length > 0) { // print the full errors - for (const error of errors) lando.log.debug(error); + for (const error of errors) lando.log(error); throw Error('There was a problem installing some of your plugins. Rerun with -vvv for more details.'); } }, diff --git a/tasks/plugin-login.js b/tasks/plugin-login.js index e99a708..b6d632e 100644 --- a/tasks/plugin-login.js +++ b/tasks/plugin-login.js @@ -1,13 +1,10 @@ 'use strict'; -module.exports = lando => { +module.exports = (lando) => { return { command: 'plugin-login', usage: '$0 plugin-login [--username ] [--password ] [--registry ]', - examples: [ - '$0 plugin-login --username riker --password "$TOKEN"', - '$0 plugin-login --registry https://npm.pkg.github.com', - ], + examples: ['$0 plugin-login --username riker --password "$TOKEN"', '$0 plugin-login --registry https://npm.pkg.github.com'], level: 'tasks', options: { username: { @@ -18,7 +15,7 @@ module.exports = lando => { type: 'string', message: 'Enter registry username', weight: 100, - validate: input => { + validate: (input) => { return typeof input === 'string' && input.length > 0 ? true : 'Must enter a username!'; }, }, @@ -31,7 +28,7 @@ module.exports = lando => { type: 'password', message: 'Enter registry password or token', weight: 200, - validate: input => { + validate: (input) => { return typeof input === 'string' && input.length > 0 ? true : 'Must enter a password or token!'; }, }, @@ -48,35 +45,35 @@ module.exports = lando => { array: true, }, }, - run: async options => { + run: async (options) => { const merge = require('lodash/merge'); const profile = require('npm-profile'); const getPluginConfig = require('../utils/get-plugin-config'); const lopts2Popts = require('../utils/lopts-2-popts'); const write = require('../utils/write-file'); - const {color} = require('listr2'); + const { color } = require('listr2'); // get relevant options - const {username, password, registry} = options; + const { username, password, registry } = options; // try to login try { // @NOTE: it also return ok=true? can it sometimes be not ok? - const {token} = await profile.loginCouch(username, password, {registry}); + const { token } = await profile.loginCouch(username, password, { registry }); // assemble and write new plugin configFile - const data = merge({}, getPluginConfig(lando.config.pluginConfigFile), lopts2Popts({...options, auth: [`${registry}=${token}`]})); // eslint-disable-line max-len + const data = merge({}, getPluginConfig(lando.config.pluginConfigFile), lopts2Popts({ ...options, auth: [`${registry}=${token}`] })); // eslint-disable-line max-len write(lando.config.pluginConfigFile, data); - lando.log.debug('wrote plugin config to %s', lando.config.pluginConfigFile); + lando.log('wrote plugin config to %s', lando.config.pluginConfigFile); // tell the user what happened console.log(`${color.green(username)} is now ${color.bold('logged in')} to ${color.magenta(registry)}!`); - // handle login errors + // handle login errors } catch (error) { // debug the original error - lando.log.debug('original error %j', error); + lando.log('original error %j', error); // for some reason not all errors have a non-zero code so enforce here error.code = 1; // malformed URL @@ -86,10 +83,10 @@ module.exports = lando => { // if we have a http status code then so we can reliably do some things if (error.statusCode) { error.message = `${error.body.error}`; - lando.log.debug('%s request failed to %s with status code %s', error.method, error.uri, error.statusCode); + lando.log('%s request failed to %s with status code %s', error.method, error.uri, error.statusCode); throw error; - // otherwise just throw and be done with it + // otherwise just throw and be done with it } else throw error; } }, diff --git a/tasks/plugin-logout.js b/tasks/plugin-logout.js index b576eb9..6e835fa 100644 --- a/tasks/plugin-logout.js +++ b/tasks/plugin-logout.js @@ -1,17 +1,17 @@ 'use strict'; -module.exports = lando => { +module.exports = (lando) => { return { command: 'plugin-logout', usage: '$0 plugin-logout', level: 'tasks', run: async () => { const write = require('../utils/write-file'); - const {color} = require('listr2'); + const { color } = require('listr2'); // write an empty config file write(lando.config.pluginConfigFile, {}); - lando.log.debug('wrote empty config to %s', lando.config.pluginConfigFile); + lando.log('wrote empty config to %s', lando.config.pluginConfigFile); // tell the user what happened console.log(`All ${color.bold('managed sessions')} have been ${color.red('destroyed')}!`); diff --git a/tasks/plugin-remove.js b/tasks/plugin-remove.js index 9a7f55d..d144617 100644 --- a/tasks/plugin-remove.js +++ b/tasks/plugin-remove.js @@ -1,12 +1,10 @@ 'use strict'; -module.exports = lando => { +module.exports = (lando) => { return { command: 'plugin-remove', usage: '$0 plugin-remove [plugin...]', - examples: [ - '$0 plugin-remove @lando/php @lando/node', - ], + examples: ['$0 plugin-remove @lando/php @lando/node'], level: 'tasks', positionals: { plugin: { @@ -14,25 +12,25 @@ module.exports = lando => { type: 'string', }, }, - run: async options => { + run: async (options) => { const Plugin = require('../components/plugin'); // reset Plugin.debug to use the lando 3 debugger - Plugin.debug = require('../utils/debug-shim')(lando.log); + Plugin.debug = lando.log; // merge plugins together, parse/normalize their names and return only unique values const plugins = options._.slice(1) - .map(plugin => require('../utils/parse-package-name')(plugin).name) + .map((plugin) => require('../utils/parse-package-name')(plugin).name) .filter((plugin, index, array) => array.indexOf(plugin) === index); - lando.log.debug('attempting to remove plugins %j', plugins); + lando.log('attempting to remove plugins %j', plugins); // prep listr things const tasks = plugins - .map(plugin => ([lando.config.plugins.find(p => p.name === plugin), plugin])) - .map(([plugin, fallback]) => require('../utils/get-plugin-remove-task')(plugin, {fallback, Plugin})); + .map((plugin) => [lando.config.plugins.find((p) => p.name === plugin), plugin]) + .map(([plugin, fallback]) => require('../utils/get-plugin-remove-task')(plugin, { fallback, Plugin })); // try to remove the plugins - const {errors, results, total} = await lando.runTasks(tasks, { + const { errors, results, total } = await lando.runTasks(tasks, { renderer: 'lando', rendererOptions: { level: 0, @@ -49,7 +47,7 @@ module.exports = lando => { // if we have errors then lets print them out if (errors.length > 0) { // print the full errors - for (const error of errors) lando.log.debug(error); + for (const error of errors) lando.log(error); throw Error('There was a problem removing some of your plugins. Rerun with -vvv for more details.'); } }, diff --git a/tasks/rebuild.js b/tasks/rebuild.js index a046900..51094ad 100644 --- a/tasks/rebuild.js +++ b/tasks/rebuild.js @@ -3,14 +3,12 @@ const _ = require('lodash'); const utils = require('./../lib/utils'); -module.exports = lando => { +module.exports = (lando) => { return { command: 'rebuild', describe: 'Rebuilds your app from scratch, preserving data', usage: '$0 rebuild [--service ...] [--yes]', - examples: [ - '$0 rebuild --service php --service nginx --yes', - ], + examples: ['$0 rebuild --service php --service nginx --yes'], options: { service: { describe: 'Rebuilds only the specified services', @@ -19,10 +17,10 @@ module.exports = lando => { }, yes: lando.cli.confirm('Are you sure you want to rebuild?'), }, - run: async options => { + run: async (options) => { // abort rebuild if consent is not given if (!options.yes) { - console.log(lando.cli.makeArt('appRebuild', {phase: 'abort'})); + console.log(lando.cli.makeArt('appRebuild', { phase: 'abort' })); return; } @@ -31,14 +29,14 @@ module.exports = lando => { // Rebuild the app if (app) { - console.log(lando.cli.makeArt('appRebuild', {name: app.name, phase: 'pre'})); + console.log(lando.cli.makeArt('appRebuild', { name: app.name, phase: 'pre' })); // run setup if we need to await require('../hooks/lando-run-setup')(lando); try { // If user has given us options then set those - if (!_.isEmpty(options.service)) app.opts = _.merge({}, app.opts, {services: options.service}); + if (!_.isEmpty(options.service)) app.opts = _.merge({}, app.opts, { services: options.service }); // rebuild hero await app.rebuild(); // determine legacy settings @@ -46,21 +44,21 @@ module.exports = lando => { // get scanner stuff const type = !_.isEmpty(app.messages) ? 'report' : 'post'; const phase = legacyScanner ? `${type}_legacy` : type; - const scans = _.find(app.checks, {type: 'url-scan-tasks'}); + const scans = _.find(app.checks, { type: 'url-scan-tasks' }); // rebuold tables - console.log(lando.cli.makeArt('appRebuild', {name: app.name, phase, messages: app.messages})); - console.log(lando.cli.formatData(utils.startTable(app, {legacyScanner}), {format: 'table'}, {border: false})); + console.log(lando.cli.makeArt('appRebuild', { name: app.name, phase, messages: app.messages })); + console.log(lando.cli.formatData(utils.startTable(app, { legacyScanner }), { format: 'table' }, { border: false })); // if we are not in legacy scanner mode then run the scans if (!legacyScanner && scans) await scans.test(...scans.args); - // print error message and reject + // print error message and reject } catch (error) { - app.log.error(error.message, error); - console.log(lando.cli.makeArt('appStart', {phase: 'error'})); + app.log(error.message, error); + console.log(lando.cli.makeArt('appStart', { phase: 'error' })); return lando.Promise.reject(error); - // plenty of gapp + // plenty of gapp } finally { console.log(' '); } diff --git a/tasks/restart.js b/tasks/restart.js index 2341bfb..d2bd9d2 100644 --- a/tasks/restart.js +++ b/tasks/restart.js @@ -3,18 +3,18 @@ const _ = require('lodash'); const utils = require('./../lib/utils'); -module.exports = lando => { +module.exports = (lando) => { return { command: 'restart', describe: 'Restarts your app', usage: '$0 restart', - run: async options => { + run: async (options) => { // Try to get our app const app = lando.getApp(options._app.root); // Restart it if we can! if (app) { - console.log(lando.cli.makeArt('appRestart', {name: app.name, phase: 'pre'})); + console.log(lando.cli.makeArt('appRestart', { name: app.name, phase: 'pre' })); // run setup if we need to await require('../hooks/lando-run-setup')(lando); @@ -28,22 +28,22 @@ module.exports = lando => { // get scanner stuff const type = !_.isEmpty(app.messages) ? 'report' : 'post'; const phase = legacyScanner ? `${type}_legacy` : type; - const scans = _.find(app.checks, {type: 'url-scan-tasks'}); + const scans = _.find(app.checks, { type: 'url-scan-tasks' }); // print post start table - console.log(lando.cli.makeArt('appStart', {name: app.name, phase, messages: app.messages})); - console.log(lando.cli.formatData(utils.startTable(app, {legacyScanner}), {format: 'table'}, {border: false})); + console.log(lando.cli.makeArt('appStart', { name: app.name, phase, messages: app.messages })); + console.log(lando.cli.formatData(utils.startTable(app, { legacyScanner }), { format: 'table' }, { border: false })); // if we are not in legacy scanner mode then run the scans if (!legacyScanner && scans) await scans.test(...scans.args); - // print error message and reject + // print error message and reject } catch (error) { - app.log.error(error.message, error); - console.log(lando.cli.makeArt('appStart', {phase: 'error'})); + app.log(error.message, error); + console.log(lando.cli.makeArt('appStart', { phase: 'error' })); return lando.Promise.reject(error); - // plenty of gapp + // plenty of gapp } finally { console.log(' '); } diff --git a/tasks/setup.js b/tasks/setup.js index cd097a5..771a13d 100644 --- a/tasks/setup.js +++ b/tasks/setup.js @@ -4,7 +4,7 @@ const groupBy = require('lodash/groupBy'); const merge = require('lodash/merge'); const sortBy = require('lodash/sortBy'); -const {color, figures} = require('listr2'); +const { color, figures } = require('listr2'); const defaultStatus = { 'CANNOT INSTALL': 0, @@ -14,13 +14,12 @@ const defaultStatus = { // helper to get a status groupings const getStatusGroups = (status = {}) => { - const results = Object.fromEntries(Object.entries(groupBy(status, 'state')) - .map(([state, items]) => ([state, items.length]))); + const results = Object.fromEntries(Object.entries(groupBy(status, 'state')).map(([state, items]) => [state, items.length])); return merge({}, defaultStatus, results); }; // get not installed message -const getNotInstalledMessage = item => { +const getNotInstalledMessage = (item) => { // start with the action and fallbacks` const message = [item.comment || `Will install ${item.version}` || 'Will install']; // add a restart message if applicable @@ -30,8 +29,8 @@ const getNotInstalledMessage = item => { }; // helper to get a renderable status table -const getStatusTable = items => ({ - rows: items.map(item => { +const getStatusTable = (items) => ({ + rows: items.map((item) => { switch (item.state) { case 'INSTALLED': return merge({}, item, { @@ -57,13 +56,13 @@ const getStatusTable = items => ({ } }), columns: { - description: {header: 'THING'}, - status: {header: 'STATUS'}, - comment: {header: 'COMMENT'}, + description: { header: 'THING' }, + status: { header: 'STATUS' }, + comment: { header: 'COMMENT' }, }, }); -module.exports = lando => { +module.exports = (lando) => { // get defaults from the lando config const defaults = lando.config.setup; // determine label for build engine @@ -138,7 +137,7 @@ module.exports = lando => { '$0 setup --skip-install-ca --build-engine 4.31.0 --build-engine-accept-license', ], options, - run: async options => { + run: async (options) => { // @TODO: conditional visibility for lando setup re first time run succesfully? const parsePkgName = require('../utils/parse-package-name'); const ux = lando.cli.getUX(); @@ -153,7 +152,7 @@ module.exports = lando => { // start by looping through option.plugin and object merging // this should allow us to skip plugin-resolution because its just going to always use the "last" version for (const plugin of options.plugin) { - const {name, peg} = parsePkgName(plugin); + const { name, peg } = parsePkgName(plugin); options.plugins[name] = peg === '*' ? 'latest' : peg; } @@ -162,8 +161,11 @@ module.exports = lando => { const pstatus = await lando.getInstallPluginsStatus(options); const pstatusSummary = getStatusGroups(pstatus); options.installPlugins = pstatusSummary['NOT INSTALLED'] + pstatusSummary['CANNOT INSTALL'] > 0; - ux.action.stop(options.installPlugins ? `${color.green('done')} ${color.dim('[see table below]')}` - : `${color.green('done')} ${color.dim('[nothing to install]')}`); + ux.action.stop( + options.installPlugins + ? `${color.green('done')} ${color.dim('[see table below]')}` + : `${color.green('done')} ${color.dim('[nothing to install]')}`, + ); // filter out any plugins that are alrady installed for (const plugin of pstatus) { @@ -174,7 +176,7 @@ module.exports = lando => { // show plugin install status/summary and prompt if needed if (options.installPlugins && options.yes === false) { - const {rows, columns} = getStatusTable(pstatus); + const { rows, columns } = getStatusTable(pstatus); // print table console.log(''); ux.table(sortBy(rows, ['row', 'weight']), columns); @@ -186,7 +188,7 @@ module.exports = lando => { const answer = await ux.confirm(color.bold('DO YOU CONSENT?')); if (!answer) throw new Error('Setup terminated!'); - // things are probably not ok + // things are probably not ok } else { console.log(`Lando has detected that ${pstatusSummary['CANNOT INSTALL']} plugins listed above cannot install correctly.`); // eslint-disable-line max-len console.log(color.magenta('It may be wise to resolve their issues before continuing!')); @@ -203,7 +205,7 @@ module.exports = lando => { // @NOTE: should a plugin install error stop the rest of setup? if (presults.errors.length > 0) { const error = new Error(`A setup error occured! Rerun with ${color.bold('lando setup --debug')} for more info.`); // eslint-disable-line max-len - lando.log.debug('%j', presults.errors[0]); + lando.log('%j', presults.errors[0]); throw error; } @@ -215,13 +217,16 @@ module.exports = lando => { const sstatus = await lando.getSetupStatus(options); const sstatusSummary = getStatusGroups(sstatus); options.installTasks = sstatusSummary['NOT INSTALLED'] + sstatusSummary['CANNOT INSTALL'] > 0; - ux.action.stop(options.installTasks ? `${color.green('done')} ${color.dim('[see table below]')}` - : `${color.green('done')} ${color.dim('[nothing to install]')}`); + ux.action.stop( + options.installTasks + ? `${color.green('done')} ${color.dim('[see table below]')}` + : `${color.green('done')} ${color.dim('[nothing to install]')}`, + ); // show setup status/summary and prompt if needed if (options.installTasks && options.yes === false) { // @TODO: lando plugin header install art - const {rows, columns} = getStatusTable(sstatus); + const { rows, columns } = getStatusTable(sstatus); // print table console.log(''); @@ -234,7 +239,7 @@ module.exports = lando => { const answer = await ux.confirm(color.bold('DO YOU CONSENT?')); if (!answer) throw new Error('Setup terminated!'); - // things are probably not ok + // things are probably not ok } else { console.log(`Lando has detected that ${sstatusSummary['CANNOT INSTALL']} setup tasks listed above cannot run correctly.`); // eslint-disable-line max-len console.log(color.magenta('It may be wise to resolve their issues before continuing!')); @@ -258,14 +263,16 @@ module.exports = lando => { // we didnt have to do anything if (errors.length === 0 && results.length === 0) { - console.log(`As far as ${color.bold('lando setup')} can tell you are ${color.green('good to go')} and do not require additional setup!`); // eslint-disable-line max-len + console.log( + `As far as ${color.bold('lando setup')} can tell you are ${color.green('good to go')} and do not require additional setup!`, + ); // eslint-disable-line max-len return; } // if we had errors if (errors.length > 0) { const error = new Error(`A setup error occured! Rerun with ${color.bold('lando setup --debug')} for more info.`); // eslint-disable-line max-len - lando.log.debug('%j', errors[0]); + lando.log('%j', errors[0]); throw error; } @@ -285,12 +292,12 @@ module.exports = lando => { } ux.action.start('Restarting'); await require('../utils/shutdown-os')({ - debug: require('../utils/debug-shim')(lando.log), + debug: lando.log, message: 'Lando needs to restart to complete setup!', }); ux.action.stop(color.green('done')); - // otherwise the usual success message + // otherwise the usual success message } else { console.log(`Setup installed ${color.green(results.length)} of ${color.bold(results.length)} things successfully!`); // eslint-disable-line max-len console.log(`You are now ${color.green('good to go')} and can start using Lando!`); diff --git a/tasks/share.js b/tasks/share.js deleted file mode 100644 index b0c7946..0000000 --- a/tasks/share.js +++ /dev/null @@ -1,35 +0,0 @@ -'use strict'; - -module.exports = lando => { - return { - command: 'share', - usage: '$0 share', - run: () => { - console.log(lando.cli.makeArt('shareWait')); - /* - if (u.parse(options.url).hostname !== 'localhost' || u.parse(options.url).protocol !== 'http:') { - throw new Error('Need a url of the form http://localhost:port!'); - } - // Try to get our app - const app = lando.getApp(options._app.root); - // Get the sharing url - if (app) { - console.log(lando.cli.makeArt('tunnel', {phase: 'pre'})); - // Ensure the app is up and lets share - return app.init().then(app => lando.metrics.report('share', {})) - // Get the URLS - .then(() => { - const config = parseConfig(u.parse(options.url).port, _.lowerCase(app.name).replace(/[^0-9a-z]/g, '')); - // Set up the localtunnel - localtunnel(config.port, {subdomain: config.host}, (err, tunnel) => { - // Error if needed - if (err) lando.log.error(err); - // Handler - tunnelHandler(tunnel, lando); - }); - }); - } - */ - }, - }; -}; diff --git a/tasks/shellenv.js b/tasks/shellenv.js index 391de50..c88bd5a 100644 --- a/tasks/shellenv.js +++ b/tasks/shellenv.js @@ -1,16 +1,13 @@ 'use strict'; const os = require('os'); -const {color} = require('listr2'); +const { color } = require('listr2'); -module.exports = lando => { +module.exports = (lando) => { return { command: 'shellenv', usage: '$0 shellenv [--check] [--shell ]', - examples: [ - '$0 shellenv --check', - '$0 shellenv --shell bash', - ], + examples: ['$0 shellenv --check', '$0 shellenv --shell bash'], level: 'tasks', options: { add: { @@ -25,8 +22,8 @@ module.exports = lando => { }, }, - run: async options => { - const debug = require('../utils/debug-shim')(lando.log); + run: async (options) => { + const debug = lando.log; // get shell paths from cli // @NOTE: in lando 3 it _should_be impossible for this to be undefined but should we throw an error? @@ -45,14 +42,14 @@ module.exports = lando => { // handle the special case of cmd.exe since it has no relavent shell profile if (shellEnv.length > 0 && require('../utils/get-user-shell')() === 'cmd.exe') { // build out args - const args = require('string-argv')(shellEnv.map(line => line[0]).join(' && ')); + const args = require('string-argv')(shellEnv.map((line) => line[0]).join(' && ')); // @TODO: we really need to use is-elevated instead of is-root but we are ommiting for now since lando // really cant run elevated anyway and its a bunch of extra effort to make all of this aysnc // in Lando 4 this will need to be resolved though. - const {stderr, code} = require('is-root')() - ? await require('../utils/run-elevated')(args, {debug}) - : await require('../utils/run-command')(args[0], args.slice(1), {debug, ignoreReturnCode: true}); + const { stderr, code } = require('is-root')() + ? await require('../utils/run-elevated')(args, { debug }) + : await require('../utils/run-command')(args[0], args.slice(1), { debug, ignoreReturnCode: true }); // throw error if (code !== 0) throw new Error(`Could not add to PATH with error: ${stderr}`); @@ -65,33 +62,33 @@ module.exports = lando => { console.log(`Start a new terminal session to use ${color.bold(`lando`)}`); return; - // otherwise update the shell profile + // otherwise update the shell profile } else if (shellEnv.length > 0) { require('../utils/update-shell-profile')(options.add, shellEnv); console.log(`Updated ${color.green(options.add)} to include:`); console.log(); - console.log(color.bold(shellEnv.map(line => line[0]).join(os.EOL))); + console.log(color.bold(shellEnv.map((line) => line[0]).join(os.EOL))); console.log(); console.log(`Start a new terminal session or run ${color.bold(`eval "$(lando shellenv)"`)} to use ${color.bold(`lando`)}`); } else { console.log(`Looks like ${color.green(options.add)} is already ready to go!`); } - // if we are checking + // if we are checking } else if (options.check) { - const {entrypoint} = lando?.config?.cli ?? {}; + const { entrypoint } = lando?.config?.cli ?? {}; if (require('../utils/is-in-path')(entrypoint)) { console.log(`${color.green(entrypoint)} is in ${color.bold('PATH')}`); - // throw if not + // throw if not } else throw new Error(`${color.red(entrypoint)} does not appear to be in ${color.bold('PATH')}!`); - // shell env is already set up + // shell env is already set up } else if (shellEnv.length === 0) { console.error(`Looks like your shell is already ready to go!`); - // finally just print the thing + // finally just print the thing } else { - console.log(shellEnv.map(line => line[0]).join(os.EOL)); + console.log(shellEnv.map((line) => line[0]).join(os.EOL)); } }, }; diff --git a/tasks/ssh.js b/tasks/ssh.js deleted file mode 100644 index ac325fc..0000000 --- a/tasks/ssh.js +++ /dev/null @@ -1,79 +0,0 @@ -'use strict'; - -// Modules -const _ = require('lodash'); - -// Other things -const bashme = ['/bin/sh', '-c', 'if ! type bash > /dev/null; then sh; else bash; fi']; - -module.exports = (lando, app) => ({ - command: 'ssh', - usage: '$0 ssh [--command ] [--service ] [--user ]', - examples: [ - '$0 ssh --command "env | grep LANDO_ | sort"', - '$0 ssh --command "apt update -y && apt install vim -y --user root --service appserver"', - ], - override: true, - options: { - service: { - describe: 'SSHs into this service', - alias: ['s'], - default: app._defaultService ?? 'appserver', - }, - command: { - describe: 'Runs a command in the service', - alias: ['c'], - }, - user: { - describe: 'Runs as a specific user', - alias: ['u'], - }, - }, - run: ({command = bashme, service = 'appserver', user = null, _app = {}} = {}) => { - // Try to get our app - const app = lando.getApp(_app.root, false); - - // If we have it then init and DOOOO EEEET - if (app) { - return app.init().then(() => { - // get the service api if possible - const api = _.get(_.find(app.info, {service}), 'api', 3); - // set additional opt defaults if possible - const opts = [undefined, api === 4 ? undefined : '/app']; - // mix any v4 service info on top of app.config.services - const services = _(_.get(app, 'config.services', {})) - .map((service, id) => _.merge({}, {id}, service)) - .map(service => _.merge({}, service, _.find(_.get(app, 'v4.services', []), s => s.id === service.id))) - .value(); - - // attempt to get additional information about the service, this means that service.appMount **should** work - // for v3 services if it is set however it is technically unsupported - if (_.find(services, s => s.id === service)) { - const config = _.find(services, s => s.id === service); - const workdir = config?.config?.overrides?.working_dir ?? config?.config?.working_dir; - // prefer appmount - if (config.appMount) opts[1] = config.appMount; - // fallback to working dir if available - if (!config.appMount && workdir) opts[0] = workdir; - } - - // continue - if (_.isNull(user)) user = require('../utils/get-user')(service, app.info); - return lando.engine.run(require('../utils/build-tooling-runner')( - app, - command, - service, - user, - { - DEBUG: lando.debuggy ? '1' : '', - LANDO_DEBUG: lando.debuggy ? '1' : '', - }, - ...opts, - )).catch(error => { - error.hide = true; - throw error; - }); - }); - } - }, -}); diff --git a/tasks/start.js b/tasks/start.js index 349f629..618836c 100644 --- a/tasks/start.js +++ b/tasks/start.js @@ -3,18 +3,18 @@ const _ = require('lodash'); const utils = require('./../lib/utils'); -module.exports = lando => { +module.exports = (lando) => { return { command: 'start', describe: 'Starts your app', usage: '$0 start', - run: async options => { + run: async (options) => { // Try to get our app const app = lando.getApp(options._app.root); // Start it if we can! if (app) { - console.log(lando.cli.makeArt('appStart', {name: app.name, phase: 'pre'})); + console.log(lando.cli.makeArt('appStart', { name: app.name, phase: 'pre' })); // run setup if we need to await require('../hooks/lando-run-setup')(lando); @@ -28,22 +28,22 @@ module.exports = lando => { // get scanner stuff const type = !_.isEmpty(app.messages) ? 'report' : 'post'; const phase = legacyScanner ? `${type}_legacy` : type; - const scans = _.find(app.checks, {type: 'url-scan-tasks'}); + const scans = _.find(app.checks, { type: 'url-scan-tasks' }); // print post start table - console.log(lando.cli.makeArt('appStart', {name: app.name, phase, messages: app.messages})); - console.log(lando.cli.formatData(utils.startTable(app, {legacyScanner}), {format: 'table'}, {border: false})); + console.log(lando.cli.makeArt('appStart', { name: app.name, phase, messages: app.messages })); + console.log(lando.cli.formatData(utils.startTable(app, { legacyScanner }), { format: 'table' }, { border: false })); // if we are not in legacy scanner mode then run the scans if (!legacyScanner && scans) await scans.test(...scans.args); - // print error message and reject + // print error message and reject } catch (error) { - app.log.error(error.message, error); - console.log(lando.cli.makeArt('appStart', {phase: 'error'})); + app.log(error.message, error); + console.log(lando.cli.makeArt('appStart', { phase: 'error' })); return lando.Promise.reject(error); - // plenty of gapp + // plenty of gapp } finally { console.log(' '); } diff --git a/tasks/update.js b/tasks/update.js index 69938c6..227c02f 100644 --- a/tasks/update.js +++ b/tasks/update.js @@ -3,7 +3,7 @@ const groupBy = require('lodash/groupBy'); const merge = require('lodash/merge'); -const {color, figures} = require('listr2'); +const { color, figures } = require('listr2'); const defaultStatus = { 'NO UPDATE': 0, @@ -14,13 +14,12 @@ const defaultStatus = { // helper to get a status groupings const getStatusGroups = (status = {}) => { - const results = Object.fromEntries(Object.entries(groupBy(status, 'state')) - .map(([state, items]) => ([state, items.length]))); + const results = Object.fromEntries(Object.entries(groupBy(status, 'state')).map(([state, items]) => [state, items.length])); return merge({}, defaultStatus, results); }; // get not installed message -const getUpdateMessage = item => { +const getUpdateMessage = (item) => { // pieces of you const rn = item.rnt ? item.rnt.replace('${version}', item.update.version) : undefined; const update = `${item.update.version}-${item.update.channel}`; @@ -29,7 +28,7 @@ const getUpdateMessage = item => { }; // get not installed message -const getCannotUpdateMessage = item => { +const getCannotUpdateMessage = (item) => { if (item.source) return 'Running from source. Please update manually.'; if (item.legacyPlugin) { return 'Legacy plugin. Please see: https://docs.lando.dev/guides/updating-plugins-v4.html#lando-3-21-0'; @@ -39,8 +38,8 @@ const getCannotUpdateMessage = item => { }; // helper to get a renderable status table -const getStatusTable = items => ({ - rows: items.map(item => { +const getStatusTable = (items) => ({ + rows: items.map((item) => { switch (item.state) { case 'NO UPDATE': return merge({}, item, { @@ -69,16 +68,16 @@ const getStatusTable = items => ({ } }), columns: { - name: {header: 'PACKAGE'}, - status: {header: 'STATUS'}, - comment: {header: 'COMMENT'}, + name: { header: 'PACKAGE' }, + status: { header: 'STATUS' }, + comment: { header: 'COMMENT' }, }, }); -module.exports = lando => { +module.exports = (lando) => { // default options const options = { - 'yes': { + yes: { describe: 'Runs non-interactively with all accepted default answers', alias: ['y'], default: !lando.config.isInteractive, @@ -90,28 +89,29 @@ module.exports = lando => { command: 'update', describe: 'Updates lando', usage: '$0 update [--yes]', - examples: [ - '$0 update --yes', - ], + examples: ['$0 update --yes'], options, - run: async options => { + run: async (options) => { const sortBy = require('lodash/sortBy'); const ux = lando.cli.getUX(); // add the plugins and install dir - const dir = lando.config.pluginDirs.find(dir => dir.type === require('../utils/get-plugin-type')()); + const dir = lando.config.pluginDirs.find((dir) => dir.type === require('../utils/get-plugin-type')()); lando.updates.plugins = lando.config.plugins; lando.updates.dir = dir ? dir.dir : undefined; // get updatable items ux.action.start('Generating update matrix'); const checks = await lando.updates.check(); - const updatesAvailable = checks.some(result => result.updateAvailable !== false); - ux.action.stop(updatesAvailable ? `${color.green('done')} ${color.dim('[see table below]')}` - : `${color.green('done')} ${color.dim('[nothing to update]')}`); + const updatesAvailable = checks.some((result) => result.updateAvailable !== false); + ux.action.stop( + updatesAvailable + ? `${color.green('done')} ${color.dim('[see table below]')}` + : `${color.green('done')} ${color.dim('[nothing to update]')}`, + ); // map into things for tabular display - const items = checks.map(item => { + const items = checks.map((item) => { if (item.update && item.update.error) item.state = 'ERROR'; else if (!item.isUpdateable) item.state = 'CANNOT UPDATE'; else if (item.updateAvailable === false) item.state = 'NO UPDATE'; @@ -121,7 +121,7 @@ module.exports = lando => { // show plugin install status summary unless non-interactive if (options.yes === false) { - const {rows, columns} = getStatusTable(items); + const { rows, columns } = getStatusTable(items); // print table console.log(''); ux.ux.table(sortBy(rows, ['row', 'name']), columns); @@ -136,7 +136,7 @@ module.exports = lando => { const answer = await ux.confirm(color.bold('DO YOU CONSENT?')); if (!answer) throw new Error('Update terminated!'); - // things are probably not ok + // things are probably not ok } else { console.log(`Lando has detected that ${summary['ERROR']} package(s) listed above has update errors.`); // eslint-disable-line max-len console.log(color.magenta(`It may be wise to resolve their issues before updating the other ${summary['HAS UPDATE']}!`)); // eslint-disable-line max-len @@ -150,7 +150,7 @@ module.exports = lando => { const tasks = await lando.updates.getUpdateTasks(); // try to update the plugins - const {errors, results} = await lando.runTasks(tasks, { + const { errors, results } = await lando.runTasks(tasks, { renderer: 'lando', rendererOptions: { level: 0, @@ -162,9 +162,9 @@ module.exports = lando => { lando.cache.remove('updates-2'); // throw an error if there is an update error - if (items.filter(item => item.state === 'ERROR').length > 0) { - const badcheck = items.find(item => item.state === 'ERROR'); - lando.log.debug('an update error check occured with %o', badcheck.update); + if (items.filter((item) => item.state === 'ERROR').length > 0) { + const badcheck = items.find((item) => item.state === 'ERROR'); + lando.log('an update error check occured with %o', badcheck.update); lando.exitCode = 14; } @@ -177,7 +177,7 @@ module.exports = lando => { // if we had errors if (errors.length > 0) { const error = new Error(`An update error occured! Rerun with ${color.bold('lando update --debug')} for more info.`); // eslint-disable-line max-len - lando.log.debug('%j', errors[0]); + lando.log('%j', errors[0]); throw error; } diff --git a/utils/build-config.js b/utils/build-config.js index 39cf1db..060a6e6 100644 --- a/utils/build-config.js +++ b/utils/build-config.js @@ -15,7 +15,7 @@ const parseLandofileConfig = (config = {}) => ({ landoFile: true, }); -module.exports = options => { +module.exports = (options) => { // Modules const hasher = require('object-hash'); @@ -31,7 +31,7 @@ module.exports = options => { // add the core config.yaml as a config source if we have it, ideally splice it in after the cli config // but if we cant then just put it at the beginning if (fs.existsSync(path.resolve(__dirname, '..', 'config.yml'))) { - const splicedex = _.findIndex(config.configSources, element => _.endsWith(element, '/cli/config.yml')) || 0; + const splicedex = _.findIndex(config.configSources, (element) => _.endsWith(element, '/cli/config.yml')) || 0; config.configSources.splice(splicedex + 1, 0, path.resolve(__dirname, '..', 'config.yml')); } @@ -74,11 +74,9 @@ module.exports = options => { if (config.composeBin && !config.orchestratorBin) config.orchestratorBin = config.composeBin; // If orchestratorBin is set, is an absolute path and exists then unset orchestratorVersion and rely on this alone - if (typeof config.orchestratorBin === 'string' - && path.isAbsolute(config.orchestratorBin) - && fs.existsSync(config.orchestratorBin)) { + if (typeof config.orchestratorBin === 'string' && path.isAbsolute(config.orchestratorBin) && fs.existsSync(config.orchestratorBin)) { delete config.orchestratorVersion; - // Otherwise remove orchestratorBin and rely on orchestratorVersion alone + // Otherwise remove orchestratorBin and rely on orchestratorVersion alone } else { delete config.orchestratorBin; } @@ -108,4 +106,3 @@ module.exports = options => { // Return the config return config; }; - diff --git a/utils/debug-shim.js b/utils/debug-shim.js deleted file mode 100644 index b7239e2..0000000 --- a/utils/debug-shim.js +++ /dev/null @@ -1,56 +0,0 @@ -'use strict'; - -const _debug = require('debug'); - -const Log = require('./../lib/logger'); - -// adds required methods to ensure the lando v3 debugger can be injected into v4 things -module.exports = (log, {namespace} = {}) => { - const fresh = new Log({...log.shim, extra: namespace}); - - // add sanitization - fresh.alsoSanitize(/_auth$/); - fresh.alsoSanitize(/_authToken$/); - fresh.alsoSanitize(/_password$/); - fresh.alsoSanitize('forceAuth'); - - // spoofer - const spoofer = _debug(namespace ?? 'lando'); - spoofer.diff = 0; - - // we need to start with the function itself and then augment it - const debug = (...args) => { - args[0] = _debug.coerce(args[0]); - - if (typeof args[0] !== 'string') args.unshift('%O'); - - // Apply any `formatters` transformations - let index = 0; - args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => { - // If we encounter an escaped % then don't increase the array index - if (match === '%%') { - return '%'; - } - index++; - const formatter = _debug.formatters[format]; - if (typeof formatter === 'function') { - const val = args[index]; - match = formatter.call(spoofer, val); - - args.splice(index, 1); - index--; - } - return match; - }); - - fresh.debug(...args); - }; - - // contract and replace should do nothing - debug.contract = () => debug; - debug.replace = () => debug; - // extend should just return a new logger - debug.extend = name => module.exports(log, {namespace: name}); - - return debug; -}; diff --git a/utils/download-x.js b/utils/download-x.js index 88ccba6..6072284 100644 --- a/utils/download-x.js +++ b/utils/download-x.js @@ -5,103 +5,103 @@ const os = require('os'); const path = require('path'); const remove = require('./remove'); -const {EventEmitter} = require('events'); -const {nanoid} = require('nanoid'); +const { EventEmitter } = require('events'); +const { nanoid } = require('nanoid'); -const axios = require('../utils/get-axios')({}, {}, {rejectUnauthorized: false}); +const axios = require('../utils/get-axios')({}, {}, { rejectUnauthorized: false }); // helper to get a platform spec tmpfile const tmpfile = () => { return process.platform === 'win32' ? path.join(os.tmpdir(), `${nanoid()}.exe`) : path.join(os.tmpdir(), nanoid()); }; -module.exports = (url, { - debug = require('debug')('@lando/download-x'), - dest = path.join(os.tmpdir(), nanoid()), - test = false} = {}, -) => { +module.exports = (url, { debug = require('debug')('@lando/download-x'), dest = path.join(os.tmpdir(), nanoid()), test = false } = {}) => { // create an event emitter we can return const download = new EventEmitter(); // download progress event - const onDownloadProgress = data => { + const onDownloadProgress = (data) => { data.percentage = Math.round(data.progress * 100); download.emit('progress', data); debug('downloading %o to %o... (%o%)', url, dest, data.percentage); }; // get the stream and start writing - axios({url, responseType: 'stream', onDownloadProgress}).then(response => new Promise((resolve, reject) => { - // emit response and add the data stream to the event emitter - download.emit('response', response); - // set some props for later - download.data = response.data; - download.status = response.status; - download.statusText = response.statusText; + axios({ url, responseType: 'stream', onDownloadProgress }) + .then( + (response) => + new Promise((resolve, reject) => { + // emit response and add the data stream to the event emitter + download.emit('response', response); + // set some props for later + download.data = response.data; + download.status = response.status; + download.statusText = response.statusText; - // get a temporary destination test file and writer - download.testfile = tmpfile(); - const writer = fs.createWriteStream(download.testfile); - // and write dat data - response.data.pipe(writer); - // resolve promise - writer.on('error', error => reject(error)); - writer.on('close', () => resolve()); - // debug - debug('downloading %o %o with code %o', url, response.statusText, response.status); - })) + // get a temporary destination test file and writer + download.testfile = tmpfile(); + const writer = fs.createWriteStream(download.testfile); + // and write dat data + response.data.pipe(writer); + // resolve promise + writer.on('error', (error) => reject(error)); + writer.on('close', () => resolve()); + // debug + debug('downloading %o %o with code %o', url, response.statusText, response.status); + }), + ) - // an error has occured - .catch(error => { - // if error has a status code then rewrite message - if (error?.response?.status) { - error.message = `could not download ${url} [${error.response.status}] ${error.response.statusText}`; - } + // an error has occured + .catch((error) => { + // if error has a status code then rewrite message + if (error?.response?.status) { + error.message = `could not download ${url} [${error.response.status}] ${error.response.statusText}`; + } - download.error = error; - download.emit('error', download.error); - }) + download.error = error; + download.emit('error', download.error); + }) - // trust but verify - .finally(async () => { - // if the file exists then try to finish up - if (fs.existsSync(download.testfile)) { - require('./make-executable')([path.basename(download.testfile)], path.dirname(download.testfile)); - // run the test if we have one - download.test = test ? require('./spawn-sync-stringer')(download.testfile, test) : false; - const {pid, status, stderr, stdout} = download.test; + // trust but verify + .finally(async () => { + // if the file exists then try to finish up + if (fs.existsSync(download.testfile)) { + require('./make-executable')([path.basename(download.testfile)], path.dirname(download.testfile)); + // run the test if we have one + download.test = test ? require('./spawn-sync-stringer')(download.testfile, test) : false; + const { pid, status, stderr, stdout } = download.test; - // if we have a test and it succeeded just let the people know - if (download.test !== false && download.test.status === 0) { - debug('%o download test %o passed with %o', url, test.join(' '), stdout); - } + // if we have a test and it succeeded just let the people know + if (download.test !== false && download.test.status === 0) { + debug('%o download test %o passed with %o', url, test.join(' '), stdout); + } - // if we have a test and it failed then yet another error - if (download.test !== false && download.test.status !== 0) { - const error = new Error(`${url} download test ${test.join(' ')} failed with code ${status} and ${stderr}`); - error.pid = pid; - error.stdout = stdout; - error.status = status; - debug(error.message); - download.emit('error', error); + // if we have a test and it failed then yet another error + if (download.test !== false && download.test.status !== 0) { + const error = new Error(`${url} download test ${test.join(' ')} failed with code ${status} and ${stderr}`); + error.pid = pid; + error.stdout = stdout; + error.status = status; + debug(error.message); + download.emit('error', error); - // otherwise we assume all is well and we emit success! - } else { - if (fs.existsSync(dest)) remove(dest); - fs.mkdirSync(path.dirname(dest), {recursive: true}); - fs.copyFileSync(download.testfile, dest); - debug('downloaded %o to %o', url, dest); - const data = {dest, url, test: download.test, status: download.status, text: download.statusText}; - download.emit('success', data); - download.emit('done', data); + // otherwise we assume all is well and we emit success! + } else { + if (fs.existsSync(dest)) remove(dest); + fs.mkdirSync(path.dirname(dest), { recursive: true }); + fs.copyFileSync(download.testfile, dest); + debug('downloaded %o to %o', url, dest); + const data = { dest, url, test: download.test, status: download.status, text: download.statusText }; + download.emit('success', data); + download.emit('done', data); + } } - } - }); + }); // merge promise magix so we can await or not return require('./merge-promise')(download, async () => { return new Promise((resolve, reject) => { - download.on('error', error => reject(error)); - download.on('success', success => resolve(success)); + download.on('error', (error) => reject(error)); + download.on('success', (success) => resolve(success)); }); }); }; diff --git a/utils/get-axios.js b/utils/get-axios.js index a853fb2..5bd7990 100644 --- a/utils/get-axios.js +++ b/utils/get-axios.js @@ -2,10 +2,9 @@ const axios = require('axios'); -const {HttpAgent, HttpsAgent} = require('@npmcli/agent'); - -module.exports = (opts = {}, httpOpts = {}, httpsOpts = {}) => axios.create({ - httpAgent: new HttpAgent({family: 4, ...httpOpts}), - httpsAgent: new HttpsAgent({family: 4, ...httpsOpts}), - ...opts, -}); +module.exports = (opts = {}, httpOpts = {}, httpsOpts = {}) => + axios.create({ + adapter: 'fetch', + ...opts, + proxy: false, + }); diff --git a/utils/get-cache-dir.js b/utils/get-cache-dir.js deleted file mode 100644 index 2d1c3ee..0000000 --- a/utils/get-cache-dir.js +++ /dev/null @@ -1,38 +0,0 @@ -'use strict'; - -const os = require('os'); -const path = require('path'); - -const getOClifHome = () => { - switch (process.platform) { - case 'darwin': - case 'linux': - return process.env.HOME || os.homedir() || os.tmpdir(); - case 'win32': - return process.env.HOME - || (process.env.HOMEDRIVE && process.env.HOMEPATH && path.join(process.env.HOMEDRIVE, process.env.HOMEPATH)) - || process.env.USERPROFILE - || os.homedir() - || os.tmpdir(); - } -}; - -/* - * Get oclif base dir based on platform - */ -const getOClifBase= product => { - const base = process.env['XDG_CACHE_HOME'] - || (process.platform === 'win32' && process.env.LOCALAPPDATA) - || path.join(getOClifHome(), '.cache'); - return path.join(base, product); -}; - -const macosCacheDir = product => { - return process.platform === 'darwin' ? path.join(getOClifHome(), 'Library', 'Caches', product) : undefined; -}; - -module.exports = (product = 'hyperdrive') => { - return process.env[`${product.toUpperCase()}_CACHE_DIR`] - || macosCacheDir(product) - || getOClifBase(product); -}; diff --git a/utils/get-commit-hash.js b/utils/get-commit-hash.js deleted file mode 100644 index a90673c..0000000 --- a/utils/get-commit-hash.js +++ /dev/null @@ -1,31 +0,0 @@ -'use strict'; - -const fs = require('fs'); -const path = require('path'); - -module.exports = (dir, { - refFile = path.join(dir, '.git', 'HEAD'), - short = false, -} = {}) => { - // if reffile doesnt exist then return false - if (!fs.existsSync(refFile)) return false; - - const gitBase = path.join(dir, '.git'); - - // if the refFile has another ref in it then we need to reset the reffile - if (fs.readFileSync(refFile, {encoding: 'utf-8'}).startsWith('ref: ')) { - const contents = fs.readFileSync(refFile, {encoding: 'utf-8'}).trim(); - const parts = contents.split('ref: '); - const ref = parts[1] ? parts[1] : 'HEAD'; - refFile = path.join(gitBase, ref); - } - - // get the commit - const commit = fs.readFileSync(refFile, {encoding: 'utf-8'}).trim(); - - // if we are "short" then return first seven - if (short && typeof commit === 'string') return commit.slice(0, 7); - - // otherwise just return the whole thing - return commit; -}; diff --git a/utils/get-default-config.js b/utils/get-default-config.js deleted file mode 100644 index b062d97..0000000 --- a/utils/get-default-config.js +++ /dev/null @@ -1,20 +0,0 @@ -'use strict'; - -const os = require('os'); -const path = require('path'); - -module.exports = ({ - envPrefix = 'LANDO', - runtime = 3, - userConfRoot = path.join(os.homedir(), '.lando'), - srcRoot = path.resolve(__dirname, '..'), -} = {}) => ({ - configSources: [path.join(srcRoot, 'config.yml'), path.join(userConfRoot, 'config.yml')], - envPrefix, - landoFile: '.lando.yml', - preLandoFiles: ['.lando.base.yml', '.lando.dist.yml', '.lando.recipe.yml', '.lando.upstream.yml'], - postLandoFiles: ['.lando.local.yml', '.lando.user.yml'], - runtime, - srcRoot, - userConfRoot, -}); diff --git a/utils/get-engine-config.js b/utils/get-engine-config.js index 6590600..849bae8 100644 --- a/utils/get-engine-config.js +++ b/utils/get-engine-config.js @@ -5,24 +5,27 @@ const fs = require('fs'); const path = require('path'); const url = require('url'); -const setDockerHost = (hostname, port = 2376) => url.format({ - protocol: 'tcp', - slashes: true, - hostname, - port, -}); +const setDockerHost = (hostname, port = 2376) => + url.format({ + protocol: 'tcp', + slashes: true, + hostname, + port, + }); -module.exports = ({engineConfig = {}, env = {}}) => { +module.exports = ({ engineConfig = {}, env = {} }) => { // Set defaults if we have to if (_.isEmpty(engineConfig)) { engineConfig = { - socketPath: (process.platform === 'win32') ? '//./pipe/docker_engine' : '/var/run/docker.sock', - host: '127.0.0.1', - port: 2376, + socketPath: process.platform === 'win32' ? '//./pipe/docker_engine' : '/var/run/docker.sock', + // host: '127.0.0.1', + // port: 2376, }; } + // Set the docker host if its non-standard - if (engineConfig.host !== '127.0.0.1') env.DOCKER_HOST = setDockerHost(engineConfig.host, engineConfig.port); + if (engineConfig.host && engineConfig.host !== '127.0.0.1') env.DOCKER_HOST = setDockerHost(engineConfig.host, engineConfig.port); + // Set the TLS/cert things if needed if (_.has(engineConfig, 'certPath')) { env.DOCKER_CERT_PATH = engineConfig.certPath; diff --git a/utils/get-object-keys.js b/utils/get-object-keys.js deleted file mode 100644 index 2aec057..0000000 --- a/utils/get-object-keys.js +++ /dev/null @@ -1,22 +0,0 @@ -'use strict'; - -/* - * Returns an array of all keys, nested or otherwise, as "." separated paths but does not expand arrays - * @TODO: implement depth? this is needed for upstream things like get-object-size? - */ -module.exports = (data, {prefix = '', expandArrays = true, separator = '.'} = {}) => { - return Object.keys(data).reduce((keys, key) => { - // if we have a primitive then return the path - if (!data[key] || typeof data[key] !== 'object' || Object.keys(data[key]).length === 0) { - return [...keys, `${prefix}${key}`]; - } - - // if we arent expanding arrays then dont return paths with array indexes - if (!expandArrays && Array.isArray(data[key])) { - return [...keys, `${prefix}${key}`]; - } - - // otherwise cycle through again - return [...keys, ...module.exports(data[key], {expandArrays, prefix: `${prefix}${key}${separator}`})]; - }, []); -}; diff --git a/utils/get-system-data-dir.js b/utils/get-system-data-dir.js deleted file mode 100644 index f431ff6..0000000 --- a/utils/get-system-data-dir.js +++ /dev/null @@ -1,16 +0,0 @@ -'use strict'; - -const path = require('path'); - -module.exports = (id = 'lando') => { - switch (process.platform) { - case 'darwin': - return path.join('/', 'Library', 'Application Support', `${id[0].toUpperCase()}${id.slice(1).toLowerCase()}`); - case 'linux': - return path.join('/', 'srv', `${id.toLowerCase()}`); - case 'win32': - return path.join( - process.env.PROGRAMDATA || process.env.ProgramData, `${id[0].toUpperCase()}${id.slice(1).toLowerCase()}`, - ); - } -}; diff --git a/utils/get-tasks.js b/utils/get-tasks.js index 3ae5938..61912c6 100644 --- a/utils/get-tasks.js +++ b/utils/get-tasks.js @@ -9,7 +9,7 @@ const path = require('path'); */ const pathsToRoot = (startFrom = process.cwd()) => { return _(_.range(path.dirname(startFrom).split(path.sep).length)) - .map(end => _.dropRight(path.dirname(startFrom).split(path.sep), end).join(path.sep)) + .map((end) => _.dropRight(path.dirname(startFrom).split(path.sep), end).join(path.sep)) .unshift(startFrom) .dropRight() .value(); @@ -20,18 +20,18 @@ const pathsToRoot = (startFrom = process.cwd()) => { */ const getBsLevel = (config, command) => { if (_.has(config, `tooling.${command}.level`)) return config.tooling[command].level; - else if (_.find(config.tooling, {id: command}).level) return _.find(config.tooling, {id: command}).level; - else return (!fs.existsSync(config.composeCache)) ? 'app' : 'engine'; + else if (_.find(config.tooling, { id: command }).level) return _.find(config.tooling, { id: command }).level; + else return !fs.existsSync(config.composeCache) ? 'app' : 'engine'; }; /* * Helper to load cached file without cache module */ -const loadCacheFile = file => { +const loadCacheFile = (file) => { try { - return JSON.parse(JSON.parse(fs.readFileSync(file, {encoding: 'utf-8'}))); + return JSON.parse(JSON.parse(fs.readFileSync(file, { encoding: 'utf-8' }))); } catch (e) { - fs.rmSync(file, {force: true, retryDelay: 201, maxRetries: 16, recursive: true}); + fs.rmSync(file, { force: true, retryDelay: 201, maxRetries: 16, recursive: true }); return {}; } }; @@ -39,11 +39,12 @@ const loadCacheFile = file => { /* * Helper to run the app task runner */ -const appRunner = command => (argv, lando) => { +const appRunner = (command) => (argv, lando) => { const app = lando.getApp(argv._app.root); - return lando.events.emit('pre-app-runner', app) - .then(() => lando.events.emit('pre-command-runner', app)) - .then(() => app.init().then(() => _.find(app.tasks, {command}).run(argv))); + return lando.events + .emit('pre-app-runner', app) + .then(() => lando.events.emit('pre-command-runner', app)) + .then(() => app.init().then(() => _.find(app.tasks, { command }).run(argv))); }; /* @@ -59,7 +60,7 @@ const engineRunner = (config, command) => (argv, lando) => { // Load only what we need so we don't pay the appinit penalty if (!_.isEmpty(_.get(app, 'config.events', []))) { _.forEach(app.config.events, (cmds, name) => { - app.events.on(name, 9999, async data => await require('./../hooks/app-run-events')(app, lando, cmds, data)); + app.events.on(name, 9999, async (data) => await require('./../hooks/app-run-events')(app, lando, cmds, data)); }); } @@ -67,16 +68,16 @@ const engineRunner = (config, command) => (argv, lando) => { app.config.tooling = require('./get-tooling-tasks')(app.config.tooling, app); // get task // @NOTE: can we actually assume this will always find something? i **THINK** we catch upstream? - const task = _.find(app.config.tooling, task => task.name === command); + const task = _.find(app.config.tooling, (task) => task.name === command); // get service, note this is not trivial because dynamic services are a thing const service = !_.startsWith(task.service, ':') ? task.service : argv[_.trim(task.service, ':')]; - lando.log.debug('resolved tooling command %s service to %s', command, service); + lando.log('resolved tooling command %s service to %s', command, service); // ensure all v3 services have their appMount set to /app const v3Mounts = _(_.get(app, 'info', [])) - .filter(service => service.api !== 4) - .map(service => ([service.service, service.appMount || '/app'])) + .filter((service) => service.api !== 4) + .map((service) => [service.service, service.appMount || '/app']) .fromPairs() .value(); app.mounts = _.merge({}, v3Mounts, app.mounts); @@ -92,27 +93,30 @@ const engineRunner = (config, command) => (argv, lando) => { } // Final event to modify and then load and run - return lando.events.emit('pre-engine-runner', app) - .then(() => lando.events.emit('pre-command-runner', app)) - .then(() => require('./build-tooling-task')(task, lando).run(argv)); + return lando.events + .emit('pre-engine-runner', app) + .then(() => lando.events.emit('pre-command-runner', app)) + .then(() => require('./build-tooling-task')(task, lando).run(argv)); }; module.exports = (config = {}, argv = {}, tasks = []) => { // merge in recipe cache config first if (fs.existsSync(config.recipeCache) && _.has(config, 'recipe')) { - config = _.merge({}, JSON.parse(fs.readFileSync(config.recipeCache, {encoding: 'utf-8'})), config); + config = _.merge({}, JSON.parse(fs.readFileSync(config.recipeCache, { encoding: 'utf-8' })), config); } // If we have a tooling router lets rebase on that if (fs.existsSync(config.toolingRouter)) { // Get the closest route const closestRoute = _(loadCacheFile(config.toolingRouter)) - .map(route => _.merge({}, route, { - closeness: _.indexOf(pathsToRoot(), route.route), - })) - .filter(route => route.closeness !== -1) + .map((route) => + _.merge({}, route, { + closeness: _.indexOf(pathsToRoot(), route.route), + }), + ) + .filter((route) => route.closeness !== -1) .orderBy('closeness') - .thru(routes => routes[0]) + .thru((routes) => routes[0]) .value(); // If we have a closest route lets mod config.tooling @@ -128,8 +132,11 @@ module.exports = (config = {}, argv = {}, tasks = []) => { }); // If the tooling command is being called lets assess whether we can get away with engine bootstrap level - const ids = _(config.tooling).map(task => task.id).filter(_.identity).value(); - const level = (_.includes(ids, argv._[0])) ? getBsLevel(config, argv._[0]) : 'app'; + const ids = _(config.tooling) + .map((task) => task.id) + .filter(_.identity) + .value(); + const level = _.includes(ids, argv._[0]) ? getBsLevel(config, argv._[0]) : 'app'; // Load all the tasks, remember we need to remove "disabled" tasks (eg non-object tasks) here _.forEach(_.get(config, 'tooling', {}), (task, command) => { @@ -144,18 +151,21 @@ module.exports = (config = {}, argv = {}, tasks = []) => { options: _.get(task, 'options', {}), positionals: _.get(task, 'positionals', {}), usage: _.get(task, 'usage', command), - run: (level === 'app') ? appRunner(command) : engineRunner({...config, argv}, command, task), + run: level === 'app' ? appRunner(command) : engineRunner({ ...config, argv }, command, task), }); } }); // get core tasks - const coreTasks = _(loadCacheFile(process.landoTaskCacheFile)).map(t => ([t.command, t])).fromPairs().value(); + const coreTasks = _(loadCacheFile(process.landoTaskCacheFile)) + .map((t) => [t.command, t]) + .fromPairs() + .value(); // mix in any relevant compose cache things if (fs.existsSync(config.composeCache)) { try { - const composeCache = JSON.parse(fs.readFileSync(config.composeCache, {encoding: 'utf-8'})); + const composeCache = JSON.parse(fs.readFileSync(config.composeCache, { encoding: 'utf-8' })); // merge in additional tooling; Object.assign(coreTasks, composeCache?.overrides?.tooling ?? {}); @@ -171,5 +181,5 @@ module.exports = (config = {}, argv = {}, tasks = []) => { } // and combine - return tasks.concat(_.map(coreTasks, task => task)); + return tasks.concat(_.map(coreTasks, (task) => task)); }; diff --git a/utils/is-wsl-interop.js b/utils/is-wsl-interop.js deleted file mode 100644 index 637169c..0000000 --- a/utils/is-wsl-interop.js +++ /dev/null @@ -1,24 +0,0 @@ -'use strict'; - -const fs = require('fs'); -const os = require('os'); - -const WINBIN_REGEX = /\/mnt\/.\/WINDOWS\/System32$/i; - -// Checks to see if Docker is installed via WSL/Windows interop. -module.exports = () => { - // return anything that is not wsl as false - if (!os.release().toLowerCase().includes('microsoft')) return false; - - // if we dont have have WSL_INTEROP then - if (!process.env.WSL_INTEROP) return false; - - // attempt to find there the winbin is at - const winbin = process.env.PATH.split(':').filter(path => WINBIN_REGEX.test(path)); - - // if we cant find anything then false - if (winbin.length === 0) return false; - - // otherwise return whether our first match exists - return fs.existsSync(winbin[0]); -}; diff --git a/utils/legacy-scan.js b/utils/legacy-scan.js deleted file mode 100644 index eab2bdc..0000000 --- a/utils/legacy-scan.js +++ /dev/null @@ -1,107 +0,0 @@ - -// Modules -const _ = require('lodash'); -const Log = require('./../lib/logger'); -const Promise = require('./../lib/promise'); - -const axios = require('../utils/get-axios')({maxRedirect: 0}, {}, {rejectUnauthorized: false}); - -// We make this module into a function so we can pass in a logger -module.exports = (log = new Log()) => { - // Helper to return a url status and log things - const setStatus = (url, status = true, color = 'green', message = '%s is ready') => { - log.debug(message, url); - return {url, status, color}; - }; - - // Convenience helpers - const setGood = url => setStatus(url); - const setOK = url => setStatus(url, true, 'yellow'); - const setBad = url => setStatus(url, false, 'red', '%s not currently accessible'); - - /** - * Scans URLs to determine if they are up or down. - * - * @since 3.0.0 - * @alias lando.scanUrls - * @param {Array} urls An array of urls like `https://mysite.lndo.site` or `https://localhost:34223` - * @param {Object} [opts] Options to configure the scan. - * @param {Integer} [opts.max=7] The amount of times to retry accessing each URL. - * @param {Array} [opts.waitCode=[400, 502, 404]] The HTTP codes to prompt a retry. - * @return {Array} An array of objects of the form {url: url, status: true|false} - * @example - * // Scan URLs and print results - * return lando.utils.scanUrls(['http://localhost', 'https://localhost']) - * .then(function(results) { - * console.log(results); - * }); - */ - const scanUrls = (urls, {max = 7, waitCodes = [400, 502, 404]} = {}) => { - log.verbose('about to scan urls'); - log.debug('scanning data', {urls, max, waitCodes}); - - // Ping the sites for awhile to determine if they are g2g - return Promise.map(urls, url => Promise.retry(() => { - // Log the attempt - log.debug('checking to see if %s is ready.', url); - // If URL contains a wildcard then immediately set fulfill with yellow status - if (_.includes(url, '*')) return Promise.resolve(setOK(url)); - // Send REST request. - return axios.get(url) - // Return good responses - .then(response => { - log.debug('scan response %s received', url, { - status: response && response.status, - headers: response && response.headers, - }); - return setGood(url); - }) - // Retry waitcodes or fail right away if we have a network issue - .catch(error => { - const extraInformation = { - code: error.code, - message: error.message, - }; - if (error.response) { - extraInformation.status = error.response.status; - extraInformation.headers = error.response.headers; - } - log.debug('scan failed for %s', url, extraInformation); - - if (error.code === 'ENOTFOUND') { - log.debug('ENOTFOUND for %s, setting to bad', url); - return Promise.resolve(setBad(url)); - } - - if (!error.response) { - log.debug('No response for %s. Setting to bad', url); - return Promise.reject(setBad(url)); - } - - if (_.includes(waitCodes, error.response.status)) { - log.debug('Response for %s, returned http code we should retry for. Setting to bad', url); - return Promise.reject(setBad(url)); - } - - log.debug('Unkown failure for %s. Setting to good', url); - return setGood(url); - }); - }, {max}) - - // Catch any error and return an inaccessible url - .catch(err => { - log.debug('scan failed.', err); - return setBad(url); - })) - - // Log and then return scan results - .then(results => { - log.verbose('scan completed.'); - log.debug('scan results.', results); - return results; - }); - }; - - // Return - return scanUrls; -}; diff --git a/utils/make-success.js b/utils/make-success.js deleted file mode 100644 index 8447f75..0000000 --- a/utils/make-success.js +++ /dev/null @@ -1,19 +0,0 @@ -'use strict'; - -/* - * Attempts to produce a standardized error object - */ -module.exports = ({ - all, - args, - command, - stdout, - stderr, -}) => ({ - command, - args, - exitCode: 0, - stdout, - stderr, - all, -}); diff --git a/utils/merge-arrays.js b/utils/merge-arrays.js deleted file mode 100644 index bc343b5..0000000 --- a/utils/merge-arrays.js +++ /dev/null @@ -1,39 +0,0 @@ -'use strict'; - -const merge = require('lodash/merge'); - -// @TODO: error handling -module.exports = (a, b, ams = 'replace') => { - // get strat and id if applicable - const strategy = ams.split(':')[0]; - const by = ams.split(':')[1] || 'id'; - - switch (strategy) { - case 'aoa': - return (a.length === 1) ? [a, b] : [...a, b]; - case 'concat': - return a.concat(b); - case 'first': - return a; - case 'last': - return b; - case 'merge': - return Object.entries([a, b] - .filter(Boolean) - .reduce((acc, datum) => { - return merge(acc, Object.fromEntries(datum.map(a => { - // if an object do fancy stuff - if (require('lodash/isPlainObject')(a)) { - if (Object.prototype.hasOwnProperty.call(a, by)) return [a[by], a]; - if (Object.keys(a).length === 1) return [Object.keys(a)[0], a]; - } - // otherwise just return pairself - return [a, a]; - }))); - }, {})) - .map(data => data[1]); - case 'replace': - default: - return merge(a, b); - } -}; diff --git a/utils/merge-promise.js b/utils/merge-promise.js deleted file mode 100644 index fdf7184..0000000 --- a/utils/merge-promise.js +++ /dev/null @@ -1,18 +0,0 @@ -'use strict'; - -const nativePromisePrototype = (async () => {})().constructor.prototype; -const descriptors = ['then', 'catch', 'finally'] -.map(property => [ - property, - Reflect.getOwnPropertyDescriptor(nativePromisePrototype, property), -]); - -module.exports = (thing, promise) => { - for (const [property, descriptor] of descriptors) { - // eslint-disable-next-line max-len - const value = typeof promise === 'function' ? (...args) => Reflect.apply(descriptor.value, promise(), args) : descriptor.value.bind(promise); - Reflect.defineProperty(thing, property, {...descriptor, value}); - } - - return thing; -}; diff --git a/utils/normalize-manifest-paths.js b/utils/normalize-manifest-paths.js deleted file mode 100644 index 5e00fc9..0000000 --- a/utils/normalize-manifest-paths.js +++ /dev/null @@ -1,25 +0,0 @@ -'use strict'; - -const get = require('lodash/get'); -const getKeys = require('./get-object-keys'); -const path = require('path'); -const set = require('lodash/set'); - -const defaultPathyKeys = ['hooks', 'registry', 'tasks']; - -module.exports = (data = {}, base, pathyKeys = defaultPathyKeys) => { - // @TODO: error handling? - - for (const key of getKeys(data)) { - // skip if not a pathy key - if (!pathyKeys.includes(key.split('.')[0])) continue; - // reset data to be an absolute path - // @TODO: should we test if abolute path exists? - if (key && typeof get(data, key) === 'string' && !path.isAbsolute(get(data, key))) { - set(data, key, path.resolve(base, get(data, key))); - } - } - - // then return - return data; -}; diff --git a/utils/prettify.js b/utils/prettify.js deleted file mode 100644 index c9e0218..0000000 --- a/utils/prettify.js +++ /dev/null @@ -1,33 +0,0 @@ -'use strict'; - -const os = require('os'); - -/* - * prettify object data for better tabular output - * @TODO: is it ok to assume that all data in an array will be the same type? - */ -module.exports = (data, {arraySeparator = ', '} = {}) => { - // if undefined then just return an empty string - if (data === undefined) return ''; - - // handle arrays differently - if (Array.isArray(data)) { - // join lists of strings together - if (typeof data[0] === 'string') { - return data.join(arraySeparator); - } - - // print arrays of objects nicely - if (data[0] && typeof data[0] === 'object' && Object.keys(data[0]).length > 0) { - return data.map(item => { - // if it doesnt have keys just return - if (typeof item !== 'object') return item; - // otherwise - return Object.keys(item).map(key => `${key}: ${item[key]}`).join(', '); - }).join(os.EOL); - } - } - - return data; -}; - diff --git a/utils/read-file.js b/utils/read-file.js deleted file mode 100644 index 654acd2..0000000 --- a/utils/read-file.js +++ /dev/null @@ -1,29 +0,0 @@ -'use strict'; - -const fs = require('fs'); -const path = require('path'); - -module.exports = (file, options = {}) => { - // @TODO: file does nto exist? - - // set extension if not set - const extension = options.extension || path.extname(file); - - // @TODO: better try/catches here? - // @TODO: throw error for default? - switch (extension) { - case '.yaml': - case '.yml': - case 'yaml': - case 'yml': - return require('../components/yaml').load(fs.readFileSync(file, 'utf8'), options); - case '.js': - case 'js': - return require(file); - case '.json': - case 'json': - return require('jsonfile').readFileSync(file, options); - default: - return fs.readFileSync(file, 'utf8'); - } -}; diff --git a/utils/run-v3-build.js b/utils/run-v3-build.js index 0393c85..8c528cf 100644 --- a/utils/run-v3-build.js +++ b/utils/run-v3-build.js @@ -6,24 +6,30 @@ const _ = require('lodash'); // adds required methods to ensure the lando v3 debugger can be injected into v4 things module.exports = (app, steps, lockfile, hash = 'YOU SHALL NOT PASS') => { if (!_.isEmpty(steps) && !app._lando.cache.get(lockfile)) { - app.log.info('running build steps...'); - return app.engine.run(steps) - // Save the new hash if everything works out ok - .then(() => { - app._lando.cache.set(lockfile, hash, {persist: true}); - app.log.info('build steps completed. and locked with %s', lockfile); - }) - // Make sure we don't save a hash if our build fails - .catch(error => { - app.addMessage({ - title: `One of your v3 build steps failed`, - type: 'warning', - detail: [ - 'This **MAY** prevent your app from working.', - 'Check for errors above, fix them in your Landofile, and try again by running:', - ], - command: 'lando rebuild', - }, error); - }); + app.log('running build steps...'); + return ( + app.engine + .run(steps) + // Save the new hash if everything works out ok + .then(() => { + app._lando.cache.set(lockfile, hash, { persist: true }); + app.log('build steps completed. and locked with %s', lockfile); + }) + // Make sure we don't save a hash if our build fails + .catch((error) => { + app.addMessage( + { + title: `One of your v3 build steps failed`, + type: 'warning', + detail: [ + 'This **MAY** prevent your app from working.', + 'Check for errors above, fix them in your Landofile, and try again by running:', + ], + command: 'lando rebuild', + }, + error, + ); + }) + ); } }; diff --git a/utils/scanner.js b/utils/scanner.js index 54a5019..c96c09e 100644 --- a/utils/scanner.js +++ b/utils/scanner.js @@ -4,20 +4,21 @@ const _ = require('lodash'); const debug = require('debug')('@lando/core:scanner'); const getAxios = require('./get-axios'); -const request = (maxRedirects = 0) => getAxios({maxRedirects}, {}, {rejectUnauthorized: false}); +const request = (maxRedirects = 0) => getAxios({ maxRedirects, tls: { rejectUnauthorized: false } }); -module.exports = (baseURL, {okCodes = [], maxRedirects = 0, log = debug, path = '/', timeout = 3000} = {}) => { - return request(maxRedirects).get(path, {baseURL, timeout}) - .then(response => { - response.lando = {code: _.get(response, 'status', 'unknown'), text: _.get(response, 'statusText', 'unknown')}; +module.exports = (baseURL, { okCodes = [], maxRedirects = 0, log = debug, path = '/', timeout = 3000 } = {}) => { + return request(maxRedirects) + .get(path, { baseURL, timeout }) + .then((response) => { + response.lando = { code: _.get(response, 'status', 'unknown'), text: _.get(response, 'statusText', 'unknown') }; log('scan of %o passed with %o %o', `${baseURL}${path}`, response.lando.code, response.lando.text); return response; }) - .catch(error => { + .catch((error) => { // get teh response from the error - const {response} = error; + const { response } = error; // standardize for lando, first try to get http code - error.lando = {code: _.get(response, 'status', 'unknown'), text: _.get(response, 'statusText', 'unknown')}; + error.lando = { code: _.get(response, 'status', 'unknown'), text: _.get(response, 'statusText', 'unknown') }; // if its unknown then try a few other scenarios eg timeout if (error.lando.code === 'unknown' && _.startsWith(error.message, 'timeout')) error.lando.code = 'TIMEOUT'; // if still unknown try to grab the code @@ -26,7 +27,7 @@ module.exports = (baseURL, {okCodes = [], maxRedirects = 0, log = debug, path = // if an OK code then also pass if (_.includes(okCodes, error.lando.code)) { log('scan of %o passed with ok code', `${baseURL}${path}`, error.lando.code); - return {lando: error.lando}; + return { lando: error.lando }; } // if we get here then debug full error? diff --git a/utils/traverse-up.js b/utils/traverse-up.js deleted file mode 100644 index 18a427c..0000000 --- a/utils/traverse-up.js +++ /dev/null @@ -1,15 +0,0 @@ -'use strict'; - -const dropRight = require('lodash/dropRight'); -const path = require('path'); -const range = require('lodash/range'); - -/* - * TBD - */ -module.exports = (files, startsFrom) => { - return range(startsFrom.split(path.sep).length) - .map(end => dropRight(startsFrom.split(path.sep), end).join(path.sep)) - .map(dir => files.map(file => path.join(dir, path.basename(file)))) - .flat(Number.POSITIVE_INFINITY); -}; diff --git a/utils/write-file.js b/utils/write-file.js deleted file mode 100644 index 5d79e22..0000000 --- a/utils/write-file.js +++ /dev/null @@ -1,51 +0,0 @@ -'use strict'; - -const fs = require('fs'); -const get = require('lodash/get'); -const path = require('path'); - -// @TODO: maybe extension should be in {options}? -// @TODO: error handling, defaults etc? -module.exports = (file, data, options = {}) => { - // set extension if not set - const extension = options.extension || path.extname(file); - // linux line endings - const forcePosixLineEndings = options.forcePosixLineEndings ?? false; - - // special handling for ImportString - if (typeof data !== 'string' && data?.constructor?.name === 'ImportString') data = data.toString(); - - // data is a string and posixOnly then replace - if (typeof data === 'string' && forcePosixLineEndings) data = data.replace(/\r\n/g, '\n'); - - switch (extension) { - case '.yaml': - case '.yml': - case 'yaml': - case 'yml': - // if this is a YAML DOC then use yaml module - if (get(data, 'constructor.name') === 'Document') { - try { - fs.writeFileSync(file, data.toString()); - } catch (error) { - throw new Error(error); - } - - // otherwise use the normal js-yaml dump - } else { - try { - fs.writeFileSync(file, require('../components/yaml').dump(data, options)); - } catch (error) { - throw new Error(error); - } - } - break; - case '.json': - case 'json': - require('jsonfile').writeFileSync(file, data, {spaces: 2, ...options}); - break; - default: - if (!fs.existsSync(file)) fs.mkdirSync(path.dirname(file), {recursive: true}); - fs.writeFileSync(file, data, {encoding: 'utf-8'}); - } -};