diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000..2ac7ef3191 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,36 @@ +version: 2 +updates: + - package-ecosystem: github-actions + directory: / + schedule: + interval: monthly + + - package-ecosystem: npm + directory: / + schedule: + interval: monthly + time: "23:00" + open-pull-requests-limit: 10 + ignore: + - dependency-name: "*" + update-types: ["version-update:semver-major"] + + - package-ecosystem: npm + directory: /packages/doctor + schedule: + interval: monthly + time: "23:00" + open-pull-requests-limit: 10 + ignore: + - dependency-name: "*" + update-types: ["version-update:semver-major"] + + - package-ecosystem: npm + directory: /packages/nativescript-envinfo + schedule: + interval: monthly + time: "23:00" + open-pull-requests-limit: 10 + ignore: + - dependency-name: "*" + update-types: ["version-update:semver-major"] diff --git a/.github/workflows/codeql-advanced.yml b/.github/workflows/codeql-advanced.yml new file mode 100644 index 0000000000..8e441dffc2 --- /dev/null +++ b/.github/workflows/codeql-advanced.yml @@ -0,0 +1,103 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL Advanced" + +on: + push: + branches: [ "main", "release" ] + pull_request: + branches: [ "main", "release" ] + schedule: + - cron: '21 2 * * 1' + +permissions: + contents: read + +jobs: + analyze: + name: Analyze (${{ matrix.language }}) + # Runner size impacts CodeQL analysis time. To learn more, please see: + # - https://gh.io/recommended-hardware-resources-for-running-codeql + # - https://gh.io/supported-runners-and-hardware-resources + # - https://gh.io/using-larger-runners (GitHub.com only) + # Consider using larger runners or machines with greater resources for possible analysis time improvements. + runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }} + permissions: + # required for all workflows + security-events: write + + # required to fetch internal or private CodeQL packs + packages: read + + # only required for workflows in private repositories + actions: read + contents: read + + strategy: + fail-fast: false + matrix: + include: + - language: actions + build-mode: none + - language: javascript-typescript + build-mode: none + # CodeQL supports the following values keywords for 'language': 'actions', 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'rust', 'swift' + # Use `c-cpp` to analyze code written in C, C++ or both + # Use 'java-kotlin' to analyze code written in Java, Kotlin or both + # Use 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both + # To learn more about changing the languages that are analyzed or customizing the build mode for your analysis, + # see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning. + # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how + # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages + steps: + - name: Checkout repository + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + + # Add any setup steps before running the `github/codeql-action/init` action. + # This includes steps like installing compilers or runtimes (`actions/setup-node` + # or others). This is typically only required for manual builds. + # - name: Setup runtime (example) + # uses: actions/setup-example@v1 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1 + with: + languages: ${{ matrix.language }} + build-mode: ${{ matrix.build-mode }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + + # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality + + # If the analyze step fails for one of the languages you are analyzing with + # "We were unable to automatically build your code", modify the matrix above + # to set the build mode to "manual" for that language. Then modify this step + # to build your code. + # â„šī¸ Command-line programs to run using the OS shell. + # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun + - if: matrix.build-mode == 'manual' + shell: bash + run: | + echo 'If you are using a "manual" build mode for one or more of the' \ + 'languages you are analyzing, replace this with the commands to build' \ + 'your code, for example:' + echo ' make bootstrap' + echo ' make release' + exit 1 + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1 + with: + category: "/language:${{matrix.language}}" diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml new file mode 100644 index 0000000000..4a514339ef --- /dev/null +++ b/.github/workflows/dependency-review.yml @@ -0,0 +1,22 @@ +# Dependency Review Action +# +# This Action will scan dependency manifest files that change as part of a Pull Request, +# surfacing known-vulnerable versions of the packages declared or updated in the PR. +# Once installed, if the workflow run is marked as required, +# PRs introducing known-vulnerable packages will be blocked from merging. +# +# Source repository: https://github.com/actions/dependency-review-action +name: 'Dependency Review' +on: [pull_request] + +permissions: + contents: read + +jobs: + dependency-review: + runs-on: ubuntu-latest + steps: + - name: 'Checkout Repository' + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4.3.0 + - name: 'Dependency Review' + uses: actions/dependency-review-action@2031cfc080254a8a887f58cffee85186f0e49e48 # v4.9.0 diff --git a/.github/workflows/npm_release_cli.yml b/.github/workflows/npm_release_cli.yml index 56ea306218..13526d53b3 100644 --- a/.github/workflows/npm_release_cli.yml +++ b/.github/workflows/npm_release_cli.yml @@ -2,42 +2,207 @@ name: 'nativescript -> npm' on: push: - branches: [ 'main' ] + branches: + - main + tags: + - "v*" paths-ignore: - 'packages/**' workflow_dispatch: + inputs: + release_type: + description: 'Release type. "dev" publishes a -next prerelease without bumping package.json. patch/minor/major/prerelease bump package.json, commit + tag to main, then publish as a stable release.' + type: choice + options: + - dev + - patch + - minor + - major + - prerelease + default: patch + +permissions: read-all env: NPM_TAG: 'next' jobs: - release: + build: + name: Build runs-on: macos-latest + permissions: + contents: write + outputs: + npm_version: ${{ steps.npm_version_output.outputs.NPM_VERSION }} + npm_tag: ${{ steps.npm_version_output.outputs.NPM_TAG }} + is_release: ${{ steps.npm_version_output.outputs.IS_RELEASE }} steps: - - uses: actions/checkout@v2 - - - uses: actions/setup-node@v3 + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@fe104658747b27e96e4f7e80cd0a94068e53901d # v2.16.1 + with: + egress-policy: audit + + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + with: + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} + + - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 with: node-version: 22.14.0 + registry-url: "https://registry.npmjs.org" - name: Setup run: npm i --ignore-scripts --legacy-peer-deps --no-package-lock - - name: Generate Version + - name: Get Current Version run: | - echo NPM_VERSION=$(node -e "console.log(require('./package.json').version);")-$NPM_TAG-$(date +"%m-%d-%Y")-$GITHUB_RUN_ID >> $GITHUB_ENV + NPM_VERSION=$(node -e "console.log(require('./package.json').version);") + echo NPM_VERSION=$NPM_VERSION >> $GITHUB_ENV - - name: Bump Version - run: npm version $NPM_VERSION + - name: Bump, commit and tag stable release (manual dispatch) + if: ${{ github.event_name == 'workflow_dispatch' && inputs.release_type != 'dev' }} + run: | + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + npm version ${{ inputs.release_type }} -m "chore: release v%s" + NPM_VERSION=$(node -e "console.log(require('./package.json').version);") + echo NPM_VERSION=$NPM_VERSION >> $GITHUB_ENV + git push origin HEAD:${GITHUB_REF_NAME} --follow-tags + + - name: Bump version for dev release + if: ${{ !contains(github.ref, 'refs/tags/') && (github.event_name != 'workflow_dispatch' || inputs.release_type == 'dev') }} + run: | + NPM_VERSION=$(node ./scripts/get-next-version.js) + echo NPM_VERSION=$NPM_VERSION >> $GITHUB_ENV + npm version $NPM_VERSION --no-git-tag-version + + - name: Output NPM Version and tag + id: npm_version_output + run: | + NPM_TAG=$(node ./scripts/get-npm-tag.js) + if [[ "${GITHUB_REF}" == refs/tags/* ]] || [[ "${{ github.event_name }}" == "workflow_dispatch" && "${{ inputs.release_type }}" != "dev" ]]; then + IS_RELEASE=true + else + IS_RELEASE=false + fi + echo NPM_VERSION=$NPM_VERSION >> $GITHUB_OUTPUT + echo NPM_TAG=$NPM_TAG >> $GITHUB_OUTPUT + echo IS_RELEASE=$IS_RELEASE >> $GITHUB_OUTPUT - name: Build nativescript run: npm pack - - name: Publish nativescript + - name: Upload npm package artifact + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + with: + name: npm-package + path: nativescript-${{steps.npm_version_output.outputs.NPM_VERSION}}.tgz + + publish: + runs-on: ubuntu-latest + environment: npm-publish + needs: + - build + permissions: + contents: read + id-token: write + env: + NPM_VERSION: ${{needs.build.outputs.npm_version}} + NPM_TAG: ${{needs.build.outputs.npm_tag}} + steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@fe104658747b27e96e4f7e80cd0a94068e53901d # v2.16.1 + with: + egress-policy: audit + + - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 + with: + node-version: 22.14.0 + registry-url: "https://registry.npmjs.org" + + - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: npm-package + path: dist + + - name: Update npm (required for OIDC trusted publishing) + run: | + npm install -g npm@^11.5.1 + npm --version + + - name: Publish package (OIDC trusted publishing) + if: ${{ vars.USE_NPM_TOKEN != 'true' }} + run: | + echo "Publishing nativescript@$NPM_VERSION to NPM with tag $NPM_TAG via OIDC trusted publishing..." + unset NODE_AUTH_TOKEN + if [ -n "${NPM_CONFIG_USERCONFIG:-}" ]; then + rm -f "$NPM_CONFIG_USERCONFIG" + fi + npm publish ./dist/nativescript-${{env.NPM_VERSION}}.tgz --tag $NPM_TAG --access public --provenance + env: + NODE_AUTH_TOKEN: "" + + - name: Publish package (granular token) + if: ${{ vars.USE_NPM_TOKEN == 'true' }} + run: | + echo "Publishing nativescript@$NPM_VERSION to NPM with tag $NPM_TAG via granular token..." + npm publish ./dist/nativescript-${{env.NPM_VERSION}}.tgz --tag $NPM_TAG --access public --provenance env: - NPM_TOKEN: ${{ secrets.NPM_PUBLISH_TOKEN }} + NODE_AUTH_TOKEN: ${{ secrets.NPM_PUBLISH_TOKEN }} + + github-release: + runs-on: ubuntu-latest + # runs for tag pushes and for manual dispatches that bumped a stable release + if: ${{ needs.build.outputs.is_release == 'true' }} + permissions: + contents: write + needs: + - build + env: + NPM_VERSION: ${{needs.build.outputs.npm_version}} + steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@fe104658747b27e96e4f7e80cd0a94068e53901d # v2.16.1 + with: + egress-policy: audit + + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + with: + fetch-depth: 0 + ref: v${{needs.build.outputs.npm_version}} + + - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 + with: + node-version: 22.14.0 + + - name: Setup + run: npm i --ignore-scripts --legacy-peer-deps --no-package-lock + + - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: npm-package + path: dist + + - name: Generate provenance statement run: | - echo "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" > .npmrc - echo "Publishing nativescript@$NPM_VERSION to NPM with tag $NPM_TAG..." - npm publish nativescript-$NPM_VERSION.tgz --tag $NPM_TAG + TGZ_PATH=$(ls dist/nativescript-*.tgz | head -n1) + TGZ_NAME=$(basename "$TGZ_PATH") + TGZ_SHA=$(sha256sum "$TGZ_PATH" | awk '{ print $1 }') + PROV_PATH="dist/${TGZ_NAME%.tgz}.intoto.jsonl" + + cat > "$PROV_PATH" < body.md + + - uses: ncipollo/release-action@339a81892b84b4eeb0f6e744e4574d79d0d9b8dd # v1.21.0 + with: + tag: v${{needs.build.outputs.npm_version}} + artifacts: "dist/nativescript-*.tgz,dist/nativescript-*.intoto.jsonl" + bodyFile: "body.md" + prerelease: ${{needs.build.outputs.npm_tag != 'latest'}} + allowUpdates: true diff --git a/.github/workflows/npm_release_doctor.yml b/.github/workflows/npm_release_doctor.yml index c3b5d04520..8366bc9d47 100644 --- a/.github/workflows/npm_release_doctor.yml +++ b/.github/workflows/npm_release_doctor.yml @@ -14,12 +14,21 @@ defaults: env: NPM_TAG: 'next' +permissions: + contents: read + jobs: release: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@fe104658747b27e96e4f7e80cd0a94068e53901d # v2.16.1 + with: + egress-policy: audit + + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - name: Setup run: npm install diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml new file mode 100644 index 0000000000..58910b421f --- /dev/null +++ b/.github/workflows/scorecard.yml @@ -0,0 +1,73 @@ +name: Scorecard supply-chain security +on: + # For Branch-Protection check. Only the default branch is supported. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection + branch_protection_rule: + # To guarantee Maintained check is occasionally updated. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained + schedule: + - cron: '20 7 * * 2' + push: + branches: ["main"] + +# Declare default permissions as read only. +permissions: read-all + +jobs: + analysis: + name: Scorecard analysis + runs-on: ubuntu-latest + permissions: + # Needed to upload the results to code-scanning dashboard. + security-events: write + # Needed to publish results and get a badge (see publish_results below). + id-token: write + contents: read + actions: read + # To allow GraphQL ListCommits to work + issues: read + pull-requests: read + # To detect SAST tools + checks: read + + steps: + + - name: "Checkout code" + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4.3.0 + with: + persist-credentials: false + + - name: "Run analysis" + uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3 + with: + results_file: results.sarif + results_format: sarif + # (Optional) "write" PAT token. Uncomment the `repo_token` line below if: + # - you want to enable the Branch-Protection check on a *public* repository, or + # - you are installing Scorecards on a *private* repository + # To create the PAT, follow the steps in https://github.com/ossf/scorecard-action#authentication-with-pat. + repo_token: ${{ secrets.SCORECARD_TOKEN }} + + # Public repositories: + # - Publish results to OpenSSF REST API for easy access by consumers + # - Allows the repository to include the Scorecard badge. + # - See https://github.com/ossf/scorecard-action#publishing-results. + # For private repositories: + # - `publish_results` will always be set to `false`, regardless + # of the value entered here. + publish_results: true + + # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF + # format to the repository Actions tab. + - name: "Upload artifact" + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + with: + name: SARIF file + path: results.sarif + retention-days: 5 + + # Upload the results to GitHub's code scanning dashboard. + - name: "Upload to code-scanning" + uses: github/codeql-action/upload-sarif@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1 + with: + sarif_file: results.sarif \ No newline at end of file diff --git a/.gitignore b/.gitignore index 310403ad93..0fd3dda24f 100644 --- a/.gitignore +++ b/.gitignore @@ -87,3 +87,5 @@ lib/common/test-reports.xml !lib/common/test-scripts/** !lib/common/scripts/** config/test-deps-versions-generated.json +!scripts/get-next-version.js +!scripts/get-npm-tag.js \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 487d817ca9..8f96bbbc1d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,103 @@ +## [9.0.5](https://github.com/NativeScript/nativescript-cli/compare/v9.0.4...v9.0.5) (2026-03-06) + + +### Security + +* CWE-1333, CWE-78 ([#5976](https://github.com/NativeScript/nativescript-cli/issues/5976)) ([3942566](https://github.com/NativeScript/nativescript-cli/commit/3942566f78d2d21fccae2ec6f313f29cec92ea11)) + + + +## [9.0.4](https://github.com/NativeScript/nativescript-cli/compare/v9.0.3...v9.0.4) (2026-02-27) + + +### Bug Fixes + +* file watcher with chokidar ([#5973](https://github.com/NativeScript/nativescript-cli/issues/5973)) ([92ec091](https://github.com/NativeScript/nativescript-cli/commit/92ec091d54d4621e0685ea119527f02111f72056)) +* **security:** CVE-2025-13465, CVE-2026-27904, CVE-2026-26996, CVE-2025-59433 ([#5974](https://github.com/NativeScript/nativescript-cli/issues/5974)) ([c4064c9](https://github.com/NativeScript/nativescript-cli/commit/c4064c9d52bbc2b7faff35e2bea8d109b1c170be)) +* visionos overrides for build flags ([#5967](https://github.com/NativeScript/nativescript-cli/issues/5967)) ([895ceb8](https://github.com/NativeScript/nativescript-cli/commit/895ceb8567ee139147643c43760487d46882f717)) +* **widget:** handle configs with other SPMPackages ([#5972](https://github.com/NativeScript/nativescript-cli/issues/5972)) ([03ff1dc](https://github.com/NativeScript/nativescript-cli/commit/03ff1dcaf98b917cbd65c6739871a7be7a224c4b)) + + +## [9.0.3](https://github.com/NativeScript/nativescript-cli/compare/v9.0.2...v9.0.3) (2026-02-01) + + +### Bug Fixes + +* allow app spm to "override" plugin spm packages ([#5951](https://github.com/NativeScript/nativescript-cli/issues/5951)) ([33d44b5](https://github.com/NativeScript/nativescript-cli/commit/33d44b58af3f267168544b3f80719d4a1c607672)) +* **vite:** incremental build file changes ([#5952](https://github.com/NativeScript/nativescript-cli/issues/5952)) ([9013634](https://github.com/NativeScript/nativescript-cli/commit/90136342348e9009d9f71ddab99c05a3d9e86775)) +* **workspaces:** duplicate added frameworks ([#5949](https://github.com/NativeScript/nativescript-cli/issues/5949)) ([768a97c](https://github.com/NativeScript/nativescript-cli/commit/768a97cafeefc414a56697d1a4550115cb9cfc51)) + + + +## [9.0.2](https://github.com/NativeScript/nativescript-cli/compare/v9.0.1...v9.0.2) (2026-01-04) + + +### Bug Fixes + +* vite build and prepare ([#5948](https://github.com/NativeScript/nativescript-cli/issues/5948)) ([e892f48](https://github.com/NativeScript/nativescript-cli/commit/e892f48ea86510b1aafbb739a42bfd834fbdc12e)) + + + +## [9.0.1](https://github.com/NativeScript/nativescript-cli/compare/v9.0.0...v9.0.1) (2025-11-18) + + +### Bug Fixes + +* prevent error if nativescript.config entry is undefined ([#5919](https://github.com/NativeScript/nativescript-cli/issues/5919)) ([bfad89e](https://github.com/NativeScript/nativescript-cli/commit/bfad89ead225c881c46e2a6a4de042a1cb434323)) + + + +# [9.0.0](https://github.com/NativeScript/nativescript-cli/compare/v8.9.3...v9.0.0) (2025-11-17) + + +### Bug Fixes + +* **android:** livesync tool connect race condition ([#5857](https://github.com/NativeScript/nativescript-cli/issues/5857)) ([1daa553](https://github.com/NativeScript/nativescript-cli/commit/1daa5533d72408b2bba6773ddbd012f5284dc41f)) +* clear all deprecated dependencies ([#5858](https://github.com/NativeScript/nativescript-cli/issues/5858)) ([d9bced3](https://github.com/NativeScript/nativescript-cli/commit/d9bced3427f620f78ca7da62066f836e4961b084)) +* **config:** using set with undefined ([#5883](https://github.com/NativeScript/nativescript-cli/issues/5883)) ([b09510f](https://github.com/NativeScript/nativescript-cli/commit/b09510f5c994226030097332b6f0996c21d1d96c)) +* remove lock from default clean ([#5881](https://github.com/NativeScript/nativescript-cli/issues/5881)) ([a1c39f6](https://github.com/NativeScript/nativescript-cli/commit/a1c39f6d7e9912b74c913a793adc3b6edf125574)) +* **security:** axios 1.11.0 ([#5847](https://github.com/NativeScript/nativescript-cli/issues/5847)) ([0b08cb2](https://github.com/NativeScript/nativescript-cli/commit/0b08cb29bda03495a1e9a99e4bef100bc2d88838)) +* **security:** xml2js and braces ([#5848](https://github.com/NativeScript/nativescript-cli/issues/5848)) ([debc85a](https://github.com/NativeScript/nativescript-cli/commit/debc85a584cdb305ff329bca12c255750e8a9658)) +* update ios-sim-portable to version 4.5.1 ([#5850](https://github.com/NativeScript/nativescript-cli/issues/5850)) ([f575bdc](https://github.com/NativeScript/nativescript-cli/commit/f575bdcc39a1a749788aa04e4cc33d2d26f92489)) +* **visionos:** build/prepare ([e40a1b8](https://github.com/NativeScript/nativescript-cli/commit/e40a1b8d6cfd055016ac2612ecccb771176766b0)) + + +### Features + +* add config to help menu ([#5916](https://github.com/NativeScript/nativescript-cli/issues/5916)) ([f81499d](https://github.com/NativeScript/nativescript-cli/commit/f81499d4092426a801ac2a4bf9579a03c463a2b9)) +* add Dependabot configuration ([#5859](https://github.com/NativeScript/nativescript-cli/issues/5859)) ([93a214c](https://github.com/NativeScript/nativescript-cli/commit/93a214c093c3aa5d47df6b19371c12b26d3c97ed)) +* add Dependency Review Action workflow ([#5860](https://github.com/NativeScript/nativescript-cli/issues/5860)) ([1478ba9](https://github.com/NativeScript/nativescript-cli/commit/1478ba9b8d6cd987833dbd7108a19ed37c0f041f)) +* android upgrades, bundletool to 1.18.2, kotlin to 2.2.20 ([#5917](https://github.com/NativeScript/nativescript-cli/issues/5917)) ([cc94b80](https://github.com/NativeScript/nativescript-cli/commit/cc94b80328ac22828509e71313848bb10d444150)) +* **android:** api level 36 + start up emulator with unknown target versions ([#5842](https://github.com/NativeScript/nativescript-cli/issues/5842)) ([de2cb8c](https://github.com/NativeScript/nativescript-cli/commit/de2cb8c1e68bfbf0c7651a440bbaff72de27cf50)) +* **android:** update default compileSdkVersion and buildToolsVersion to 35 ([#5849](https://github.com/NativeScript/nativescript-cli/issues/5849)) ([cca32f9](https://github.com/NativeScript/nativescript-cli/commit/cca32f99d644c176f61383866cd45979d6e1f6b2)) +* config settings to use different bundlers ([#5837](https://github.com/NativeScript/nativescript-cli/issues/5837)) ([27e94e8](https://github.com/NativeScript/nativescript-cli/commit/27e94e8bececb837ce901e37e9b1c0d4581603dd)) +* hooks command ([#5918](https://github.com/NativeScript/nativescript-cli/issues/5918)) ([87cbca9](https://github.com/NativeScript/nativescript-cli/commit/87cbca902f8a30f27b8db524d307fd40d808216a)) +* **hooks:** support ES Modules ([#5843](https://github.com/NativeScript/nativescript-cli/issues/5843)) ([23c07aa](https://github.com/NativeScript/nativescript-cli/commit/23c07aa097750147432a8a823a4673c328df76fc)) +* migration updates ([52e5749](https://github.com/NativeScript/nativescript-cli/commit/52e57499806431ee5e3919e9a7cd631e030481ac)) +* replace chalk/ansi-colors/glob with Node.js built-ins ([#5853](https://github.com/NativeScript/nativescript-cli/issues/5853)) ([e562267](https://github.com/NativeScript/nativescript-cli/commit/e562267ce6a7d5cf2172679d6498b2ab79a9aff7)) + + + +## [8.9.3](https://github.com/NativeScript/nativescript-cli/compare/v8.9.2...v8.9.3) (2025-07-16) + + +### Bug Fixes + +* **bundler:** include process.env first ([4df139d](https://github.com/NativeScript/nativescript-cli/commit/4df139dc83456ac98dc4cdae765b72a47a945f91)) +* pass down process environment to webpack process ([#5844](https://github.com/NativeScript/nativescript-cli/issues/5844)) ([1e8b93f](https://github.com/NativeScript/nativescript-cli/commit/1e8b93fb0b8c5ac3080fdb5eecec5b7326859c81)) + + + +## [8.9.2](https://github.com/NativeScript/nativescript-cli/compare/v8.9.1...v8.9.2) (2025-03-25) + + +### Bug Fixes + +* icon generator color type error ([#5838](https://github.com/NativeScript/nativescript-cli/issues/5838)) ([af81491](https://github.com/NativeScript/nativescript-cli/commit/af8149113844a7aebcd6bf66eeae73154ac7927b)) +* remove --legacy-peer-deps flag on install ([#5839](https://github.com/NativeScript/nativescript-cli/issues/5839)) ([ca6fb68](https://github.com/NativeScript/nativescript-cli/commit/ca6fb68a96cbf4006885c878527c0743b3dae248)) + + + ## [8.9.1](https://github.com/NativeScript/nativescript-cli/compare/v8.9.0...v8.9.1) (2025-03-05) diff --git a/Gruntfile.js b/Gruntfile.js index ad630f4650..a08b50c319 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -2,7 +2,7 @@ const childProcess = require("child_process"); const EOL = require("os").EOL; const path = require("path"); const now = new Date().toISOString(); -const latestVersion = require('latest-version').default; +const manifest = require('pacote').manifest; const ENVIRONMENTS = { @@ -248,15 +248,38 @@ function registerTestingDependenciesTasks(grunt) { const generatedVersionFilePath = path.join(configsBasePath, "test-deps-versions-generated.json"); grunt.registerTask("generate_unit_testing_dependencies", async function () { - var done = this.async(); + const done = this.async(); + const dependenciesVersions = {}; - const testDependencies = grunt.file.readJSON(path.join(configsBasePath, "test-dependencies.json")); - for (var dependency of testDependencies) { - const dependencyVersion = dependency.version || await latestVersion(dependency.name); - dependenciesVersions[dependency.name] = dependencyVersion; + let testDependencies; + + try { + testDependencies = grunt.file.readJSON(path.join(configsBasePath, "test-dependencies.json")); + } catch (err) { + grunt.log.error("Could not read test-dependencies.json:", err); + return done(false); } - grunt.file.write(generatedVersionFilePath, JSON.stringify(dependenciesVersions)); - done(); + + (async () => { + try { + for (const dep of testDependencies) { + if (dep.version) { + dependenciesVersions[dep.name] = dep.version; + } else { + dependenciesVersions[dep.name] = await latestVersion(dep.name); + } + } + grunt.file.write( + generatedVersionFilePath, + JSON.stringify(dependenciesVersions, null, 2) + ); + grunt.log.writeln("Wrote", generatedVersionFilePath); + done(); + } catch (err) { + grunt.log.error(err); + done(false); + } + })(); }); grunt.registerTask("verify_unit_testing_dependencies", function () { @@ -266,3 +289,9 @@ function registerTestingDependenciesTasks(grunt) { }); } +async function latestVersion(name) { + // only fetches the package.json for the latest dist-tag + const { version } = await manifest(name.toLowerCase(), { fullMetadata: false }); + return version; +} + diff --git a/README.md b/README.md index 07ca7c7b89..7324ffcff2 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,6 @@

-
- Nativescript Logo -
-
- NativeScript Command-Line Interface -
+ Nativescript Logo

The NativeScript CLI lets you create, build, and deploy NativeScript apps.

@@ -14,7 +9,11 @@ --- -[![nativescript -> npm](https://github.com/NativeScript/nativescript-cli/actions/workflows/npm_release_cli.yml/badge.svg)](https://github.com/NativeScript/nativescript-cli/actions/workflows/npm_release_cli.yml) +

+ npm version + license + downloads +

Get it using: `npm install -g nativescript` @@ -45,6 +44,12 @@ Get it using: `npm install -g nativescript` - [Extending the CLI](#extending-the-cli) - [Troubleshooting](#troubleshooting) - [How to Contribute](#how-to-contribute) +- [Scorecard Maintenance](#scorecard-maintenance) + - [1) Branch-Protection check (`?`) in Scorecard workflow](#1-branch-protection-check--in-scorecard-workflow) + - [2) Required branch/ruleset settings for higher Branch-Protection and Code-Review](#2-required-branchruleset-settings-for-higher-branch-protection-and-code-review) + - [3) Keep Token-Permissions high](#3-keep-token-permissions-high) + - [4) Signed-Releases check](#4-signed-releases-check) + - [5) Vulnerabilities check](#5-vulnerabilities-check) - [How to Build](#how-to-build) - [Get Help](#get-help) - [License](#license) @@ -67,10 +72,7 @@ Some popular use cases: To learn more about NativeScript, you can check the following resources: * [The NativeScript web page][2] -* [NativeScript - a Technical Overview][7] -* [Announcing NativeScript - cross-platform framework for building native mobile applications][8] -* The NativeScript [Documentation repo][3] and [Documentation portal][4] -* [The NativeScript FAQ][6] +* The NativeScript [Documentation][4] and contributing to [docs via the repo](https://github.com/NativeScript/docs) [Back to Top][1] @@ -104,9 +106,9 @@ System Requirements You can install and run the NativeScript CLI on Windows, macOS or Linux. -* [Windows](https://docs.nativescript.org/start/ns-setup-win) -* [macOS](https://docs.nativescript.org/start/ns-setup-os-x) -* [Linux](https://docs.nativescript.org/start/ns-setup-linux) +* [Windows](https://docs.nativescript.org/setup/windows) +* [macOS](https://docs.nativescript.org/setup/macos) +* [Linux](https://docs.nativescript.org/setup/linux) Installation === @@ -224,14 +226,14 @@ The CLI places the project in a new directory in the current directory. The newl ``` MyApp/ -├── app -│ ├── App_Resources +├── App_Resources +├── src │ └── ... └── platforms └── ... ``` -* The `app` directory is the **development space for your application**. You should modify all common and platform-specific code within this directory. When you run `prepare `, the NativeScript CLI prepares relevant content to the platform-specific folders for each target platform. +* The `src` directory (or sometimes `app` folder) is the **development space for your application**. You should modify all common and platform-specific code within this directory. When you run `prepare `, the NativeScript CLI prepares relevant content to the platform-specific folders for each target platform. * The `platforms` directory is created empty. When you add a target platform to your project, the NativeScript CLI creates a new subdirectory with the platform name. The subdirectory contains the ready-to-build resources of your app. When you run `prepare `, the NativeScript CLI prepares relevant content from the `app` directory to the platform-specific subdirectory for each target platform. [Back to Top][1] @@ -263,13 +265,13 @@ You can develop shared functionality or design in common files. To indicate that ### Modifying Configuration Files -The NativeScript CLI respects any platform configuration files placed inside `app/App_Resources`. +The NativeScript CLI respects any platform configuration files placed inside `App_Resources`. ### Modifying Entitlements File (iOS only) -To specify which capabilities are required by your App - Maps, Push Notifications, Wallet etc. you can add or edit the `app.entitlements` file placed inside `app/App_Resources/iOS`. When building the project, the default `app/App_Resources/iOS/app.entitlements` file gets merged with all Plugins entitlement files and a new `yourAppName.entitlements` is created in the platforms directory. The path would be `app/platforms/ios//.entitlements` and will be linked in the `build.xcconfig` file. +To specify which capabilities are required by your App - Maps, Push Notifications, Wallet etc. you can add or edit the `app.entitlements` file placed inside `App_Resources/iOS`. When building the project, the default `App_Resources/iOS/app.entitlements` file gets merged with all Plugins entitlement files and a new `yourAppName.entitlements` is created in the platforms directory. The path would be `platforms/ios//.entitlements` and will be linked in the `build.xcconfig` file. -You can always override the generated entitlements file, by pointing to your own entitlements file by setting the `CODE_SIGN_ENTITLEMENTS` property in the `app/App_Resources/iOS/build.xcconfig` file. +You can always override the generated entitlements file, by pointing to your own entitlements file by setting the `CODE_SIGN_ENTITLEMENTS` property in the `App_Resources/iOS/build.xcconfig` file. [Back to Top][1] @@ -314,11 +316,11 @@ ns run ios Extending the CLI === -The NativeScript CLI lets you extend its behavior and customize it to fit your needs by using [hooks](https://en.wikipedia.org/wiki/Hooking). +The NativeScript CLI lets you extend its behavior and customize it to fit your needs by using [hooks](https://docs.nativescript.org/guide/hooks). When you run one of the extendable commands (for example, `ns build`), the CLI checks for hooks and executes them. Plugins can also use hooks to control the compilation of the application package. -For more information, see the [Extending the CLI document](https://github.com/NativeScript/nativescript-cli/blob/master/extending-cli.md) +For more information, see the [Extending the CLI document](https://github.com/NativeScript/nativescript-cli/blob/main/extending-cli.md) [Back to Top][1] @@ -348,12 +350,56 @@ To learn how to contribute to the code base, click [here](https://github.com/Nat [Back to Top][1] +Scorecard Maintenance +=== + +This repository tracks OpenSSF Scorecard. Use this checklist when score drops or checks become inconclusive. + +### 1) Branch-Protection check (`?`) in Scorecard workflow + +- Ensure `.github/workflows/scorecard.yml` uses `repo_token: ${{ secrets.SCORECARD_TOKEN }}`. +- Set `SCORECARD_TOKEN` as a repository Actions secret. +- If using a fine-grained PAT, set expiration to **366 days or less** (NativeScript org policy). +- If Branch-Protection still reports token incompatibility, use a PAT type compatible with Scorecard's Branch-Protection query path. + +### 2) Required branch/ruleset settings for higher Branch-Protection and Code-Review + +Apply to `main` and release branches: + +- Prevent force push and prevent branch deletion. +- Require pull request before merge. +- Require status checks to pass before merge. +- Require at least 2 approvals. +- Require code owner review. +- Dismiss stale approvals when new commits are pushed. +- Include administrators. + +### 3) Keep Token-Permissions high + +- Set top-level workflow permissions to read-only (for example `permissions: read-all`). +- Grant write permissions only at job level and only when needed (for example publish/release jobs). +- Keep GitHub Actions pinned to full commit SHAs. + +### 4) Signed-Releases check + +- Publish release assets with provenance/signature files. +- Keep release workflow attaching `*.intoto.jsonl` artifacts alongside release bundles. + +### 5) Vulnerabilities check + +- Keep runtime dependency vulnerabilities near zero. +- Run `npm audit --omit=dev` before release PRs. +- Update vulnerable dependencies quickly; for non-applicable findings, document and track mitigation clearly. + +[Back to Top][1] + How to Build === ``` git clone https://github.com/NativeScript/nativescript-cli cd nativescript-cli npm run setup +npm run build ``` To use the locally built CLI instead of `ns` you can call `PATH_TO_CLI_FOLDER/bin/ns`. For example: @@ -379,7 +425,4 @@ This software is licensed under the Apache 2.0 license, quoted --- +title: ns config get +position: 2 +---<% } %> + +# ns config get + +### Description + +Prints the value for a specific key from the project's NativeScript configuration. + +### Commands + +Usage | Synopsis +------|------- +General | `$ ns config get ` + +### Arguments + +* `` — The configuration key in dot-notation. Examples: `ios.id`, `android.codeCache`, `bundler`. + +### Examples + +* `$ ns config get ios.id` +* `$ ns config get android.codeCache` +* `$ ns config get bundler` + +<% if(isHtml) { %> + +### Related Commands + +Command | Description +----------|---------- +[config](config.html) | Lists all configuration values for the current project. +[config set](config-set.html) | Sets the value for the specified configuration key. +<% } %> \ No newline at end of file diff --git a/docs/man_pages/config/config-set.md b/docs/man_pages/config/config-set.md new file mode 100644 index 0000000000..ea7769f647 --- /dev/null +++ b/docs/man_pages/config/config-set.md @@ -0,0 +1,40 @@ +<% if (isJekyll) { %>--- +title: ns config set +position: 3 +---<% } %> + +# ns config set + +### Description + +Sets the value for a specific key in the project's NativeScript configuration. + +### Commands + +Usage | Synopsis +------|------- +General | `$ ns config set ` + +### Arguments + +* `` — The configuration key in dot-notation. Examples: `ios.id`, `android.codeCache`, `bundler`. +* `` — The value to set. Parsed as JSON when possible (e.g. `true`, `42`, `{ "foo": "bar" }`). Otherwise treated as a string. + +### Examples + +* `$ ns config set ios.id org.nativescript.myapp` +* `$ ns config set android.codeCache true` +* `$ ns config set bundler vite` + +### Notes + +* Setting whole objects is not supported. Update individual keys instead. For example, use: + `$ ns config set android.codeCache true` + +### Related Commands + +Command | Description +----------|---------- +[config](config.html) | Lists all configuration values for the current project. +[config get](config-get.html) | Prints the value for the specified configuration key. +<% } %> \ No newline at end of file diff --git a/docs/man_pages/config/config.md b/docs/man_pages/config/config.md new file mode 100644 index 0000000000..7b701e03d1 --- /dev/null +++ b/docs/man_pages/config/config.md @@ -0,0 +1,39 @@ +<% if (isJekyll) { %>--- +title: ns config +position: 1 +---<% } %> + +# ns config + +### Description + +View and manage your project's NativeScript configuration stored in `nativescript.config.(js|ts)` (or legacy `nsconfig.json`). + +### Commands + +Usage | Synopsis +------|--------- +List all config | `$ ns config` +Get a value | `$ ns config get ` +Set a value | `$ ns config set ` + +### Examples + +* `$ ns config` — prints all configuration values. +* `$ ns config get ios.id` — prints the iOS bundle identifier. +* `$ ns config set android.codeCache true` — enables Android V8 code cache. + +### Notes + +* Keys use dot-notation, for example: `ios.id`, `android.codeCache`, `bundler`. +* Values are parsed as JSON when possible. Use quotes for strings with spaces. + +<% if(isHtml) { %> + +### Related Commands + +Command | Description +----------|---------- +[config get](config-get.html) | Prints the value for the specified configuration key. +[config set](config-set.html) | Sets the value for the specified configuration key. +<% } %> \ No newline at end of file diff --git a/docs/man_pages/project/hooks/hooks.md b/docs/man_pages/project/hooks/hooks.md new file mode 100644 index 0000000000..0c952aedc7 --- /dev/null +++ b/docs/man_pages/project/hooks/hooks.md @@ -0,0 +1,35 @@ +<% if (isJekyll) { %>--- +title: ns hooks +position: 1 +---<% } %> + +# ns create + +### Description + +Manages lifecycle hooks from installed plugins. + +### Commands + +Usage | Synopsis +---------|--------- +Install | `$ ns hooks install` +List | `$ ns hooks list` +Lock | `$ ns hooks lock` +Verify | `$ ns hooks verify` + +#### Install + +Installs hooks from each installed plugin dependency. + +#### List + +Lists the plugins which have hooks and which scripts they install + +#### Lock + +Generates a `hooks-lock.json` containing the hooks that are in the current versions of the plugins. + +#### Verify + +Verifies that the hooks contained in the installed plugins match those listed in the `hooks-lock.json` file. diff --git a/docs/man_pages/start.md b/docs/man_pages/start.md index 83b9da83e8..646952bb68 100644 --- a/docs/man_pages/start.md +++ b/docs/man_pages/start.md @@ -51,6 +51,7 @@ Command | Description [plugin](lib-management/plugin.html) | Lets you manage the plugins for your project. [open](project/configuration/open.md) | Opens the native project in Xcode/Android Studio. [widget ios](project/configuration/widget.md) | Adds a new iOS widget to the project. +[hooks](project/hooks/hooks.html) | Installs lifecycle hooks from plugins. ## Publishing Commands Command | Description ---|--- diff --git a/lib/bootstrap.ts b/lib/bootstrap.ts index ca8fe39888..3281d84930 100644 --- a/lib/bootstrap.ts +++ b/lib/bootstrap.ts @@ -263,6 +263,15 @@ injector.requireCommand("plugin|update", "./commands/plugin/update-plugin"); injector.requireCommand("plugin|build", "./commands/plugin/build-plugin"); injector.requireCommand("plugin|create", "./commands/plugin/create-plugin"); +injector.requireCommand( + ["hooks|*list", "hooks|install"], + "./commands/hooks/hooks", +); +injector.requireCommand( + ["hooks|lock", "hooks|verify"], + "./commands/hooks/hooks-lock", +); + injector.require("doctorService", "./services/doctor-service"); injector.require("xcprojService", "./services/xcproj-service"); injector.require("versionsService", "./services/versions-service"); @@ -414,8 +423,8 @@ injector.require( injector.requirePublic("cleanupService", "./services/cleanup-service"); injector.require( - "webpackCompilerService", - "./services/webpack/webpack-compiler-service", + "bundlerCompilerService", + "./services/bundler/bundler-compiler-service", ); injector.require( diff --git a/lib/bun-package-manager.ts b/lib/bun-package-manager.ts index b2d5b8f842..cfd5ffc057 100644 --- a/lib/bun-package-manager.ts +++ b/lib/bun-package-manager.ts @@ -47,10 +47,7 @@ export class BunPackageManager extends BasePackageManager { const jsonContentBefore = this.$fs.readJson(packageJsonPath); const flags = this.getFlagsString(config, true); - // TODO: Confirm desired behavior. The npm version uses --legacy-peer-deps - // by default, we could use `--no-peer` for Bun if similar is needed; the - // pnpm version uses `--shamefully-hoist`, but Bun has no similar flag. - let params = ["install", "--legacy-peer-deps"]; + let params = ["install"]; const isInstallingAllDependencies = packageName === pathToSave; if (!isInstallingAllDependencies) { params.push(packageName); diff --git a/lib/color.ts b/lib/color.ts index 9260c23f5c..936569201e 100644 --- a/lib/color.ts +++ b/lib/color.ts @@ -1,12 +1,92 @@ -// using chalk as some of our other dependencies are already using it... -// exporting from here so we can easily refactor to a different color library if needed -import * as ansi from "ansi-colors"; -import * as chalk from "chalk"; +import { styleText, stripVTControlCharacters } from "node:util"; -export type Color = typeof chalk.Color; +// Define color types based on util.inspect.colors +export type StyleFormat = + | "reset" + | "bold" + | "dim" + | "italic" + | "underline" + | "blink" + | "inverse" + | "hidden" + | "strikethrough" + | "doubleunderline" + | "black" + | "red" + | "green" + | "yellow" + | "blue" + | "magenta" + | "cyan" + | "white" + | "gray" + | "redBright" + | "greenBright" + | "yellowBright" + | "blueBright" + | "magentaBright" + | "cyanBright" + | "whiteBright" + | "bgBlack" + | "bgRed" + | "bgGreen" + | "bgYellow" + | "bgBlue" + | "bgMagenta" + | "bgCyan" + | "bgWhite" + | "bgGray" + | "bgRedBright" + | "bgGreenBright" + | "bgYellowBright" + | "bgBlueBright" + | "bgMagentaBright" + | "bgCyanBright" + | "bgWhiteBright"; -export function stripColors(formatStr: string) { - return ansi.stripColor(formatStr); -} +export type Color = StyleFormat; -export const color = chalk; +// Create a chalk-like API using the Node.js util.styleText function +export const color = { + reset: (text: string) => styleText("reset", text), + bold: (text: string) => styleText("bold", text), + dim: (text: string) => styleText("dim", text), + italic: (text: string) => styleText("italic", text), + underline: (text: string) => styleText("underline", text), + inverse: (text: string) => styleText("inverse", text), + hidden: (text: string) => styleText("hidden", text), + strikethrough: (text: string) => styleText("strikethrough", text), + + // Text colors + black: (text: string) => styleText("black", text), + red: (text: string) => styleText("red", text), + blue: (text: string) => styleText("blue", text), + magenta: (text: string) => styleText("magenta", text), + cyan: (text: string) => styleText("cyan", text), + white: (text: string) => styleText("white", text), + gray: (text: string) => styleText("gray", text), + yellow: (text: string) => styleText("yellow", text), + green: (text: string) => styleText("green", text), + grey: (text: string) => styleText("grey", text), + + // Background colors + bgBlack: (text: string) => styleText("bgBlack", text), + bgBlackBright: (text: string) => styleText("bgBlackBright", text), + bgRed: (text: string) => styleText("bgRed", text), + bgGreen: (text: string) => styleText("bgGreen", text), + bgYellow: (text: string) => styleText("bgYellow", text), + bgBlue: (text: string) => styleText("bgBlue", text), + bgMagenta: (text: string) => styleText("bgMagenta", text), + bgCyan: (text: string) => styleText("bgCyan", text), + bgWhite: (text: string) => styleText("bgWhite", text), + cyanBright: (text: string) => styleText("cyanBright", text), + whiteBright: (text: string) => styleText("whiteBright", text), + greenBright: (text: string) => styleText("greenBright", text), + yellowBright: (text: string) => styleText("yellowBright", text), + redBright: (text: string) => styleText("redBright", text), + + styleText, +}; + +export const stripColors = (text: string) => stripVTControlCharacters(text); diff --git a/lib/commands/build.ts b/lib/commands/build.ts index d4c6460a1c..f3c3c1adb3 100644 --- a/lib/commands/build.ts +++ b/lib/commands/build.ts @@ -27,13 +27,13 @@ export abstract class BuildCommandBase extends ValidatePlatformCommandBase { protected $buildController: IBuildController, $platformValidationService: IPlatformValidationService, private $buildDataService: IBuildDataService, - protected $logger: ILogger + protected $logger: ILogger, ) { super( $options, $platformsDataService, $platformValidationService, - $projectData + $projectData, ); this.$projectData.initializeProjectData(); } @@ -52,7 +52,7 @@ export abstract class BuildCommandBase extends ValidatePlatformCommandBase { const buildData = this.$buildDataService.getBuildData( this.$projectData.projectDir, platform, - this.$options + this.$options, ); const outputPath = await this.$buildController.prepareAndBuild(buildData); @@ -63,24 +63,24 @@ export abstract class BuildCommandBase extends ValidatePlatformCommandBase { if ( !this.$platformValidationService.isPlatformSupportedForOS( platform, - this.$projectData + this.$projectData, ) ) { this.$errors.fail( - `Applications for platform ${platform} can not be built on this OS` + `Applications for platform ${platform} can not be built on this OS`, ); } } protected async validateArgs( args: string[], - platform: string + platform: string, ): Promise { if (args.length !== 0) { this.$errors.failWithHelp( `The arguments '${args.join( - " " - )}' are not valid for the current command.` + " ", + )}' are not valid for the current command.`, ); } @@ -88,7 +88,7 @@ export abstract class BuildCommandBase extends ValidatePlatformCommandBase { this.$options.provision, this.$options.teamId, this.$projectData, - platform + platform, ); return result; @@ -108,7 +108,7 @@ export class BuildIosCommand extends BuildCommandBase implements ICommand { $platformValidationService: IPlatformValidationService, $logger: ILogger, $buildDataService: IBuildDataService, - protected $migrateController: IMigrateController + protected $migrateController: IMigrateController, ) { super( $options, @@ -119,7 +119,7 @@ export class BuildIosCommand extends BuildCommandBase implements ICommand { $buildController, $platformValidationService, $buildDataService, - $logger + $logger, ); } @@ -163,7 +163,7 @@ export class BuildAndroidCommand extends BuildCommandBase implements ICommand { protected $androidBundleValidatorHelper: IAndroidBundleValidatorHelper, $buildDataService: IBuildDataService, protected $logger: ILogger, - private $migrateController: IMigrateController + private $migrateController: IMigrateController, ) { super( $options, @@ -174,7 +174,7 @@ export class BuildAndroidCommand extends BuildCommandBase implements ICommand { $buildController, $platformValidationService, $buildDataService, - $logger + $logger, ); } @@ -185,12 +185,12 @@ export class BuildAndroidCommand extends BuildCommandBase implements ICommand { if (this.$options.aab) { this.$logger.info( - AndroidAppBundleMessages.ANDROID_APP_BUNDLE_DOCS_MESSAGE + AndroidAppBundleMessages.ANDROID_APP_BUNDLE_DOCS_MESSAGE, ); if (this.$options.release) { this.$logger.info( - AndroidAppBundleMessages.ANDROID_APP_BUNDLE_PUBLISH_DOCS_MESSAGE + AndroidAppBundleMessages.ANDROID_APP_BUNDLE_PUBLISH_DOCS_MESSAGE, ); } } @@ -205,7 +205,7 @@ export class BuildAndroidCommand extends BuildCommandBase implements ICommand { }); } this.$androidBundleValidatorHelper.validateRuntimeVersion( - this.$projectData + this.$projectData, ); let canExecute = await super.canExecuteCommandBase(platform); if (canExecute) { @@ -233,7 +233,7 @@ export class BuildVisionOsCommand extends BuildIosCommand implements ICommand { $platformValidationService: IPlatformValidationService, $logger: ILogger, $buildDataService: IBuildDataService, - protected $migrateController: IMigrateController + protected $migrateController: IMigrateController, ) { super( $options, @@ -245,15 +245,33 @@ export class BuildVisionOsCommand extends BuildIosCommand implements ICommand { $platformValidationService, $logger, $buildDataService, - $migrateController + $migrateController, ); } + public async execute(args: string[]): Promise { + await this.executeCore([ + this.$devicePlatformsConstants.visionOS.toLowerCase(), + ]); + } + public async canExecute(args: string[]): Promise { - this.$errors.fail( - 'Building for "visionOS" platform is not supported via the CLI. Please open the project in Xcode and build it from there.' - ); - return false; + const platform = this.$devicePlatformsConstants.visionOS; + if (!this.$options.force) { + await this.$migrateController.validate({ + projectDir: this.$projectData.projectDir, + platforms: [platform], + }); + } + + super.validatePlatform(platform); + + let canExecute = await super.canExecuteCommandBase(platform); + if (canExecute) { + canExecute = await super.validateArgs(args, platform); + } + + return canExecute; } } diff --git a/lib/commands/clean.ts b/lib/commands/clean.ts index 1d8c636a55..62a00bf8ce 100644 --- a/lib/commands/clean.ts +++ b/lib/commands/clean.ts @@ -110,7 +110,6 @@ export class CleanCommand implements ICommand { constants.HOOKS_DIR_NAME, constants.PLATFORMS_DIR_NAME, constants.NODE_MODULES_FOLDER_NAME, - constants.PACKAGE_LOCK_JSON_FILE_NAME, ]; try { @@ -267,7 +266,8 @@ export class CleanCommand implements ICommand { spinner.warn( `This will run "${color.yellow( `ns clean`, - )}" in all the selected projects and ${color.red.bold( + )}" in all the selected projects and ${color.styleText( + ["red", "bold"], "delete files from your system", )}!`, ); diff --git a/lib/commands/config.ts b/lib/commands/config.ts index 83f4c8369c..a37506bf47 100644 --- a/lib/commands/config.ts +++ b/lib/commands/config.ts @@ -38,7 +38,7 @@ export class ConfigListCommand implements ICommand { .join("\n") ); } else { - return color.yellow(value.toString()); + return color.yellow(typeof value === 'undefined' ? 'undefined' : value.toString()); } } } @@ -91,7 +91,8 @@ export class ConfigSetCommand implements ICommand { const convertedValue = this.getConvertedValue(value); const existingKey = current !== undefined; const keyDisplay = color.green(key); - const currentDisplay = color.yellow(current); + // when current is undefined, return empty string to avoid throw + const currentDisplay = current ? color.yellow(current) : ""; const updatedDisplay = color.cyan(convertedValue); this.$logger.info( diff --git a/lib/commands/debug.ts b/lib/commands/debug.ts index 031effbbce..c7478ab09f 100644 --- a/lib/commands/debug.ts +++ b/lib/commands/debug.ts @@ -20,7 +20,8 @@ import * as _ from "lodash"; export class DebugPlatformCommand extends ValidatePlatformCommandBase - implements ICommand { + implements ICommand +{ public allowedParameters: ICommandParameter[] = []; constructor( @@ -36,13 +37,13 @@ export class DebugPlatformCommand private $debugDataService: IDebugDataService, private $debugController: IDebugController, private $liveSyncCommandHelper: ILiveSyncCommandHelper, - private $migrateController: IMigrateController + private $migrateController: IMigrateController, ) { super( $options, $platformsDataService, $platformValidationService, - $projectData + $projectData, ); $cleanupService.setShouldDispose(false); } @@ -66,10 +67,10 @@ export class DebugPlatformCommand const debugData = this.$debugDataService.getDebugData( selectedDeviceForDebug.deviceInfo.identifier, this.$projectData, - debugOptions + debugOptions, ); await this.$debugController.printDebugInformation( - await this.$debugController.startDebug(debugData) + await this.$debugController.startDebug(debugData), ); return; } @@ -83,7 +84,7 @@ export class DebugPlatformCommand }, buildPlatform: undefined, skipNativePrepare: false, - } + }, ); } @@ -98,17 +99,17 @@ export class DebugPlatformCommand if ( !this.$platformValidationService.isPlatformSupportedForOS( this.platform, - this.$projectData + this.$projectData, ) ) { this.$errors.fail( - `Applications for platform ${this.platform} can not be built on this OS` + `Applications for platform ${this.platform} can not be built on this OS`, ); } if (this.$options.release) { this.$errors.failWithHelp( - "--release flag is not applicable to this command." + "--release flag is not applicable to this command.", ); } @@ -138,12 +139,12 @@ export class DebugIOSCommand implements ICommand { private $sysInfo: ISysInfo, private $projectData: IProjectData, $iosDeviceOperations: IIOSDeviceOperations, - $iOSSimulatorLogProvider: Mobile.IiOSSimulatorLogProvider + $iOSSimulatorLogProvider: Mobile.IiOSSimulatorLogProvider, ) { this.$projectData.initializeProjectData(); // Do not dispose ios-device-lib, so the process will remain alive and the debug application (NativeScript Inspector or Chrome DevTools) will be able to connect to the socket. // In case we dispose ios-device-lib, the socket will be closed and the code will fail when the debug application tries to read/send data to device socket. - // That's why the `$ tns debug ios --justlaunch` command will not release the terminal. + // That's why the `$ ns debug ios --justlaunch` command will not release the terminal. // In case we do not set it to false, the dispose will be called once the command finishes its execution, which will prevent the debugging. $iosDeviceOperations.setShouldDispose(false); $iOSSimulatorLogProvider.setShouldDispose(false); @@ -157,18 +158,18 @@ export class DebugIOSCommand implements ICommand { if ( !this.$platformValidationService.isPlatformSupportedForOS( this.$devicePlatformsConstants.iOS, - this.$projectData + this.$projectData, ) ) { this.$errors.fail( - `Applications for platform ${this.$devicePlatformsConstants.iOS} can not be built on this OS` + `Applications for platform ${this.$devicePlatformsConstants.iOS} can not be built on this OS`, ); } const isValidTimeoutOption = this.isValidTimeoutOption(); if (!isValidTimeoutOption) { this.$errors.fail( - `Timeout option specifies the seconds NativeScript CLI will wait to find the inspector socket port from device's logs. Must be a number.` + `Timeout option specifies the seconds NativeScript CLI will wait to find the inspector socket port from device's logs. Must be a number.`, ); } @@ -179,7 +180,7 @@ export class DebugIOSCommand implements ICommand { macOSWarning.severity === SystemWarningsSeverity.high ) { this.$errors.fail( - `You cannot use NativeScript Inspector on this OS. To use it, please update your OS.` + `You cannot use NativeScript Inspector on this OS. To use it, please update your OS.`, ); } } @@ -224,7 +225,7 @@ export class DebugAndroidCommand implements ICommand { private $devicePlatformsConstants: Mobile.IDevicePlatformsConstants, private $injector: IInjector, private $projectData: IProjectData, - private $options: IOptions + private $options: IOptions, ) { this.$projectData.initializeProjectData(); } diff --git a/lib/commands/embedding/embed.ts b/lib/commands/embedding/embed.ts index a186b8763c..fd3b58ac63 100644 --- a/lib/commands/embedding/embed.ts +++ b/lib/commands/embedding/embed.ts @@ -24,7 +24,7 @@ export class EmbedCommand extends PrepareCommand implements ICommand { private $logger: ILogger, private $fs: IFileSystem, - private $projectConfigService: IProjectConfigService + private $projectConfigService: IProjectConfigService, ) { super( $options, @@ -34,7 +34,7 @@ export class EmbedCommand extends PrepareCommand implements ICommand { $platformCommandParameter, $platformsDataService, $prepareDataService, - $migrateController + $migrateController, ); } @@ -56,10 +56,11 @@ export class EmbedCommand extends PrepareCommand implements ICommand { if (!this.$fs.exists(resolvedHostProjectPath)) { this.$logger.error( `The host project path ${color.yellow( - hostProjectPath - )} (resolved to: ${color.yellow.dim( - resolvedHostProjectPath - )}) does not exist.` + hostProjectPath, + )} (resolved to: ${color.styleText( + ["yellow", "dim"], + resolvedHostProjectPath, + )}) does not exist.`, ); return; } @@ -89,7 +90,7 @@ export class EmbedCommand extends PrepareCommand implements ICommand { if (!args[1]) { const hostProjectPath = this.getEmbedConfigForKey( "hostProjectPath", - platform + platform, ); if (hostProjectPath) { args[1] = hostProjectPath; @@ -99,7 +100,7 @@ export class EmbedCommand extends PrepareCommand implements ICommand { if (!args[2]) { const hostProjectModuleName = this.getEmbedConfigForKey( "hostProjectModuleName", - platform + platform, ); if (hostProjectModuleName) { args[2] = hostProjectModuleName; @@ -119,7 +120,7 @@ export class EmbedCommand extends PrepareCommand implements ICommand { // get the embed.. value, or fallback to embed. value return this.$projectConfigService.getValue( `embed.${platform}.${key}`, - this.$projectConfigService.getValue(`embed.${key}`) + this.$projectConfigService.getValue(`embed.${key}`), ); } } diff --git a/lib/commands/hooks/common.ts b/lib/commands/hooks/common.ts new file mode 100644 index 0000000000..4532a73326 --- /dev/null +++ b/lib/commands/hooks/common.ts @@ -0,0 +1,118 @@ +import * as _ from "lodash"; +import { IProjectData } from "../../definitions/project"; +import { IPluginData } from "../../definitions/plugins"; +import { ICommandParameter } from "../../common/definitions/commands"; +import { IErrors, IFileSystem } from "../../common/declarations"; +import path = require("path"); +import * as crypto from "crypto"; + +export const LOCK_FILE_NAME = "nativescript-lock.json"; +export interface OutputHook { + type: string; + hash: string; +} + +export interface OutputPlugin { + name: string; + hooks: OutputHook[]; +} + +export class HooksVerify { + public allowedParameters: ICommandParameter[] = []; + + constructor( + protected $projectData: IProjectData, + protected $errors: IErrors, + protected $fs: IFileSystem, + protected $logger: ILogger, + ) { + this.$projectData.initializeProjectData(); + } + + protected async verifyHooksLock( + plugins: IPluginData[], + hooksLockPath: string, + ): Promise { + let lockFileContent: string; + let hooksLock: OutputPlugin[]; + + try { + lockFileContent = this.$fs.readText(hooksLockPath, "utf8"); + hooksLock = JSON.parse(lockFileContent); + } catch (err) { + this.$errors.fail( + `❌ Failed to read or parse ${LOCK_FILE_NAME} at ${hooksLockPath}`, + ); + } + + const lockMap = new Map>(); // pluginName -> hookType -> hash + + for (const plugin of hooksLock) { + const hookMap = new Map(); + for (const hook of plugin.hooks) { + hookMap.set(hook.type, hook.hash); + } + lockMap.set(plugin.name, hookMap); + } + + let isValid = true; + + for (const plugin of plugins) { + const pluginLockHooks = lockMap.get(plugin.name); + + if (!pluginLockHooks) { + this.$logger.error( + `❌ Plugin '${plugin.name}' not found in ${LOCK_FILE_NAME}`, + ); + isValid = false; + continue; + } + + for (const hook of plugin.nativescript?.hooks || []) { + const expectedHash = pluginLockHooks.get(hook.type); + + if (!expectedHash) { + this.$logger.error( + `❌ Missing hook '${hook.type}' for plugin '${plugin.name}' in ${LOCK_FILE_NAME}`, + ); + isValid = false; + continue; + } + + let fileContent: string | Buffer; + + try { + fileContent = this.$fs.readFile( + path.join(plugin.fullPath, hook.script), + ); + } catch (err) { + this.$logger.error( + `❌ Cannot read script file '${hook.script}' for hook '${hook.type}' in plugin '${plugin.name}'`, + ); + isValid = false; + continue; + } + + const actualHash = crypto + .createHash("sha256") + .update(fileContent) + .digest("hex"); + + if (actualHash !== expectedHash) { + this.$logger.error( + `❌ Hash mismatch for '${hook.script}' (${hook.type} in ${plugin.name}):`, + ); + this.$logger.error(` Expected: ${expectedHash}`); + this.$logger.error(` Actual: ${actualHash}`); + isValid = false; + } + } + } + + if (isValid) { + this.$logger.info("✅ All hooks verified successfully. No issues found."); + } else { + this.$errors.fail("❌ One or more hooks failed verification."); + } + } +} diff --git a/lib/commands/hooks/hooks-lock.ts b/lib/commands/hooks/hooks-lock.ts new file mode 100644 index 0000000000..27399ac622 --- /dev/null +++ b/lib/commands/hooks/hooks-lock.ts @@ -0,0 +1,135 @@ +import { IProjectData } from "../../definitions/project"; +import { IPluginsService, IPluginData } from "../../definitions/plugins"; +import { ICommand, ICommandParameter } from "../../common/definitions/commands"; +import { IErrors, IFileSystem } from "../../common/declarations"; +import { injector } from "../../common/yok"; +import path = require("path"); +import * as crypto from "crypto"; +import { + HooksVerify, + LOCK_FILE_NAME, + OutputHook, + OutputPlugin, +} from "./common"; + +export class HooksLockPluginCommand implements ICommand { + public allowedParameters: ICommandParameter[] = []; + + constructor( + private $pluginsService: IPluginsService, + private $projectData: IProjectData, + private $errors: IErrors, + private $fs: IFileSystem, + private $logger: ILogger, + ) { + this.$projectData.initializeProjectData(); + } + + public async execute(): Promise { + const plugins: IPluginData[] = + await this.$pluginsService.getAllInstalledPlugins(this.$projectData); + if (plugins && plugins.length > 0) { + const pluginsWithHooks: IPluginData[] = []; + for (const plugin of plugins) { + if (plugin.nativescript?.hooks?.length > 0) { + pluginsWithHooks.push(plugin); + } + } + + await this.writeHooksLockFile( + pluginsWithHooks, + this.$projectData.projectDir, + ); + } else { + this.$logger.info("No plugins with hooks found."); + } + } + + public async canExecute(args: string[]): Promise { + return true; + } + + private async writeHooksLockFile( + plugins: IPluginData[], + outputDir: string, + ): Promise { + const output: OutputPlugin[] = []; + + for (const plugin of plugins) { + const hooks: OutputHook[] = []; + + for (const hook of plugin.nativescript?.hooks || []) { + try { + const fileContent = this.$fs.readFile( + path.join(plugin.fullPath, hook.script), + ); + const hash = crypto + .createHash("sha256") + .update(fileContent) + .digest("hex"); + + hooks.push({ + type: hook.type, + hash, + }); + } catch (err) { + this.$logger.warn( + `Warning: Failed to read script '${hook.script}' for plugin '${plugin.name}'. Skipping this hook.`, + ); + continue; + } + } + + output.push({ name: plugin.name, hooks }); + } + + const filePath = path.resolve(outputDir, LOCK_FILE_NAME); + + try { + this.$fs.writeFile(filePath, JSON.stringify(output, null, 2), "utf8"); + this.$logger.info(`✅ ${LOCK_FILE_NAME} written to: ${filePath}`); + } catch (err) { + this.$errors.fail(`❌ Failed to write ${LOCK_FILE_NAME}: ${err}`); + } + } +} + +export class HooksVerifyPluginCommand extends HooksVerify implements ICommand { + public allowedParameters: ICommandParameter[] = []; + + constructor( + private $pluginsService: IPluginsService, + $projectData: IProjectData, + $errors: IErrors, + $fs: IFileSystem, + $logger: ILogger, + ) { + super($projectData, $errors, $fs, $logger); + } + + public async execute(): Promise { + const plugins: IPluginData[] = + await this.$pluginsService.getAllInstalledPlugins(this.$projectData); + if (plugins && plugins.length > 0) { + const pluginsWithHooks: IPluginData[] = []; + for (const plugin of plugins) { + if (plugin.nativescript?.hooks?.length > 0) { + pluginsWithHooks.push(plugin); + } + } + await this.verifyHooksLock( + pluginsWithHooks, + path.join(this.$projectData.projectDir, LOCK_FILE_NAME), + ); + } else { + this.$logger.info("No plugins with hooks found."); + } + } + + public async canExecute(args: string[]): Promise { + return true; + } +} + +injector.registerCommand(["hooks|lock"], HooksLockPluginCommand); +injector.registerCommand(["hooks|verify"], HooksVerifyPluginCommand); diff --git a/lib/commands/hooks/hooks.ts b/lib/commands/hooks/hooks.ts new file mode 100644 index 0000000000..4971c648cf --- /dev/null +++ b/lib/commands/hooks/hooks.ts @@ -0,0 +1,104 @@ +import { IProjectData } from "../../definitions/project"; +import { IPluginsService, IPluginData } from "../../definitions/plugins"; +import { ICommand, ICommandParameter } from "../../common/definitions/commands"; +import { injector } from "../../common/yok"; +import { IErrors, IFileSystem } from "../../common/declarations"; +import path = require("path"); +import { HOOKS_DIR_NAME } from "../../constants"; +import { createTable } from "../../common/helpers"; +import nsHooks = require("@nativescript/hook"); +import { HooksVerify, LOCK_FILE_NAME } from "./common"; + +export class HooksPluginCommand extends HooksVerify implements ICommand { + public allowedParameters: ICommandParameter[] = []; + + constructor( + private $pluginsService: IPluginsService, + $projectData: IProjectData, + $errors: IErrors, + $fs: IFileSystem, + $logger: ILogger, + ) { + super($projectData, $errors, $fs, $logger); + } + + public async execute(args: string[]): Promise { + const isList: boolean = + args.length > 0 && args[0] === "list" ? true : false; + const plugins: IPluginData[] = + await this.$pluginsService.getAllInstalledPlugins(this.$projectData); + if (plugins && plugins.length > 0) { + const hooksDir = path.join(this.$projectData.projectDir, HOOKS_DIR_NAME); + const pluginsWithHooks: IPluginData[] = []; + for (const plugin of plugins) { + if (plugin.nativescript?.hooks?.length > 0) { + pluginsWithHooks.push(plugin); + } + } + + if (isList) { + const headers: string[] = ["Plugin", "HookName", "HookPath"]; + const hookDataData: string[][] = pluginsWithHooks.flatMap((plugin) => + plugin.nativescript.hooks.map( + (hook: { type: string; script: string }) => { + return [plugin.name, hook.type, hook.script]; + }, + ), + ); + const hookDataTable: any = createTable(headers, hookDataData); + this.$logger.info("Hooks:"); + this.$logger.info(hookDataTable.toString()); + } else { + if ( + this.$fs.exists( + path.join(this.$projectData.projectDir, LOCK_FILE_NAME), + ) + ) { + await this.verifyHooksLock( + pluginsWithHooks, + path.join(this.$projectData.projectDir, LOCK_FILE_NAME), + ); + } + + if (pluginsWithHooks.length === 0) { + if (!this.$fs.exists(hooksDir)) { + this.$fs.createDirectory(hooksDir); + } + } + for (const plugin of pluginsWithHooks) { + nsHooks(plugin.fullPath).postinstall(); + } + } + } + } + + public async canExecute(args: string[]): Promise { + if (args.length > 0 && args[0] !== "list") { + this.$errors.failWithHelp( + `Invalid argument ${args[0]}. Supported argument is "list".`, + ); + } + return true; + } +} + +export class HooksListPluginCommand extends HooksPluginCommand { + public allowedParameters: ICommandParameter[] = []; + + constructor( + $pluginsService: IPluginsService, + $projectData: IProjectData, + $errors: IErrors, + $fs: IFileSystem, + $logger: ILogger, + ) { + super($pluginsService, $projectData, $errors, $fs, $logger); + } + + public async execute(): Promise { + await super.execute(["list"]); + } +} + +injector.registerCommand(["hooks|install"], HooksPluginCommand); +injector.registerCommand(["hooks|*list"], HooksListPluginCommand); diff --git a/lib/commands/post-install.ts b/lib/commands/post-install.ts index d02b0d769f..6062467680 100644 --- a/lib/commands/post-install.ts +++ b/lib/commands/post-install.ts @@ -18,7 +18,7 @@ export class PostInstallCliCommand implements ICommand { private $settingsService: ISettingsService, private $analyticsService: IAnalyticsService, private $logger: ILogger, - private $hostInfo: IHostInfo + private $hostInfo: IHostInfo, ) {} public disableAnalytics = true; @@ -35,7 +35,7 @@ export class PostInstallCliCommand implements ICommand { // TODO: Check if this is the correct place, probably we should set this at the end of the command. await this.$fs.setCurrentUserAsOwner( this.$settingsService.getProfileDir(), - process.env.SUDO_USER + process.env.SUDO_USER, ); } } @@ -55,15 +55,18 @@ export class PostInstallCliCommand implements ICommand { public async postCommandAction(args: string[]): Promise { this.$logger.info(""); this.$logger.info( - color.green.bold("You have successfully installed the NativeScript CLI!") + color.styleText( + ["green", "bold"], + "You have successfully installed the NativeScript CLI!", + ), ); this.$logger.info(""); this.$logger.info("Your next step is to create a new project:"); - this.$logger.info(color.green.bold("ns create")); + this.$logger.info(color.styleText(["green", "bold"], "ns create")); this.$logger.info(""); this.$logger.printMarkdown( - "If you have any questions, check Stack Overflow: `https://stackoverflow.com/questions/tagged/nativescript` and our public Discord channel: `https://nativescript.org/discord`" + "If you have any questions, check Stack Overflow: `https://stackoverflow.com/questions/tagged/nativescript` and our public Discord channel: `https://nativescript.org/discord`", ); } } diff --git a/lib/commands/typings.ts b/lib/commands/typings.ts index 67f01cfc62..9159e6f5f5 100644 --- a/lib/commands/typings.ts +++ b/lib/commands/typings.ts @@ -1,4 +1,4 @@ -import { glob } from "glob"; +import { glob } from "node:fs/promises"; import { homedir } from "os"; import * as path from "path"; import { PromptObject } from "prompts"; @@ -20,7 +20,7 @@ export class TypingsCommand implements ICommand { private $childProcess: IChildProcess, private $hostInfo: IHostInfo, private $staticConfig: IStaticConfig, - private $prompter: IPrompter + private $prompter: IPrompter, ) {} public async execute(args: string[]): Promise { @@ -35,7 +35,7 @@ export class TypingsCommand implements ICommand { if (this.$options.copyTo) { this.$fs.copyFile( path.resolve(this.$projectData.projectDir, "typings"), - this.$options.copyTo + this.$options.copyTo, ); typingsFolder = this.$options.copyTo; } @@ -43,7 +43,7 @@ export class TypingsCommand implements ICommand { if (result !== false) { this.$logger.info( "Typings have been generated in the following directory:", - typingsFolder + typingsFolder, ); } } @@ -56,7 +56,7 @@ export class TypingsCommand implements ICommand { private async resolveGradleDependencies(target: string) { const gradleHome = path.resolve( - process.env.GRADLE_USER_HOME ?? path.join(homedir(), `/.gradle`) + process.env.GRADLE_USER_HOME ?? path.join(homedir(), `/.gradle`), ); const gradleFiles = path.resolve(gradleHome, "caches/modules-2/files-2.1/"); @@ -67,18 +67,12 @@ export class TypingsCommand implements ICommand { const pattern = `${target.replaceAll(":", "/")}/**/*.{jar,aar}`; - const res = await glob(pattern, { + const items = []; + for await (const item of glob(pattern, { cwd: gradleFiles, - }); - - if (!res || res.length === 0) { - this.$logger.warn("No files found"); - return []; - } - - const items = res.map((item) => { + })) { const [group, artifact, version, sha1, file] = item.split(path.sep); - return { + items.push({ id: sha1 + version, group, artifact, @@ -86,14 +80,19 @@ export class TypingsCommand implements ICommand { sha1, file, path: path.resolve(gradleFiles, item), - }; - }); + }); + } + + if (items.length === 0) { + this.$logger.warn("No files found"); + return []; + } this.$logger.clearScreen(); const choices = await this.$prompter.promptForChoice( `Select dependencies to generate typings for (${color.greenBright( - target + target, )})`, items .sort((a, b) => { @@ -108,9 +107,10 @@ export class TypingsCommand implements ICommand { .map((item) => { return { title: `${color.white(item.group)}:${color.greenBright( - item.artifact - )}:${color.yellow(item.version)} - ${color.cyanBright.bold( - item.file + item.artifact, + )}:${color.yellow(item.version)} - ${color.styleText( + ["cyanBright", "bold"], + item.file, )}`, value: item.id, }; @@ -118,7 +118,7 @@ export class TypingsCommand implements ICommand { true, { optionsPerPage: process.stdout.rows - 6, // 6 lines are taken up by the instructions - } as Partial + } as Partial, ); this.$logger.clearScreen(); @@ -139,7 +139,7 @@ export class TypingsCommand implements ICommand { } catch (err) { this.$logger.trace( `Failed to resolve gradle dependencies for target "${target}"`, - err + err, ); } } @@ -151,13 +151,13 @@ export class TypingsCommand implements ICommand { "No .jar or .aar file specified. Please specify at least one of the following:", " - path to .jar file with --jar ", " - path to .aar file with --aar ", - ].join("\n") + ].join("\n"), ); return false; } this.$fs.ensureDirectoryExists( - path.resolve(this.$projectData.projectDir, "typings", "android") + path.resolve(this.$projectData.projectDir, "typings", "android"), ); const dtsGeneratorPath = path.resolve( @@ -165,7 +165,7 @@ export class TypingsCommand implements ICommand { "platforms", "android", "build-tools", - "dts-generator.jar" + "dts-generator.jar", ); if (!this.$fs.exists(dtsGeneratorPath)) { this.$logger.warn("No platforms folder found, preparing project now..."); @@ -173,7 +173,7 @@ export class TypingsCommand implements ICommand { this.$hostInfo.isWindows ? "ns.cmd" : "ns", ["prepare", "android"], "exit", - { stdio: "inherit", shell: this.$hostInfo.isWindows } + { stdio: "inherit", shell: this.$hostInfo.isWindows }, ); } @@ -206,7 +206,7 @@ export class TypingsCommand implements ICommand { path.resolve(this.$projectData.projectDir, "typings", "android"), ], "exit", - { stdio: "inherit" } + { stdio: "inherit" }, ); } @@ -216,7 +216,7 @@ export class TypingsCommand implements ICommand { } this.$fs.ensureDirectoryExists( - path.resolve(this.$projectData.projectDir, "typings", "ios") + path.resolve(this.$projectData.projectDir, "typings", "ios"), ); await this.$childProcess.spawnFromEvent( @@ -229,11 +229,11 @@ export class TypingsCommand implements ICommand { TNS_TYPESCRIPT_DECLARATIONS_PATH: path.resolve( this.$projectData.projectDir, "typings", - "ios" + "ios", ), }, stdio: "inherit", - } + }, ); } } diff --git a/lib/commands/widget.ts b/lib/commands/widget.ts index d448e142c5..5a12e69fe6 100644 --- a/lib/commands/widget.ts +++ b/lib/commands/widget.ts @@ -8,7 +8,6 @@ import * as plist from "plist"; import { injector } from "../common/yok"; import { capitalizeFirstLetter } from "../common/utils"; import { EOL } from "os"; -import { SupportedConfigValues } from "../tools/config-manipulation/config-transformer"; export class WidgetCommand implements ICommand { public allowedParameters: ICommandParameter[] = []; @@ -219,10 +218,7 @@ public struct ${capitalizeFirstLetter(name)}Model: ActivityAttributes { } configData.ios.SPMPackages = spmPackages; - await this.$projectConfigService.setValue( - "", // root - configData as { [key: string]: SupportedConfigValues }, - ); + await this.$projectConfigService.setValue("ios.SPMPackages", spmPackages); if (fs.existsSync(gitIgnorePath)) { const gitIgnore = fs.readFileSync(gitIgnorePath, { diff --git a/lib/common/definitions/extensibility.d.ts b/lib/common/definitions/extensibility.d.ts index cdb55b9230..fbfd3be6d5 100644 --- a/lib/common/definitions/extensibility.d.ts +++ b/lib/common/definitions/extensibility.d.ts @@ -124,7 +124,7 @@ interface IExtensibilityService { * Gives the name of the extension that contains a required command. * The method finds all extensions from npm and checks the command property defined in the nativescript key of the package.json. * Based on specified input array, the method tries to find a suitable command that is defined in the extension. - * @example In case the input is `tns execute this command now`, the array will be ["execute", "this", "command", "now"]. + * @example In case the input is `ns execute this command now`, the array will be ["execute", "this", "command", "now"]. * There may be an extension that defines execute|this as a command. The method will check each extension for the following commands: * execute|this|command|now, execute|this|command, execute|this, execute * In case it finds any of this commands, the method will return the extension name and the command name. @@ -132,7 +132,7 @@ interface IExtensibilityService { * @returns {IExtensionCommandInfo} Information about the extension and the registered command. */ getExtensionNameWhereCommandIsRegistered( - inputOpts: IGetExtensionCommandInfoParams + inputOpts: IGetExtensionCommandInfoParams, ): Promise; /** diff --git a/lib/common/definitions/mobile.d.ts b/lib/common/definitions/mobile.d.ts index 74d0fb9a2b..0d4b58638b 100644 --- a/lib/common/definitions/mobile.d.ts +++ b/lib/common/definitions/mobile.d.ts @@ -131,7 +131,7 @@ declare global { appId: string, projectName: string, projectDir: string, - ensureAppStarted?: boolean + ensureAppStarted?: boolean, ): Promise; destroyDebugSocket(appId: string): Promise; openDeviceLogStream(options?: IiOSLogStreamOptions): Promise; @@ -146,7 +146,7 @@ declare global { interface IAndroidDeviceFileSystem extends IDeviceFileSystem { getDeviceHashService( - appIdentifier: string + appIdentifier: string, ): Mobile.IAndroidDeviceHashService; } @@ -240,7 +240,7 @@ declare global { */ setProjectNameForDevice( deviceIdentifier: string, - projectName: string + projectName: string, ): void; /** @@ -250,7 +250,7 @@ declare global { */ setProjectDirForDevice( deviceIdentifier: string, - projectDir: string + projectDir: string, ): void; } @@ -293,7 +293,7 @@ declare global { */ startLogProcess( deviceId: string, - options?: Mobile.IiOSLogStreamOptions + options?: Mobile.IiOSLogStreamOptions, ): Promise; } @@ -317,7 +317,7 @@ declare global { filterData( platform: string, data: string, - deviceLogOptions: Mobile.IDeviceLogOptions + deviceLogOptions: Mobile.IDeviceLogOptions, ): string; } @@ -334,7 +334,7 @@ declare global { replaceWithOriginalFileLocations( platform: string, messageData: string, - loggingOptions: Mobile.IDeviceLogOptions + loggingOptions: Mobile.IDeviceLogOptions, ): string; } @@ -351,7 +351,7 @@ declare global { */ filterData( data: string, - deviceLogOptions: Mobile.IDeviceLogOptions + deviceLogOptions: Mobile.IDeviceLogOptions, ): string; } @@ -380,13 +380,13 @@ declare global { installApplication( packageFilePath: string, appIdentifier?: string, - buildData?: IBuildData + buildData?: IBuildData, ): Promise; uninstallApplication(appIdentifier: string): Promise; reinstallApplication( appIdentifier: string, packageFilePath: string, - buildData?: IBuildData + buildData?: IBuildData, ): Promise; startApplication(appData: IStartApplicationData): Promise; stopApplication(appData: IApplicationData): Promise; @@ -395,7 +395,7 @@ declare global { tryStartApplication(appData: IApplicationData): Promise; getDebuggableApps(): Promise; getDebuggableAppViews( - appIdentifiers: string[] + appIdentifiers: string[], ): Promise>; /** * Sets the files transferred on device. @@ -432,34 +432,34 @@ declare global { getFile( deviceFilePath: string, appIdentifier: string, - outputFilePath?: string + outputFilePath?: string, ): Promise; getFileContent( deviceFilePath: string, - appIdentifier: string + appIdentifier: string, ): Promise; putFile( localFilePath: string, deviceFilePath: string, - appIdentifier: string + appIdentifier: string, ): Promise; deleteFile(deviceFilePath: string, appIdentifier: string): Promise; transferFiles( deviceAppData: Mobile.IDeviceAppData, - localToDevicePaths: Mobile.ILocalToDevicePathData[] + localToDevicePaths: Mobile.ILocalToDevicePathData[], ): Promise; transferDirectory( deviceAppData: Mobile.IDeviceAppData, localToDevicePaths: Mobile.ILocalToDevicePathData[], - projectFilesPath: string + projectFilesPath: string, ): Promise; transferFile?( localFilePath: string, - deviceFilePath: string + deviceFilePath: string, ): Promise; createFileOnDevice?( deviceFilePath: string, - fileContent: string + fileContent: string, ): Promise; /** * Updates the hash file on device with the current hashes of files. @@ -468,7 +468,7 @@ declare global { */ updateHashesOnDevice( hashes: IStringDictionary, - appIdentifier: string + appIdentifier: string, ): Promise; } @@ -483,11 +483,11 @@ declare global { interface IAndroidDebugBridge { executeCommand( args: string[], - options?: IAndroidDebugBridgeCommandOptions + options?: IAndroidDebugBridgeCommandOptions, ): Promise; executeShellCommand( args: string[], - options?: IAndroidDebugBridgeCommandOptions + options?: IAndroidDebugBridgeCommandOptions, ): Promise; pushFile(localFilePath: string, deviceFilePath: string): Promise; removeFile(deviceFilePath: string): Promise; @@ -514,7 +514,7 @@ declare global { interface IDeviceAndroidDebugBridge extends IAndroidDebugBridge { sendBroadcastToDevice( action: string, - extras?: IStringDictionary + extras?: IStringDictionary, ): Promise; } @@ -557,7 +557,7 @@ declare global { skipEmulatorStart?: boolean; /** * Currently available only for iOS. Specifies the sdk version of the iOS simulator. - * In case when `tns run ios --device "iPhone 6"` command is executed, the user can specify the sdk of the simulator because it is possible to have more than one device with the same name but with different sdk versions. + * In case when `ns run ios --device "iPhone 6"` command is executed, the user can specify the sdk of the simulator because it is possible to have more than one device with the same name but with different sdk versions. */ sdk?: string; @@ -587,7 +587,7 @@ declare global { execute( action: (device: Mobile.IDevice) => Promise, canExecute?: (dev: Mobile.IDevice) => boolean, - options?: { allowNoDevices?: boolean } + options?: { allowNoDevices?: boolean }, ): Promise[]>; /** @@ -622,7 +622,7 @@ declare global { deviceIdentifiers: string[], appIdentifier: string, framework: string, - projectDir: string + projectDir: string, ): Promise[]; setLogLevel(logLevel: string, deviceIdentifier?: string): void; deployOnDevices( @@ -630,20 +630,20 @@ declare global { packageFile: string, packageName: string, framework: string, - projectDir: string + projectDir: string, ): Promise[]; getDeviceByIdentifier(identifier: string): Mobile.IDevice; mapAbstractToTcpPort( deviceIdentifier: string, appIdentifier: string, - framework: string + framework: string, ): Promise; getDebuggableApps( - deviceIdentifiers: string[] + deviceIdentifiers: string[], ): Promise[]; getDebuggableViews( deviceIdentifier: string, - appIdentifier: string + appIdentifier: string, ): Promise; /** @@ -659,7 +659,7 @@ declare global { * @returns {Promise} Dictionary with the following format: { ios: { devices: Mobile.IDeviceInfo[], errors: string[] }, android: { devices: Mobile.IDeviceInfo[], errors: string[]}}. */ getEmulatorImages( - options?: Mobile.IListEmulatorsOptions + options?: Mobile.IListEmulatorsOptions, ): Promise; /** @@ -674,11 +674,11 @@ declare global { * prompts the user for a manual choice or returns the first one for non interactive terminals. */ pickSingleDevice( - options: IPickSingleDeviceOptions + options: IPickSingleDeviceOptions, ): Promise; getPlatformsFromDeviceDescriptors( - deviceDescriptors: ILiveSyncDeviceDescriptor[] + deviceDescriptors: ILiveSyncDeviceDescriptor[], ): string[]; } @@ -734,7 +734,7 @@ declare global { mapAbstractToTcpPort( deviceIdentifier: string, appIdentifier: string, - framework: string + framework: string, ): Promise; /** @@ -743,7 +743,7 @@ declare global { * @return {Mobile.IDeviceApplicationInformation[]} Returns array of applications information for the applications which are available for debugging. */ getDebuggableApps( - deviceIdentifier: string + deviceIdentifier: string, ): Promise; /** @@ -756,7 +756,7 @@ declare global { getMappedAbstractToTcpPorts( deviceIdentifier: string, appIdentifiers: string[], - framework: string + framework: string, ): Promise>; /** @@ -767,7 +767,7 @@ declare global { */ getAppProcessId( deviceIdentifier: string, - appIdentifier: string + appIdentifier: string, ): Promise; /** @@ -778,7 +778,7 @@ declare global { * @returns {number} The TCP port that is used for the forwarding. */ forwardFreeTcpToAbstractPort( - portForwardInputData: IPortForwardData + portForwardInputData: IPortForwardData, ): Promise; } @@ -840,7 +840,7 @@ declare global { fileName: string, localProjectRootPath: string, onDeviceFileName: string, - deviceProjectRootPath: string + deviceProjectRootPath: string, ): Mobile.ILocalToDevicePathData; } @@ -895,7 +895,7 @@ declare global { * @returns {Promise} Starts the emulator and returns the errors if some error occurs. */ startEmulator( - options: Mobile.IStartEmulatorOptions + options: Mobile.IStartEmulatorOptions, ): Promise; /** @@ -916,7 +916,7 @@ declare global { * Returns array of all available android emulators - genymotion and native avd emulators and array of errors. */ getEmulatorImages( - adbDevicesOutput: string[] + adbDevicesOutput: string[], ): Promise; /** * Gets all identifiers of all running android emulators. @@ -967,7 +967,7 @@ declare global { * @returns {Promise} - Returns a dictionary in the following format: { properties: string; error?: string; } */ enumerateGuestProperties( - id: string + id: string, ): Promise; } @@ -1012,7 +1012,7 @@ declare global { */ parseIniFile( iniFilePath: string, - avdInfo?: Mobile.IAvdInfo + avdInfo?: Mobile.IAvdInfo, ): Mobile.IAvdInfo; } @@ -1056,7 +1056,7 @@ declare global { launchApplication( applicationPath: string, appIdentifier: string, - options: IiOSSimLaunchApplicationOptions + options: IiOSSimLaunchApplicationOptions, ): Promise; printDeviceTypes(): Promise; sendNotification(notification: string, deviceId: string): Promise; @@ -1104,7 +1104,7 @@ declare global { interface IiOSSimulatorService extends IEmulatorPlatformService { postDarwinNotification( notification: string, - deviceId: string + deviceId: string, ): Promise; /** @@ -1206,34 +1206,34 @@ declare global { getDeviceFileContent( device: Mobile.IDevice, deviceFilePath: string, - projectData: IProjectData + projectData: IProjectData, ): Promise; } interface IEmulatorHelper { mapAndroidApiLevelToVersion: IStringDictionary; getEmulatorsFromAvailableEmulatorsOutput( - availableEmulatorsOutput: Mobile.IListEmulatorsOutput + availableEmulatorsOutput: Mobile.IListEmulatorsOutput, ): Mobile.IDeviceInfo[]; getErrorsFromAvailableEmulatorsOutput( - availableEmulatorsOutput: Mobile.IListEmulatorsOutput + availableEmulatorsOutput: Mobile.IListEmulatorsOutput, ): string[]; getEmulatorByImageIdentifier( imageIdentifier: string, - emulators: Mobile.IDeviceInfo[] + emulators: Mobile.IDeviceInfo[], ): Mobile.IDeviceInfo; getEmulatorByIdOrName( emulatorIdOrName: string, - emulators: Mobile.IDeviceInfo[] + emulators: Mobile.IDeviceInfo[], ): Mobile.IDeviceInfo; getEmulatorByStartEmulatorOptions( options: Mobile.IStartEmulatorOptions, - emulators: Mobile.IDeviceInfo[] + emulators: Mobile.IDeviceInfo[], ): Mobile.IDeviceInfo; isEmulatorRunning(emulator: Mobile.IDeviceInfo): boolean; setRunningAndroidEmulatorProperties( emulatorId: string, - emulator: Mobile.IDeviceInfo + emulator: Mobile.IDeviceInfo, ): void; } @@ -1286,13 +1286,13 @@ declare global { * Computes the shasums of localToDevicePaths and updates hash file on device */ updateHashes( - localToDevicePaths: Mobile.ILocalToDevicePathData[] + localToDevicePaths: Mobile.ILocalToDevicePathData[], ): Promise; /** * Computes the shasums of localToDevicePaths and removes them from hash file on device */ removeHashes( - localToDevicePaths: Mobile.ILocalToDevicePathData[] + localToDevicePaths: Mobile.ILocalToDevicePathData[], ): Promise; /** @@ -1309,7 +1309,7 @@ declare global { */ generateHashesFromLocalToDevicePaths( localToDevicePaths: Mobile.ILocalToDevicePathData[], - initialShasums?: IStringDictionary + initialShasums?: IStringDictionary, ): Promise; /** @@ -1318,7 +1318,7 @@ declare global { * @returns {string[]} DevicePaths of all elements from the input localToDevicePaths. */ getDevicePaths( - localToDevicePaths: Mobile.ILocalToDevicePathData[] + localToDevicePaths: Mobile.ILocalToDevicePathData[], ): string[]; /** @@ -1329,7 +1329,7 @@ declare global { */ getChangedShasums( oldShasums: IStringDictionary, - currentShasums: IStringDictionary + currentShasums: IStringDictionary, ): IStringDictionary; } @@ -1371,7 +1371,7 @@ declare global { */ handleErrors( errors: IAndroidDebugBridgeError[], - treatErrorsAsWarnings?: boolean + treatErrorsAsWarnings?: boolean, ): void; } @@ -1401,77 +1401,77 @@ declare global { install( ipaPath: string, deviceIdentifiers: string[], - errorHandler?: DeviceOperationErrorHandler + errorHandler?: DeviceOperationErrorHandler, ): Promise; uninstall( appIdentifier: string, deviceIdentifiers: string[], - errorHandler?: DeviceOperationErrorHandler + errorHandler?: DeviceOperationErrorHandler, ): Promise; startLookingForDevices( deviceFoundCallback: DeviceInfoCallback, deviceUpdatedCallback: DeviceInfoCallback, deviceLostCallback: DeviceInfoCallback, - options?: Mobile.IDeviceLookingOptions + options?: Mobile.IDeviceLookingOptions, ): Promise; startDeviceLog(deviceIdentifier: string): void; apps( deviceIdentifiers: string[], - errorHandler?: DeviceOperationErrorHandler + errorHandler?: DeviceOperationErrorHandler, ): Promise; listDirectory( listArray: IOSDeviceLib.IReadOperationData[], - errorHandler?: DeviceOperationErrorHandler + errorHandler?: DeviceOperationErrorHandler, ): Promise; readFiles( deviceFilePaths: IOSDeviceLib.IReadOperationData[], - errorHandler?: DeviceOperationErrorHandler + errorHandler?: DeviceOperationErrorHandler, ): Promise; downloadFiles( deviceFilePaths: IOSDeviceLib.IFileOperationData[], - errorHandler?: DeviceOperationErrorHandler + errorHandler?: DeviceOperationErrorHandler, ): Promise; uploadFiles( files: IOSDeviceLib.IUploadFilesData[], - errorHandler?: DeviceOperationErrorHandler + errorHandler?: DeviceOperationErrorHandler, ): Promise; deleteFiles( deleteArray: IOSDeviceLib.IDeleteFileData[], - errorHandler?: DeviceOperationErrorHandler + errorHandler?: DeviceOperationErrorHandler, ): Promise; start( startArray: IOSDeviceLib.IIOSApplicationData[], - errorHandler?: DeviceOperationErrorHandler + errorHandler?: DeviceOperationErrorHandler, ): Promise; stop( stopArray: IOSDeviceLib.IIOSApplicationData[], - errorHandler?: DeviceOperationErrorHandler + errorHandler?: DeviceOperationErrorHandler, ): Promise; postNotification( postNotificationArray: IOSDeviceLib.IPostNotificationData[], - errorHandler?: DeviceOperationErrorHandler + errorHandler?: DeviceOperationErrorHandler, ): Promise; awaitNotificationResponse( awaitNotificationResponseArray: IOSDeviceLib.IAwaitNotificatioNResponseData[], - errorHandler?: DeviceOperationErrorHandler + errorHandler?: DeviceOperationErrorHandler, ): Promise; connectToPort( connectToPortArray: IOSDeviceLib.IConnectToPortData[], - errorHandler?: DeviceOperationErrorHandler + errorHandler?: DeviceOperationErrorHandler, ): Promise>; setShouldDispose(shouldDispose: boolean): void; @@ -1480,7 +1480,7 @@ declare global { type DeviceOperationErrorHandler = (err: IOSDeviceLib.IDeviceError) => void; type DeviceInfoCallback = ( - deviceInfo: IOSDeviceLib.IDeviceActionInfo + deviceInfo: IOSDeviceLib.IDeviceActionInfo, ) => void; type IOSDeviceResponse = IDictionary; diff --git a/lib/common/file-system.ts b/lib/common/file-system.ts index 5246ebc453..d4ef58d970 100644 --- a/lib/common/file-system.ts +++ b/lib/common/file-system.ts @@ -18,7 +18,7 @@ import { EOL } from "os"; import * as detectNewline from "detect-newline"; import { IFileSystem, IReadFileOptions, IFsStats } from "./declarations"; import { IInjector } from "./definitions/yok"; -import { create as createArchiver } from "archiver"; +import * as yazl from "yazl"; // TODO: Add .d.ts for mkdirp module (or use it from @types repo). const mkdirp = require("mkdirp"); @@ -37,28 +37,24 @@ export class FileSystem implements IFileSystem { ): Promise { //we are resolving it here instead of in the constructor, because config has dependency on file system and config shouldn't require logger const $logger = this.$injector.resolve("logger"); - const zip = createArchiver("zip", { - zlib: { - level: 9, - }, - }); + const zip = new yazl.ZipFile(); const outFile = fs.createWriteStream(zipFile); - zip.pipe(outFile); + + for (const file of files) { + let relativePath = zipPathCallback(file); + relativePath = relativePath.replace(/\\/g, "/"); + $logger.trace("zipping as '%s' file '%s'", relativePath, file); + zip.addFile(file, relativePath, { compress: true }); + } + zip.end(); return new Promise((resolve, reject) => { outFile.on("error", (err: Error) => reject(err)); + zip.outputStream.on("error", (err: Error) => reject(err)); + zip.outputStream.pipe(outFile); outFile.on("close", () => { - $logger.trace("zip: %d bytes written", zip.pointer()); resolve(); }); - - for (const file of files) { - let relativePath = zipPathCallback(file); - relativePath = relativePath.replace(/\\/g, "/"); - $logger.trace("zipping as '%s' file '%s'", relativePath, file); - zip.append(fs.createReadStream(file), { name: relativePath }); - } - zip.finalize(); }); } diff --git a/lib/common/header.ts b/lib/common/header.ts index 6cc7b0eed8..7c3d00643c 100644 --- a/lib/common/header.ts +++ b/lib/common/header.ts @@ -10,15 +10,18 @@ export function printHeader() { const header = [ color.dim("│ "), - color.cyanBright.bold("{N} NativeScript "), - color.whiteBright.bold("CLI"), + color.styleText(["cyanBright", "bold"], "{N} NativeScript "), + color.styleText(["whiteBright", "bold"], "CLI"), color.dim(` [v${version}] `), // color.dim(" │"), ].join(""); const tagLine = [ color.dim("│ "), color.dim(" → "), - color.whiteBright.bold("Empower JavaScript with native APIs "), + color.styleText( + ["whiteBright", "bold"], + "Empower JavaScript with native APIs ", + ), // color.dim(" │"), ].join(""); @@ -28,10 +31,10 @@ export function printHeader() { console.info(" " + color.dim("┌" + "─".repeat(width - 1) + "┐")); console.info( - " " + header + " ".repeat(width - headerLength) + color.dim("│") + " " + header + " ".repeat(width - headerLength) + color.dim("│"), ); console.info( - " " + tagLine + " ".repeat(width - tagLineLength) + color.dim("│") + " " + tagLine + " ".repeat(width - tagLineLength) + color.dim("│"), ); console.info(" " + color.dim("└" + "─".repeat(width - 1) + "┘")); } diff --git a/lib/common/logger/layouts/cli-layout.ts b/lib/common/logger/layouts/cli-layout.ts index 003854ed77..aadae92252 100644 --- a/lib/common/logger/layouts/cli-layout.ts +++ b/lib/common/logger/layouts/cli-layout.ts @@ -22,7 +22,7 @@ export function layout(config: any) { } if (logEvent.level.isEqualTo(LoggerLevel.ERROR)) { - return color.red.bold(msg); + return color.styleText(["red", "bold"], msg); } if (logEvent.level.isEqualTo(LoggerLevel.WARN)) { diff --git a/lib/common/logger/logger.ts b/lib/common/logger/logger.ts index d0cb1ccd88..cd6ae95ce0 100644 --- a/lib/common/logger/logger.ts +++ b/lib/common/logger/logger.ts @@ -136,8 +136,8 @@ export class Logger implements ILogger { const opts = { unescape: true, link: color.red, - strong: color.green.bold, - firstHeading: color.blue.bold, + strong: (str: string) => color.styleText(["green", "bold"], str), + firstHeading: (str: string) => color.styleText(["blue", "bold"], str), tableOptions: { chars: { mid: "", "left-mid": "", "mid-mid": "", "right-mid": "" }, style: { diff --git a/lib/common/mobile/android/android-application-manager.ts b/lib/common/mobile/android/android-application-manager.ts index b5fc2d2216..fb8b46e350 100644 --- a/lib/common/mobile/android/android-application-manager.ts +++ b/lib/common/mobile/android/android-application-manager.ts @@ -36,7 +36,7 @@ export class AndroidApplicationManager extends ApplicationManagerBase { protected $deviceLogProvider: Mobile.IDeviceLogProvider, private $errors: IErrors, $logger: ILogger, - $hooksService: IHooksService + $hooksService: IHooksService, ) { super($logger, $hooksService, $deviceLogProvider); } @@ -58,7 +58,7 @@ export class AndroidApplicationManager extends ApplicationManagerBase { public async installApplication( packageFilePath: string, appIdentifier?: string, - buildData?: IAndroidBuildData + buildData?: IAndroidBuildData, ): Promise { if (appIdentifier) { const deviceRootPath = `${LiveSyncPaths.ANDROID_TMP_DIR_NAME}/${appIdentifier}`; @@ -85,15 +85,15 @@ export class AndroidApplicationManager extends ApplicationManagerBase { } public uninstallApplication(appIdentifier: string): Promise { - // Need to set the treatErrorsAsWarnings to true because when using tns run command if the application is not installed on the device it will throw error + // Need to set the treatErrorsAsWarnings to true because when using `ns run` command if the application is not installed on the device it will throw error return this.adb.executeShellCommand( ["pm", "uninstall", `${appIdentifier}`], - { treatErrorsAsWarnings: true } + { treatErrorsAsWarnings: true }, ); } public async startApplication( - appData: Mobile.IStartApplicationData + appData: Mobile.IStartApplicationData, ): Promise { if (appData.waitForDebugger) { await this.adb.executeShellCommand([ @@ -144,7 +144,7 @@ export class AndroidApplicationManager extends ApplicationManagerBase { ]); } else { this.$logger.trace( - `Tried starting activity for: ${appIdentifier}, using activity manager but failed.` + `Tried starting activity for: ${appIdentifier}, using activity manager but failed.`, ); await this.adb.executeShellCommand([ "monkey", @@ -165,22 +165,22 @@ export class AndroidApplicationManager extends ApplicationManagerBase { const deviceIdentifier = this.identifier; const processIdentifier = await this.getAppProcessId( deviceIdentifier, - appIdentifier + appIdentifier, ); if (processIdentifier) { this.$deviceLogProvider.setApplicationPidForDevice( deviceIdentifier, - processIdentifier + processIdentifier, ); this.$deviceLogProvider.setApplicationIdForDevice( deviceIdentifier, - appIdentifier + appIdentifier, ); this.$deviceLogProvider.setProjectDirForDevice( deviceIdentifier, - appData.projectDir + appData.projectDir, ); await this.$logcatHelper.start({ @@ -196,7 +196,7 @@ export class AndroidApplicationManager extends ApplicationManagerBase { } else { await this.$logcatHelper.dump(this.identifier); this.$errors.fail( - `Unable to find running "${appIdentifier}" application on device "${deviceIdentifier}".` + `Unable to find running "${appIdentifier}" application on device "${deviceIdentifier}".`, ); } } @@ -204,7 +204,7 @@ export class AndroidApplicationManager extends ApplicationManagerBase { private async getAppProcessId( deviceIdentifier: string, - appIdentifier: string + appIdentifier: string, ) { const appIdCheckStartTime = new Date().getTime(); let processIdentifier = ""; @@ -213,11 +213,11 @@ export class AndroidApplicationManager extends ApplicationManagerBase { while (!processIdentifier && !hasTimedOut) { processIdentifier = await this.$androidProcessService.getAppProcessId( deviceIdentifier, - appIdentifier + appIdentifier, ); if (!processIdentifier) { this.$logger.trace( - `Wasn't able to get pid of the app. Sleeping for "${this.PID_CHECK_INTERVAL}ms".` + `Wasn't able to get pid of the app. Sleeping for "${this.PID_CHECK_INTERVAL}ms".`, ); await sleep(this.PID_CHECK_INTERVAL); hasTimedOut = @@ -244,13 +244,13 @@ export class AndroidApplicationManager extends ApplicationManagerBase { } public async getDebuggableAppViews( - appIdentifiers: string[] + appIdentifiers: string[], ): Promise> { const mappedAppIdentifierPorts = await this.$androidProcessService.getMappedAbstractToTcpPorts( this.identifier, appIdentifiers, - TARGET_FRAMEWORK_IDENTIFIERS.Cordova + TARGET_FRAMEWORK_IDENTIFIERS.Cordova, ), applicationViews: IDictionary = {}; @@ -269,11 +269,11 @@ export class AndroidApplicationManager extends ApplicationManagerBase { } } catch (err) { this.$logger.trace( - `Error while checking ${localAddress}. Error is: ${err.message}` + `Error while checking ${localAddress}. Error is: ${err.message}`, ); } - } - ) + }, + ), ); return applicationViews; @@ -286,9 +286,9 @@ export class AndroidApplicationManager extends ApplicationManagerBase { return new RegExp( `${regExpEscape( - appIdentifier + appIdentifier, )}${packageActivitySeparator}${fullJavaClassName}`, - `m` + `m`, ); } diff --git a/lib/common/mobile/android/android-emulator-services.ts b/lib/common/mobile/android/android-emulator-services.ts index efe09016b6..6a973d2ed4 100644 --- a/lib/common/mobile/android/android-emulator-services.ts +++ b/lib/common/mobile/android/android-emulator-services.ts @@ -8,7 +8,8 @@ import { injector } from "../../yok"; import * as semver from "semver"; export class AndroidEmulatorServices - implements Mobile.IEmulatorPlatformService { + implements Mobile.IEmulatorPlatformService +{ constructor( private $androidGenymotionService: Mobile.IAndroidVirtualDeviceService, private $androidVirtualDeviceService: Mobile.IAndroidVirtualDeviceService, @@ -16,71 +17,75 @@ export class AndroidEmulatorServices private $childProcess: IChildProcess, private $emulatorHelper: Mobile.IEmulatorHelper, private $logger: ILogger, - private $utils: IUtils + private $utils: IUtils, ) {} public async getEmulatorImages(): Promise { const adbDevicesOutput = await this.$adb.getDevicesSafe(); - const avdAvailableEmulatorsOutput = await this.$androidVirtualDeviceService.getEmulatorImages( - adbDevicesOutput - ); - const genyAvailableDevicesOutput = await this.$androidGenymotionService.getEmulatorImages( - adbDevicesOutput - ); + const avdAvailableEmulatorsOutput = + await this.$androidVirtualDeviceService.getEmulatorImages( + adbDevicesOutput, + ); + const genyAvailableDevicesOutput = + await this.$androidGenymotionService.getEmulatorImages(adbDevicesOutput); const devices = _.concat( avdAvailableEmulatorsOutput.devices, - genyAvailableDevicesOutput.devices + genyAvailableDevicesOutput.devices, ).filter((item) => !!item); return { devices, errors: avdAvailableEmulatorsOutput.errors.concat( - genyAvailableDevicesOutput.errors + genyAvailableDevicesOutput.errors, ), }; } public async getRunningEmulatorIds(): Promise { const adbDevicesOutput = await this.$adb.getDevicesSafe(); - const avds = await this.$androidVirtualDeviceService.getRunningEmulatorIds( - adbDevicesOutput - ); - const genies = await this.$androidGenymotionService.getRunningEmulatorIds( - adbDevicesOutput - ); + const avds = + await this.$androidVirtualDeviceService.getRunningEmulatorIds( + adbDevicesOutput, + ); + const genies = + await this.$androidGenymotionService.getRunningEmulatorIds( + adbDevicesOutput, + ); return avds.concat(genies); } public async getRunningEmulatorName(emulatorId: string): Promise { - let result = await this.$androidVirtualDeviceService.getRunningEmulatorName( - emulatorId - ); - if (!result) { - result = await this.$androidGenymotionService.getRunningEmulatorName( - emulatorId + let result = + await this.$androidVirtualDeviceService.getRunningEmulatorName( + emulatorId, ); + if (!result) { + result = + await this.$androidGenymotionService.getRunningEmulatorName(emulatorId); } return result; } public async getRunningEmulatorImageIdentifier( - emulatorId: string + emulatorId: string, ): Promise { - let result = await this.$androidVirtualDeviceService.getRunningEmulatorImageIdentifier( - emulatorId - ); - if (!result) { - result = await this.$androidGenymotionService.getRunningEmulatorImageIdentifier( - emulatorId + let result = + await this.$androidVirtualDeviceService.getRunningEmulatorImageIdentifier( + emulatorId, ); + if (!result) { + result = + await this.$androidGenymotionService.getRunningEmulatorImageIdentifier( + emulatorId, + ); } return result; } public async startEmulator( - options: Mobile.IAndroidStartEmulatorOptions + options: Mobile.IAndroidStartEmulatorOptions, ): Promise { const output = await this.startEmulatorCore(options); let bootToCompleteOutput = null; @@ -88,13 +93,13 @@ export class AndroidEmulatorServices bootToCompleteOutput = await this.waitForEmulatorBootToComplete( output.runningEmulator, output.endTimeEpoch, - options.timeout + options.timeout, ); } return { errors: ((output && output.errors) || []).concat( - (bootToCompleteOutput && bootToCompleteOutput.errors) || [] + (bootToCompleteOutput && bootToCompleteOutput.errors) || [], ), }; } @@ -104,7 +109,7 @@ export class AndroidEmulatorServices } private async startEmulatorCore( - options: Mobile.IAndroidStartEmulatorOptions + options: Mobile.IAndroidStartEmulatorOptions, ): Promise<{ runningEmulator: Mobile.IDeviceInfo; errors: string[]; @@ -118,7 +123,7 @@ export class AndroidEmulatorServices let emulator = this.$emulatorHelper.getEmulatorByStartEmulatorOptions( options, - availableEmulators + availableEmulators, ); if ( !emulator && @@ -158,7 +163,7 @@ export class AndroidEmulatorServices const emulators = (await this.getEmulatorImages()).devices; const newEmulator = _.find( emulators, - (e) => e.imageIdentifier === emulator.imageIdentifier + (e) => e.imageIdentifier === emulator.imageIdentifier, ); if (newEmulator && this.$emulatorHelper.isEmulatorRunning(newEmulator)) { return { @@ -185,29 +190,29 @@ export class AndroidEmulatorServices let pathToEmulatorExecutable = null; let startEmulatorArgs = null; if (emulator.vendor === AndroidVirtualDevice.AVD_VENDOR_NAME) { - pathToEmulatorExecutable = this.$androidVirtualDeviceService - .pathToEmulatorExecutable; + pathToEmulatorExecutable = + this.$androidVirtualDeviceService.pathToEmulatorExecutable; startEmulatorArgs = this.$androidVirtualDeviceService.startEmulatorArgs( - emulator.imageIdentifier + emulator.imageIdentifier, ); } else if ( emulator.vendor === AndroidVirtualDevice.GENYMOTION_VENDOR_NAME ) { - pathToEmulatorExecutable = this.$androidGenymotionService - .pathToEmulatorExecutable; + pathToEmulatorExecutable = + this.$androidGenymotionService.pathToEmulatorExecutable; startEmulatorArgs = this.$androidGenymotionService.startEmulatorArgs( - emulator.imageIdentifier + emulator.imageIdentifier, ); } this.$logger.info( - `Starting Android emulator with image ${emulator.imageIdentifier}` + `Starting Android emulator with image ${emulator.imageIdentifier}`, ); const childProcess = this.$childProcess.spawn( pathToEmulatorExecutable, startEmulatorArgs, - { stdio: "ignore", detached: true } + { stdio: "ignore", detached: true }, ); childProcess.unref(); childProcess.on("error", (err: Error) => { @@ -235,13 +240,13 @@ export class AndroidEmulatorServices const minVersion = semver.coerce(AndroidVirtualDevice.MIN_ANDROID_VERSION); const bestVersion = best && best.version && semver.coerce(best.version); - return bestVersion && semver.gte(bestVersion, minVersion) ? best : null; + return !bestVersion || semver.gte(bestVersion, minVersion) ? best : null; } private async waitForEmulatorBootToComplete( emulator: Mobile.IDeviceInfo, endTimeEpoch: number, - timeout: number + timeout: number, ): Promise<{ runningEmulator: Mobile.IDeviceInfo; errors: string[] }> { this.$logger.info("Waiting for emulator device initialization...", { [LoggerConfigData.skipNewLine]: true, @@ -249,11 +254,11 @@ export class AndroidEmulatorServices const isInfiniteWait = this.$utils.getMilliSecondsTimeout( - timeout || AndroidVirtualDevice.TIMEOUT_SECONDS + timeout || AndroidVirtualDevice.TIMEOUT_SECONDS, ) === 0; while (getCurrentEpochTime() < endTimeEpoch || isInfiniteWait) { const isEmulatorBootCompleted = await this.isEmulatorBootCompleted( - emulator.identifier + emulator.identifier, ); if (isEmulatorBootCompleted) { this.$logger.info(EOL, { [LoggerConfigData.skipNewLine]: true }); @@ -276,7 +281,7 @@ export class AndroidEmulatorServices private async isEmulatorBootCompleted(emulatorId: string): Promise { const output = await this.$adb.getPropertyValue( emulatorId, - "dev.bootcomplete" + "dev.bootcomplete", ); const matches = output.match("1"); return matches && matches.length > 0; diff --git a/lib/common/mobile/device-log-provider.ts b/lib/common/mobile/device-log-provider.ts index 4a3c8e0617..d5c548f780 100644 --- a/lib/common/mobile/device-log-provider.ts +++ b/lib/common/mobile/device-log-provider.ts @@ -4,7 +4,7 @@ import { injector } from "../yok"; import { LoggerConfigData } from "../../constants"; import { IOptions } from "../../declarations"; -import { Color, color } from "../../color"; +import { color, StyleFormat } from "../../color"; import { ITimelineProfilerService } from "../../services/timeline-profiler-service"; @@ -14,7 +14,7 @@ export class DeviceLogProvider extends DeviceLogProviderBase { protected $logger: ILogger, protected $logSourceMapService: Mobile.ILogSourceMapService, protected $timelineProfilerService: ITimelineProfilerService, - protected $options: IOptions + protected $options: IOptions, ) { super($logFilter, $logger, $logSourceMapService); } @@ -22,7 +22,7 @@ export class DeviceLogProvider extends DeviceLogProviderBase { public logData( lineText: string, platform: string, - deviceIdentifier: string + deviceIdentifier: string, ): void { // console.log(lineText) const loggingOptions = this.getDeviceLogOptionsForDevice(deviceIdentifier); @@ -30,7 +30,7 @@ export class DeviceLogProvider extends DeviceLogProviderBase { data = this.$logSourceMapService.replaceWithOriginalFileLocations( platform, data, - loggingOptions + loggingOptions, ); if (data) { @@ -55,16 +55,15 @@ export class DeviceLogProvider extends DeviceLogProviderBase { time: color.greenBright, }; - private deviceColorMap = new Map(); + private deviceColorMap = new Map(); - private colorPool: Color[] = [ - "bgBlackBright", - "bgMagentaBright", + private colorPool: StyleFormat[] = [ + "bgGray", "bgBlueBright", "bgWhiteBright", "bgCyanBright", "bgYellowBright", - "bgGreenBright", + "bgMagentaBright", ]; private colorPoolIndex = 0; @@ -73,7 +72,7 @@ export class DeviceLogProvider extends DeviceLogProviderBase { return this.deviceColorMap.get(deviceIdentifier); } - const color = this.colorPool[this.colorPoolIndex]; + const color = this.colorPool[this.colorPoolIndex] as StyleFormat; // wrap around if we have no more colors in the pool this.colorPoolIndex = this.colorPoolIndex === this.colorPool.length - 1 @@ -150,8 +149,8 @@ export class DeviceLogProvider extends DeviceLogProviderBase { toLog.split("\n").forEach((actualLine) => { this.printLine( - color[this.getDeviceColor(deviceIdentifier)](" "), - this.consoleLevelColor[level](actualLine) + color.styleText(this.getDeviceColor(deviceIdentifier), " "), + this.consoleLevelColor[level](actualLine), ); }); } diff --git a/lib/common/mobile/emulator-helper.ts b/lib/common/mobile/emulator-helper.ts index f892b605fa..baf98fc7aa 100644 --- a/lib/common/mobile/emulator-helper.ts +++ b/lib/common/mobile/emulator-helper.ts @@ -5,6 +5,7 @@ import { injector } from "../yok"; export class EmulatorHelper implements Mobile.IEmulatorHelper { // https://developer.android.com/guide/topics/manifest/uses-sdk-element public mapAndroidApiLevelToVersion = { + "android-36": "16.0.0", "android-35": "15.0.0", "android-34": "14.0.0", "android-33": "13.0.0", @@ -27,7 +28,7 @@ export class EmulatorHelper implements Mobile.IEmulatorHelper { }; public getEmulatorsFromAvailableEmulatorsOutput( - availableEmulatorsOutput: Mobile.IListEmulatorsOutput + availableEmulatorsOutput: Mobile.IListEmulatorsOutput, ): Mobile.IDeviceInfo[] { return _(availableEmulatorsOutput) .valuesIn() @@ -38,7 +39,7 @@ export class EmulatorHelper implements Mobile.IEmulatorHelper { } public getErrorsFromAvailableEmulatorsOutput( - availableEmulatorsOutput: Mobile.IListEmulatorsOutput + availableEmulatorsOutput: Mobile.IListEmulatorsOutput, ): string[] { return _(availableEmulatorsOutput) .valuesIn() @@ -50,7 +51,7 @@ export class EmulatorHelper implements Mobile.IEmulatorHelper { public getEmulatorByImageIdentifier( imageIdentifier: string, - emulators: Mobile.IDeviceInfo[] + emulators: Mobile.IDeviceInfo[], ): Mobile.IDeviceInfo { const imagerIdentifierLowerCase = imageIdentifier && imageIdentifier.toLowerCase(); @@ -60,13 +61,13 @@ export class EmulatorHelper implements Mobile.IEmulatorHelper { emulator && emulator.imageIdentifier && imageIdentifier && - emulator.imageIdentifier.toLowerCase() === imagerIdentifierLowerCase + emulator.imageIdentifier.toLowerCase() === imagerIdentifierLowerCase, ); } public getEmulatorByIdOrName( emulatorIdOrName: string, - emulators: Mobile.IDeviceInfo[] + emulators: Mobile.IDeviceInfo[], ): Mobile.IDeviceInfo { const emulatorIdOrNameLowerCase = emulatorIdOrName && emulatorIdOrName.toLowerCase(); @@ -77,7 +78,7 @@ export class EmulatorHelper implements Mobile.IEmulatorHelper { emulatorIdOrNameLowerCase && ((emulator.identifier && emulator.identifier.toLowerCase() === emulatorIdOrNameLowerCase) || - emulator.displayName.toLowerCase() === emulatorIdOrNameLowerCase) + emulator.displayName.toLowerCase() === emulatorIdOrNameLowerCase), ); } @@ -87,7 +88,7 @@ export class EmulatorHelper implements Mobile.IEmulatorHelper { public getEmulatorByStartEmulatorOptions( options: Mobile.IStartEmulatorOptions, - emulators: Mobile.IDeviceInfo[] + emulators: Mobile.IDeviceInfo[], ): Mobile.IDeviceInfo { let result: Mobile.IDeviceInfo = null; @@ -98,7 +99,7 @@ export class EmulatorHelper implements Mobile.IEmulatorHelper { if (!result && options.imageIdentifier) { result = this.getEmulatorByImageIdentifier( options.imageIdentifier, - emulators + emulators, ); } @@ -111,7 +112,7 @@ export class EmulatorHelper implements Mobile.IEmulatorHelper { public setRunningAndroidEmulatorProperties( emulatorId: string, - emulator: Mobile.IDeviceInfo + emulator: Mobile.IDeviceInfo, ): void { emulator.identifier = emulatorId; emulator.status = RUNNING_EMULATOR_STATUS; diff --git a/lib/common/mobile/mobile-core/devices-service.ts b/lib/common/mobile/mobile-core/devices-service.ts index 003b8898d8..15bf11787f 100644 --- a/lib/common/mobile/mobile-core/devices-service.ts +++ b/lib/common/mobile/mobile-core/devices-service.ts @@ -567,7 +567,7 @@ export class DevicesService /** * Returns device depending on the passed index. - * The index refers to assigned number to listed devices by tns device command. + * The index refers to assigned number to listed devices by ns device command. * @param index assigned device number */ private getDeviceByIndex(index: number): Mobile.IDevice { diff --git a/lib/common/services/hooks-service.ts b/lib/common/services/hooks-service.ts index 4879ae4a5b..0b9676258a 100644 --- a/lib/common/services/hooks-service.ts +++ b/lib/common/services/hooks-service.ts @@ -24,7 +24,10 @@ import { color } from "../../color"; import { memoize } from "../decorators"; class Hook implements IHook { - constructor(public name: string, public fullPath: string) {} + constructor( + public name: string, + public fullPath: string, + ) {} } export class HooksService implements IHooksService { @@ -45,7 +48,7 @@ export class HooksService implements IHooksService { private $projectHelper: IProjectHelper, private $options: IOptions, private $performanceService: IPerformanceService, - private $projectConfigService: IProjectConfigService + private $projectConfigService: IProjectConfigService, ) {} public get hookArgsName(): string { @@ -69,12 +72,12 @@ export class HooksService implements IHooksService { if (projectDir) { this.hooksDirectories.push( - path.join(projectDir, HooksService.HOOKS_DIRECTORY_NAME) + path.join(projectDir, HooksService.HOOKS_DIRECTORY_NAME), ); } this.$logger.trace( - "Hooks directories: " + util.inspect(this.hooksDirectories) + "Hooks directories: " + util.inspect(this.hooksDirectories), ); const customHooks = this.$projectConfigService.getValue("hooks", []); @@ -91,7 +94,7 @@ export class HooksService implements IHooksService { public executeBeforeHooks( commandName: string, - hookArguments?: IDictionary + hookArguments?: IDictionary, ): Promise { const beforeHookName = `before-${HooksService.formatHookName(commandName)}`; const traceMessage = `BeforeHookName for command ${commandName} is ${beforeHookName}`; @@ -100,7 +103,7 @@ export class HooksService implements IHooksService { public executeAfterHooks( commandName: string, - hookArguments?: IDictionary + hookArguments?: IDictionary, ): Promise { const afterHookName = `after-${HooksService.formatHookName(commandName)}`; const traceMessage = `AfterHookName for command ${commandName} is ${afterHookName}`; @@ -110,7 +113,7 @@ export class HooksService implements IHooksService { private async executeHooks( hookName: string, traceMessage: string, - hookArguments?: IDictionary + hookArguments?: IDictionary, ): Promise { if (this.$config.DISABLE_HOOKS || !this.$options.hooks) { return; @@ -135,8 +138,8 @@ export class HooksService implements IHooksService { await this.executeHooksInDirectory( hooksDirectory, hookName, - hookArguments - ) + hookArguments, + ), ); } @@ -148,8 +151,8 @@ export class HooksService implements IHooksService { this.$projectHelper.projectDir, hookName, hook, - hookArguments - ) + hookArguments, + ), ); } } catch (err) { @@ -160,11 +163,16 @@ export class HooksService implements IHooksService { return _.flatten(results); } + private isESModule(hook: IHook): boolean { + const ext = path.extname(hook.fullPath).toLowerCase(); + return ext === ".mjs"; + } + private async executeHook( directoryPath: string, hookName: string, hook: IHook, - hookArguments?: IDictionary + hookArguments?: IDictionary, ): Promise { hookArguments = hookArguments || {}; @@ -173,15 +181,22 @@ export class HooksService implements IHooksService { const relativePath = path.relative(directoryPath, hook.fullPath); const trackId = relativePath.replace( new RegExp("\\" + path.sep, "g"), - AnalyticsEventLabelDelimiter + AnalyticsEventLabelDelimiter, ); + const isESM = this.isESModule(hook); let command = this.getSheBangInterpreter(hook); let inProc = false; if (!command) { command = hook.fullPath; - if (path.extname(hook.fullPath).toLowerCase() === ".js") { + if ( + [".mjs", ".cjs", ".js"].includes( + path.extname(hook.fullPath).toLowerCase(), + ) + ) { command = process.argv[0]; - inProc = this.shouldExecuteInProcess(this.$fs.readText(hook.fullPath)); + inProc = isESM + ? true + : this.shouldExecuteInProcess(this.$fs.readText(hook.fullPath)); } } @@ -190,15 +205,21 @@ export class HooksService implements IHooksService { this.$logger.trace( "Executing %s hook at location %s in-process", hookName, - hook.fullPath + hook.fullPath, ); - const hookEntryPoint = require(hook.fullPath); + let hookEntryPoint; + if (isESM) { + const { default: hookFn } = await import(hook.fullPath); + hookEntryPoint = hookFn; + } else { + hookEntryPoint = require(hook.fullPath); + } this.$logger.trace(`Validating ${hookName} arguments.`); const invalidArguments = this.validateHookArguments( hookEntryPoint, - hook.fullPath + hook.fullPath, ); if (invalidArguments.length) { @@ -206,8 +227,8 @@ export class HooksService implements IHooksService { `${ hook.fullPath } will NOT be executed because it has invalid arguments - ${color.grey( - invalidArguments.join(", ") - )}.` + invalidArguments.join(", "), + )}.`, ); return; } @@ -220,14 +241,13 @@ export class HooksService implements IHooksService { const projectDataHookArg = hookArguments["hookArgs"] && hookArguments["hookArgs"]["projectData"]; if (projectDataHookArg) { - hookArguments["projectData"] = hookArguments[ - "$projectData" - ] = projectDataHookArg; + hookArguments["projectData"] = hookArguments["$projectData"] = + projectDataHookArg; } const maybePromise = this.$injector.resolve( hookEntryPoint, - hookArguments + hookArguments, ); if (maybePromise) { this.$logger.trace("Hook promises to signal completion"); @@ -255,7 +275,7 @@ export class HooksService implements IHooksService { "Executing %s hook at location %s with environment ", hookName, hook.fullPath, - environment + environment, ); const output = await this.$childProcess.spawnFromEvent( @@ -263,7 +283,7 @@ export class HooksService implements IHooksService { [hook.fullPath], "close", environment, - { throwError: false } + { throwError: false }, ); result = output; @@ -275,7 +295,7 @@ export class HooksService implements IHooksService { "Finished executing %s hook at location %s with environment ", hookName, hook.fullPath, - environment + environment, ); } const endTime = this.$performanceService.now(); @@ -289,7 +309,7 @@ export class HooksService implements IHooksService { private async executeHooksInDirectory( directoryPath: string, hookName: string, - hookArguments?: IDictionary + hookArguments?: IDictionary, ): Promise { hookArguments = hookArguments || {}; const results: any[] = []; @@ -301,7 +321,7 @@ export class HooksService implements IHooksService { directoryPath, hookName, hook, - hookArguments + hookArguments, ); if (result) { @@ -316,14 +336,14 @@ export class HooksService implements IHooksService { const hooks: IHook[] = []; const customHooks: INsConfigHooks[] = this.$projectConfigService.getValue( "hooks", - [] + [], ); for (const cHook of customHooks) { if (cHook.type === hookName) { const fullPath = path.join( this.$projectHelper.projectDir, - cHook.script + cHook.script, ); const isFile = this.$fs.getFsStats(fullPath).isFile(); @@ -332,8 +352,8 @@ export class HooksService implements IHooksService { hooks.push( new Hook( this.getBaseFilename(fileNameParts[fileNameParts.length - 1]), - fullPath - ) + fullPath, + ), ); } } @@ -346,10 +366,10 @@ export class HooksService implements IHooksService { const allBaseHooks = this.getHooksInDirectory(directoryPath); const baseHooks = _.filter( allBaseHooks, - (hook) => hook.name.toLowerCase() === hookName.toLowerCase() + (hook) => hook.name.toLowerCase() === hookName.toLowerCase(), ); const moreHooks = this.getHooksInDirectory( - path.join(directoryPath, hookName) + path.join(directoryPath, hookName), ); return baseHooks.concat(moreHooks); } @@ -385,13 +405,11 @@ export class HooksService implements IHooksService { const clientName = this.$staticConfig.CLIENT_NAME.toUpperCase(); const environment: IStringDictionary = {}; - environment[util.format("%s-COMMANDLINE", clientName)] = process.argv.join( - " " - ); + environment[util.format("%s-COMMANDLINE", clientName)] = + process.argv.join(" "); environment[util.format("%s-HOOK_FULL_PATH", clientName)] = hookFullPath; - environment[ - util.format("%s-VERSION", clientName) - ] = this.$staticConfig.version; + environment[util.format("%s-VERSION", clientName)] = + this.$staticConfig.version; return { cwd: this.$projectHelper.projectDir, @@ -463,7 +481,7 @@ export class HooksService implements IHooksService { private validateHookArguments( hookConstructor: any, - hookFullPath: string + hookFullPath: string, ): string[] { const invalidArguments: string[] = []; @@ -477,7 +495,7 @@ export class HooksService implements IHooksService { } } catch (err) { this.$logger.trace( - `Cannot resolve ${argument} of hook ${hookFullPath}, reason: ${err}` + `Cannot resolve ${argument} of hook ${hookFullPath}, reason: ${err}`, ); invalidArguments.push(argument); } diff --git a/lib/common/services/net-service.ts b/lib/common/services/net-service.ts index 4efb391cf0..d519265ab6 100644 --- a/lib/common/services/net-service.ts +++ b/lib/common/services/net-service.ts @@ -18,7 +18,7 @@ export class Net implements INet { private $errors: IErrors, private $childProcess: IChildProcess, private $logger: ILogger, - private $osInfo: IOsInfo + private $osInfo: IOsInfo, ) {} public async getFreePort(): Promise { @@ -82,7 +82,7 @@ export class Net implements INet { public async getAvailablePortInRange( startPort: number, - endPort?: number + endPort?: number, ): Promise { endPort = endPort || 65534; while (!(await this.isPortAvailable(startPort))) { @@ -96,7 +96,7 @@ export class Net implements INet { } public async waitForPortToListen( - waitForPortListenData: IWaitForPortListenData + waitForPortListenData: IWaitForPortListenData, ): Promise { if (!waitForPortListenData) { this.$errors.fail("You must pass port and timeout for check."); @@ -126,8 +126,8 @@ export class Net implements INet { if (!currentPlatformData) { this.$errors.fail( `Unable to check for free ports on ${platform}. Supported platforms are: ${_.keys( - platformData - ).join(", ")}` + platformData, + ).join(", ")}`, ); } diff --git a/lib/common/test/unit-tests/file-system.ts b/lib/common/test/unit-tests/file-system.ts index 8ea252d41b..f9de36974f 100644 --- a/lib/common/test/unit-tests/file-system.ts +++ b/lib/common/test/unit-tests/file-system.ts @@ -1,6 +1,7 @@ import { Yok } from "../../yok"; +import { mkdtempSync } from "fs"; +import { tmpdir } from "os"; import * as path from "path"; -import * as temp from "temp"; import * as hostInfoLib from "../../host-info"; import { assert, use } from "chai"; import "chai-as-promised"; @@ -28,7 +29,6 @@ function isOsCaseSensitive(testInjector: IInjector): boolean { const hostInfo = testInjector.resolve("hostInfo"); return hostInfo.isLinux; } -temp.track(); function createWriteJsonTestCases(): { exists: boolean; @@ -125,7 +125,7 @@ describe("FileSystem", () => { beforeEach(() => { testInjector = createTestInjector(); - tempDir = temp.mkdirSync("projectToUnzip"); + tempDir = mkdtempSync(path.join(tmpdir(), "projectToUnzip-")); fs = testInjector.resolve("fs"); file = path.join(tempDir, unzippedFileName); fs.writeFile(file, msg); @@ -188,7 +188,7 @@ describe("FileSystem", () => { const commandUnzipFailedMessage = "Command unzip failed with exit code 9"; it("is case sensitive when options is not defined", async () => { const testInjector = createTestInjector(); - const tempDir = temp.mkdirSync("projectToUnzip"); + const tempDir = mkdtempSync(path.join(tmpdir(), "projectToUnzip-")); const fs: IFileSystem = testInjector.resolve("fs"); if (isOsCaseSensitive(testInjector)) { await assert.isRejected( @@ -202,7 +202,7 @@ describe("FileSystem", () => { it("is case sensitive when caseSensitive option is not defined", async () => { const testInjector = createTestInjector(); - const tempDir = temp.mkdirSync("projectToUnzip"); + const tempDir = mkdtempSync(path.join(tmpdir(), "projectToUnzip-")); const fs: IFileSystem = testInjector.resolve("fs"); if (isOsCaseSensitive(testInjector)) { await assert.isRejected( @@ -216,7 +216,7 @@ describe("FileSystem", () => { it("is case sensitive when caseSensitive option is true", async () => { const testInjector = createTestInjector(); - const tempDir = temp.mkdirSync("projectToUnzip"); + const tempDir = mkdtempSync(path.join(tmpdir(), "projectToUnzip-")); const fs: IFileSystem = testInjector.resolve("fs"); if (isOsCaseSensitive(testInjector)) { await assert.isRejected( @@ -233,7 +233,7 @@ describe("FileSystem", () => { it("is case insensitive when caseSensitive option is false", async () => { const testInjector = createTestInjector(); - const tempDir = temp.mkdirSync("projectToUnzip"); + const tempDir = mkdtempSync(path.join(tmpdir(), "projectToUnzip-")); const fs: IFileSystem = testInjector.resolve("fs"); const file = path.join(tempDir, unzippedFileName); await fs.unzip( @@ -251,7 +251,7 @@ describe("FileSystem", () => { describe("renameIfExists", () => { it("returns true when file is renamed", () => { const testInjector = createTestInjector(); - const tempDir = temp.mkdirSync("renameIfExists"); + const tempDir = mkdtempSync(path.join(tmpdir(), "renameIfExists-")); const testFileName = path.join(tempDir, "testRenameIfExistsMethod"); const newFileName = path.join(tempDir, "newfilename"); @@ -287,7 +287,7 @@ describe("FileSystem", () => { beforeEach(() => { testInjector = createTestInjector(); - tempDir = temp.mkdirSync("copyFile"); + tempDir = mkdtempSync(path.join(tmpdir(), "copyFile-")); testFileName = path.join(tempDir, "testCopyFile"); newFileName = path.join(tempDir, "newfilename"); diff --git a/lib/common/test/unit-tests/mobile/project-files-manager.ts b/lib/common/test/unit-tests/mobile/project-files-manager.ts index 927dde9acd..1ab06e1a94 100644 --- a/lib/common/test/unit-tests/mobile/project-files-manager.ts +++ b/lib/common/test/unit-tests/mobile/project-files-manager.ts @@ -12,12 +12,12 @@ import * as path from "path"; import { Yok } from "../../../yok"; import { ProjectFilesProviderBase } from "../../../services/project-files-provider-base"; -import * as temp from "temp"; +import { mkdtempSync } from "fs"; +import { tmpdir } from "os"; import { LiveSyncPaths } from "../../../constants"; import { TempServiceStub } from "../../../../../test/stubs"; import { IInjector } from "../../../definitions/yok"; import { IProjectFilesManager } from "../../../declarations"; -temp.track(); const testedApplicationIdentifier = "com.telerik.myApp"; const iOSDeviceProjectRootPath = "/Documents/AppBuilder/LiveSync/app"; @@ -44,7 +44,7 @@ function createTestInjector(): IInjector { testInjector.register("hostInfo", HostInfo); testInjector.register( "localToDevicePathDataFactory", - LocalToDevicePathDataFactory + LocalToDevicePathDataFactory, ); testInjector.register("mobileHelper", MobileHelper); testInjector.register("projectFilesProvider", ProjectFilesProviderBase); @@ -61,12 +61,14 @@ function createTestInjector(): IInjector { async function createFiles( testInjector: IInjector, - filesToCreate: string[] + filesToCreate: string[], ): Promise { - const directoryPath = temp.mkdirSync("Project Files Manager Tests"); + const directoryPath = mkdtempSync( + path.join(tmpdir(), "Project Files Manager Tests-"), + ); _.each(filesToCreate, (file) => - createFile(testInjector, file, "", directoryPath) + createFile(testInjector, file, "", directoryPath), ); return directoryPath; @@ -76,11 +78,11 @@ function createFile( testInjector: IInjector, fileToCreate: string, fileContent: string, - directoryPath?: string + directoryPath?: string, ): string { const fs = testInjector.resolve("fs"); directoryPath = !directoryPath - ? temp.mkdirSync("Project Files Manager Tests") + ? mkdtempSync(path.join(tmpdir(), "Project Files Manager Tests-")) : directoryPath; fs.writeFile(path.join(directoryPath, fileToCreate), fileContent); @@ -100,50 +102,52 @@ describe("Project Files Manager Tests", () => { it("maps non-platform specific files to device file paths for ios platform", async () => { const files = ["~/TestApp/app/test.js", "~/TestApp/app/myfile.js"]; - const localToDevicePaths = await projectFilesManager.createLocalToDevicePaths( - iOSDeviceAppData, - "~/TestApp/app", - files, - [] - ); + const localToDevicePaths = + await projectFilesManager.createLocalToDevicePaths( + iOSDeviceAppData, + "~/TestApp/app", + files, + [], + ); _.each(localToDevicePaths, (localToDevicePathData, index) => { assert.equal(files[index], localToDevicePathData.getLocalPath()); assert.equal( mobileHelper.buildDevicePath( iOSDeviceProjectRootPath, - path.basename(files[index]) + path.basename(files[index]), ), - localToDevicePathData.getDevicePath() + localToDevicePathData.getDevicePath(), ); assert.equal( path.basename(files[index]), - localToDevicePathData.getRelativeToProjectBasePath() + localToDevicePathData.getRelativeToProjectBasePath(), ); }); }); it("maps non-platform specific files to device file paths for android platform", async () => { const files = ["~/TestApp/app/test.js", "~/TestApp/app/myfile.js"]; - const localToDevicePaths = await projectFilesManager.createLocalToDevicePaths( - androidDeviceAppData, - "~/TestApp/app", - files, - [] - ); + const localToDevicePaths = + await projectFilesManager.createLocalToDevicePaths( + androidDeviceAppData, + "~/TestApp/app", + files, + [], + ); _.each(localToDevicePaths, (localToDevicePathData, index) => { assert.equal(files[index], localToDevicePathData.getLocalPath()); assert.equal( mobileHelper.buildDevicePath( androidDeviceProjectRootPath, - path.basename(files[index]) + path.basename(files[index]), ), - localToDevicePathData.getDevicePath() + localToDevicePathData.getDevicePath(), ); assert.equal( path.basename(files[index]), - localToDevicePathData.getRelativeToProjectBasePath() + localToDevicePathData.getRelativeToProjectBasePath(), ); }); }); @@ -155,18 +159,18 @@ describe("Project Files Manager Tests", () => { iOSDeviceAppData, "~/TestApp/app", [filePath], - [] + [], ) )[0]; assert.equal(filePath, localToDevicePathData.getLocalPath()); assert.equal( mobileHelper.buildDevicePath(iOSDeviceProjectRootPath, "test.js"), - localToDevicePathData.getDevicePath() + localToDevicePathData.getDevicePath(), ); assert.equal( "test.ios.js", - localToDevicePathData.getRelativeToProjectBasePath() + localToDevicePathData.getRelativeToProjectBasePath(), ); }); @@ -177,18 +181,18 @@ describe("Project Files Manager Tests", () => { androidDeviceAppData, "~/TestApp/app", [filePath], - [] + [], ) )[0]; assert.equal(filePath, localToDevicePathData.getLocalPath()); assert.equal( mobileHelper.buildDevicePath(androidDeviceProjectRootPath, "test.js"), - localToDevicePathData.getDevicePath() + localToDevicePathData.getDevicePath(), ); assert.equal( "test.android.js", - localToDevicePathData.getRelativeToProjectBasePath() + localToDevicePathData.getRelativeToProjectBasePath(), ); }); @@ -199,7 +203,7 @@ describe("Project Files Manager Tests", () => { projectFilesManager.processPlatformSpecificFiles( directoryPath, "android", - {} + {}, ); const fs = testInjector.resolve("fs"); @@ -228,7 +232,7 @@ describe("Project Files Manager Tests", () => { testInjector, "test.release.x", releaseFileContent, - directoryPath + directoryPath, ); projectFilesManager.processPlatformSpecificFiles(directoryPath, "android", { @@ -241,7 +245,7 @@ describe("Project Files Manager Tests", () => { assert.isFalse(fs.exists(path.join(directoryPath, "test.release.x"))); assert.isTrue( fs.readFile(path.join(directoryPath, "test.x")).toString() === - releaseFileContent + releaseFileContent, ); }); @@ -253,7 +257,7 @@ describe("Project Files Manager Tests", () => { projectFilesManager.processPlatformSpecificFiles( directoryPath, "android", - {} + {}, ); const fs = testInjector.resolve("fs"); @@ -262,7 +266,7 @@ describe("Project Files Manager Tests", () => { assert.isFalse(fs.exists(path.join(directoryPath, "test.release.x"))); assert.isTrue( fs.readFile(path.join(directoryPath, "test.x")).toString() === - debugFileContent + debugFileContent, ); }); diff --git a/lib/common/test/unit-tests/services/hook-service.ts b/lib/common/test/unit-tests/services/hook-service.ts index 7b5d935a9c..f0eb83fd3f 100644 --- a/lib/common/test/unit-tests/services/hook-service.ts +++ b/lib/common/test/unit-tests/services/hook-service.ts @@ -14,9 +14,8 @@ import * as FileSystemLib from "../../../file-system"; import * as ChildProcessLib from "../../../child-process"; import { IHooksService } from "../../../declarations"; import { HooksService } from "../../../services/hooks-service"; -import * as temp from "temp"; - -temp.track(); +import { mkdtempSync } from "fs"; +import { tmpdir } from "os"; function createTestInjector(opts?: { projectDir?: string }): IInjector { const testInjector = new Yok(); @@ -34,7 +33,7 @@ function createTestInjector(opts?: { projectDir?: string }): IInjector { testInjector.register("projectConfigService", ProjectConfigServiceStub); testInjector.register( "projectHelper", - new ProjectHelperStub("", opts && opts.projectDir) + new ProjectHelperStub("", opts && opts.projectDir), ); testInjector.register("performanceService", PerformanceService); testInjector.register("hooksService", HooksService); @@ -47,7 +46,7 @@ describe("hooks-service", () => { it("should run hooks from hooks folder", async () => { const projectName = "projectDirectory"; - const projectPath = temp.mkdirSync(projectName); + const projectPath = mkdtempSync(path.join(tmpdir(), `${projectName}-`)); const testInjector = createTestInjector({ projectDir: projectPath }); @@ -64,7 +63,7 @@ describe("hooks-service", () => { fs.mkdirSync(path.join(projectPath, "hooks/after-prepare")); fs.writeFileSync( path.join(projectPath, "hooks/after-prepare/hook.js"), - script + script, ); service = testInjector.resolve("$hooksService"); @@ -73,13 +72,13 @@ describe("hooks-service", () => { assert.equal( testInjector.resolve("$logger").output, - "after-prepare hook is running\n" + "after-prepare hook is running\n", ); }); it("should run custom hooks from nativescript config", async () => { const projectName = "projectDirectory"; - const projectPath = temp.mkdirSync(projectName); + const projectPath = mkdtempSync(path.join(tmpdir(), `${projectName}-`)); const testInjector = createTestInjector({ projectDir: projectPath }); @@ -99,7 +98,7 @@ describe("hooks-service", () => { "projectConfigService", ProjectConfigServiceStub.initWithConfig({ hooks: [{ type: "before-prepare", script: "scripts/custom-hook.js" }], - }) + }), ); service = testInjector.resolve("$hooksService"); @@ -108,13 +107,13 @@ describe("hooks-service", () => { assert.equal( testInjector.resolve("$logger").output, - "custom hook is running\n" + "custom hook is running\n", ); }); it("skip when missing hook args", async () => { const projectName = "projectDirectory"; - const projectPath = temp.mkdirSync(projectName); + const projectPath = mkdtempSync(path.join(tmpdir(), `${projectName}-`)); const testInjector = createTestInjector({ projectDir: projectPath }); @@ -131,7 +130,7 @@ describe("hooks-service", () => { fs.mkdirSync(path.join(projectPath, "hooks/after-prepare")); fs.writeFileSync( path.join(projectPath, "hooks/after-prepare/hook.js"), - script + script, ); service = testInjector.resolve("$hooksService"); @@ -140,13 +139,13 @@ describe("hooks-service", () => { expect(testInjector.resolve("$logger").warnOutput).to.have.string( "invalid arguments", - "$projectData should be missing" + "$projectData should be missing", ); }); it("should run non-hook files", async () => { const projectName = "projectDirectory"; - const projectPath = temp.mkdirSync(projectName); + const projectPath = mkdtempSync(path.join(tmpdir(), `${projectName}-`)); const testInjector = createTestInjector({ projectDir: projectPath }); @@ -160,7 +159,7 @@ describe("hooks-service", () => { fs.mkdirSync(path.join(projectPath, "hooks/after-prepare")); fs.writeFileSync( path.join(projectPath, "hooks/after-prepare/script.js"), - script + script, ); service = testInjector.resolve("$hooksService"); @@ -169,7 +168,7 @@ describe("hooks-service", () => { assert( fs.existsSync(path.join(projectPath, "js-test.txt")), - "javascript file did not run" + "javascript file did not run", ); }); }); diff --git a/lib/common/test/unit-tests/yok.ts b/lib/common/test/unit-tests/yok.ts index 880c66b012..32370fcc7b 100644 --- a/lib/common/test/unit-tests/yok.ts +++ b/lib/common/test/unit-tests/yok.ts @@ -2,16 +2,19 @@ import { assert } from "chai"; import { injector, setGlobalInjector, Yok } from "../../yok"; import * as path from "path"; import * as fs from "fs"; -import * as temp from "temp"; +import { mkdtempSync } from "fs"; +import { tmpdir } from "os"; import * as _ from "lodash"; +import * as fc from "fast-check"; import { ICliGlobal } from "../../definitions/cli-global"; import { ICommandParameter } from "../../definitions/commands"; import { IInjector } from "../../definitions/yok"; -temp.track(); - class MyClass { - constructor(private x: string, public y: any) {} + constructor( + private x: string, + public y: any, + ) {} public checkX(): void { assert.strictEqual(this.x, "foo"); @@ -476,9 +479,10 @@ describe("yok", () => { const cliGlobal = (global); const injectorCache = cliGlobal.$injector; cliGlobal.$injector = injector; - const tmpPathA = temp.path({ - prefix: "overrideAlreadyRequiredModule_fileA", - }); + const tmpDirA = mkdtempSync( + path.join(tmpdir(), "overrideAlreadyRequiredModule_fileA-"), + ); + const tmpPathA = path.join(tmpDirA, "fileA.js"); fs.writeFileSync( tmpPathA, ` @@ -490,14 +494,15 @@ class A { } } $injector.register("a", A); - ` + `, ); injector.require("a", tmpPathA); - const tmpPathB = temp.path({ - prefix: "overrideAlreadyRequiredModule_fileB", - }); + const tmpDirB = mkdtempSync( + path.join(tmpdir(), "overrideAlreadyRequiredModule_fileB-"), + ); + const tmpPathB = path.join(tmpDirB, "fileB.js"); fs.writeFileSync( tmpPathB, ` @@ -509,7 +514,7 @@ class A { } } $injector.register("a", A); - ` + `, ); injector.overrideAlreadyRequiredModule = true; @@ -526,7 +531,7 @@ $injector.register("a", A); setGlobalInjector(new Yok()); injector.requirePublic("foo", "test"); assert.isTrue( - _.includes(Object.getOwnPropertyNames(injector.publicApi), "foo") + _.includes(Object.getOwnPropertyNames(injector.publicApi), "foo"), ); }); @@ -542,9 +547,10 @@ $injector.register("a", A); const injectorCache = injector; setGlobalInjector(new Yok()); - const testPublicApiFilePath = temp.path({ - prefix: "overrideAlreadyRequiredModule_fileA", - }); + const tempDir = mkdtempSync( + path.join(tmpdir(), "overrideAlreadyRequiredModule_fileA-"), + ); + const testPublicApiFilePath = path.join(tempDir, "public-api-mocks.js"); const pathToMock = path.join(__dirname, "mocks", "public-api-mocks.js"); const originalContent = fs.readFileSync(pathToMock).toString(); @@ -567,11 +573,11 @@ $injector.register("a", A); const result = 1; assert.ok( injector.publicApi.testPublicApi, - "The module testPublicApi must be resolved in its getter and the returned value should not be falsey." + "The module testPublicApi must be resolved in its getter and the returned value should not be falsey.", ); assert.deepStrictEqual( await injector.publicApi.testPublicApi.myMethod(result), - result + result, ); setGlobalInjector(injectorCache); @@ -589,14 +595,14 @@ $injector.register("a", A); it("and is valid", () => { localInjector.requireCommand("sample|command", "sampleFileName"); return assert.eventually.isTrue( - localInjector.isValidHierarchicalCommand("sample", ["command"]) + localInjector.isValidHierarchicalCommand("sample", ["command"]), ); }); it("and has default value and no arguments passed", () => { localInjector.requireCommand("sample|*default", "sampleFileName"); return assert.eventually.isTrue( - localInjector.isValidHierarchicalCommand("sample", []) + localInjector.isValidHierarchicalCommand("sample", []), ); }); @@ -607,7 +613,7 @@ $injector.register("a", A); localInjector.registerCommand("sample|*default", command); localInjector.requireCommand("sample|*default", "sampleFileName"); return assert.eventually.isTrue( - localInjector.isValidHierarchicalCommand("sample", ["arg"]) + localInjector.isValidHierarchicalCommand("sample", ["arg"]), ); }); @@ -621,21 +627,24 @@ $injector.register("a", A); localInjector.registerCommand("sample|*default", command); localInjector.requireCommand("sample|*default", "sampleFileName"); return assert.eventually.isTrue( - localInjector.isValidHierarchicalCommand("sample", ["arg"]) + localInjector.isValidHierarchicalCommand("sample", ["arg"]), ); }); it("and has default value and argument default passed", () => { localInjector.requireCommand("sample|*default", "sampleFileName"); return assert.eventually.isTrue( - localInjector.isValidHierarchicalCommand("sample", ["default"]) + localInjector.isValidHierarchicalCommand("sample", ["default"]), ); }); it("and has default value and some arguments passed", () => { localInjector.requireCommand("sample|*default", "sampleFileName"); return assert.eventually.isTrue( - localInjector.isValidHierarchicalCommand("sample", ["arg1", "arg2"]) + localInjector.isValidHierarchicalCommand("sample", [ + "arg1", + "arg2", + ]), ); }); }); @@ -644,50 +653,50 @@ $injector.register("a", A); it("and is valid", () => { localInjector.requireCommand( "sample|command|subcommand", - "sampleFileName" + "sampleFileName", ); return assert.eventually.isTrue( localInjector.isValidHierarchicalCommand("sample", [ "command", "subcommand", - ]) + ]), ); }); it("and has default value and no arguments passed", () => { localInjector.requireCommand( "sample|command|*default", - "sampleFileName" + "sampleFileName", ); return assert.eventually.isTrue( - localInjector.isValidHierarchicalCommand("sample", ["command"]) + localInjector.isValidHierarchicalCommand("sample", ["command"]), ); }); it("has default value and default argument passed", () => { localInjector.requireCommand( "sample|command|*default", - "sampleFileName" + "sampleFileName", ); return assert.eventually.isTrue( localInjector.isValidHierarchicalCommand("sample", [ "command", "default", - ]) + ]), ); }); it("has default value and some arguments passed", () => { localInjector.requireCommand( "sample|command|*default", - "sampleFileName" + "sampleFileName", ); return assert.eventually.isTrue( localInjector.isValidHierarchicalCommand("sample", [ "command", "arg1", "arg2", - ]) + ]), ); }); }); @@ -697,7 +706,7 @@ $injector.register("a", A); it("when command is invalid", () => { localInjector.requireCommand("sample|command", "sampleFileName"); return assert.eventually.isFalse( - localInjector.isValidHierarchicalCommand("wrong", ["command"]) + localInjector.isValidHierarchicalCommand("wrong", ["command"]), ); }); @@ -705,7 +714,7 @@ $injector.register("a", A); it("when arguments are invalid", () => { localInjector.requireCommand("sample|command", "sampleFileName"); return assert.isRejected( - localInjector.isValidHierarchicalCommand("sample", ["commandarg"]) + localInjector.isValidHierarchicalCommand("sample", ["commandarg"]), ); }); }); @@ -722,21 +731,21 @@ $injector.register("a", A); injector.requireCommand("sample|command", "sampleFileName"); assert.isUndefined( injector.buildHierarchicalCommand("command", ["subCommand"]), - "When there's no matching subcommand, buildHierarchicalCommand should return undefined." + "When there's no matching subcommand, buildHierarchicalCommand should return undefined.", ); }); it("when there's no hierarchical commands required", () => { assert.isUndefined( injector.buildHierarchicalCommand("command", ["subCommand"]), - "When there's no hierarchical commands required, buildHierarchicalCommand should return undefined." + "When there's no hierarchical commands required, buildHierarchicalCommand should return undefined.", ); }); it("when only one argument is passed", () => { assert.isUndefined( injector.buildHierarchicalCommand("command", []), - "When when only one argument is passed, buildHierarchicalCommand should return undefined." + "When when only one argument is passed, buildHierarchicalCommand should return undefined.", ); }); @@ -744,7 +753,7 @@ $injector.register("a", A); injector.requireCommand("command", "sampleFileName"); assert.isUndefined( injector.buildHierarchicalCommand("command", []), - "When there's matching command, but it is not hierarchical command, buildHierarchicalCommand should return undefined." + "When there's matching command, but it is not hierarchical command, buildHierarchicalCommand should return undefined.", ); }); }); @@ -753,19 +762,17 @@ $injector.register("a", A); it("when only command is passed, no arguments are returned", () => { const commandName = "sample|command"; injector.requireCommand(commandName, "sampleFileName"); - const buildHierarchicalCommandResult = injector.buildHierarchicalCommand( - "sample", - ["command"] - ); + const buildHierarchicalCommandResult = + injector.buildHierarchicalCommand("sample", ["command"]); assert.deepStrictEqual( buildHierarchicalCommandResult.commandName, commandName, - `The expected command name is ${commandName}` + `The expected command name is ${commandName}`, ); assert.deepStrictEqual( buildHierarchicalCommandResult.remainingArguments, [], - "There shouldn't be any arguments left." + "There shouldn't be any arguments left.", ); }); @@ -779,19 +786,20 @@ $injector.register("a", A); "to", "command", ]; - const buildHierarchicalCommandResult = injector.buildHierarchicalCommand( - "sample", - ["command"].concat(sampleArguments) - ); + const buildHierarchicalCommandResult = + injector.buildHierarchicalCommand( + "sample", + ["command"].concat(sampleArguments), + ); assert.deepStrictEqual( buildHierarchicalCommandResult.commandName, commandName, - `The expected command name is ${commandName}` + `The expected command name is ${commandName}`, ); assert.deepStrictEqual( buildHierarchicalCommandResult.remainingArguments, sampleArguments, - "All arguments except first one should be returned." + "All arguments except first one should be returned.", ); }); @@ -805,38 +813,37 @@ $injector.register("a", A); "to", "command", ]; - const buildHierarchicalCommandResult = injector.buildHierarchicalCommand( - "sample", - ["CoMmanD"].concat(sampleArguments) - ); + const buildHierarchicalCommandResult = + injector.buildHierarchicalCommand( + "sample", + ["CoMmanD"].concat(sampleArguments), + ); assert.deepStrictEqual( buildHierarchicalCommandResult.commandName, commandName, - `The expected command name is ${commandName}` + `The expected command name is ${commandName}`, ); assert.deepStrictEqual( buildHierarchicalCommandResult.remainingArguments, sampleArguments, - "All arguments except first one should be returned." + "All arguments except first one should be returned.", ); }); it("when only default command is passed, no arguments are returned", () => { const commandName = "sample|*command"; injector.requireCommand(commandName, "sampleFileName"); - const buildHierarchicalCommandResult = injector.buildHierarchicalCommand( - "sample", - ["command"] - ); + const buildHierarchicalCommandResult = + injector.buildHierarchicalCommand("sample", ["command"]); assert.deepStrictEqual( buildHierarchicalCommandResult.commandName, commandName, - `The expected command name is ${commandName}` + `The expected command name is ${commandName}`, ); assert.deepStrictEqual( buildHierarchicalCommandResult.remainingArguments, [], - "There shouldn't be any arguments left." + "There shouldn't be any arguments left.", ); }); @@ -850,19 +857,20 @@ $injector.register("a", A); "to", "command", ]; - const buildHierarchicalCommandResult = injector.buildHierarchicalCommand( - "sample", - ["command"].concat(sampleArguments) - ); + const buildHierarchicalCommandResult = + injector.buildHierarchicalCommand( + "sample", + ["command"].concat(sampleArguments), + ); assert.deepStrictEqual( buildHierarchicalCommandResult.commandName, commandName, - `The expected command name is ${commandName}` + `The expected command name is ${commandName}`, ); assert.deepStrictEqual( buildHierarchicalCommandResult.remainingArguments, sampleArguments, - "All arguments except first one should be returned." + "All arguments except first one should be returned.", ); }); }); @@ -871,19 +879,22 @@ $injector.register("a", A); it("when only command is passed, no arguments are returned", () => { const commandName = "sample|command|with|more|pipes"; injector.requireCommand(commandName, "sampleFileName"); - const buildHierarchicalCommandResult = injector.buildHierarchicalCommand( - "sample", - ["command", "with", "more", "pipes"] - ); + const buildHierarchicalCommandResult = + injector.buildHierarchicalCommand("sample", [ + "command", + "with", + "more", + "pipes", + ]); assert.deepStrictEqual( buildHierarchicalCommandResult.commandName, commandName, - `The expected command name is ${commandName}` + `The expected command name is ${commandName}`, ); assert.deepStrictEqual( buildHierarchicalCommandResult.remainingArguments, [], - "There shouldn't be any arguments left." + "There shouldn't be any arguments left.", ); }); @@ -897,38 +908,37 @@ $injector.register("a", A); "to", "command", ]; - const buildHierarchicalCommandResult = injector.buildHierarchicalCommand( - "sample", - ["command", "pipes"].concat(sampleArguments) - ); + const buildHierarchicalCommandResult = + injector.buildHierarchicalCommand( + "sample", + ["command", "pipes"].concat(sampleArguments), + ); assert.deepStrictEqual( buildHierarchicalCommandResult.commandName, commandName, - `The expected command name is ${commandName}` + `The expected command name is ${commandName}`, ); assert.deepStrictEqual( buildHierarchicalCommandResult.remainingArguments, sampleArguments, - "All arguments except the ones used for commandName should be returned." + "All arguments except the ones used for commandName should be returned.", ); }); it("when only default command is passed, no arguments are returned", () => { const commandName = "sample|*command|pipes"; injector.requireCommand(commandName, "sampleFileName"); - const buildHierarchicalCommandResult = injector.buildHierarchicalCommand( - "sample", - ["command", "pipes"] - ); + const buildHierarchicalCommandResult = + injector.buildHierarchicalCommand("sample", ["command", "pipes"]); assert.deepStrictEqual( buildHierarchicalCommandResult.commandName, commandName, - `The expected command name is ${commandName}` + `The expected command name is ${commandName}`, ); assert.deepStrictEqual( buildHierarchicalCommandResult.remainingArguments, [], - "There shouldn't be any arguments left." + "There shouldn't be any arguments left.", ); }); @@ -942,19 +952,20 @@ $injector.register("a", A); "to", "command", ]; - const buildHierarchicalCommandResult = injector.buildHierarchicalCommand( - "sample", - ["command", "pipes"].concat(sampleArguments) - ); + const buildHierarchicalCommandResult = + injector.buildHierarchicalCommand( + "sample", + ["command", "pipes"].concat(sampleArguments), + ); assert.deepStrictEqual( buildHierarchicalCommandResult.commandName, commandName, - `The expected command name is ${commandName}` + `The expected command name is ${commandName}`, ); assert.deepStrictEqual( buildHierarchicalCommandResult.remainingArguments, sampleArguments, - "All arguments except the ones used for commandName should be returned." + "All arguments except the ones used for commandName should be returned.", ); }); @@ -972,118 +983,199 @@ $injector.register("a", A); injector.requireCommand("sample|command|with|more", "sampleFileName"); injector.requireCommand( "sample|command|with|more|pipes", - "sampleFileName" + "sampleFileName", ); }); it("when subcommand of subcommand is called", () => { const commandName = "sample|command|with|more|pipes"; - const buildHierarchicalCommandResult = injector.buildHierarchicalCommand( - "sample", - ["command", "with", "more", "pipes"] - ); + const buildHierarchicalCommandResult = + injector.buildHierarchicalCommand("sample", [ + "command", + "with", + "more", + "pipes", + ]); assert.deepStrictEqual( buildHierarchicalCommandResult.commandName, commandName, - `The expected command name is ${commandName}` + `The expected command name is ${commandName}`, ); assert.deepStrictEqual( buildHierarchicalCommandResult.remainingArguments, [], - "There shouldn't be any arguments left." + "There shouldn't be any arguments left.", ); }); it("and correct arguments, when subcommand of subcommand is called", () => { const commandName = "sample|command|with|more|pipes"; - const buildHierarchicalCommandResult = injector.buildHierarchicalCommand( - "sample", - ["command", "with", "more", "pipes"].concat(sampleArguments) - ); + const buildHierarchicalCommandResult = + injector.buildHierarchicalCommand( + "sample", + ["command", "with", "more", "pipes"].concat(sampleArguments), + ); assert.deepStrictEqual( buildHierarchicalCommandResult.commandName, commandName, - `The expected command name is ${commandName}` + `The expected command name is ${commandName}`, ); assert.deepStrictEqual( buildHierarchicalCommandResult.remainingArguments, sampleArguments, - "All arguments except the ones used for commandName should be returned." + "All arguments except the ones used for commandName should be returned.", ); }); it("when top subcommand is called and it has its own subcommand", () => { const commandName = "sample|command"; - const buildHierarchicalCommandResult = injector.buildHierarchicalCommand( - "sample", - ["command"] - ); + const buildHierarchicalCommandResult = + injector.buildHierarchicalCommand("sample", ["command"]); assert.deepStrictEqual( buildHierarchicalCommandResult.commandName, commandName, - `The expected command name is ${commandName}` + `The expected command name is ${commandName}`, ); assert.deepStrictEqual( buildHierarchicalCommandResult.remainingArguments, [], - "There shouldn't be any arguments left." + "There shouldn't be any arguments left.", ); }); it("and correct arguments, when top subcommand is called and it has its own subcommand", () => { const commandName = "sample|command"; - const buildHierarchicalCommandResult = injector.buildHierarchicalCommand( - "sample", - ["command"].concat(sampleArguments) - ); + const buildHierarchicalCommandResult = + injector.buildHierarchicalCommand( + "sample", + ["command"].concat(sampleArguments), + ); assert.deepStrictEqual( buildHierarchicalCommandResult.commandName, commandName, - `The expected command name is ${commandName}` + `The expected command name is ${commandName}`, ); assert.deepStrictEqual( buildHierarchicalCommandResult.remainingArguments, sampleArguments, - "All arguments except the ones used for commandName should be returned." + "All arguments except the ones used for commandName should be returned.", ); }); it("when subcommand of subcommand is called and it has its own subcommand", () => { const commandName = "sample|command|with"; - const buildHierarchicalCommandResult = injector.buildHierarchicalCommand( - "sample", - ["command", "with"] - ); + const buildHierarchicalCommandResult = + injector.buildHierarchicalCommand("sample", ["command", "with"]); assert.deepStrictEqual( buildHierarchicalCommandResult.commandName, commandName, - `The expected command name is ${commandName}` + `The expected command name is ${commandName}`, ); assert.deepStrictEqual( buildHierarchicalCommandResult.remainingArguments, [], - "There shouldn't be any arguments left." + "There shouldn't be any arguments left.", ); }); it("and correct arguments, when subcommand of subcommand is called and it has its own subcommand", () => { const commandName = "sample|command|with"; - const buildHierarchicalCommandResult = injector.buildHierarchicalCommand( - "sample", - ["command", "with"].concat(sampleArguments) - ); + const buildHierarchicalCommandResult = + injector.buildHierarchicalCommand( + "sample", + ["command", "with"].concat(sampleArguments), + ); assert.deepStrictEqual( buildHierarchicalCommandResult.commandName, commandName, - `The expected command name is ${commandName}` + `The expected command name is ${commandName}`, ); assert.deepStrictEqual( buildHierarchicalCommandResult.remainingArguments, sampleArguments, - "All arguments except the ones used for commandName should be returned." + "All arguments except the ones used for commandName should be returned.", ); }); }); }); + + it("fuzzes one-level hierarchical command parsing with mixed casing", () => { + fc.assert( + fc.property( + fc + .stringMatching(/^[a-z][a-z0-9-]{0,15}$/) + .filter((value) => value.indexOf("|") === -1), + fc.array(fc.string(), { maxLength: 6 }), + fc.array(fc.boolean(), { minLength: 1, maxLength: 16 }), + ( + rawSubCommand: string, + remainingArguments: string[], + mixedCaseFlags: boolean[], + ) => { + setGlobalInjector(new Yok()); + const subCommand = rawSubCommand.slice(0, 16); + const commandName = `sample|${subCommand}`; + injector.requireCommand(commandName, "sampleFileName"); + + const commandTokenCharacters = subCommand.split(""); + const mixedCaseToken = commandTokenCharacters + .map((character, index) => { + const useUpperCase = + mixedCaseFlags[index % mixedCaseFlags.length]; + return useUpperCase + ? character.toUpperCase() + : character.toLowerCase(); + }) + .join(""); + + const result = injector.buildHierarchicalCommand("sample", [ + mixedCaseToken, + ...remainingArguments, + ]); + + assert.isDefined(result); + assert.deepStrictEqual(result.commandName, commandName); + assert.deepStrictEqual( + result.remainingArguments, + remainingArguments, + ); + }, + ), + { numRuns: 120 }, + ); + }); + + it("fuzzes two-level hierarchical command parsing and trailing args", () => { + fc.assert( + fc.property( + fc + .tuple( + fc.stringMatching(/^[a-z][a-z0-9]{0,10}$/), + fc.stringMatching(/^[a-z][a-z0-9]{0,10}$/), + ) + .filter(([firstToken, secondToken]) => firstToken !== secondToken), + fc.array(fc.string(), { maxLength: 5 }), + ([firstToken, secondToken], trailingArguments: string[]) => { + setGlobalInjector(new Yok()); + const commandName = `sample|${firstToken}|${secondToken}`; + injector.requireCommand(commandName, "sampleFileName"); + + const result = injector.buildHierarchicalCommand("sample", [ + firstToken, + secondToken, + ...trailingArguments, + ]); + + assert.isDefined(result); + assert.deepStrictEqual(result.commandName, commandName); + assert.deepStrictEqual( + result.remainingArguments, + trailingArguments, + ); + }, + ), + { numRuns: 120 }, + ); + }); }); it("adds whole class to public api when requirePublicClass is used", () => { @@ -1106,7 +1198,7 @@ $injector.register("a", A); const resultFooObject = injector.publicApi.foo; fs.unlinkSync(filepath); assert.isTrue( - _.includes(Object.getOwnPropertyNames(injector.publicApi), "foo") + _.includes(Object.getOwnPropertyNames(injector.publicApi), "foo"), ); assert.deepStrictEqual(resultFooObject, dataObject); }); diff --git a/lib/common/verify-node-version.ts b/lib/common/verify-node-version.ts index fb64c4a456..fa13e858ba 100644 --- a/lib/common/verify-node-version.ts +++ b/lib/common/verify-node-version.ts @@ -46,14 +46,16 @@ export function verifyNodeVersion(): void { semver.lt(nodeVer, minimumRequiredVersion) ) { console.error( - color.red.bold( - util.format( - "%sNode.js '%s' is not supported. To be able to work with %s CLI, install any Node.js version in the following range: %s.%s", - os.EOL, - nodeVer, - cliName, - supportedVersionsRange, - os.EOL, + color.bold( + color.red( + util.format( + "%sNode.js '%s' is not supported. To be able to work with %s CLI, install any Node.js version in the following range: %s.%s", + os.EOL, + nodeVer, + cliName, + supportedVersionsRange, + os.EOL, + ), ), ), ); diff --git a/lib/common/yok.ts b/lib/common/yok.ts index cfadfaa888..cf06c51445 100644 --- a/lib/common/yok.ts +++ b/lib/common/yok.ts @@ -70,7 +70,7 @@ export class Yok implements IInjector { public requireCommand(names: any, file: string): void { forEachName(names, (commandName) => { const commands = commandName.split( - CommandsDelimiters.HierarchicalCommand + CommandsDelimiters.HierarchicalCommand, ); if (commands.length > 1) { @@ -79,7 +79,7 @@ export class Yok implements IInjector { this.modules[this.createCommandName(commands[0])] ) { throw new Error( - "Default commands should be required before child commands" + "Default commands should be required before child commands", ); } @@ -90,7 +90,7 @@ export class Yok implements IInjector { } this.hierarchicalCommands[parentCommandName].push( - _.tail(commands).join(CommandsDelimiters.HierarchicalCommand) + _.tail(commands).join(CommandsDelimiters.HierarchicalCommand), ); } @@ -164,7 +164,7 @@ export class Yok implements IInjector { const relativePath = path.join("../", file); const dependency: IDependency = { require: require("fs").existsSync( - path.join(__dirname, relativePath + ".js") + path.join(__dirname, relativePath + ".js"), ) ? relativePath : file, @@ -197,8 +197,8 @@ export class Yok implements IInjector { const subCommands = this.hierarchicalCommands[name]; const defaultCommand = _.find(subCommands, (command) => _.some(command.split(CommandsDelimiters.HierarchicalCommand), (c) => - _.startsWith(c, CommandsDelimiters.DefaultCommandSymbol) - ) + _.startsWith(c, CommandsDelimiters.DefaultCommandSymbol), + ), ); return defaultCommand; @@ -206,7 +206,7 @@ export class Yok implements IInjector { public buildHierarchicalCommand( parentCommandName: string, - commandLineArguments: string[] + commandLineArguments: string[], ): any { let currentSubCommandName: string, finalSubCommandName: string, @@ -226,7 +226,7 @@ export class Yok implements IInjector { (sc) => sc === currentSubCommandName || sc === - `${CommandsDelimiters.DefaultCommandSymbol}${currentSubCommandName}` + `${CommandsDelimiters.DefaultCommandSymbol}${currentSubCommandName}`, )) ) { finalSubCommandName = matchingSubCommandName; @@ -244,8 +244,8 @@ export class Yok implements IInjector { .map((command) => _.startsWith(command, CommandsDelimiters.DefaultCommandSymbol) ? command.substr(1) - : command - ) + : command, + ), ); } @@ -253,7 +253,7 @@ export class Yok implements IInjector { return { commandName: this.getHierarchicalCommandName( parentCommandName, - finalSubCommandName + finalSubCommandName, ), remainingArguments: finalRemainingArguments, }; @@ -274,7 +274,7 @@ export class Yok implements IInjector { if (args.length > 0) { const hierarchicalCommand = this.buildHierarchicalCommand( name, - args + args, ); if (hierarchicalCommand) { commandName = hierarchicalCommand.commandName; @@ -284,11 +284,11 @@ export class Yok implements IInjector { ? this.getHierarchicalCommandName(name, defaultCommand) : "help"; // If we'll execute the default command, but it's full name had been written by the user - // for example "tns run ios", we have to remove the "ios" option from the arguments that we'll pass to the command. + // for example "ns run ios", we have to remove the "ios" option from the arguments that we'll pass to the command. if ( _.includes( this.hierarchicalCommands[name], - CommandsDelimiters.DefaultCommandSymbol + args[0] + CommandsDelimiters.DefaultCommandSymbol + args[0], ) ) { commandArguments = _.tail(args); @@ -301,7 +301,7 @@ export class Yok implements IInjector { if (defaultCommand) { commandName = this.getHierarchicalCommandName( name, - defaultCommand + defaultCommand, ); } else { commandName = "help"; @@ -314,7 +314,7 @@ export class Yok implements IInjector { await commandsService.tryExecuteCommand( commandName, - commandName === "help" ? [name] : commandArguments + commandName === "help" ? [name] : commandArguments, ); }, }; @@ -325,23 +325,23 @@ export class Yok implements IInjector { private getHierarchicalCommandName( parentCommandName: string, - subCommandName: string + subCommandName: string, ) { return [parentCommandName, subCommandName].join( - CommandsDelimiters.HierarchicalCommand + CommandsDelimiters.HierarchicalCommand, ); } public async isValidHierarchicalCommand( commandName: string, - commandArguments: string[] + commandArguments: string[], ): Promise { if (_.includes(Object.keys(this.hierarchicalCommands), commandName)) { const subCommands = this.hierarchicalCommands[commandName]; if (subCommands) { const fullCommandName = this.buildHierarchicalCommand( commandName, - commandArguments + commandArguments, ); if (!fullCommandName) { // In case buildHierarchicalCommand doesn't find a valid command @@ -449,7 +449,7 @@ export class Yok implements IInjector { private resolveConstructor( ctor: any, - ctorArguments?: { [key: string]: any } + ctorArguments?: { [key: string]: any }, ): any { annotate(ctor); @@ -530,10 +530,10 @@ export class Yok implements IInjector { public getRegisteredCommandsNames(includeDev: boolean): string[] { const modulesNames: string[] = _.keys(this.modules); const commandsNames: string[] = _.filter(modulesNames, (moduleName) => - _.startsWith(moduleName, `${this.COMMANDS_NAMESPACE}.`) + _.startsWith(moduleName, `${this.COMMANDS_NAMESPACE}.`), ); let commands = _.map(commandsNames, (commandName: string) => - commandName.substr(this.COMMANDS_NAMESPACE.length + 1) + commandName.substr(this.COMMANDS_NAMESPACE.length + 1), ); if (!includeDev) { commands = _.reject(commands, (command) => _.startsWith(command, "dev-")); @@ -544,10 +544,10 @@ export class Yok implements IInjector { public getRegisteredKeyCommandsNames(): string[] { const modulesNames: string[] = _.keys(this.modules); const commandsNames: string[] = _.filter(modulesNames, (moduleName) => - _.startsWith(moduleName, `${this.KEY_COMMANDS_NAMESPACE}.`) + _.startsWith(moduleName, `${this.KEY_COMMANDS_NAMESPACE}.`), ); let commands = _.map(commandsNames, (commandName: string) => - commandName.substr(this.KEY_COMMANDS_NAMESPACE.length + 1) + commandName.substr(this.KEY_COMMANDS_NAMESPACE.length + 1), ); return commands; } diff --git a/lib/constants.ts b/lib/constants.ts index 0ac436ec77..c76d6f6696 100644 --- a/lib/constants.ts +++ b/lib/constants.ts @@ -16,6 +16,7 @@ export const SCOPED_TNS_CORE_MODULES = "@nativescript/core"; export const TNS_CORE_THEME_NAME = "nativescript-theme-core"; export const SCOPED_TNS_CORE_THEME_NAME = "@nativescript/theme"; export const WEBPACK_PLUGIN_NAME = "@nativescript/webpack"; +export const RSPACK_PLUGIN_NAME = "@nativescript/rspack"; export const TNS_CORE_MODULES_WIDGETS_NAME = "tns-core-modules-widgets"; export const UI_MOBILE_BASE_NAME = "@nativescript/ui-mobile-base"; export const TNS_ANDROID_RUNTIME_NAME = "tns-android"; @@ -36,6 +37,7 @@ export const XML_FILE_EXTENSION = ".xml"; export const PLATFORMS_DIR_NAME = "platforms"; export const HOOKS_DIR_NAME = "hooks"; export const WEBPACK_CONFIG_NAME = "webpack.config.js"; +export const RSPACK_CONFIG_NAME = "rspack.config.js"; export const TSCCONFIG_TNS_JSON_NAME = "tsconfig.tns.json"; export const KARMA_CONFIG_NAME = "karma.conf.js"; export const LIB_DIR_NAME = "lib"; @@ -222,7 +224,7 @@ export const CACACHE_DIRECTORY_NAME = "_cacache"; export const FILES_CHANGE_EVENT_NAME = "filesChangeEvent"; export const INITIAL_SYNC_EVENT_NAME = "initialSyncEvent"; export const PREPARE_READY_EVENT_NAME = "prepareReadyEvent"; -export const WEBPACK_COMPILATION_COMPLETE = "webpackCompilationComplete"; +export const BUNDLER_COMPILATION_COMPLETE = "bundlerCompilationComplete"; export class DebugCommandErrors { public static UNABLE_TO_USE_FOR_DEVICE_AND_EMULATOR = diff --git a/lib/controllers/migrate-controller.ts b/lib/controllers/migrate-controller.ts index d83016803e..3db61d6cd4 100644 --- a/lib/controllers/migrate-controller.ts +++ b/lib/controllers/migrate-controller.ts @@ -40,7 +40,8 @@ import { IInjector } from "../common/definitions/yok"; import { injector } from "../common/yok"; import { IJsonFileSettingsService } from "../common/definitions/json-file-settings-service"; import { SupportedConfigValues } from "../tools/config-manipulation/config-transformer"; -import * as temp from "temp"; +import * as fs from "fs"; +import { tmpdir } from "os"; import { color } from "../color"; import { ITerminalSpinner, @@ -121,7 +122,7 @@ export class MigrateController { packageName: "@nativescript/core", minVersion: "6.5.0", - desiredVersion: "~8.9.0", + desiredVersion: "~9.0.0", shouldAddIfMissing: true, }, { @@ -131,7 +132,7 @@ export class MigrateController { packageName: "@nativescript/types", minVersion: "7.0.0", - desiredVersion: "~8.9.0", + desiredVersion: "~9.0.0", isDev: true, }, { @@ -164,7 +165,7 @@ export class MigrateController { packageName: "nativescript-vue", minVersion: "2.7.0", - desiredVersion: "~2.9.3", + desiredVersion: "~3.0.0", async shouldMigrateAction( dependency: IMigrationDependency, projectData: IProjectData, @@ -190,7 +191,7 @@ export class MigrateController { packageName: "@nativescript/angular", minVersion: "10.0.0", - desiredVersion: "^19.0.0", + desiredVersion: "^20.0.0", async shouldMigrateAction( dependency: IMigrationDependency, projectData: IProjectData, @@ -262,7 +263,7 @@ export class MigrateController packageName: "typescript", isDev: true, minVersion: "3.7.0", - desiredVersion: "~5.7.0", + desiredVersion: "~5.8.0", }, { packageName: "node-sass", @@ -295,13 +296,13 @@ export class MigrateController { packageName: "@nativescript/ios", minVersion: "6.5.3", - desiredVersion: "~8.9.0", + desiredVersion: "~9.0.0", isDev: true, }, { packageName: "@nativescript/android", minVersion: "7.0.0", - desiredVersion: "~8.9.0", + desiredVersion: "~9.0.0", isDev: true, }, ]; @@ -1237,7 +1238,7 @@ export class MigrateController configContents.compilerOptions = configContents.compilerOptions || {}; configContents.compilerOptions.target = "es2020"; configContents.compilerOptions.module = "esnext"; - configContents.compilerOptions.moduleResolution = "node"; + configContents.compilerOptions.moduleResolution = "bundler"; configContents.compilerOptions.experimentalDecorators = true; configContents.compilerOptions.removeComments = false; @@ -1285,9 +1286,9 @@ export class MigrateController return "./" + path.relative(projectDir, polyfillsPath); } - const tempDir = temp.mkdirSync({ - prefix: "migrate-angular-polyfills", - }); + const tempDir = fs.mkdtempSync( + path.join(tmpdir(), "migrate-angular-polyfills-"), + ); // get from default angular template await this.$pacoteService.extractPackage( @@ -1310,7 +1311,7 @@ export class MigrateController private async migrateNativeScriptAngular(): Promise { const minVersion = "10.0.0"; - const desiredVersion = "~19.1.0"; + const desiredVersion = "~20.2.0"; const dependencies: IMigrationDependency[] = [ { diff --git a/lib/controllers/prepare-controller.ts b/lib/controllers/prepare-controller.ts index 8ba3550b86..b92ea3bbf8 100644 --- a/lib/controllers/prepare-controller.ts +++ b/lib/controllers/prepare-controller.ts @@ -1,4 +1,4 @@ -import { watch, ChokidarOptions, FSWatcher } from "chokidar"; +import { watch, WatchOptions, FSWatcher } from "chokidar"; import { EventEmitter } from "events"; import * as _ from "lodash"; import * as path from "path"; @@ -13,6 +13,7 @@ import { hook } from "../common/helpers"; import { injector } from "../common/yok"; import { AnalyticsEventLabelDelimiter, + BUNDLER_COMPILATION_COMPLETE, CONFIG_FILE_NAME_JS, CONFIG_FILE_NAME_TS, PACKAGE_JSON_FILE_NAME, @@ -20,7 +21,6 @@ import { PREPARE_READY_EVENT_NAME, SupportedPlatform, TrackActionNames, - WEBPACK_COMPILATION_COMPLETE, } from "../constants"; import { IOptions, IWatchIgnoreListService } from "../declarations"; import { @@ -67,7 +67,7 @@ export class PrepareController extends EventEmitter { private $prepareNativePlatformService: IPrepareNativePlatformService, private $projectChangesService: IProjectChangesService, private $projectDataService: IProjectDataService, - private $webpackCompilerService: IWebpackCompilerService, + private $bundlerCompilerService: IBundlerCompilerService, private $watchIgnoreListService: IWatchIgnoreListService, private $analyticsService: IAnalyticsService, private $markingModeService: IMarkingModeService, @@ -117,9 +117,9 @@ export class PrepareController extends EventEmitter { this.watchersData[projectDir][platformLowerCase] && this.watchersData[projectDir][platformLowerCase].hasWebpackCompilerProcess ) { - await this.$webpackCompilerService.stopWebpackCompiler(platformLowerCase); - this.$webpackCompilerService.removeListener( - WEBPACK_COMPILATION_COMPLETE, + await this.$bundlerCompilerService.stopBundlerCompiler(platformLowerCase); + this.$bundlerCompilerService.removeListener( + BUNDLER_COMPILATION_COMPLETE, this.webpackCompilerHandler, ); this.watchersData[projectDir][ @@ -177,7 +177,7 @@ export class PrepareController extends EventEmitter { prepareData, ); } else { - await this.$webpackCompilerService.compileWithoutWatch( + await this.$bundlerCompilerService.compileWithoutWatch( platformData, projectData, prepareData, @@ -296,15 +296,15 @@ export class PrepareController extends EventEmitter { }; this.webpackCompilerHandler = handler.bind(this); - this.$webpackCompilerService.on( - WEBPACK_COMPILATION_COMPLETE, + this.$bundlerCompilerService.on( + BUNDLER_COMPILATION_COMPLETE, this.webpackCompilerHandler, ); this.watchersData[projectData.projectDir][ platformData.platformNameLowerCase ].hasWebpackCompilerProcess = true; - await this.$webpackCompilerService.compileWithWatch( + await this.$bundlerCompilerService.compileWithWatch( platformData, projectData, prepareData, @@ -353,7 +353,7 @@ export class PrepareController extends EventEmitter { const patterns = await this.getWatcherPatterns(platformData, projectData); - const watcherOptions: ChokidarOptions = { + const watcherOptions: WatchOptions = { ignoreInitial: true, cwd: projectData.projectDir, awaitWriteFinish: { @@ -560,7 +560,7 @@ export class PrepareController extends EventEmitter { if (this.pausedFileWatch) { for (const watcher of watchers) { for (const platform in watcher) { - await this.$webpackCompilerService.stopWebpackCompiler(platform); + await this.$bundlerCompilerService.stopBundlerCompiler(platform); watcher[platform].hasWebpackCompilerProcess = false; } } @@ -569,7 +569,7 @@ export class PrepareController extends EventEmitter { for (const platform in watcher) { const args = watcher[platform].prepareArguments; watcher[platform].hasWebpackCompilerProcess = true; - await this.$webpackCompilerService.compileWithWatch( + await this.$bundlerCompilerService.compileWithWatch( args.platformData, args.projectData, args.prepareData, diff --git a/lib/definitions/hooks.d.ts b/lib/definitions/hooks.d.ts new file mode 100644 index 0000000000..c2c3932fc7 --- /dev/null +++ b/lib/definitions/hooks.d.ts @@ -0,0 +1 @@ +declare module "@nativescript/hook"; diff --git a/lib/definitions/project.d.ts b/lib/definitions/project.d.ts index e99e204691..c8046b2ed4 100644 --- a/lib/definitions/project.d.ts +++ b/lib/definitions/project.d.ts @@ -121,6 +121,7 @@ export interface IOSLocalSPMPackage extends IOSSPMPackageBase { } export type IOSSPMPackage = IOSRemoteSPMPackage | IOSLocalSPMPackage; +export type BundlerType = "webpack" | "rspack" | "vite"; interface INsConfigIOS extends INsConfigPlaform { discardUncaughtJsExceptions?: boolean; @@ -182,6 +183,8 @@ interface INsConfig { shared?: boolean; overridePods?: string; webpackConfigPath?: string; + bundlerConfigPath?: string; + bundler?: BundlerType; ios?: INsConfigIOS; android?: INsConfigAndroid; visionos?: INSConfigVisionOS; @@ -215,13 +218,28 @@ interface IProjectData extends ICreateProjectData { * Value is true when project has nativescript.config and it has `shared: true` in it. */ isShared: boolean; - /** + * Specifies the bundler used to build the application. + * + * - `"webpack"`: Uses Webpack for traditional bundling. + * - `"rspack"`: Uses Rspack for fast bundling. + * - `"vite"`: Uses Vite for fast bundling. + * + * @default "webpack" + */ + bundler: BundlerType; + /** + * @deprecated Use bundlerConfigPath * Defines the path to the configuration file passed to webpack process. * By default this is the webpack.config.js at the root of the application. * The value can be changed by setting `webpackConfigPath` in nativescript.config. */ webpackConfigPath: string; + /** + * Defines the path to the bundler configuration file passed to the compiler. + * The value can be changed by setting `bundlerConfigPath` in nativescript.config. + */ + bundlerConfigPath: string; projectName: string; /** diff --git a/lib/definitions/temp-service.d.ts b/lib/definitions/temp-service.d.ts index ea73b7737c..24038d9ec3 100644 --- a/lib/definitions/temp-service.d.ts +++ b/lib/definitions/temp-service.d.ts @@ -1,9 +1,13 @@ -import { AffixOptions } from "temp"; +export type AffixOptions = { + prefix?: string; + suffix?: string; + dir?: string; +}; /** * Declares wrapped functions of temp module */ -interface ITempService { +export interface ITempService { mkdirSync(affixes: string | AffixOptions): Promise; path(options: string | AffixOptions): Promise; } diff --git a/lib/device-sockets/ios/app-debug-socket-proxy-factory.ts b/lib/device-sockets/ios/app-debug-socket-proxy-factory.ts index 3f83fcbaad..10ddd50209 100644 --- a/lib/device-sockets/ios/app-debug-socket-proxy-factory.ts +++ b/lib/device-sockets/ios/app-debug-socket-proxy-factory.ts @@ -21,14 +21,14 @@ export class AppDebugSocketProxyFactory private $lockService: ILockService, private $options: IOptions, private $tempService: ITempService, - private $net: INet + private $net: INet, ) { super(); } public getTCPSocketProxy( deviceIdentifier: string, - appId: string + appId: string, ): net.Server { return this.deviceTcpServers[`${deviceIdentifier}-${appId}`]; } @@ -37,18 +37,18 @@ export class AppDebugSocketProxyFactory device: Mobile.IiOSDevice, appId: string, projectName: string, - projectDir: string + projectDir: string, ): Promise { const cacheKey = `${device.deviceInfo.identifier}-${appId}`; const existingServer = this.deviceTcpServers[cacheKey]; if (existingServer) { this.$errors.fail( - `TCP socket proxy is already running for device '${device.deviceInfo.identifier}' and app '${appId}'` + `TCP socket proxy is already running for device '${device.deviceInfo.identifier}' and app '${appId}'`, ); } this.$logger.info( - "\nSetting up proxy...\nPress Ctrl + C to terminate, or disconnect.\n" + "\nSetting up proxy...\nPress Ctrl + C to terminate, or disconnect.\n", ); const server = net.createServer({ @@ -69,7 +69,7 @@ export class AppDebugSocketProxyFactory const appDebugSocket = await device.getDebugSocket( appId, projectName, - projectDir + projectDir, ); this.$logger.info("Backend socket created."); @@ -112,7 +112,7 @@ export class AppDebugSocketProxyFactory device: Mobile.IiOSDevice, appId: string, projectName: string, - projectDir: string + projectDir: string, ): Promise { const existingWebProxy = this.deviceWebServers[`${device.deviceInfo.identifier}-${appId}`]; @@ -130,14 +130,14 @@ export class AppDebugSocketProxyFactory device: Mobile.IiOSDevice, appId: string, projectName: string, - projectDir: string + projectDir: string, ): Promise { let clientConnectionLockRelease: () => void; const cacheKey = `${device.deviceInfo.identifier}-${appId}`; const existingServer = this.deviceWebServers[cacheKey]; if (existingServer) { this.$errors.fail( - `Web socket proxy is already running for device '${device.deviceInfo.identifier}' and app '${appId}'` + `Web socket proxy is already running for device '${device.deviceInfo.identifier}' and app '${appId}'`, ); } @@ -145,7 +145,7 @@ export class AppDebugSocketProxyFactory const localPort = await this.$net.getAvailablePortInRange(41000); this.$logger.info( - "\nSetting up debugger proxy...\nPress Ctrl + C to terminate, or disconnect.\n" + "\nSetting up debugger proxy...\nPress Ctrl + C to terminate, or disconnect.\n", ); // NB: When the inspector frontend connects we might not have connected to the inspector backend yet. @@ -159,14 +159,14 @@ export class AppDebugSocketProxyFactory port: localPort, verifyClient: async ( info: any, - callback: (res: boolean, code?: number, message?: string) => void + callback: (res: boolean, code?: number, message?: string) => void, ) => { let acceptHandshake = true; clientConnectionLockRelease = null; try { clientConnectionLockRelease = await this.$lockService.lock( - `debug-connection-${device.deviceInfo.identifier}-${appId}.lock` + `debug-connection-${device.deviceInfo.identifier}-${appId}.lock`, ); this.$logger.info("Frontend client connected."); @@ -184,7 +184,7 @@ export class AppDebugSocketProxyFactory appDebugSocket = await device.getDebugSocket( appId, projectName, - projectDir + projectDir, ); currentAppSocket = appDebugSocket; this.$logger.info("Backend socket created."); @@ -198,7 +198,7 @@ export class AppDebugSocketProxyFactory this.emit(CONNECTION_ERROR_EVENT_NAME, err); acceptHandshake = false; this.$logger.warn( - `Cannot connect to device socket. The error message is '${err.message}'.` + `Cannot connect to device socket. The error message is '${err.message}'.`, ); } @@ -225,7 +225,7 @@ export class AppDebugSocketProxyFactory webSocket.send(message); } else { this.$logger.trace( - `Received message ${message}, but unable to send it to webSocket as its state is: ${webSocket.readyState}` + `Received message ${message}, but unable to send it to webSocket as its state is: ${webSocket.readyState}`, ); } }); diff --git a/lib/helpers/key-command-helper.ts b/lib/helpers/key-command-helper.ts index ecfaabd367..59d9804e8c 100644 --- a/lib/helpers/key-command-helper.ts +++ b/lib/helpers/key-command-helper.ts @@ -1,4 +1,5 @@ -import { color, stripColors } from "../color"; +import { color } from "../color"; +import { stripVTControlCharacters } from "node:util"; import { IKeyCommandHelper, IKeyCommandPlatform, @@ -62,7 +63,7 @@ export default class KeyCommandHelper implements IKeyCommandHelper { const line = ` ${color.dim("→")} ${color.bold(keyCommand.key)} — ${ keyCommand.description }`; - const lineLength = stripColors(line).length - 1; + const lineLength = stripVTControlCharacters(line).length - 1; console.log(color.dim(` ┌${"─".repeat(lineLength)}┐`)); console.log(line + color.dim(" │")); console.log(color.dim(` └${"─".repeat(lineLength)}┘`)); @@ -114,18 +115,18 @@ export default class KeyCommandHelper implements IKeyCommandHelper { [ "", ` The CLI is ${color.underline( - `interactive` + `interactive`, )}, you can press the following keys any time (make sure the terminal has focus).`, "", ...commandHelp, "", - ].join("\n") + ].join("\n"), ); } public attachKeyCommands( platform: IKeyCommandPlatform, - processType: SupportedProcessType + processType: SupportedProcessType, ) { this.processType = processType; this.platform = platform; diff --git a/lib/nativescript-cli.ts b/lib/nativescript-cli.ts index f9932fc1a3..04b2f90fd3 100644 --- a/lib/nativescript-cli.ts +++ b/lib/nativescript-cli.ts @@ -3,6 +3,35 @@ require("./bootstrap"); import * as shelljs from "shelljs"; shelljs.config.silent = true; shelljs.config.fatal = true; + +if (process.platform === "win32") { + // Later versions of shelljs do not process globs with \ path delimiters correctly, for windows change to / + const realcp = shelljs.cp; + (shelljs as any).cp = (...args: unknown[]) => { + if (args.length === 3) { + args[1] = replaceDashes(args[1] as string | string[]); + } else { + args[0] = replaceDashes(args[0] as string | string[]); + } + + if (args.length == 2) { + realcp(args[0] as string[], args[1] as string); + } else { + realcp(args[0] as string, args[1] as string[], args[2] as string); + } + }; + function replaceDashes(values: string | string[]): string | string[] { + if (Array.isArray(values)) { + for (let i = 0; i < values.length; ++i) { + values[i] = replaceDashes(values[i]) as string; + } + return values; + } else { + return values.replace(/\\/g, "/"); + } + } +} + import { installUncaughtExceptionListener } from "./common/errors"; import { settlePromises } from "./common/helpers"; import { injector } from "./common/yok"; @@ -14,7 +43,7 @@ import { import { IInitializeService } from "./definitions/initialize-service"; import { color } from "./color"; installUncaughtExceptionListener( - process.exit.bind(process, ErrorCodes.UNCAUGHT) + process.exit.bind(process, ErrorCodes.UNCAUGHT), ); const logger: ILogger = injector.resolve("logger"); @@ -23,7 +52,7 @@ export const originalProcessOn = process.on.bind(process); process.on = (event: string, listener: any): any => { if (event === "SIGINT") { logger.trace( - `Trying to handle SIGINT event. CLI overrides this behavior and does not allow handling SIGINT as this causes issues with Ctrl + C in terminal.` + `Trying to handle SIGINT event. CLI overrides this behavior and does not allow handling SIGINT as this causes issues with Ctrl + C in terminal.`, ); const msg = "The stackTrace of the location trying to handle SIGINT is"; const stackTrace = new Error(msg).stack || ""; @@ -31,9 +60,9 @@ process.on = (event: string, listener: any): any => { stackTrace.replace( `Error: ${msg}`, `${msg} (${color.yellow( - "note:" - )} this is not an error, just a stack-trace for debugging purposes):` - ) + "note:", + )} this is not an error, just a stack-trace for debugging purposes):`, + ), ); } else { return originalProcessOn(event, listener); @@ -52,13 +81,12 @@ process.on = (event: string, listener: any): any => { const err: IErrors = injector.resolve("$errors"); err.printCallStack = config.DEBUG; - const $initializeService = injector.resolve( - "initializeService" - ); + const $initializeService = + injector.resolve("initializeService"); await $initializeService.initialize(); const extensibilityService: IExtensibilityService = injector.resolve( - "extensibilityService" + "extensibilityService", ); try { await settlePromises(extensibilityService.loadExtensions()); @@ -66,9 +94,8 @@ process.on = (event: string, listener: any): any => { logger.trace("Unable to load extensions. Error is: ", err); } - const commandDispatcher: ICommandDispatcher = injector.resolve( - "commandDispatcher" - ); + const commandDispatcher: ICommandDispatcher = + injector.resolve("commandDispatcher"); // unused... // const messages: IMessagesService = injector.resolve("$messagesService"); diff --git a/lib/node-package-manager.ts b/lib/node-package-manager.ts index 254ff7e5e5..bf63cae523 100644 --- a/lib/node-package-manager.ts +++ b/lib/node-package-manager.ts @@ -47,7 +47,7 @@ export class NodePackageManager extends BasePackageManager { const jsonContentBefore = this.$fs.readJson(packageJsonPath); const flags = this.getFlagsString(config, true); - let params = ["install", "--legacy-peer-deps"]; + let params = ["install"]; const isInstallingAllDependencies = packageName === pathToSave; if (!isInstallingAllDependencies) { params.push(packageName); diff --git a/lib/project-data.ts b/lib/project-data.ts index 3e36c374b5..277dbf32d1 100644 --- a/lib/project-data.ts +++ b/lib/project-data.ts @@ -5,6 +5,7 @@ import { parseJson } from "./common/helpers"; import { EOL } from "os"; import { cache } from "./common/decorators"; import { + BundlerType, INsConfig, IProjectConfigService, IProjectData, @@ -99,6 +100,8 @@ export class ProjectData implements IProjectData { public podfilePath: string; public isShared: boolean; public webpackConfigPath: string; + public bundlerConfigPath: string; + public bundler: BundlerType; public initialized: boolean; constructor( @@ -110,7 +113,7 @@ export class ProjectData implements IProjectData { private $logger: ILogger, private $injector: IInjector, private $androidResourcesMigrationService: IAndroidResourcesMigrationService, - private $devicePlatformsConstants: Mobile.IDevicePlatformsConstants + private $devicePlatformsConstants: Mobile.IDevicePlatformsConstants, ) {} get projectConfig(): IProjectConfigService { @@ -142,7 +145,7 @@ export class ProjectData implements IProjectData { public initializeProjectDataFromContent( packageJsonContent: string, - projectDir?: string + projectDir?: string, ): void { projectDir = projectDir || this.$projectHelper.projectDir || ""; this.projectDir = projectDir; @@ -157,7 +160,7 @@ export class ProjectData implements IProjectData { this.$errors.fail( `The project file ${this.projectFilePath} is corrupted. ${EOL}` + `Consider restoring an earlier version from your source control or backup.${EOL}` + - `Additional technical info: ${err.toString()}` + `Additional technical info: ${err.toString()}`, ); } @@ -178,36 +181,43 @@ export class ProjectData implements IProjectData { this.appDirectoryPath = this.getAppDirectoryPath(); this.appResourcesDirectoryPath = this.getAppResourcesDirectoryPath(); this.androidManifestPath = this.getPathToAndroidManifest( - this.appResourcesDirectoryPath + this.appResourcesDirectoryPath, ); this.gradleFilesDirectoryPath = path.join( this.appResourcesDirectoryPath, - this.$devicePlatformsConstants.Android + this.$devicePlatformsConstants.Android, ); this.appGradlePath = path.join( this.gradleFilesDirectoryPath, - constants.APP_GRADLE_FILE_NAME + constants.APP_GRADLE_FILE_NAME, ); this.infoPlistPath = path.join( this.appResourcesDirectoryPath, this.$devicePlatformsConstants.iOS, - constants.INFO_PLIST_FILE_NAME + constants.INFO_PLIST_FILE_NAME, ); this.buildXcconfigPath = path.join( this.appResourcesDirectoryPath, this.$devicePlatformsConstants.iOS, - constants.BUILD_XCCONFIG_FILE_NAME + constants.BUILD_XCCONFIG_FILE_NAME, ); this.podfilePath = path.join( this.appResourcesDirectoryPath, this.$devicePlatformsConstants.iOS, - constants.PODFILE_NAME + constants.PODFILE_NAME, ); this.isShared = !!(this.nsConfig && this.nsConfig.shared); - this.webpackConfigPath = + + const webpackConfigPath = this.nsConfig && this.nsConfig.webpackConfigPath ? path.resolve(this.projectDir, this.nsConfig.webpackConfigPath) : path.join(this.projectDir, "webpack.config.js"); + this.webpackConfigPath = webpackConfigPath; + this.bundlerConfigPath = + this.nsConfig && this.nsConfig.bundlerConfigPath + ? path.resolve(this.projectDir, this.nsConfig.bundlerConfigPath) + : webpackConfigPath; + this.bundler = this?.nsConfig?.bundler ?? "webpack"; return; } @@ -217,7 +227,7 @@ export class ProjectData implements IProjectData { private getPathToAndroidManifest(appResourcesDir: string): string { const androidDirPath = path.join( appResourcesDir, - this.$devicePlatformsConstants.Android + this.$devicePlatformsConstants.Android, ); const androidManifestDir = this.$androidResourcesMigrationService.hasMigrated(appResourcesDir) @@ -230,13 +240,13 @@ export class ProjectData implements IProjectData { private errorInvalidProject(projectDir: string): void { const currentDir = path.resolve("."); this.$logger.trace( - `Unable to find project. projectDir: ${projectDir}, options.path: ${this.$options.path}, ${currentDir}` + `Unable to find project. projectDir: ${projectDir}, options.path: ${this.$options.path}, ${currentDir}`, ); // This is the case when no project file found this.$errors.fail( "No project found at or above '%s' and neither was a --path specified.", - projectDir || this.$options.path || currentDir + projectDir || this.$options.path || currentDir, ); } @@ -291,7 +301,7 @@ export class ProjectData implements IProjectData { private resolveToProjectDir( pathToResolve: string, - projectDir?: string + projectDir?: string, ): string { if (!projectDir) { projectDir = this.projectDir; @@ -306,7 +316,7 @@ export class ProjectData implements IProjectData { @cache() private initializeProjectIdentifiers( - config: INsConfig + config: INsConfig, ): Mobile.IProjectIdentifier { this.$logger.trace(`Initializing project identifiers. Config: `, config); @@ -341,18 +351,18 @@ export class ProjectData implements IProjectData { private getProjectType(): string { let detectedProjectType = _.find( ProjectData.PROJECT_TYPES, - (projectType) => projectType.isDefaultProjectType + (projectType) => projectType.isDefaultProjectType, ).type; const deps: string[] = _.keys(this.dependencies).concat( - _.keys(this.devDependencies) + _.keys(this.devDependencies), ); _.each(ProjectData.PROJECT_TYPES, (projectType) => { if ( _.some( projectType.requiredDependencies, - (requiredDependency) => deps.indexOf(requiredDependency) !== -1 + (requiredDependency) => deps.indexOf(requiredDependency) !== -1, ) ) { detectedProjectType = projectType.type; @@ -366,7 +376,7 @@ export class ProjectData implements IProjectData { @cache() private warnProjectId(): void { this.$logger.warn( - "[WARNING]: IProjectData.projectId is deprecated. Please use IProjectData.projectIdentifiers[platform]." + "[WARNING]: IProjectData.projectId is deprecated. Please use IProjectData.projectIdentifiers[platform].", ); } } diff --git a/lib/services/analytics-settings-service.ts b/lib/services/analytics-settings-service.ts index 9a73f67ed8..1c44a8ffdf 100644 --- a/lib/services/analytics-settings-service.ts +++ b/lib/services/analytics-settings-service.ts @@ -19,7 +19,7 @@ class AnalyticsSettingsService implements IAnalyticsSettingsService { private $staticConfig: IStaticConfig, private $hostInfo: IHostInfo, private $osInfo: IOsInfo, - private $logger: ILogger + private $logger: ILogger, ) {} public async canDoRequest(): Promise { @@ -33,28 +33,32 @@ class AnalyticsSettingsService implements IAnalyticsSettingsService { @exported("analyticsSettingsService") public getClientId(): Promise { return this.getSettingValueOrDefault( - this.$staticConfig.ANALYTICS_INSTALLATION_ID_SETTING_NAME + this.$staticConfig.ANALYTICS_INSTALLATION_ID_SETTING_NAME, ); } public getClientName(): string { - return "" + color.cyan.bold(this.$staticConfig.CLIENT_NAME_ALIAS); + return ( + "" + + color.styleText(["cyan", "bold"], this.$staticConfig.CLIENT_NAME_ALIAS) + ); } public async getUserSessionsCount(projectName: string): Promise { - const sessionsCountForProject = await this.$userSettingsService.getSettingValue< - number - >(this.getSessionsProjectKey(projectName)); + const sessionsCountForProject = + await this.$userSettingsService.getSettingValue( + this.getSessionsProjectKey(projectName), + ); return sessionsCountForProject || 0; } public async setUserSessionsCount( count: number, - projectName: string + projectName: string, ): Promise { return this.$userSettingsService.saveSetting( this.getSessionsProjectKey(projectName), - count + count, ); } @@ -97,9 +101,8 @@ class AnalyticsSettingsService implements IAnalyticsSettingsService { } private async getSettingValueOrDefault(settingName: string): Promise { - let guid = await this.$userSettingsService.getSettingValue( - settingName - ); + let guid = + await this.$userSettingsService.getSettingValue(settingName); if (!guid) { guid = createGUID(false); diff --git a/lib/services/analytics/analytics-broker-process.ts b/lib/services/analytics/analytics-broker-process.ts index d7fd77ff27..24e202ac46 100644 --- a/lib/services/analytics/analytics-broker-process.ts +++ b/lib/services/analytics/analytics-broker-process.ts @@ -19,7 +19,7 @@ require(pathToBootstrap); const analyticsLoggingService = injector.resolve( FileLogService, - { logFile } + { logFile }, ); analyticsLoggingService.logData({ message: "Initializing AnalyticsBroker." }); @@ -32,7 +32,7 @@ let trackingQueue: Promise = Promise.resolve(); const sendDataForTracking = async (data: ITrackingInformation) => { trackingQueue = trackingQueue.then(() => - analyticsBroker.sendDataForTracking(data) + analyticsBroker.sendDataForTracking(data), ); await trackingQueue; }; @@ -55,7 +55,7 @@ const killCurrentProcessGracefully = () => { process.on("message", async (data: ITrackingInformation) => { analyticsLoggingService.logData({ message: `analytics-broker-process received message of type: ${JSON.stringify( - data + data, )}`, }); @@ -66,12 +66,17 @@ process.on("message", async (data: ITrackingInformation) => { analyticsLoggingService.logData({ message: `analytics-broker-process will send ${DetachedProcessMessages.ProcessFinishedTasks} message`, }); - process.send(DetachedProcessMessages.ProcessFinishedTasks, () => { - analyticsLoggingService.logData({ - message: `analytics-broker-process sent ${DetachedProcessMessages.ProcessFinishedTasks} message and will exit gracefully now`, - }); - killCurrentProcessGracefully(); - }); + process.send( + DetachedProcessMessages.ProcessFinishedTasks, + null, + null, + () => { + analyticsLoggingService.logData({ + message: `analytics-broker-process sent ${DetachedProcessMessages.ProcessFinishedTasks} message and will exit gracefully now`, + }); + killCurrentProcessGracefully(); + }, + ); } return; diff --git a/lib/services/assets-generation/assets-generation-service.ts b/lib/services/assets-generation/assets-generation-service.ts index 6f669d5bf4..fb37845e51 100644 --- a/lib/services/assets-generation/assets-generation-service.ts +++ b/lib/services/assets-generation/assets-generation-service.ts @@ -1,4 +1,4 @@ -import { Jimp, cssColorToHex, rgbaToInt, JimpInstance } from "jimp"; +import JimpModule = require("jimp"); import * as Color from "color"; import { exported } from "../../common/decorators"; import { AssetConstants } from "../../constants"; @@ -113,7 +113,7 @@ export class AssetsGenerationService implements IAssetsGenerationService { assetItem.data?.default ?? "white"; - const colorHEX: number = cssColorToHex(color); + const colorHEX: number = JimpModule.cssColorToHex(color); const hex = colorHEX?.toString(16).substring(0, 6) ?? "FFFFFF"; this.$fs.writeFile( @@ -164,7 +164,8 @@ export class AssetsGenerationService implements IAssetsGenerationService { continue; } - let image: JimpInstance; + let image: JimpModule.JimpInstance; + switch (operation) { case Operations.OverlayWith: const overlayImageScale = @@ -178,16 +179,10 @@ export class AssetsGenerationService implements IAssetsGenerationService { imageResize, imageResize, ); - image = this.generateImage( - background, - width, - height, - outputPath, - image, - ); + image = this.generateImage(background, width, height, image); break; case Operations.Blank: - image = this.generateImage(background, width, height, outputPath); + image = this.generateImage(background, width, height); break; case Operations.Resize: image = await this.resize(generationData.imagePath, width, height); @@ -200,13 +195,7 @@ export class AssetsGenerationService implements IAssetsGenerationService { assetItem.height, ); // The scale will apply to the underlying layer of the generated image - image = this.generateImage( - "#00000000", - width, - height, - outputPath, - image, - ); + image = this.generateImage("#00000000", width, height, image); break; default: throw new Error(`Invalid image generation operation: ${operation}`); @@ -214,16 +203,17 @@ export class AssetsGenerationService implements IAssetsGenerationService { // This code disables the alpha chanel, as some images for the Apple App Store must not have transparency. if (assetItem.rgba === false) { - // - // The original code here became broken at some time and there is an issue posted here.. - // https://github.com/oliver-moran/jimp/issues/954 - // But NathanaelA recommended the below change and it works so maybe that's just what we go with. - // - // image = image.rgba(false); - image = (image as any).colorType(2); + // Add an underlying white layer + image = this.generateImage("#FFFFFF", image.width, image.height, image); } - image.write(outputPath as any); + if (this.isAssetFilePath(outputPath)) { + image.write(outputPath); + } else { + this.$logger.warn( + `Incorrect destination path ${outputPath} for image ${assetItem.filename}`, + ); + } } } @@ -231,29 +221,30 @@ export class AssetsGenerationService implements IAssetsGenerationService { imagePath: string, width: number, height: number, - ): Promise { - const image = await Jimp.read(imagePath); + ): Promise { + const image = await JimpModule.Jimp.read(imagePath); return image.scaleToFit({ w: width, h: height, - }) as any; + }) as JimpModule.JimpInstance; } private generateImage( background: string, width: number, height: number, - outputPath: string, - overlayImage?: JimpInstance, - ): JimpInstance { - // Typescript declarations for Jimp are not updated to define the constructor with backgroundColor so we workaround it by casting it to for this case only. - const J = Jimp; + overlayImage?: JimpModule.JimpInstance, + ): JimpModule.JimpInstance { const backgroundColor = this.getRgbaNumber(background); - let image = new J(width, height, backgroundColor); + let image = new JimpModule.Jimp({ + width, + height, + color: backgroundColor, + }); if (overlayImage) { - const centeredWidth = (width - overlayImage.bitmap.width) / 2; - const centeredHeight = (height - overlayImage.bitmap.height) / 2; + const centeredWidth = (width - overlayImage.width) / 2; + const centeredHeight = (height - overlayImage.height) / 2; image = image.composite(overlayImage, centeredWidth, centeredHeight); } @@ -265,7 +256,21 @@ export class AssetsGenerationService implements IAssetsGenerationService { const colorRgb = color.rgb(); const alpha = Math.round(colorRgb.alpha() * 255); - return rgbaToInt(colorRgb.red(), colorRgb.green(), colorRgb.blue(), alpha); + return JimpModule.rgbaToInt( + colorRgb.red(), + colorRgb.green(), + colorRgb.blue(), + alpha, + ); + } + + private isAssetFilePath(path: string): path is `${string}.${string}` { + if (!path) { + return false; + } + + const index = path.lastIndexOf("."); + return index > -1 && index < path.length - 1; } } diff --git a/lib/services/webpack/webpack-compiler-service.ts b/lib/services/bundler/bundler-compiler-service.ts similarity index 52% rename from lib/services/webpack/webpack-compiler-service.ts rename to lib/services/bundler/bundler-compiler-service.ts index 323899793a..3eb880b2ba 100644 --- a/lib/services/webpack/webpack-compiler-service.ts +++ b/lib/services/bundler/bundler-compiler-service.ts @@ -5,8 +5,8 @@ import * as _ from "lodash"; import { EventEmitter } from "events"; import { performanceLog } from "../../common/decorators"; import { - WEBPACK_COMPILATION_COMPLETE, WEBPACK_PLUGIN_NAME, + BUNDLER_COMPILATION_COMPLETE, PackageManagers, CONFIG_FILE_NAME_DISPLAY, } from "../../constants"; @@ -16,7 +16,11 @@ import { IOptions, } from "../../declarations"; import { IPlatformData } from "../../definitions/platform"; -import { IProjectData } from "../../definitions/project"; +import { + BundlerType, + IProjectConfigService, + IProjectData, +} from "../../definitions/project"; import { IDictionary, IErrors, @@ -34,23 +38,26 @@ import { } from "../../helpers/package-path-helper"; // todo: move out of here -interface IWebpackMessage { +interface IBundlerMessage { type: "compilation" | "hmr-status"; version?: number; hash?: string; data?: T; } -interface IWebpackCompilation { +interface IBundlerCompilation { emittedAssets: string[]; staleAssets: string[]; } -export class WebpackCompilerService +/* for specific bundling debugging separate from logger */ +const debugLog = false; + +export class BundlerCompilerService extends EventEmitter - implements IWebpackCompilerService + implements IBundlerCompilerService { - private webpackProcesses: IDictionary = {}; + private bundlerProcesses: IDictionary = {}; private expectedHashes: IStringDictionary = {}; constructor( @@ -64,7 +71,8 @@ export class WebpackCompilerService private $mobileHelper: Mobile.IMobileHelper, private $cleanupService: ICleanupService, private $packageManager: IPackageManager, - private $packageInstallationManager: IPackageInstallationManager // private $sharedEventBus: ISharedEventBus + private $packageInstallationManager: IPackageInstallationManager, // private $sharedEventBus: ISharedEventBus + private $projectConfigService: IProjectConfigService, ) { super(); } @@ -72,23 +80,26 @@ export class WebpackCompilerService public async compileWithWatch( platformData: IPlatformData, projectData: IProjectData, - prepareData: IPrepareData + prepareData: IPrepareData, ): Promise { return new Promise(async (resolve, reject) => { - if (this.webpackProcesses[platformData.platformNameLowerCase]) { + if (this.bundlerProcesses[platformData.platformNameLowerCase]) { resolve(void 0); return; } - let isFirstWebpackWatchCompilation = true; + let isFirstBundlerWatchCompilation = true; prepareData.watch = true; try { - const childProcess = await this.startWebpackProcess( + const childProcess = await this.startBundleProcess( platformData, projectData, - prepareData + prepareData, ); + // Handle Vite differently from webpack + const isVite = this.getBundler() === "vite"; + childProcess.stdout.on("data", function (data) { process.stdout.write(data); }); @@ -97,8 +108,103 @@ export class WebpackCompilerService process.stderr.write(data); }); - childProcess.on("message", (message: string | IWebpackEmitMessage) => { - this.$logger.trace("Message from webpack", message); + // For both Vite and webpack, we wait for the first build to complete + // Don't resolve immediately for Vite - wait for first IPC message + + childProcess.on("message", (message: string | IBundlerEmitMessage) => { + this.$logger.trace(`Message from ${projectData.bundler}`, message); + + // Handle Vite messages + if ( + isVite && + message && + (message as IBundlerEmitMessage).emittedFiles + ) { + message = message as IBundlerEmitMessage; + if (debugLog) { + console.log("Received Vite IPC message:", message); + } + + // Copy Vite output files directly to platform destination + const distOutput = path.join( + projectData.projectDir, + ".ns-vite-build", + ); + const destDir = path.join( + platformData.appDestinationDirectoryPath, + this.$options.hostProjectModuleName, + ); + + if (debugLog) { + console.log(`Copying from ${distOutput} to ${destDir}.`); + } + + // Determine which files to copy based on build type and changes + if ( + message.buildType === "incremental" && + message.emittedFiles && + message.emittedFiles.length > 0 + ) { + // Incremental builds: only copy files that are likely affected by the changes + const filesToCopy = this.getIncrementalFilesToCopy( + message.emittedFiles, + ); + if (debugLog) { + console.log("Incremental build - files to copy:", filesToCopy); + } + + this.copyViteBundleToNative(distOutput, destDir, filesToCopy); + } else { + if (debugLog) { + console.log("Full build - copying all files."); + } + this.copyViteBundleToNative(distOutput, destDir); + } + + // Resolve the promise on first build completion + if (isFirstBundlerWatchCompilation) { + isFirstBundlerWatchCompilation = false; + if (debugLog) { + console.log( + "Vite first build completed, resolving compileWithWatch", + ); + } + resolve(childProcess); + } + + // Transform Vite message to match webpack format + const files = (message as IBundlerEmitMessage).emittedFiles.map( + (file) => + path.join( + platformData.appDestinationDirectoryPath, + this.$options.hostProjectModuleName, + file, + ), + ); + + const data = { + files, + hasOnlyHotUpdateFiles: message.isHMR || false, + hmrData: { + hash: (message as IBundlerEmitMessage).hash || "", + fallbackFiles: [] as string[], + }, + platform: platformData.platformNameLowerCase, + }; + + this.$logger.info( + `Vite build completed! Files copied to native platform.`, + ); + + if (debugLog) { + console.log( + "Emitting BUNDLER_COMPILATION_COMPLETE for full build.", + ); + } + this.emit(BUNDLER_COMPILATION_COMPLETE, data); + + return; + } // if we are on webpack5 - we handle HMR in a slightly different way if ( @@ -108,8 +214,8 @@ export class WebpackCompilerService ) { // first compilation can be ignored because it will be synced regardless // handling it here would trigger 2 syncs - if (isFirstWebpackWatchCompilation) { - isFirstWebpackWatchCompilation = false; + if (isFirstBundlerWatchCompilation) { + isFirstBundlerWatchCompilation = false; resolve(childProcess); return; } @@ -122,22 +228,27 @@ export class WebpackCompilerService // } return this.handleHMRMessage( - message as IWebpackMessage, + message as IBundlerMessage, platformData, projectData, - prepareData + prepareData, ); } - if (message === "Webpack compilation complete.") { - this.$logger.info("Webpack build done!"); + if ( + message === + `${capitalizeFirstLetter(projectData.bundler)} compilation complete.` + ) { + this.$logger.info( + `${capitalizeFirstLetter(projectData.bundler)} build done!`, + ); resolve(childProcess); } - message = message as IWebpackEmitMessage; + message = message as IBundlerEmitMessage; if (message.emittedFiles) { - if (isFirstWebpackWatchCompilation) { - isFirstWebpackWatchCompilation = false; + if (isFirstBundlerWatchCompilation) { + isFirstBundlerWatchCompilation = false; this.expectedHashes[platformData.platformNameLowerCase] = prepareData.hmr ? message.hash : ""; return; @@ -153,7 +264,7 @@ export class WebpackCompilerService message.emittedFiles, message.chunkFiles, message.hash, - platformData.platformNameLowerCase + platformData.platformNameLowerCase, ); } else { result = { @@ -166,21 +277,21 @@ export class WebpackCompilerService path.join( platformData.appDestinationDirectoryPath, this.$options.hostProjectModuleName, - file - ) + file, + ), ); const fallbackFiles = result.fallbackFiles.map((file: string) => path.join( platformData.appDestinationDirectoryPath, this.$options.hostProjectModuleName, - file - ) + file, + ), ); const data = { files, hasOnlyHotUpdateFiles: files.every( - (f) => f.indexOf("hot-update") > -1 + (f) => f.indexOf("hot-update") > -1, ), hmrData: { hash: result.hash, @@ -189,7 +300,10 @@ export class WebpackCompilerService platform: platformData.platformNameLowerCase, }; - this.$logger.trace("Generated data from webpack message:", data); + this.$logger.trace( + `Generated data from ${projectData.bundler} message:`, + data, + ); // the hash of the compilation is the same as the previous one and there are only hot updates produced if (data.hasOnlyHotUpdateFiles && previousHash === message.hash) { @@ -197,33 +311,33 @@ export class WebpackCompilerService } if (data.files.length) { - this.emit(WEBPACK_COMPILATION_COMPLETE, data); + this.emit(BUNDLER_COMPILATION_COMPLETE, data); } } }); childProcess.on("error", (err) => { this.$logger.trace( - `Unable to start webpack process in watch mode. Error is: ${err}` + `Unable to start ${projectData.bundler} process in watch mode. Error is: ${err}`, ); - delete this.webpackProcesses[platformData.platformNameLowerCase]; + delete this.bundlerProcesses[platformData.platformNameLowerCase]; reject(err); }); childProcess.on("close", async (arg: any) => { - await this.$cleanupService.removeKillProcess( - childProcess.pid.toString() - ); - const exitCode = typeof arg === "number" ? arg : arg && arg.code; this.$logger.trace( - `Webpack process exited with code ${exitCode} when we expected it to be long living with watch.` + `${capitalizeFirstLetter(projectData.bundler)} process exited with code ${exitCode} when we expected it to be long living with watch.`, + ); + + await this.$cleanupService.removeKillProcess( + childProcess.pid.toString(), ); const error: any = new Error( - `Executing webpack failed with exit code ${exitCode}.` + `Executing ${projectData.bundler} failed with exit code ${exitCode}.`, ); error.code = exitCode; - delete this.webpackProcesses[platformData.platformNameLowerCase]; + delete this.bundlerProcesses[platformData.platformNameLowerCase]; reject(error); }); } catch (err) { @@ -235,41 +349,41 @@ export class WebpackCompilerService public async compileWithoutWatch( platformData: IPlatformData, projectData: IProjectData, - prepareData: IPrepareData + prepareData: IPrepareData, ): Promise { return new Promise(async (resolve, reject) => { - if (this.webpackProcesses[platformData.platformNameLowerCase]) { + if (this.bundlerProcesses[platformData.platformNameLowerCase]) { resolve(); return; } try { - const childProcess = await this.startWebpackProcess( + const childProcess = await this.startBundleProcess( platformData, projectData, - prepareData + prepareData, ); childProcess.on("error", (err) => { this.$logger.trace( - `Unable to start webpack process in non-watch mode. Error is: ${err}` + `Unable to start ${projectData.bundler} process in non-watch mode. Error is: ${err}`, ); - delete this.webpackProcesses[platformData.platformNameLowerCase]; + delete this.bundlerProcesses[platformData.platformNameLowerCase]; reject(err); }); childProcess.on("close", async (arg: any) => { await this.$cleanupService.removeKillProcess( - childProcess.pid.toString() + childProcess.pid.toString(), ); - delete this.webpackProcesses[platformData.platformNameLowerCase]; + delete this.bundlerProcesses[platformData.platformNameLowerCase]; const exitCode = typeof arg === "number" ? arg : arg && arg.code; if (exitCode === 0) { resolve(); } else { const error: any = new Error( - `Executing webpack failed with exit code ${exitCode}.` + `Executing ${projectData.bundler} failed with exit code ${exitCode}.`, ); error.code = exitCode; reject(error); @@ -281,14 +395,14 @@ export class WebpackCompilerService }); } - public async stopWebpackCompiler(platform: string): Promise { + public async stopBundlerCompiler(platform: string): Promise { if (platform) { - await this.stopWebpackForPlatform(platform); + await this.stopBundlerForPlatform(platform); } else { - const webpackedPlatforms = Object.keys(this.webpackProcesses); + const bundlerPlatforms = Object.keys(this.bundlerProcesses); - for (let i = 0; i < webpackedPlatforms.length; i++) { - await this.stopWebpackForPlatform(webpackedPlatforms[i]); + for (let i = 0; i < bundlerPlatforms.length; i++) { + await this.stopBundlerForPlatform(bundlerPlatforms[i]); } } } @@ -304,28 +418,46 @@ export class WebpackCompilerService } @performanceLog() - private async startWebpackProcess( + private async startBundleProcess( platformData: IPlatformData, projectData: IProjectData, - prepareData: IPrepareData + prepareData: IPrepareData, ): Promise { - if (!this.$fs.exists(projectData.webpackConfigPath)) { - this.$errors.fail( - `The webpack configuration file ${projectData.webpackConfigPath} does not exist. Ensure the file exists, or update the path in ${CONFIG_FILE_NAME_DISPLAY}.` - ); + if (projectData.bundlerConfigPath) { + if (!this.$fs.exists(projectData.bundlerConfigPath)) { + this.$errors.fail( + `The bundler configuration file ${projectData.bundlerConfigPath} does not exist. Ensure the file exists, or update the path in ${CONFIG_FILE_NAME_DISPLAY}.`, + ); + } + } else { + if (!this.$fs.exists(projectData.bundlerConfigPath)) { + this.$errors.fail( + `The ${projectData.bundler} configuration file ${projectData.bundlerConfigPath} does not exist. Ensure the file exists, or update the path in ${CONFIG_FILE_NAME_DISPLAY}.`, + ); + } } const envData = this.buildEnvData( platformData.platformNameLowerCase, projectData, - prepareData + prepareData, ); - const envParams = await this.buildEnvCommandLineParams( + const isVite = this.getBundler() === "vite"; + const cliArgs = await this.buildEnvCommandLineParams( envData, platformData, projectData, - prepareData + prepareData, ); + // Note: With Vite, we need `--` to prevent vite cli from erroring on unknown options. + const envParams = isVite + ? [ + `--mode=${prepareData.release ? "production" : "development"}`, + ...(prepareData.watch ? [`--watch`] : []), + "--", + ...cliArgs, + ] + : cliArgs; const additionalNodeArgs = semver.major(process.version) <= 8 ? ["--harmony"] : []; @@ -339,14 +471,16 @@ export class WebpackCompilerService const args = [ ...additionalNodeArgs, - this.getWebpackExecutablePath(projectData), - this.isWebpack5(projectData) ? `build` : null, - `--config=${projectData.webpackConfigPath}`, + this.getBundlerExecutablePath(projectData), + isVite || this.isModernBundler(projectData) ? "build" : null, + `--config=${projectData.bundlerConfigPath}`, ...envParams, ].filter(Boolean); - if (prepareData.watch) { - args.push("--watch"); + if (!isVite) { + if (prepareData.watch) { + args.push("--watch"); + } } const stdio = prepareData.watch ? ["ipc"] : "inherit"; @@ -355,7 +489,9 @@ export class WebpackCompilerService stdio, }; options.env = { + ...process.env, NATIVESCRIPT_WEBPACK_ENV: JSON.stringify(envData), + NATIVESCRIPT_BUNDLER_ENV: JSON.stringify(envData), }; if (this.$hostInfo.isWindows) { Object.assign(options.env, { APPDATA: process.env.appData }); @@ -369,13 +505,17 @@ export class WebpackCompilerService }); } + if (debugLog) { + console.log("args:", args); + } + const childProcess = this.$childProcess.spawn( process.execPath, args, - options + options, ); - this.webpackProcesses[platformData.platformNameLowerCase] = childProcess; + this.bundlerProcesses[platformData.platformNameLowerCase] = childProcess; await this.$cleanupService.addKillProcess(childProcess.pid.toString()); return childProcess; @@ -384,7 +524,7 @@ export class WebpackCompilerService private buildEnvData( platform: string, projectData: IProjectData, - prepareData: IPrepareData + prepareData: IPrepareData, ) { const { env } = prepareData; const envData = Object.assign({}, env, { [platform.toLowerCase()]: true }); @@ -403,9 +543,9 @@ export class WebpackCompilerService __dirname, "..", "..", - "nativescript-cli-lib.js" + "nativescript-cli-lib.js", ), - } + }, ); envData.verbose = envData.verbose || this.$logger.isVerbose(); @@ -452,7 +592,7 @@ export class WebpackCompilerService envData: any, platformData: IPlatformData, projectData: IProjectData, - prepareData: IPrepareData + prepareData: IPrepareData, ) { const envFlagNames = Object.keys(envData); const canSnapshot = @@ -462,27 +602,30 @@ export class WebpackCompilerService if (!canSnapshot) { this.$logger.warn( "Stripping the snapshot flag. " + - "Bear in mind that snapshot is only available in Android release builds." + "Bear in mind that snapshot is only available in Android release builds.", ); envFlagNames.splice(envFlagNames.indexOf("snapshot"), 1); } else if (this.$hostInfo.isWindows) { - const minWebpackPluginWithWinSnapshotsVersion = "1.3.0"; - const installedWebpackPluginVersion = - await this.$packageInstallationManager.getInstalledDependencyVersion( - WEBPACK_PLUGIN_NAME, - projectData.projectDir - ); - const hasWebpackPluginWithWinSnapshotsSupport = - !!installedWebpackPluginVersion - ? semver.gte( - semver.coerce(installedWebpackPluginVersion), - minWebpackPluginWithWinSnapshotsVersion - ) - : true; - if (!hasWebpackPluginWithWinSnapshotsSupport) { - this.$errors.fail( - `In order to generate Snapshots on Windows, please upgrade your Webpack plugin version (npm i ${WEBPACK_PLUGIN_NAME}@latest).` - ); + if (projectData.bundler === "webpack") { + //TODO: check this use case for webpack5 WEBPACK_PLUGIN_NAME + const minWebpackPluginWithWinSnapshotsVersion = "1.3.0"; + const installedWebpackPluginVersion = + await this.$packageInstallationManager.getInstalledDependencyVersion( + WEBPACK_PLUGIN_NAME, + projectData.projectDir, + ); + const hasWebpackPluginWithWinSnapshotsSupport = + !!installedWebpackPluginVersion + ? semver.gte( + semver.coerce(installedWebpackPluginVersion), + minWebpackPluginWithWinSnapshotsVersion, + ) + : true; + if (!hasWebpackPluginWithWinSnapshotsSupport) { + this.$errors.fail( + `In order to generate Snapshots on Windows, please upgrade your Webpack plugin version (npm i ${WEBPACK_PLUGIN_NAME}@latest).`, + ); + } } } } @@ -513,7 +656,7 @@ export class WebpackCompilerService allEmittedFiles: string[], chunkFiles: string[], nextHash: string, - platform: string + platform: string, ) { const currentHash = this.getCurrentHotUpdateHash(allEmittedFiles); @@ -535,7 +678,7 @@ export class WebpackCompilerService ? _.difference(allEmittedFiles, chunkFiles) : allEmittedFiles; const fallbackFiles = chunkFiles.concat( - emittedHotUpdatesAndAssets.filter((f) => f.indexOf("hot-update") === -1) + emittedHotUpdatesAndAssets.filter((f) => f.indexOf("hot-update") === -1), ); return { @@ -548,7 +691,7 @@ export class WebpackCompilerService private getCurrentHotUpdateHash(emittedFiles: string[]) { let hotHash; const hotUpdateScripts = emittedFiles.filter((x) => - x.endsWith(".hot-update.js") + x.endsWith(".hot-update.js"), ); if (hotUpdateScripts && hotUpdateScripts.length) { // the hash is the same for each hot update in the current compilation @@ -561,50 +704,57 @@ export class WebpackCompilerService return hotHash || ""; } - private async stopWebpackForPlatform(platform: string) { - this.$logger.trace(`Stopping webpack watch for platform ${platform}.`); - const webpackProcess = this.webpackProcesses[platform]; - await this.$cleanupService.removeKillProcess(webpackProcess.pid.toString()); - if (webpackProcess) { - webpackProcess.kill("SIGINT"); - delete this.webpackProcesses[platform]; + private async stopBundlerForPlatform(platform: string) { + this.$logger.trace( + `Stopping ${this.getBundler()} watch for platform ${platform}.`, + ); + const bundlerProcess = this.bundlerProcesses[platform]; + await this.$cleanupService.removeKillProcess(bundlerProcess.pid.toString()); + if (bundlerProcess) { + bundlerProcess.kill("SIGINT"); + delete this.bundlerProcesses[platform]; } } private handleHMRMessage( - message: IWebpackMessage, + message: IBundlerMessage, platformData: IPlatformData, projectData: IProjectData, - prepareData: IPrepareData + prepareData: IPrepareData, ) { - // handle new webpack hmr packets - this.$logger.trace("Received message from webpack process:", message); + // handle new bundler hmr packets + this.$logger.trace( + `Received message from ${projectData.bundler} process:`, + message, + ); if (message.type !== "compilation") { return; } - this.$logger.trace("Webpack build done!"); + this.$logger.trace( + `${capitalizeFirstLetter(projectData.bundler)} build done!`, + ); const files = message.data.emittedAssets.map((asset: string) => path.join( platformData.appDestinationDirectoryPath, this.$options.hostProjectModuleName, - asset - ) + asset, + ), ); const staleFiles = message.data.staleAssets.map((asset: string) => path.join( platformData.appDestinationDirectoryPath, this.$options.hostProjectModuleName, - asset - ) + asset, + ), ); // extract last hash from emitted filenames const lastHash = (() => { const absoluteFileNameWithLastHash = files.find((fileName: string) => - fileName.endsWith("hot-update.js") + fileName.endsWith("hot-update.js"), ); if (!absoluteFileNameWithLastHash) { @@ -623,7 +773,7 @@ export class WebpackCompilerService return; } - this.emit(WEBPACK_COMPILATION_COMPLETE, { + this.emit(BUNDLER_COMPILATION_COMPLETE, { files, staleFiles, hasOnlyHotUpdateFiles: prepareData.hmr, @@ -635,9 +785,19 @@ export class WebpackCompilerService }); } - private getWebpackExecutablePath(projectData: IProjectData): string { - if (this.isWebpack5(projectData)) { - const packagePath = resolvePackagePath("@nativescript/webpack", { + private getBundlerExecutablePath(projectData: IProjectData): string { + const bundler = this.getBundler(); + + if (bundler === "vite") { + const packagePath = resolvePackagePath(`vite`, { + paths: [projectData.projectDir], + }); + + if (packagePath) { + return path.resolve(packagePath, "bin", "vite.js"); + } + } else if (this.isModernBundler(projectData)) { + const packagePath = resolvePackagePath(`@nativescript/${bundler}`, { paths: [projectData.projectDir], }); @@ -657,22 +817,150 @@ export class WebpackCompilerService return path.resolve(packagePath, "bin", "webpack.js"); } - private isWebpack5(projectData: IProjectData): boolean { - const packageJSONPath = resolvePackageJSONPath("@nativescript/webpack", { - paths: [projectData.projectDir], - }); + private isModernBundler(projectData: IProjectData): boolean { + const bundler = this.getBundler(); + switch (bundler) { + case "rspack": + return true; + default: + const packageJSONPath = resolvePackageJSONPath(WEBPACK_PLUGIN_NAME, { + paths: [projectData.projectDir], + }); - if (packageJSONPath) { - const packageData = this.$fs.readJson(packageJSONPath); - const ver = semver.coerce(packageData.version); + if (packageJSONPath) { + const packageData = this.$fs.readJson(packageJSONPath); + const ver = semver.coerce(packageData.version); - if (semver.satisfies(ver, ">= 5.0.0")) { - return true; - } + if (semver.satisfies(ver, ">= 5.0.0")) { + return true; + } + } + break; } return false; } + + public getBundler(): BundlerType { + return this.$projectConfigService.getValue(`bundler`, "webpack"); + } + + private copyViteBundleToNative( + distOutput: string, + destDir: string, + specificFiles: string[] = null, + ) { + // Clean and copy Vite output to native platform folder + if (debugLog) { + console.log(`Copying Vite bundle from "${distOutput}" to "${destDir}".`); + } + + try { + if (specificFiles) { + // Selective mode: only copy specific files (incremental) + if (debugLog) { + console.log( + "Selective copy - copying specific files:", + specificFiles, + ); + } + + // Ensure destination directory exists + this.$fs.createDirectory(destDir); + + // Copy only the specified files + for (const file of specificFiles) { + const srcPath = path.join(distOutput, file); + const destPath = path.join(destDir, file); + + if (!this.$fs.exists(srcPath)) continue; + + // create parent dirs + this.$fs.createDirectory(path.dirname(destPath)); + + this.$fs.copyFile(srcPath, destPath); + + if (debugLog) { + console.log(`Copied ${file}`); + } + } + } else { + // Full build mode: clean and copy everything + if (debugLog) { + console.log("Full build: Copying all files."); + } + + // Clean destination directory + if (this.$fs.exists(destDir)) { + this.$fs.deleteDirectory(destDir); + } + this.$fs.createDirectory(destDir); + + // Copy all files from dist to platform destination + if (this.$fs.exists(distOutput)) { + this.copyRecursiveSync(distOutput, destDir); + } else { + this.$logger.warn( + `Vite output directory does not exist: ${distOutput}`, + ); + } + } + } catch (error) { + this.$logger.warn(`Failed to copy Vite bundle: ${error.message}`); + } + } + + private getIncrementalFilesToCopy(emittedFiles: string[]): string[] { + // For incremental builds, we need to determine which emitted files are likely affected + // by the source file changes + + const filesToCopy: string[] = []; + + const bundleFiles = emittedFiles.filter( + (file) => + file.endsWith(".mjs") || file.endsWith(".js") || file.endsWith(".map"), + ); + filesToCopy.push(...bundleFiles); + + // Only copy assets if there are explicit asset-related changes + const assetFiles = emittedFiles.filter( + (file) => + file.includes("assets/") || + file.includes("static/") || + file.includes("fonts/") || + file.includes("images/"), + ); + if (assetFiles.length > 0) { + filesToCopy.push(...assetFiles); + } + + // Remove duplicates and return + return [...new Set(filesToCopy)]; + } + + private copyRecursiveSync(src: string, dest: string) { + // Ensure destination exists + this.$fs.createDirectory(dest); + + const entries = this.$fs.readDirectory(src); + for (const name of entries) { + const srcPath = path.join(src, name); + const destPath = path.join(dest, name); + const lstats = this.$fs.getLsStats(srcPath); + + if (lstats.isDirectory()) { + this.copyRecursiveSync(srcPath, destPath); + } else if (lstats.isFile() || lstats.isSymbolicLink()) { + // create parent directory (copyFile will also ensure it, but keep explicit) + this.$fs.createDirectory(path.dirname(destPath)); + this.$fs.copyFile(srcPath, destPath); + } + } + } +} + +function capitalizeFirstLetter(val: string) { + return String(val).charAt(0).toUpperCase() + String(val).slice(1); } -injector.register("webpackCompilerService", WebpackCompilerService); +injector.register("bundlerCompilerService", BundlerCompilerService); diff --git a/lib/services/webpack/webpack.d.ts b/lib/services/bundler/bundler.ts similarity index 89% rename from lib/services/webpack/webpack.d.ts rename to lib/services/bundler/bundler.ts index e3a8dddd8b..08e6bda859 100644 --- a/lib/services/webpack/webpack.d.ts +++ b/lib/services/bundler/bundler.ts @@ -18,21 +18,21 @@ import { import { INotConfiguredEnvOptions } from "../../common/definitions/commands"; declare global { - interface IWebpackCompilerService extends EventEmitter { + interface IBundlerCompilerService extends EventEmitter { compileWithWatch( platformData: IPlatformData, projectData: IProjectData, - prepareData: IPrepareData + prepareData: IPrepareData, ): Promise; compileWithoutWatch( platformData: IPlatformData, projectData: IProjectData, - prepareData: IPrepareData + prepareData: IPrepareData, ): Promise; - stopWebpackCompiler(platform: string): Promise; + stopBundlerCompiler(platform: string): Promise; } - interface IWebpackEnvOptions { + interface IBundlerEnvOptions { sourceMap?: boolean; uglify?: boolean; production?: boolean; @@ -42,19 +42,19 @@ declare global { checkForChanges( platformData: IPlatformData, projectData: IProjectData, - prepareData: IPrepareData + prepareData: IPrepareData, ): Promise; getPrepareInfoFilePath(platformData: IPlatformData): string; getPrepareInfo(platformData: IPlatformData): IPrepareInfo; savePrepareInfo( platformData: IPlatformData, projectData: IProjectData, - prepareData: IPrepareData + prepareData: IPrepareData, ): Promise; setNativePlatformStatus( platformData: IPlatformData, projectData: IProjectData, - addedPlatform: IAddedNativePlatform + addedPlatform: IAddedNativePlatform, ): void; currentChanges: IProjectChangesInfo; } @@ -68,10 +68,14 @@ declare global { hasNativeChanges: boolean; } - interface IWebpackEmitMessage { + interface IBundlerEmitMessage { emittedFiles: string[]; chunkFiles: string[]; hash: string; + changedFiles?: string[]; + isHMR?: boolean; + filesToCopy?: string[]; + buildType?: string; } interface IPlatformProjectService @@ -81,12 +85,12 @@ declare global { validate( projectData: IProjectData, options: IOptions, - notConfiguredEnvOptions?: INotConfiguredEnvOptions + notConfiguredEnvOptions?: INotConfiguredEnvOptions, ): Promise; createProject( frameworkDir: string, frameworkVersion: string, - projectData: IProjectData + projectData: IProjectData, ): Promise; interpolateData(projectData: IProjectData): Promise; interpolateConfigurationFile(projectData: IProjectData): void; @@ -108,13 +112,13 @@ declare global { validateOptions( projectId?: string, provision?: true | string, - teamId?: true | string + teamId?: true | string, ): Promise; buildProject( projectRoot: string, projectData: IProjectData, - buildConfig: T + buildConfig: T, ): Promise; /** @@ -125,7 +129,7 @@ declare global { */ prepareProject( projectData: IProjectData, - prepareData: T + prepareData: T, ): Promise; /** @@ -146,7 +150,7 @@ declare global { preparePluginNativeCode( pluginData: IPluginData, - options?: any + options?: any, ): Promise; /** @@ -157,17 +161,17 @@ declare global { */ removePluginNativeCode( pluginData: IPluginData, - projectData: IProjectData + projectData: IProjectData, ): Promise; beforePrepareAllPlugins( projectData: IProjectData, - dependencies?: IDependencyData[] + dependencies?: IDependencyData[], ): Promise; handleNativeDependenciesChange( projectData: IProjectData, - opts: IRelease + opts: IRelease, ): Promise; /** @@ -178,11 +182,11 @@ declare global { cleanDeviceTempFolder( deviceIdentifier: string, - projectData: IProjectData + projectData: IProjectData, ): Promise; processConfigurationFilesFromAppResources( projectData: IProjectData, - opts: { release: boolean } + opts: { release: boolean }, ): Promise; /** @@ -214,7 +218,7 @@ declare global { checkForChanges( changeset: IProjectChangesInfo, prepareData: T, - projectData: IProjectData + projectData: IProjectData, ): Promise; /** diff --git a/lib/services/debug-service-base.ts b/lib/services/debug-service-base.ts index bf2017c6a7..700cfb2ae6 100644 --- a/lib/services/debug-service-base.ts +++ b/lib/services/debug-service-base.ts @@ -8,10 +8,11 @@ import { export abstract class DebugServiceBase extends EventEmitter - implements IDeviceDebugService { + implements IDeviceDebugService +{ constructor( protected device: Mobile.IDevice, - protected $devicesService: Mobile.IDevicesService + protected $devicesService: Mobile.IDevicesService, ) { super(); } @@ -20,20 +21,21 @@ export abstract class DebugServiceBase public abstract debug( debugData: IDebugData, - debugOptions: IDebugOptions + debugOptions: IDebugOptions, ): Promise; public abstract debugStop(): Promise; protected getCanExecuteAction( - deviceIdentifier: string + deviceIdentifier: string, ): (device: Mobile.IDevice) => boolean { return (device: Mobile.IDevice): boolean => { if (deviceIdentifier) { let isSearchedDevice = device.deviceInfo.identifier === deviceIdentifier; if (!isSearchedDevice) { - const deviceByDeviceOption = this.$devicesService.getDeviceByDeviceOption(); + const deviceByDeviceOption = + this.$devicesService.getDeviceByDeviceOption(); isSearchedDevice = deviceByDeviceOption && device.deviceInfo.identifier === @@ -49,7 +51,7 @@ export abstract class DebugServiceBase protected getChromeDebugUrl( debugOptions: IDebugOptions, - port: number + port: number, ): string { // corresponds to 55.0.2883 Chrome version // SHA is taken from https://chromium.googlesource.com/chromium/src/+/55.0.2883.100 @@ -74,7 +76,7 @@ export abstract class DebugServiceBase chromeDevToolsPrefix = `https://chrome-devtools-frontend.appspot.com/serve_file/@${commitSHA}`; } - const chromeUrl = `${chromeDevToolsPrefix}/inspector.html?ws=localhost:${port}`; + const chromeUrl = `${chromeDevToolsPrefix}/inspector.html?ws=127.0.0.1:${port}`; return chromeUrl; } } diff --git a/lib/services/extensibility-service.ts b/lib/services/extensibility-service.ts index 395dbd0a03..eff1fb0f0a 100644 --- a/lib/services/extensibility-service.ts +++ b/lib/services/extensibility-service.ts @@ -41,11 +41,11 @@ export class ExtensibilityService implements IExtensibilityService { private $logger: ILogger, private $packageManager: INodePackageManager, private $settingsService: ISettingsService, - private $requireService: IRequireService + private $requireService: IRequireService, ) {} public async installExtension( - extensionName: string + extensionName: string, ): Promise { this.$logger.trace(`Start installation of extension '${extensionName}'.`); @@ -62,10 +62,10 @@ export class ExtensibilityService implements IExtensibilityService { const installResultInfo = await this.$packageManager.install( packageName, this.pathToExtensions, - npmOpts + npmOpts, ); this.$logger.trace( - `Finished installation of extension '${extensionName}'. Trying to load it now.` + `Finished installation of extension '${extensionName}'. Trying to load it now.`, ); return this.getInstalledExtensionData(installResultInfo.name); @@ -79,11 +79,11 @@ export class ExtensibilityService implements IExtensibilityService { await this.$packageManager.uninstall( extensionName, { save: true }, - this.pathToExtensions + this.pathToExtensions, ); this.$logger.trace( - `Finished uninstallation of extension '${extensionName}'.` + `Finished uninstallation of extension '${extensionName}'.`, ); } @@ -95,7 +95,7 @@ export class ExtensibilityService implements IExtensibilityService { public getInstalledExtensionsData(): IExtensionData[] { const installedExtensions = this.getInstalledExtensions(); return _.keys(installedExtensions).map((installedExtension) => - this.getInstalledExtensionData(installedExtension) + this.getInstalledExtensionData(installedExtension), ); } @@ -108,7 +108,7 @@ export class ExtensibilityService implements IExtensibilityService { dependencies = this.getInstalledExtensions(); } catch (err) { this.$logger.trace( - `Error while getting installed dependencies: ${err.message}. No extensions will be loaded.` + `Error while getting installed dependencies: ${err.message}. No extensions will be loaded.`, ); } @@ -148,11 +148,11 @@ export class ExtensibilityService implements IExtensibilityService { return this.getInstalledExtensionData(extensionName); } catch (error) { this.$logger.warn( - `Error while loading ${extensionName} is: ${error.message}` + `Error while loading ${extensionName} is: ${error.message}`, ); const err = ( new Error( - `Unable to load extension ${extensionName}. You will not be able to use the functionality that it adds. Error: ${error.message}` + `Unable to load extension ${extensionName}. You will not be able to use the functionality that it adds. Error: ${error.message}`, ) ); err.extensionName = extensionName; @@ -161,28 +161,28 @@ export class ExtensibilityService implements IExtensibilityService { } public async getExtensionNameWhereCommandIsRegistered( - inputOpts: IGetExtensionCommandInfoParams + inputOpts: IGetExtensionCommandInfoParams, ): Promise { let allExtensions: INpmsSingleResultData[] = []; try { const npmsResult = await this.$packageManager.searchNpms( - "nativescript:extension" + "nativescript:extension", ); allExtensions = npmsResult.results || []; } catch (err) { this.$logger.trace( - `Unable to find extensions via npms. Error is: ${err}` + `Unable to find extensions via npms. Error is: ${err}`, ); return null; } const defaultCommandRegExp = new RegExp( - `${regExpEscape(inputOpts.defaultCommandDelimiter)}.*` + `${regExpEscape(inputOpts.defaultCommandDelimiter)}.*`, ); const commandDelimiterRegExp = createRegExp( inputOpts.commandDelimiter, - "g" + "g", ); for (const extensionData of allExtensions) { @@ -190,9 +190,8 @@ export class ExtensibilityService implements IExtensibilityService { try { // now get full package.json for the latest version of the package - const registryData = await this.$packageManager.getRegistryPackageData( - extensionName - ); + const registryData = + await this.$packageManager.getRegistryPackageData(extensionName); const latestPackageData = registryData.versions[registryData["dist-tags"].latest]; const commands: string[] = @@ -202,12 +201,12 @@ export class ExtensibilityService implements IExtensibilityService { if (commands && commands.length) { // For each default command we need to add its short syntax in the array of commands. // For example in case there's a default command called devices list, the commands array will contain devices|*list. - // However, in case the user executes just tns devices, CLI will still execute the tns devices list command. + // However, in case the user executes just ns devices, CLI will still execute the ns devices list command. // So we need to add the devices command as well. _.filter( commands, (command) => - command.indexOf(inputOpts.defaultCommandDelimiter) !== -1 + command.indexOf(inputOpts.defaultCommandDelimiter) !== -1, ).forEach((defaultCommand) => { commands.push(defaultCommand.replace(defaultCommandRegExp, "")); }); @@ -221,12 +220,12 @@ export class ExtensibilityService implements IExtensibilityService { if (_.some(commands, (c) => c.toLowerCase() === currentCommand)) { const beautifiedCommandName = currentCommand.replace( commandDelimiterRegExp, - " " + " ", ); return { extensionName, registeredCommandName: currentCommand, - installationMessage: `The command ${beautifiedCommandName} is registered in extension ${extensionName}. You can install it by executing 'tns extension install ${extensionName}'`, + installationMessage: `The command ${beautifiedCommandName} is registered in extension ${extensionName}. You can install it by executing 'ns extension install ${extensionName}'`, }; } @@ -236,7 +235,7 @@ export class ExtensibilityService implements IExtensibilityService { } catch (err) { // We do not want to stop the whole process in case we are unable to find data for one of the extensions. this.$logger.trace( - `Unable to get data for ${extensionName}. Error is: ${err}` + `Unable to get data for ${extensionName}. Error is: ${err}`, ); } } @@ -248,7 +247,7 @@ export class ExtensibilityService implements IExtensibilityService { return path.join( this.pathToExtensions, constants.NODE_MODULES_FOLDER_NAME, - extensionName + extensionName, ); } @@ -256,23 +255,23 @@ export class ExtensibilityService implements IExtensibilityService { const pathToExtension = this.getPathToExtension(extensionName); const pathToPackageJson = path.join( pathToExtension, - constants.PACKAGE_JSON_FILE_NAME + constants.PACKAGE_JSON_FILE_NAME, ); const jsonData = this.$fs.readJson(pathToPackageJson); return jsonData; } private async assertExtensionIsInstalled( - extensionName: string + extensionName: string, ): Promise { this.$logger.trace(`Asserting extension ${extensionName} is installed.`); const installedExtensions = this.$fs.readDirectory( - path.join(this.pathToExtensions, constants.NODE_MODULES_FOLDER_NAME) + path.join(this.pathToExtensions, constants.NODE_MODULES_FOLDER_NAME), ); if (installedExtensions.indexOf(extensionName) === -1) { this.$logger.trace( - `Extension ${extensionName} is not installed, starting installation.` + `Extension ${extensionName} is not installed, starting installation.`, ); await this.installExtension(extensionName); } diff --git a/lib/services/ios-entitlements-service.ts b/lib/services/ios-entitlements-service.ts index c506971016..932fe88ab0 100644 --- a/lib/services/ios-entitlements-service.ts +++ b/lib/services/ios-entitlements-service.ts @@ -13,7 +13,7 @@ export class IOSEntitlementsService { private $logger: ILogger, private $devicePlatformsConstants: Mobile.IDevicePlatformsConstants, private $mobileHelper: Mobile.IMobileHelper, - private $pluginsService: IPluginsService + private $pluginsService: IPluginsService, ) {} public static readonly DefaultEntitlementsName: string = "app.entitlements"; @@ -23,9 +23,9 @@ export class IOSEntitlementsService { const entitlementsPath = path.join( projectData.appResourcesDirectoryPath, this.$mobileHelper.normalizePlatformName( - this.$options.platformOverride ?? this.$devicePlatformsConstants.iOS + this.$options.platformOverride ?? this.$devicePlatformsConstants.iOS, ), - entitlementsName + entitlementsName, ); return entitlementsPath; } @@ -33,18 +33,21 @@ export class IOSEntitlementsService { public getPlatformsEntitlementsPath(projectData: IProjectData): string { return path.join( projectData.platformsDir, - this.$options.platformOverride ?? - this.$devicePlatformsConstants.iOS.toLowerCase(), + this.$mobileHelper + .normalizePlatformName( + this.$options.platformOverride ?? this.$devicePlatformsConstants.iOS, + ) + .toLowerCase(), projectData.projectName, - projectData.projectName + ".entitlements" + projectData.projectName + ".entitlements", ); } public getPlatformsEntitlementsRelativePath( - projectData: IProjectData + projectData: IProjectData, ): string { return path.join( projectData.projectName, - projectData.projectName + ".entitlements" + projectData.projectName + ".entitlements", ); } @@ -71,7 +74,7 @@ export class IOSEntitlementsService { for (const plugin of allPlugins) { const pluginInfoPlistPath = path.join( plugin.pluginPlatformsFolderPath(this.$devicePlatformsConstants.iOS), - IOSEntitlementsService.DefaultEntitlementsName + IOSEntitlementsService.DefaultEntitlementsName, ); makePatch(pluginInfoPlistPath); } @@ -85,17 +88,17 @@ export class IOSEntitlementsService { const plistContent = session.build(); this.$logger.trace( "App.entitlements: Write to: " + - this.getPlatformsEntitlementsPath(projectData) + this.getPlatformsEntitlementsPath(projectData), ); this.$fs.writeFile( this.getPlatformsEntitlementsPath(projectData), - plistContent + plistContent, ); } } private getAllInstalledPlugins( - projectData: IProjectData + projectData: IProjectData, ): Promise { return this.$pluginsService.getAllInstalledPlugins(projectData); } diff --git a/lib/services/ios-project-service.ts b/lib/services/ios-project-service.ts index ce078642f3..692a4567da 100644 --- a/lib/services/ios-project-service.ts +++ b/lib/services/ios-project-service.ts @@ -130,6 +130,7 @@ export class IOSProjectService extends projectServiceBaseLib.PlatformProjectServ } private _platformsDirCache: string = null; + private _platformOverrideCache: string = null; private _platformData: IPlatformData = null; public getPlatformData(projectData: IProjectData): IPlatformData { @@ -139,10 +140,12 @@ export class IOSProjectService extends projectServiceBaseLib.PlatformProjectServ ); } + const currentOverride = this.$options.platformOverride ?? null; if ( projectData && projectData.platformsDir && - this._platformsDirCache !== projectData.platformsDir + (this._platformsDirCache !== projectData.platformsDir || + this._platformOverrideCache !== currentOverride) ) { const platform = this.$mobileHelper.normalizePlatformName( this.$options.platformOverride ?? this.$devicePlatformsConstants.iOS, @@ -231,6 +234,8 @@ export class IOSProjectService extends projectServiceBaseLib.PlatformProjectServ ".xbm", ], // https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIImage_Class/ }; + this._platformsDirCache = projectData.platformsDir; + this._platformOverrideCache = currentOverride; } return this._platformData; @@ -545,6 +550,18 @@ export class IOSProjectService extends projectServiceBaseLib.PlatformProjectServ } } + // Track added frameworks by name to prevent duplicates in monorepo/workspace setups + // where the same plugin may exist in multiple node_modules paths + private _addedFrameworks: Set = new Set(); + + /** + * Clears the framework and static library tracking sets. Should be called at the start of a new prepare cycle. + */ + public clearFrameworksCache(): void { + this._addedFrameworks.clear(); + this._addedStaticLibs.clear(); + } + private async addFramework( frameworkPath: string, projectData: IProjectData, @@ -553,6 +570,16 @@ export class IOSProjectService extends projectServiceBaseLib.PlatformProjectServ return; } + // Check if framework with same name already added (prevents duplicate output errors in monorepos) + const frameworkName = path.basename(frameworkPath); + if (this._addedFrameworks.has(frameworkName)) { + this.$logger.trace( + `Framework ${frameworkName} already added, skipping duplicate from ${frameworkPath}`, + ); + return; + } + this._addedFrameworks.add(frameworkName); + this.validateFramework(frameworkPath); const project = this.createPbxProj(projectData); @@ -592,12 +619,24 @@ export class IOSProjectService extends projectServiceBaseLib.PlatformProjectServ this.savePbxProj(project, projectData); } + // Track added static libraries by name to prevent duplicates in monorepo/workspace setups + private _addedStaticLibs: Set = new Set(); + private async addStaticLibrary( staticLibPath: string, projectData: IProjectData, ): Promise { - // Copy files to lib folder. + // Check if static library with same name already added (prevents duplicate errors in monorepos) const libraryName = path.basename(staticLibPath, ".a"); + if (this._addedStaticLibs.has(libraryName)) { + this.$logger.trace( + `Static library ${libraryName} already added, skipping duplicate from ${staticLibPath}`, + ); + return; + } + this._addedStaticLibs.add(libraryName); + + // Copy files to lib folder. const headersSubpath = path.join( path.dirname(staticLibPath), "include", @@ -625,13 +664,10 @@ export class IOSProjectService extends projectServiceBaseLib.PlatformProjectServ projectData: IProjectData, prepareData: IOSPrepareData, ): Promise { + const platformData = this.getPlatformData(projectData); const projectRoot = this.$options.hostProjectPath ? this.$options.hostProjectPath - : path.join( - projectData.platformsDir, - this.$devicePlatformsConstants.iOS.toLowerCase(), - ); - const platformData = this.getPlatformData(projectData); + : platformData.projectRoot; const pluginsData = this.getAllProductionPlugins(projectData); const pbxProjPath = this.getPbxProjPath(projectData); @@ -1157,6 +1193,9 @@ export class IOSProjectService extends projectServiceBaseLib.PlatformProjectServ projectData: IProjectData, opts: IRelease, ): Promise { + // Clear framework tracking for fresh duplicate detection + this.clearFrameworksCache(); + const platformData = this.getPlatformData(projectData); const pluginsData = this.getAllProductionPlugins(projectData); this.setProductBundleIdentifier(projectData); diff --git a/lib/services/ios/ios-signing-service.ts b/lib/services/ios/ios-signing-service.ts index dd44da952f..e05abb8dd0 100644 --- a/lib/services/ios/ios-signing-service.ts +++ b/lib/services/ios/ios-signing-service.ts @@ -9,6 +9,7 @@ import * as helpers from "../../common/helpers"; import { IOSProvisionService } from "../ios-provision-service"; import { IOSBuildData } from "../../data/build-data"; import { + IOptions, IProvisioningJSON, IXcconfigService, IXcprojService, @@ -25,19 +26,20 @@ export class IOSSigningService implements IiOSSigningService { private $fs: IFileSystem, private $iOSProvisionService: IOSProvisionService, private $logger: ILogger, + private $options: IOptions, private $pbxprojDomXcode: IPbxprojDomXcode, private $prompter: IPrompter, private $xcconfigService: IXcconfigService, - private $xcprojService: IXcprojService + private $xcprojService: IXcprojService, ) {} public async setupSigningForDevice( projectRoot: string, projectData: IProjectData, - iOSBuildData: IOSBuildData + iOSBuildData: IOSBuildData, ): Promise { const xcode = this.$pbxprojDomXcode.Xcode.open( - this.getPbxProjPath(projectData, projectRoot) + this.getPbxProjPath(projectData, projectRoot), ); const signing = xcode.getSigning(projectData.projectName); @@ -63,7 +65,7 @@ export class IOSSigningService implements IiOSSigningService { const teamId = await this.getDevelopmentTeam( projectData, projectRoot, - iOSBuildData.teamId + iOSBuildData.teamId, ); await this.setupSigningFromTeam(projectRoot, projectData, teamId); } @@ -72,10 +74,10 @@ export class IOSSigningService implements IiOSSigningService { public async setupSigningFromTeam( projectRoot: string, projectData: IProjectData, - teamId: string + teamId: string, ): Promise { const xcode = this.$pbxprojDomXcode.Xcode.open( - this.getPbxProjPath(projectData, projectRoot) + this.getPbxProjPath(projectData, projectRoot), ); const signing = xcode.getSigning(projectData.projectName); @@ -94,12 +96,11 @@ export class IOSSigningService implements IiOSSigningService { } if (shouldUpdateXcode) { - const teamIdsForName = await this.$iOSProvisionService.getTeamIdsWithName( - teamId - ); + const teamIdsForName = + await this.$iOSProvisionService.getTeamIdsWithName(teamId); if (teamIdsForName.length > 0) { this.$logger.trace( - `Team id ${teamIdsForName[0]} will be used for team name "${teamId}".` + `Team id ${teamIdsForName[0]} will be used for team name "${teamId}".`, ); teamId = teamIdsForName[0]; } @@ -111,7 +112,7 @@ export class IOSSigningService implements IiOSSigningService { IOSNativeTargetProductTypes.watchApp, IOSNativeTargetProductTypes.watchExtension, ], - teamId + teamId, ); this.getExtensionNames(projectData).forEach((name) => { xcode.setAutomaticSigningStyle(name, teamId); @@ -122,7 +123,7 @@ export class IOSSigningService implements IiOSSigningService { this.$logger.trace(`Set Automatic signing style and team id ${teamId}.`); } else { this.$logger.trace( - `The specified ${teamId} is already set in the Xcode.` + `The specified ${teamId} is already set in the Xcode.`, ); } } @@ -131,7 +132,7 @@ export class IOSSigningService implements IiOSSigningService { projectRoot: string, projectData: IProjectData, provision?: string, - mobileProvisionData?: mobileProvisionFinder.provision.MobileProvision + mobileProvisionData?: mobileProvisionFinder.provision.MobileProvision, ): Promise { if (!provision) { // read uuid from Xcode an cache... @@ -139,7 +140,7 @@ export class IOSSigningService implements IiOSSigningService { } const xcode = this.$pbxprojDomXcode.Xcode.open( - this.getPbxProjPath(projectData, projectRoot) + this.getPbxProjPath(projectData, projectRoot), ); const signing = xcode.getSigning(projectData.projectName); @@ -160,11 +161,11 @@ export class IOSSigningService implements IiOSSigningService { const projectSigningConfig = await this.getManualSigningConfiguration( projectData, provision, - mobileProvisionData + mobileProvisionData, ); xcode.setManualSigningStyle( projectData.projectName, - projectSigningConfig + projectSigningConfig, ); xcode.setManualSigningStyleByTargetProductTypesList( [ @@ -172,20 +173,20 @@ export class IOSSigningService implements IiOSSigningService { IOSNativeTargetProductTypes.watchApp, IOSNativeTargetProductTypes.watchExtension, ], - projectSigningConfig + projectSigningConfig, ); this.$logger.trace( - `Set Manual signing style and provisioning profile: ${projectSigningConfig.name} (${projectSigningConfig.uuid})` + `Set Manual signing style and provisioning profile: ${projectSigningConfig.name} (${projectSigningConfig.uuid})`, ); const extensionSigningConfig = await Promise.all( - this.getExtensionsManualSigningConfiguration(projectData) + this.getExtensionsManualSigningConfiguration(projectData), ); extensionSigningConfig.forEach(({ name, configuration }) => { xcode.setManualSigningStyle(name, configuration); this.$logger.trace( - `Set Manual signing style and provisioning profile: ${configuration.name} (${configuration.uuid})` + `Set Manual signing style and provisioning profile: ${configuration.name} (${configuration.uuid})`, ); }); @@ -193,7 +194,7 @@ export class IOSSigningService implements IiOSSigningService { // this.cache(uuid); } else { this.$logger.trace( - `The specified provisioning profile is already set in the Xcode: ${provision}` + `The specified provisioning profile is already set in the Xcode: ${provision}`, ); } } @@ -202,7 +203,7 @@ export class IOSSigningService implements IiOSSigningService { const extensionFolderPath = path.join( projectData.getAppResourcesDirectoryPath(), constants.iOSAppResourcesFolderName, - constants.NATIVE_EXTENSION_FOLDER + constants.NATIVE_EXTENSION_FOLDER, ); if (this.$fs.exists(extensionFolderPath)) { @@ -223,12 +224,12 @@ export class IOSSigningService implements IiOSSigningService { projectData.getAppResourcesDirectoryPath(), constants.iOSAppResourcesFolderName, constants.NATIVE_EXTENSION_FOLDER, - constants.EXTENSION_PROVISIONING_FILENAME + constants.EXTENSION_PROVISIONING_FILENAME, ); if (this.$fs.exists(provisioningJSONPath)) { const provisioningJSON = this.$fs.readJson( - provisioningJSONPath + provisioningJSONPath, ) as IProvisioningJSON; const extensionNames = this.getExtensionNames(projectData); @@ -239,12 +240,12 @@ export class IOSSigningService implements IiOSSigningService { if (extensionNames.includes(name)) { const configuration = await this.getManualSigningConfiguration( projectData, - provision + provision, ); return { name, configuration }; } return null; - } + }, ); return provisioning; @@ -256,14 +257,14 @@ export class IOSSigningService implements IiOSSigningService { private async getManualSigningConfiguration( projectData: IProjectData, provision: string, - mobileProvisionData?: mobileProvisionFinder.provision.MobileProvision + mobileProvisionData?: mobileProvisionFinder.provision.MobileProvision, ) { const pickStart = Date.now(); const mobileprovision = mobileProvisionData || (await this.$iOSProvisionService.pick( provision, - projectData.projectIdentifiers.ios + projectData.projectIdentifiers.ios, )); const pickEnd = Date.now(); this.$logger.trace( @@ -271,13 +272,15 @@ export class IOSSigningService implements IiOSSigningService { (mobileprovision ? "found" : "failed to find ") + " matching provisioning profile. (" + (pickEnd - pickStart) + - "ms.)" + "ms.)", ); if (!mobileprovision) { this.$errors.fail( - "Failed to find mobile provision with UUID or Name: " + provision + "Failed to find mobile provision with UUID or Name: " + provision, ); } + const isVisionOS = + this.$options.platformOverride?.toLowerCase() === "visionos"; const configuration = { team: mobileprovision.TeamIdentifier && @@ -288,8 +291,12 @@ export class IOSSigningService implements IiOSSigningService { name: mobileprovision.Name, identity: mobileprovision.Type === "Development" - ? "iPhone Developer" - : "iPhone Distribution", + ? isVisionOS + ? "Apple Development" + : "iPhone Developer" + : isVisionOS + ? "Apple Distribution" + : "iPhone Distribution", }; return configuration; } @@ -298,17 +305,17 @@ export class IOSSigningService implements IiOSSigningService { return path.join( projectData.appResourcesDirectoryPath, iOSAppResourcesFolderName, - BUILD_XCCONFIG_FILE_NAME + BUILD_XCCONFIG_FILE_NAME, ); } private getPbxProjPath( projectData: IProjectData, - projectRoot: string + projectRoot: string, ): string { return path.join( this.$xcprojService.getXcodeprojPath(projectData, projectRoot), - "project.pbxproj" + "project.pbxproj", ); } private readTeamIdFromFile(projectRoot: string): string | undefined { @@ -325,17 +332,17 @@ export class IOSSigningService implements IiOSSigningService { private async getDevelopmentTeam( projectData: IProjectData, projectRoot: string, - teamId?: string + teamId?: string, ): Promise { teamId = teamId || this.readXCConfigDevelopmentTeam(projectData); if (!teamId) { const teams = await this.$iOSProvisionService.getDevelopmentTeams(); this.$logger.warn( - "Xcode requires a team id to be specified when building for device." + "Xcode requires a team id to be specified when building for device.", ); this.$logger.warn( - "You can specify the team id by setting the DEVELOPMENT_TEAM setting in build.xcconfig file located in App_Resources folder of your app, or by using the --teamId option when calling run, debug or livesync commands." + "You can specify the team id by setting the DEVELOPMENT_TEAM setting in build.xcconfig file located in App_Resources folder of your app, or by using the --teamId option when calling run, debug or livesync commands.", ); if (teams.length === 1) { teamId = teams[0].id; @@ -344,15 +351,15 @@ export class IOSSigningService implements IiOSSigningService { teams[0].name + " (" + teams[0].id + - ")" + ")", ); } else if (teams.length > 0) { if (!helpers.isInteractive()) { this.$errors.fail( `Unable to determine default development team. Available development teams are: ${_.map( teams, - (team) => team.id - )}. Specify team in app/App_Resources/iOS/build.xcconfig file in the following way: DEVELOPMENT_TEAM = ` + (team) => team.id, + )}. Specify team in app/App_Resources/iOS/build.xcconfig file in the following way: DEVELOPMENT_TEAM = `, ); } const fromFile = this.readTeamIdFromFile(projectRoot); @@ -370,7 +377,7 @@ export class IOSSigningService implements IiOSSigningService { } const choice = await this.$prompter.promptForChoice( "Found multiple development teams, select one:", - choices + choices, ); teamId = teams[choices.indexOf(choice)].id; @@ -383,18 +390,18 @@ export class IOSSigningService implements IiOSSigningService { "Do you want to make teamId: " + teamId + " a persistent choice for your app?", - choicesPersist + choicesPersist, ); switch (choicesPersist.indexOf(choicePersist)) { case 0: const xcconfigFile = path.join( projectData.appResourcesDirectoryPath, "iOS", - BUILD_XCCONFIG_FILE_NAME + BUILD_XCCONFIG_FILE_NAME, ); this.$fs.appendFile( xcconfigFile, - "\nDEVELOPMENT_TEAM = " + teamId + "\n" + "\nDEVELOPMENT_TEAM = " + teamId + "\n", ); break; case 1: @@ -415,41 +422,41 @@ export class IOSSigningService implements IiOSSigningService { private readXCConfigDevelopmentTeam(projectData: IProjectData): string { return this.$xcconfigService.readPropertyValue( this.getBuildXCConfigFilePath(projectData), - "DEVELOPMENT_TEAM" + "DEVELOPMENT_TEAM", ); } private readXCConfigProvisioningProfile(projectData: IProjectData): string { return this.$xcconfigService.readPropertyValue( this.getBuildXCConfigFilePath(projectData), - "PROVISIONING_PROFILE" + "PROVISIONING_PROFILE", ); } private readXCConfigProvisioningProfileForIPhoneOs( - projectData: IProjectData + projectData: IProjectData, ): string { return this.$xcconfigService.readPropertyValue( this.getBuildXCConfigFilePath(projectData), - "PROVISIONING_PROFILE[sdk=iphoneos*]" + "PROVISIONING_PROFILE[sdk=iphoneos*]", ); } private readXCConfigProvisioningProfileSpecifier( - projectData: IProjectData + projectData: IProjectData, ): string { return this.$xcconfigService.readPropertyValue( this.getBuildXCConfigFilePath(projectData), - "PROVISIONING_PROFILE_SPECIFIER" + "PROVISIONING_PROFILE_SPECIFIER", ); } private readXCConfigProvisioningProfileSpecifierForIPhoneOs( - projectData: IProjectData + projectData: IProjectData, ): string { return this.$xcconfigService.readPropertyValue( this.getBuildXCConfigFilePath(projectData), - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]", ); } } diff --git a/lib/services/ios/spm-service.ts b/lib/services/ios/spm-service.ts index d7d46107ff..c7462b9d8e 100644 --- a/lib/services/ios/spm-service.ts +++ b/lib/services/ios/spm-service.ts @@ -1,6 +1,6 @@ import { injector } from "../../common/yok"; import { IProjectConfigService, IProjectData } from "../../definitions/project"; -import { MobileProject } from "@rigor789/trapezedev-project"; +import { MobileProject } from "@nstudio/trapezedev-project"; import { IPlatformData } from "../../definitions/platform"; import path = require("path"); @@ -24,6 +24,29 @@ export class SPMService implements ISPMService { return spmPackages; } + /** + * Merges plugin SPM packages with app SPM packages. + * App packages take precedence over plugin packages with the same name. + * @param appPackages - Array of app SPM packages (modified in place) + * @param pluginPackages - Array of plugin SPM packages to merge + */ + private mergePluginSPMPackages( + appPackages: IosSPMPackage[], + pluginPackages: IosSPMPackage[], + ): void { + // include swift packages from plugin configs + // but allow app packages to override plugin packages with the same name + const appPackageNames = new Set(appPackages.map(pkg => pkg.name)); + + for (const pluginPkg of pluginPackages) { + if (appPackageNames.has(pluginPkg.name)) { + this.$logger.trace(`SPM: app package overrides plugin package: ${pluginPkg.name}`); + } else { + appPackages.push(pluginPkg); + } + } + } + // note: this is not used anywhere at the moment. // public hasSPMPackages(projectData: IProjectData): boolean { // return this.getSPMPackages(projectData).length > 0; @@ -41,8 +64,7 @@ export class SPMService implements ISPMService { ); if (pluginSpmPackages?.length) { - // include swift packages from plugin configs - spmPackages.push(...pluginSpmPackages); + this.mergePluginSPMPackages(spmPackages, pluginSpmPackages); } if (!spmPackages.length) { diff --git a/lib/services/ios/xcodebuild-args-service.ts b/lib/services/ios/xcodebuild-args-service.ts index b97a11d8e5..8eee2ea366 100644 --- a/lib/services/ios/xcodebuild-args-service.ts +++ b/lib/services/ios/xcodebuild-args-service.ts @@ -16,6 +16,7 @@ import * as _ from "lodash"; import { DevicePlatformSdkName, SimulatorPlatformSdkName, + VisionDevicePlatformSdkName, VisionSimulatorPlatformSdkName, } from "../ios-project-service"; @@ -26,13 +27,13 @@ export class XcodebuildArgsService implements IXcodebuildArgsService { private $fs: IFileSystem, private $iOSWatchAppService: IIOSWatchAppService, private $logger: ILogger, - private $xcconfigService: IXcconfigService + private $xcconfigService: IXcconfigService, ) {} public async getBuildForSimulatorArgs( platformData: IPlatformData, projectData: IProjectData, - buildConfig: IBuildConfig + buildConfig: IBuildConfig, ): Promise { let args = await this.getArchitecturesArgs(buildConfig); @@ -45,11 +46,11 @@ export class XcodebuildArgsService implements IXcodebuildArgsService { let destination = "generic/platform=iOS Simulator"; let isvisionOS = this.$devicePlatformsConstants.isvisionOS( - buildConfig.platform + buildConfig.platform, ); if (isvisionOS) { - destination = "platform=visionOS Simulator"; + destination = "generic/platform=visionOS Simulator"; if (buildConfig._device) { destination += `,id=${buildConfig._device.deviceInfo.identifier}`; } @@ -67,8 +68,10 @@ export class XcodebuildArgsService implements IXcodebuildArgsService { this.getBuildCommonArgs( platformData, projectData, - isvisionOS ? VisionSimulatorPlatformSdkName : SimulatorPlatformSdkName - ) + isvisionOS + ? VisionSimulatorPlatformSdkName + : SimulatorPlatformSdkName, + ), ) .concat(this.getBuildLoggingArgs()) .concat(this.getXcodeProjectArgs(platformData, projectData)); @@ -79,20 +82,20 @@ export class XcodebuildArgsService implements IXcodebuildArgsService { public async getBuildForDeviceArgs( platformData: IPlatformData, projectData: IProjectData, - buildConfig: IBuildConfig + buildConfig: IBuildConfig, ): Promise { const architectures = await this.getArchitecturesArgs(buildConfig); const archivePath = path.join( platformData.getBuildOutputPath(buildConfig), - projectData.projectName + ".xcarchive" + projectData.projectName + ".xcarchive", ); let destination = "generic/platform=iOS"; let isvisionOS = this.$devicePlatformsConstants.isvisionOS( - buildConfig.platform + buildConfig.platform, ); if (isvisionOS) { - destination = "platform=visionOS"; + destination = "generic/platform=visionOS"; if (buildConfig._device) { destination += `,id=${buildConfig._device.deviceInfo.identifier}`; } @@ -113,21 +116,33 @@ export class XcodebuildArgsService implements IXcodebuildArgsService { this.getBuildCommonArgs( platformData, projectData, - DevicePlatformSdkName - ) + isvisionOS ? VisionDevicePlatformSdkName : DevicePlatformSdkName, + ), ) .concat(this.getBuildLoggingArgs()); + // pbxproj-dom sets CODE_SIGN_IDENTITY[sdk=iphoneos*] which doesn't match + // the xros SDK used by visionOS builds — pass it explicitly as an override + if (isvisionOS) { + args.push( + `CODE_SIGN_IDENTITY=${ + buildConfig.release ? "Apple Distribution" : "Apple Development" + }`, + ); + } + return args; } private async getArchitecturesArgs( - buildConfig: IBuildConfig + buildConfig: IBuildConfig, ): Promise { const args = []; if (this.$devicePlatformsConstants.isvisionOS(buildConfig.platform)) { - args.push("ONLY_ACTIVE_ARCH=YES"); + // visionOS builds (device/simulator) are arm64-only; rely on destination for arch + // and explicitly exclude x86_64 to avoid accidental selection + args.push("ONLY_ACTIVE_ARCH=YES", "EXCLUDED_ARCHS=x86_64"); return args; } @@ -143,11 +158,11 @@ export class XcodebuildArgsService implements IXcodebuildArgsService { public getXcodeProjectArgs( platformData: IPlatformData, - projectData: IProjectData + projectData: IProjectData, ): string[] { const xcworkspacePath = path.join( platformData.projectRoot, - `${projectData.projectName}.xcworkspace` + `${projectData.projectName}.xcworkspace`, ); // Introduced in Xcode 14+ // ref: https://forums.swift.org/t/telling-xcode-14-beta-4-to-trust-build-tool-plugins-programatically/59305/5 @@ -162,7 +177,7 @@ export class XcodebuildArgsService implements IXcodebuildArgsService { const BUILD_SETTINGS_FILE_PATH = path.join( projectData.appResourcesDirectoryPath, platformData.normalizedPlatformName, - constants.BUILD_XCCONFIG_FILE_NAME + constants.BUILD_XCCONFIG_FILE_NAME, ); // Only include explicit properties from build.xcconfig @@ -175,7 +190,7 @@ export class XcodebuildArgsService implements IXcodebuildArgsService { const deployTargetProperty = "IPHONEOS_DEPLOYMENT_TARGET"; const deployTargetVersion = this.$xcconfigService.readPropertyValue( BUILD_SETTINGS_FILE_PATH, - deployTargetProperty + deployTargetProperty, ); if (deployTargetVersion) { extraArgs.push(`${deployTargetProperty}=${deployTargetVersion}`); @@ -184,7 +199,7 @@ export class XcodebuildArgsService implements IXcodebuildArgsService { const swiftUIBootProperty = "NS_SWIFTUI_BOOT"; const swiftUIBootValue = this.$xcconfigService.readPropertyValue( BUILD_SETTINGS_FILE_PATH, - swiftUIBootProperty + swiftUIBootProperty, ); if (swiftUIBootValue) { extraArgs.push(`${swiftUIBootProperty}=${swiftUIBootValue}`); @@ -196,7 +211,7 @@ export class XcodebuildArgsService implements IXcodebuildArgsService { const xcodeprojPath = path.join( platformData.projectRoot, - `${projectData.projectName}.xcodeproj` + `${projectData.projectName}.xcodeproj`, ); return ["-project", xcodeprojPath, ...extraArgs]; } @@ -208,7 +223,7 @@ export class XcodebuildArgsService implements IXcodebuildArgsService { private getBuildCommonArgs( platformData: IPlatformData, projectData: IProjectData, - platformSdkName: string + platformSdkName: string, ): string[] { let args: string[] = []; @@ -226,7 +241,7 @@ export class XcodebuildArgsService implements IXcodebuildArgsService { } private async getArchitecturesFromConnectedDevices( - buildConfig: IiOSBuildConfig + buildConfig: IiOSBuildConfig, ): Promise { const platform = this.$devicePlatformsConstants.iOS.toLowerCase(); await this.$devicesService.initialize({ diff --git a/lib/services/livesync/android-livesync-tool.ts b/lib/services/livesync/android-livesync-tool.ts index 4406a63114..9057a64c79 100644 --- a/lib/services/livesync/android-livesync-tool.ts +++ b/lib/services/livesync/android-livesync-tool.ts @@ -475,7 +475,9 @@ export class AndroidLivesyncTool implements IAndroidLivesyncTool { this.pendingConnectionData.socketTimer = setTimeout(tryConnect, 1000); }; - this.pendingConnectionData.socket = socket; + if (this.pendingConnectionData) { + this.pendingConnectionData.socket = socket; + } socket.once("data", (data) => { socket.removeListener("close", tryConnectAfterTimeout); diff --git a/lib/services/pacote-service.ts b/lib/services/pacote-service.ts index 743a1cf75c..847bcb5101 100644 --- a/lib/services/pacote-service.ts +++ b/lib/services/pacote-service.ts @@ -16,7 +16,7 @@ export class PacoteService implements IPacoteService { private $injector: IInjector, private $logger: ILogger, private $npmConfigService: INpmConfigService, - private $proxyService: IProxyService + private $proxyService: IProxyService, ) {} @cache() @@ -27,11 +27,11 @@ export class PacoteService implements IPacoteService { public async manifest( packageName: string, - options?: IPacoteManifestOptions + options?: IPacoteManifestOptions, ): Promise { this.$logger.trace( `Calling pacoteService.manifest for packageName: '${packageName}' and options: `, - options + options, ); const manifestOptions: IPacoteBaseOptions = await this.getPacoteBaseOptions(); @@ -43,7 +43,7 @@ export class PacoteService implements IPacoteService { packageName = this.getRealPackageName(packageName); this.$logger.trace( `Calling pacote.manifest for packageName: ${packageName} and manifestOptions:`, - manifestOptions + manifestOptions, ); const result = await pacote.manifest(packageName, manifestOptions); @@ -55,12 +55,12 @@ export class PacoteService implements IPacoteService { public async extractPackage( packageName: string, destinationDirectory: string, - options?: IPacoteExtractOptions + options?: IPacoteExtractOptions, ): Promise { // strip: Remove the specified number of leading path elements. Pathnames with fewer elements will be silently skipped. More info: https://github.com/npm/node-tar/blob/e89c4d37519b1c20133a9f49d5f6b85fa34c203b/README.md // C: Create an archive this.$logger.trace( - `Calling pacoteService.extractPackage for packageName: '${packageName}', destinationDir: '${destinationDirectory}' and options: ${options}` + `Calling pacoteService.extractPackage for packageName: '${packageName}', destinationDir: '${destinationDirectory}' and options: ${options}`, ); const extractOptions = { strip: 1, C: destinationDirectory }; if (options) { @@ -72,14 +72,14 @@ export class PacoteService implements IPacoteService { return new Promise(async (resolve, reject) => { this.$logger.trace( - `Calling pacoteService.extractPackage for packageName: '${packageName}', destinationDir: '${destinationDirectory}' and options: ${options}` + `Calling pacoteService.extractPackage for packageName: '${packageName}', destinationDir: '${destinationDirectory}' and options: ${options}`, ); const source = await pacote .tarball(packageName, pacoteOptions) .catch((err: Error) => { this.$logger.trace( - `Error in source while trying to extract stream from ${packageName}. Error is ${err}` + `Error in source while trying to extract stream from ${packageName}. Error is ${err}`, ); reject(err); }); @@ -88,8 +88,8 @@ export class PacoteService implements IPacoteService { `Creating extract tar stream with options: ${JSON.stringify( extractOptions, null, - 2 - )}` + 2, + )}`, ); const destination = tar.x(extractOptions); // Initiate the source @@ -99,14 +99,14 @@ export class PacoteService implements IPacoteService { destination.on("error", (err: Error) => { this.$logger.trace( - `Error in destination while trying to extract stream from ${packageName}. Error is ${err}` + `Error in destination while trying to extract stream from ${packageName}. Error is ${err}`, ); reject(err); }); destination.on("finish", () => { this.$logger.trace( - `Successfully extracted '${packageName}' to ${destinationDirectory}` + `Successfully extracted '${packageName}' to ${destinationDirectory}`, ); resolve(); }); @@ -114,7 +114,7 @@ export class PacoteService implements IPacoteService { } private async getPacoteBaseOptions(): Promise { - // In case `tns create myapp --template https://github.com/NativeScript/template-hello-world.git` command is executed, pacote module throws an error if cache option is not provided. + // In case `ns create myapp --template https://github.com/NativeScript/template-hello-world.git` command is executed, pacote module throws an error if cache option is not provided. const cachePath = await this.$packageManager.getCachePath(); // Add NPM Configuration to our Manifest options @@ -131,7 +131,7 @@ export class PacoteService implements IPacoteService { private getRealPackageName(packageName: string): string { if (this.$fs.exists(packageName)) { this.$logger.trace( - `Will resolve the full path to package ${packageName}.` + `Will resolve the full path to package ${packageName}.`, ); packageName = path.resolve(packageName); } diff --git a/lib/services/plugins-service.ts b/lib/services/plugins-service.ts index e9b5e6a54c..2fadc8fe16 100644 --- a/lib/services/plugins-service.ts +++ b/lib/services/plugins-service.ts @@ -624,7 +624,7 @@ This framework comes from ${dependencyName} plugin, which is installed multiple projectDir: string ): IPluginData { try { - const pluginData: any = {}; + const pluginData: IPluginData = {}; pluginData.name = cacheData.name; pluginData.version = cacheData.version; pluginData.fullPath = @@ -648,6 +648,7 @@ This framework comes from ${dependencyName} plugin, which is installed multiple if (pluginData.isPlugin) { pluginData.platformsData = data.platforms; pluginData.pluginVariables = data.variables; + pluginData.nativescript = data; } return pluginData; } catch (err) { diff --git a/lib/services/temp-service.ts b/lib/services/temp-service.ts index 988fe8a8c0..f82af5efdd 100644 --- a/lib/services/temp-service.ts +++ b/lib/services/temp-service.ts @@ -1,22 +1,39 @@ -import * as temp from "temp"; +import * as fs from "fs"; +import * as path from "path"; +import { tmpdir } from "os"; import { ICleanupService } from "../definitions/cleanup-service"; import { injector } from "../common/yok"; -import { AffixOptions } from "temp"; import { ITempService } from "../definitions/temp-service"; +type TempAffixOptions = { + prefix?: string; + suffix?: string; + dir?: string; +}; + export class TempService implements ITempService { constructor(private $cleanupService: ICleanupService) { - temp.track(); + // no-op } - public async mkdirSync(affixes: string | AffixOptions): Promise { - const pathToDir = temp.mkdirSync(affixes); + public async mkdirSync(affixes: string | TempAffixOptions): Promise { + const opts = typeof affixes === "string" ? { prefix: affixes } : affixes; + const baseDir = opts?.dir ? opts.dir : tmpdir(); + const prefix = (opts?.prefix ?? "ns-").replace(/\s+/g, "-"); + // fs.mkdtempSync requires the full path prefix + const pathToDir = fs.mkdtempSync(path.join(baseDir, prefix)); await this.$cleanupService.addCleanupDeleteAction(pathToDir); return pathToDir; } - public async path(options: string | AffixOptions): Promise { - const pathToFile = temp.path(options); + public async path(options: string | TempAffixOptions): Promise { + const opts = typeof options === "string" ? { prefix: options } : options; + const baseDir = opts?.dir ? opts.dir : tmpdir(); + const prefix = (opts?.prefix ?? "ns-").replace(/\s+/g, "-"); + const suffix = opts?.suffix ?? ""; + const unique = Math.random().toString(36).slice(2); + const filePath = path.join(baseDir, `${prefix}${unique}${suffix}`); + const pathToFile = filePath; await this.$cleanupService.addCleanupDeleteAction(pathToFile); return pathToFile; } diff --git a/lib/tools/config-manipulation/config-transformer.ts b/lib/tools/config-manipulation/config-transformer.ts index 6430ef7b0e..50f926a530 100644 --- a/lib/tools/config-manipulation/config-transformer.ts +++ b/lib/tools/config-manipulation/config-transformer.ts @@ -184,26 +184,56 @@ export class ConfigTransformer implements IConfigTransformer { return `{}`; } + private isBooleanLiteralNode(initializer: any): boolean { + return ( + initializer?.getKind() === SyntaxKind.TrueKeyword || + initializer?.getKind() === SyntaxKind.FalseKeyword + ); + } + + private replaceInitializer( + initializer: any, + newValue: SupportedConfigValues, + ) { + return initializer.replaceWithText(this.createInitializer(newValue)); + } + private setInitializerValue( initializer: any, newValue: SupportedConfigValues, ) { if (Node.isStringLiteral(initializer)) { + if (typeof newValue !== "string") { + return this.replaceInitializer(initializer, newValue); + } return (initializer as StringLiteral).setLiteralValue(newValue as string); } if (Node.isNumericLiteral(initializer)) { + if (typeof newValue !== "number") { + return this.replaceInitializer(initializer, newValue); + } return (initializer as NumericLiteral).setLiteralValue( newValue as number, ); } - if (Node.isBooleanKeyword(initializer)) { + if (this.isBooleanLiteralNode(initializer)) { + if (typeof newValue !== "boolean") { + return this.replaceInitializer(initializer, newValue); + } return (initializer as BooleanLiteral).setLiteralValue( newValue as boolean, ); } + if ( + Node.isArrayLiteralExpression(initializer) || + Node.isObjectLiteralExpression(initializer) + ) { + return this.replaceInitializer(initializer, newValue); + } + if (Node.isIdentifier(initializer)) { return this.setIdentifierValue(initializer as Identifier, newValue); } @@ -211,7 +241,7 @@ export class ConfigTransformer implements IConfigTransformer { throw new Error("Unsupported value type: " + initializer.getKindName()); } - private getInitializerValue(initializer: any) { + private getInitializerValue(initializer: any): any { if (Node.isStringLiteral(initializer)) { return (initializer as StringLiteral).getLiteralValue(); } @@ -220,10 +250,30 @@ export class ConfigTransformer implements IConfigTransformer { return (initializer as NumericLiteral).getLiteralValue(); } - if (Node.isBooleanKeyword(initializer)) { + if (this.isBooleanLiteralNode(initializer)) { return (initializer as BooleanLiteral).getLiteralValue(); } + if (Node.isArrayLiteralExpression(initializer)) { + return initializer + .getElements() + .map((element: any) => this.getInitializerValue(element)); + } + + if (Node.isObjectLiteralExpression(initializer)) { + const result: Record = {}; + for (const property of initializer.getProperties()) { + if (!Node.isPropertyAssignment(property)) { + continue; + } + const name = property.getNameNode().getText().replace(/['\"]/g, ""); + result[name] = this.getInitializerValue( + property.getInitializerOrThrow(), + ); + } + return result; + } + if (Node.isIdentifier(initializer)) { return this.getIdentifierValue(initializer as Identifier); } @@ -278,10 +328,30 @@ export class ConfigTransformer implements IConfigTransformer { return (initializer as NumericLiteral).getLiteralValue(); } - if (Node.isBooleanKeyword(initializer)) { + if (this.isBooleanLiteralNode(initializer)) { return (initializer as BooleanLiteral).getLiteralValue(); } + if (Node.isArrayLiteralExpression(initializer)) { + return initializer + .getElements() + .map((element: any) => this.getInitializerValue(element)); + } + + if (Node.isObjectLiteralExpression(initializer)) { + const result: Record = {}; + for (const property of initializer.getProperties()) { + if (!Node.isPropertyAssignment(property)) { + continue; + } + const name = property.getNameNode().getText().replace(/['\"]/g, ""); + result[name] = this.getInitializerValue( + property.getInitializerOrThrow(), + ); + } + return result; + } + if (Node.isIdentifier(initializer)) { return this.getIdentifierValue(initializer as Identifier); } diff --git a/package-lock.json b/package-lock.json index 1341cd2e72..a4e4386333 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,26 +1,24 @@ { "name": "nativescript", - "version": "8.9.1", + "version": "9.0.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "nativescript", - "version": "8.9.1", + "version": "9.0.6", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@foxt/js-srp": "^0.0.3-patch2", - "@nativescript/doctor": "2.0.16-rc.0", - "@npmcli/arborist": "^9.0.0", + "@foxt/js-srp": "0.0.3-patch2", + "@nativescript/doctor": "2.0.17", + "@nativescript/hook": "3.0.4", + "@npmcli/arborist": "9.1.8", + "@nstudio/trapezedev-project": "7.2.3", "@rigor789/resolve-package-path": "1.0.7", - "@rigor789/trapezedev-project": "7.1.2", - "ansi-colors": "^4.1.3", - "archiver": "^7.0.1", - "axios": "1.7.9", + "axios": "1.13.5", "byline": "5.0.0", - "chalk": "4.1.2", - "chokidar": "4.0.3", + "chokidar": "^3.6.0", "cli-table3": "0.6.5", "color": "4.2.3", "convert-source-map": "2.0.0", @@ -28,47 +26,46 @@ "email-validator": "2.0.4", "esprima": "4.0.1", "font-finder": "1.1.0", - "glob": "11.0.1", "ios-device-lib": "0.9.4", "ios-mobileprovision-finder": "1.2.1", - "ios-sim-portable": "4.5.0", + "ios-sim-portable": "4.5.1", "jimp": "1.6.0", - "lodash": "4.17.21", + "lodash": "4.17.23", "log4js": "6.9.1", - "marked": "15.0.7", + "marked": "15.0.12", "marked-terminal": "7.3.0", - "minimatch": "10.0.1", + "minimatch": "10.2.4", "mkdirp": "3.0.1", "mute-stream": "2.0.0", "nativescript-dev-xcode": "0.8.1", "open": "8.4.2", "ora": "5.4.1", - "pacote": "21.0.0", + "pacote": "21.0.4", "pbxproj-dom": "1.2.0", "plist": "3.1.0", "plist-merge-patch": "0.2.0", - "prettier": "3.5.2", + "prettier": "3.7.3", "prompts": "2.4.2", "proper-lockfile": "4.1.2", - "proxy-lib": "0.4.0", + "proxy-lib": "0.4.1", "qr-image": "3.2.0", "qrcode-terminal": "0.12.0", - "semver": "7.7.1", - "shelljs": "0.8.5", - "simple-git": "3.27.0", + "semver": "7.7.3", + "shelljs": "0.10.0", + "simple-git": "3.30.0", "simple-plist": "1.4.0", - "source-map": "0.7.4", - "tar": "7.4.3", - "temp": "0.9.4", + "source-map": "0.7.6", + "tar": "7.5.9", "ts-morph": "25.0.1", "tunnel": "0.0.6", "typescript": "5.7.3", "universal-analytics": "0.5.3", "uuid": "11.1.0", "winreg": "1.2.5", - "ws": "8.18.1", + "ws": "8.18.3", "xml2js": "0.6.2", - "yargs": "17.7.2" + "yargs": "17.7.2", + "yazl": "^3.3.1" }, "bin": { "nativescript": "bin/tns", @@ -77,14 +74,12 @@ "tns": "bin/tns" }, "devDependencies": { - "@types/archiver": "^6.0.3", "@types/byline": "^4.2.36", - "@types/chai": "5.0.1", - "@types/chai-as-promised": "8.0.1", + "@types/chai": "5.2.2", + "@types/chai-as-promised": "8.0.2", "@types/color": "4.2.0", "@types/convert-source-map": "2.0.3", - "@types/glob": "^8.1.0", - "@types/lodash": "4.17.15", + "@types/lodash": "4.17.23", "@types/marked-terminal": "^6.1.1", "@types/node": "^22.0.0", "@types/npmcli__arborist": "^6.3.0", @@ -94,21 +89,23 @@ "@types/proper-lockfile": "4.1.4", "@types/qr-image": "3.2.9", "@types/retry": "0.12.5", - "@types/semver": "7.5.8", + "@types/semver": "7.7.1", "@types/shelljs": "^0.8.11", "@types/sinon": "^17.0.3", "@types/tabtab": "^3.0.2", "@types/tar": "6.1.13", - "@types/temp": "0.9.4", "@types/tunnel": "0.0.7", "@types/universal-analytics": "0.4.8", "@types/uuid": "^10.0.0", - "@types/ws": "8.5.14", + "@types/ws": "8.18.1", "@types/xml2js": "0.4.14", "@types/yargs": "17.0.33", - "chai": "5.2.0", - "chai-as-promised": "8.0.1", + "@types/yazl": "^3.3.0", + "braces": ">=3.0.3", + "chai": "5.3.3", + "chai-as-promised": "8.0.2", "conventional-changelog-cli": "^5.0.0", + "fast-check": "3.23.2", "grunt": "1.6.1", "grunt-contrib-clean": "2.0.1", "grunt-contrib-copy": "1.0.0", @@ -118,11 +115,11 @@ "grunt-ts": "6.0.0-beta.22", "husky": "9.1.7", "istanbul": "0.4.5", - "latest-version": "9.0.0", - "lint-staged": "~15.4.3", - "mocha": "11.1.0", - "sinon": "19.0.2", - "source-map-support": "0.5.21" + "lint-staged": "~15.5.2", + "mocha": "11.7.5", + "sinon": "19.0.5", + "source-map-support": "0.5.21", + "xml2js": ">=0.5.0" }, "engines": { "node": ">=20.0.0" @@ -132,23 +129,25 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", + "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "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" @@ -164,6 +163,33 @@ "node": ">=0.1.90" } }, + "node_modules/@conventional-changelog/git-client": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@conventional-changelog/git-client/-/git-client-2.5.1.tgz", + "integrity": "sha512-lAw7iA5oTPWOLjiweb7DlGEMDEvzqzLLa6aWOly2FSZ64IwLE8T458rC+o+WvI31Doz6joM7X2DoNog7mX8r4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@simple-libs/child-process-utils": "^1.0.0", + "@simple-libs/stream-utils": "^1.1.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "conventional-commits-filter": "^5.0.0", + "conventional-commits-parser": "^6.1.0" + }, + "peerDependenciesMeta": { + "conventional-commits-filter": { + "optional": true + }, + "conventional-commits-parser": { + "optional": true + } + } + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -182,13 +208,26 @@ "integrity": "sha512-mCjMIf+/mwmuzSGr8CWWQDjDUqMBnw9TBnzfcBUTR2ySPoXcg6Pfb4/WPklY1TwY3Pe3f3r8q6hzWvvogInuug==", "license": "ISC" }, + "node_modules/@gar/promise-retry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@gar/promise-retry/-/promise-retry-1.0.2.tgz", + "integrity": "sha512-Lm/ZLhDZcBECta3TmCQSngiQykFdfw+QtI1/GYMsZd4l3nG+P8WLB16XuS7WaBGLQ+9E+cOcWQsth9cayuGt8g==", + "license": "MIT", + "dependencies": { + "retry": "^0.13.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, "node_modules/@hutson/parse-repository-url": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", - "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-5.0.0.tgz", + "integrity": "sha512-e5+YUKENATs1JgYHMzTr2MW/NDcXGfYFAuOQU8gJgF/kEh4EqKgfGrfLI67bMD4tbhZVlkigz/9YYwWcbOFthg==", + "dev": true, "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" + "node": ">=10.13.0" } }, "node_modules/@ionic/utils-array": { @@ -302,87 +341,12 @@ } }, "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-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "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.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "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" - }, + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-9.0.0.tgz", + "integrity": "sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==", + "license": "BlueOak-1.0.0", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=18" } }, "node_modules/@isaacs/fs-minipass": { @@ -397,15 +361,6 @@ "node": ">=18.0.0" } }, - "node_modules/@isaacs/fs-minipass/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/@isaacs/string-locale-compare": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz", @@ -834,9 +789,9 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { @@ -865,23 +820,28 @@ "license": "MIT" }, "node_modules/@nativescript/doctor": { - "version": "2.0.16-rc.0", - "resolved": "https://registry.npmjs.org/@nativescript/doctor/-/doctor-2.0.16-rc.0.tgz", - "integrity": "sha512-ZZ85tIH56vRyt9A4NpFeKGgCGX5B312HgdvUNNWoxzGI7DzpRfB2E/niu6pF7ejvpyFGXVLntisL0f/XX69E7g==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@nativescript/doctor/-/doctor-2.0.17.tgz", + "integrity": "sha512-+S3nL9/OwsrQ75MkolXtLYOuzzjc2W9EEqys7hg8FLFJbcQc47TYmpGLf/v7bdwx6Rh8G3HTcKy0QSkjInL1WQ==", "license": "Apache-2.0", "dependencies": { "lodash": "4.17.21", - "semver": "7.6.3", - "shelljs": "0.8.5", - "temp": "0.9.4", + "semver": "7.7.2", + "shelljs": "0.10.0", "winreg": "1.2.5", "yauzl": "3.2.0" } }, + "node_modules/@nativescript/doctor/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/@nativescript/doctor/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -890,6 +850,16 @@ "node": ">=10" } }, + "node_modules/@nativescript/hook": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@nativescript/hook/-/hook-3.0.4.tgz", + "integrity": "sha512-oahiN7V0D+fgl9o8mjGRgExujTpgSBB0DAFr3eX91qdlJZV8ywJ6mnvtHZyEI2j46yPgAE8jmNIw/Z/d3aWetw==", + "license": "Apache-2.0", + "dependencies": { + "glob": "^11.0.0", + "mkdirp": "^3.0.1" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -933,59 +903,58 @@ "license": "MIT" }, "node_modules/@npmcli/agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", - "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-4.0.0.tgz", + "integrity": "sha512-kAQTcEN9E8ERLVg5AsGwLNoFb+oEG6engbqAU2P43gD4JEIkNGMHdVQ096FsOAAYpZPB0RSt0zgInKIAS1l5QA==", "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", + "lru-cache": "^11.2.1", "socks-proxy-agent": "^8.0.3" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/arborist": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-9.0.0.tgz", - "integrity": "sha512-ZFsI/VJ7wJ2rTksLNJ9xqr75Ste/wiKvW+7w12ZGbcT67xWii97yS+aDlh3edNhqlqoXvdzYG4hTNui81VxJCA==", + "version": "9.1.8", + "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-9.1.8.tgz", + "integrity": "sha512-TYAzq0oaXQU+uLfXFbR2wYx62qHIOSg/TYhGWJSphJDypyjdNXC7B/+k29ElC2vWlWfX4OJnhmSY5DTwSFiNpg==", "license": "ISC", "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/fs": "^4.0.0", - "@npmcli/installed-package-contents": "^3.0.0", - "@npmcli/map-workspaces": "^4.0.1", - "@npmcli/metavuln-calculator": "^9.0.0", - "@npmcli/name-from-folder": "^3.0.0", - "@npmcli/node-gyp": "^4.0.0", - "@npmcli/package-json": "^6.0.1", - "@npmcli/query": "^4.0.0", - "@npmcli/redact": "^3.0.0", - "@npmcli/run-script": "^9.0.1", - "bin-links": "^5.0.0", - "cacache": "^19.0.1", + "@npmcli/fs": "^5.0.0", + "@npmcli/installed-package-contents": "^4.0.0", + "@npmcli/map-workspaces": "^5.0.0", + "@npmcli/metavuln-calculator": "^9.0.2", + "@npmcli/name-from-folder": "^4.0.0", + "@npmcli/node-gyp": "^5.0.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/query": "^5.0.0", + "@npmcli/redact": "^4.0.0", + "@npmcli/run-script": "^10.0.0", + "bin-links": "^6.0.0", + "cacache": "^20.0.1", "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^8.0.0", + "hosted-git-info": "^9.0.0", "json-stringify-nice": "^1.1.4", - "lru-cache": "^10.2.2", - "minimatch": "^9.0.4", - "nopt": "^8.0.0", - "npm-install-checks": "^7.1.0", - "npm-package-arg": "^12.0.0", - "npm-pick-manifest": "^10.0.0", - "npm-registry-fetch": "^18.0.1", - "pacote": "^21.0.0", - "parse-conflict-json": "^4.0.0", - "proc-log": "^5.0.0", - "proggy": "^3.0.0", + "lru-cache": "^11.2.1", + "minimatch": "^10.0.3", + "nopt": "^9.0.0", + "npm-install-checks": "^8.0.0", + "npm-package-arg": "^13.0.0", + "npm-pick-manifest": "^11.0.1", + "npm-registry-fetch": "^19.0.0", + "pacote": "^21.0.2", + "parse-conflict-json": "^5.0.1", + "proc-log": "^6.0.0", + "proggy": "^4.0.0", "promise-all-reject-late": "^1.0.0", "promise-call-limit": "^3.0.1", - "read-package-json-fast": "^4.0.0", "semver": "^7.3.7", - "ssri": "^12.0.0", + "ssri": "^13.0.0", "treeverse": "^3.0.0", "walk-up-path": "^4.0.0" }, @@ -996,168 +965,95 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@npmcli/arborist/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/@npmcli/fs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", - "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-5.0.0.tgz", + "integrity": "sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og==", "license": "ISC", "dependencies": { "semver": "^7.3.5" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/git": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-6.0.3.tgz", - "integrity": "sha512-GUYESQlxZRAdhs3UhbB6pVRNUELQOHXwK9ruDkwmCv2aZ5y0SApQzUJCg02p3A7Ue2J5hxvlk1YI53c00NmRyQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-7.0.2.tgz", + "integrity": "sha512-oeolHDjExNAJAnlYP2qzNjMX/Xi9bmu78C9dIGr4xjobrSKbuMYCph8lTzn4vnW3NjIqVmw/f8BCfouqyJXlRg==", "license": "ISC", "dependencies": { - "@npmcli/promise-spawn": "^8.0.0", - "ini": "^5.0.0", - "lru-cache": "^10.0.1", - "npm-pick-manifest": "^10.0.0", - "proc-log": "^5.0.0", - "promise-retry": "^2.0.1", + "@gar/promise-retry": "^1.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "ini": "^6.0.0", + "lru-cache": "^11.2.1", + "npm-pick-manifest": "^11.0.1", + "proc-log": "^6.0.0", "semver": "^7.3.5", - "which": "^5.0.0" + "which": "^6.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/installed-package-contents": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-3.0.0.tgz", - "integrity": "sha512-fkxoPuFGvxyrH+OQzyTkX2LUEamrF4jZSmxjAtPPHHGO0dqsQ8tTKjnIS8SAnPHdk2I03BDtSMR5K/4loKg79Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-4.0.0.tgz", + "integrity": "sha512-yNyAdkBxB72gtZ4GrwXCM0ZUedo9nIbOMKfGjt6Cu6DXf0p8y1PViZAKDC8q8kv/fufx0WTjRBdSlyrvnP7hmA==", "license": "ISC", "dependencies": { - "npm-bundled": "^4.0.0", - "npm-normalize-package-bin": "^4.0.0" + "npm-bundled": "^5.0.0", + "npm-normalize-package-bin": "^5.0.0" }, "bin": { "installed-package-contents": "bin/index.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/map-workspaces": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-4.0.2.tgz", - "integrity": "sha512-mnuMuibEbkaBTYj9HQ3dMe6L0ylYW+s/gfz7tBDMFY/la0w9Kf44P9aLn4/+/t3aTR3YUHKoT6XQL9rlicIe3Q==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-5.0.3.tgz", + "integrity": "sha512-o2grssXo1e774E5OtEwwrgoszYRh0lqkJH+Pb9r78UcqdGJRDRfhpM8DvZPjzNLLNYeD/rNbjOKM3Ss5UABROw==", "license": "ISC", "dependencies": { - "@npmcli/name-from-folder": "^3.0.0", - "@npmcli/package-json": "^6.0.0", - "glob": "^10.2.2", - "minimatch": "^9.0.0" + "@npmcli/name-from-folder": "^4.0.0", + "@npmcli/package-json": "^7.0.0", + "glob": "^13.0.0", + "minimatch": "^10.0.3" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/map-workspaces/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "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/map-workspaces/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/@npmcli/map-workspaces/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/@npmcli/map-workspaces/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/@npmcli/map-workspaces/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==", + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", "license": "BlueOak-1.0.0", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@npmcli/metavuln-calculator": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-9.0.0.tgz", - "integrity": "sha512-znLKqdy1ZEGNK3VB9j/RzGyb/P0BJb3fGpvEbHIAyBAXsps2l1ce8SVHfsGAFLl9s8072PxafqTn7RC8wSnQPg==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-9.0.3.tgz", + "integrity": "sha512-94GLSYhLXF2t2LAC7pDwLaM4uCARzxShyAQKsirmlNcpidH89VA4/+K1LbJmRMgz5gy65E/QBBWQdUvGLe2Frg==", "license": "ISC", "dependencies": { - "cacache": "^19.0.0", - "json-parse-even-better-errors": "^4.0.0", + "cacache": "^20.0.0", + "json-parse-even-better-errors": "^5.0.0", "pacote": "^21.0.0", - "proc-log": "^5.0.0", + "proc-log": "^6.0.0", "semver": "^7.3.5" }, "engines": { @@ -1165,250 +1061,118 @@ } }, "node_modules/@npmcli/name-from-folder": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-3.0.0.tgz", - "integrity": "sha512-61cDL8LUc9y80fXn+lir+iVt8IS0xHqEKwPu/5jCjxQTVoSCmkXvw4vbMrzAMtmghz3/AkiBjhHkDKUH+kf7kA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-4.0.0.tgz", + "integrity": "sha512-qfrhVlOSqmKM8i6rkNdZzABj8MKEITGFAY+4teqBziksCQAOLutiAxM1wY2BKEd8KjUSpWmWCYxvXr0y4VTlPg==", "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/node-gyp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-4.0.0.tgz", - "integrity": "sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-5.0.0.tgz", + "integrity": "sha512-uuG5HZFXLfyFKqg8QypsmgLQW7smiRjVc45bqD/ofZZcR/uxEjgQU8qDPv0s9TEeMUiAAU/GC5bR6++UdTirIQ==", "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/package-json": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.1.1.tgz", - "integrity": "sha512-d5qimadRAUCO4A/Txw71VM7UrRZzV+NPclxz/dc+M6B2oYwjWTjqh8HA/sGQgs9VZuJ6I/P7XIAlJvgrl27ZOw==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-7.0.5.tgz", + "integrity": "sha512-iVuTlG3ORq2iaVa1IWUxAO/jIp77tUKBhoMjuzYW2kL4MLN1bi/ofqkZ7D7OOwh8coAx1/S2ge0rMdGv8sLSOQ==", "license": "ISC", "dependencies": { - "@npmcli/git": "^6.0.0", - "glob": "^10.2.2", - "hosted-git-info": "^8.0.0", - "json-parse-even-better-errors": "^4.0.0", - "proc-log": "^5.0.0", + "@npmcli/git": "^7.0.0", + "glob": "^13.0.0", + "hosted-git-info": "^9.0.0", + "json-parse-even-better-errors": "^5.0.0", + "proc-log": "^6.0.0", "semver": "^7.5.3", - "validate-npm-package-license": "^3.0.4" + "spdx-expression-parse": "^4.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/package-json/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "license": "ISC", + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "license": "BlueOak-1.0.0", "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" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, - "bin": { - "glob": "dist/esm/bin.mjs" + "engines": { + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@npmcli/package-json/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", + "node_modules/@npmcli/promise-spawn": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-9.0.1.tgz", + "integrity": "sha512-OLUaoqBuyxeTqUvjA3FZFiXUfYC1alp3Sa99gW3EUDz3tZ3CbXDdcZ7qWKBzicrJleIgucoWamWH1saAmH/l2Q==", + "license": "ISC", "dependencies": { - "@isaacs/cliui": "^8.0.2" + "which": "^6.0.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@npmcli/package-json/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "node_modules/@npmcli/query": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/query/-/query-5.0.0.tgz", + "integrity": "sha512-8TZWfTQOsODpLqo9SVhVjHovmKXNpevHU0gO9e+y4V4fRIOneiXy0u0sMP9LmS71XivrEWfZWg50ReH4WRT4aQ==", "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/package-json/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/@npmcli/package-json/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/@npmcli/promise-spawn": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-8.0.2.tgz", - "integrity": "sha512-/bNJhjc+o6qL+Dwz/bqfTQClkEO5nTQ1ZEcdCkAQjhkZMHIh22LPG7fNh1enJP1NKWDqYiiABnjFCY7E0zHYtQ==", - "license": "ISC", - "dependencies": { - "which": "^5.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/query": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/query/-/query-4.0.0.tgz", - "integrity": "sha512-3pPbese0fbCiFJ/7/X1GBgxAKYFE8sxBddA7GtuRmOgNseH4YbGsXJ807Ig3AEwNITjDUISHglvy89cyDJnAwA==", - "license": "ISC", - "dependencies": { - "postcss-selector-parser": "^6.1.2" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/redact": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.1.1.tgz", - "integrity": "sha512-3Hc2KGIkrvJWJqTbvueXzBeZlmvoOxc2jyX00yzr3+sNFquJg0N8hH4SAPLPVrkWIRQICVpVgjrss971awXVnA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-4.0.0.tgz", + "integrity": "sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q==", "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/run-script": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-9.0.2.tgz", - "integrity": "sha512-cJXiUlycdizQwvqE1iaAb4VRUM3RX09/8q46zjvy+ct9GhfZRWd7jXYVc1tn/CfRlGPVkX/u4sstRlepsm7hfw==", + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-10.0.4.tgz", + "integrity": "sha512-mGUWr1uMnf0le2TwfOZY4SFxZGXGfm4Jtay/nwAa2FLNAKXUoUwaGwBMNH36UHPtinWfTSJ3nqFQr0091CxVGg==", "license": "ISC", "dependencies": { - "@npmcli/node-gyp": "^4.0.0", - "@npmcli/package-json": "^6.0.0", - "@npmcli/promise-spawn": "^8.0.0", - "node-gyp": "^11.0.0", - "proc-log": "^5.0.0", - "which": "^5.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "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/@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "4.2.10" - }, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true, - "license": "ISC" - }, - "node_modules/@pnpm/npm-conf": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", - "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" + "@npmcli/node-gyp": "^5.0.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "node-gyp": "^12.1.0", + "proc-log": "^6.0.0" }, "engines": { - "node": ">=12" - } - }, - "node_modules/@prettier/plugin-xml": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@prettier/plugin-xml/-/plugin-xml-2.2.0.tgz", - "integrity": "sha512-UWRmygBsyj4bVXvDiqSccwT1kmsorcwQwaIy30yVh8T+Gspx4OlC0shX1y+ZuwXZvgnafmpRYKks0bAu9urJew==", - "license": "MIT", - "dependencies": { - "@xml-tools/parser": "^1.0.11", - "prettier": ">=2.4.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@rigor789/resolve-package-path": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@rigor789/resolve-package-path/-/resolve-package-path-1.0.7.tgz", - "integrity": "sha512-/JqGCvHpj0PxS9cyZPP5LpiEy1pYszgWor/JTyreHQwLPQQdxO1mUYTtRribYcVosxH7FFs0GJBtJ652nlwKyw==", - "license": "MIT" - }, - "node_modules/@rigor789/trapezedev-project": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@rigor789/trapezedev-project/-/trapezedev-project-7.1.2.tgz", - "integrity": "sha512-eFnyKmQD73uB+CA+mg2YODFM6EAlUV/ub57UnRAI9QmpsXZnPedbJH698hjWm5g6+KuR8La9rg4sxBEexPG6Ow==", + "node_modules/@nstudio/trapezedev-project": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@nstudio/trapezedev-project/-/trapezedev-project-7.2.3.tgz", + "integrity": "sha512-EIxEGjwPeMfBVkxvRvf8GY+pD3lfu8CP2sh/AD5eV4fgW/gpgRYE9WKbW4QJLj7WIRgQbn6Oos9NXq1OfTmzhA==", "license": "SEE LICENSE", "dependencies": { "@ionic/utils-fs": "^3.1.5", "@ionic/utils-subprocess": "^2.1.8", "@prettier/plugin-xml": "^2.2.0", - "@trapezedev/gradle-parse": "7.0.10", - "@xmldom/xmldom": "^0.7.5", - "conventional-changelog": "^3.1.4", - "cross-fetch": "^3.1.5", + "@trapezedev/gradle-parse": "7.1.3", + "@xmldom/xmldom": "^0.8.11", "cross-spawn": "^7.0.3", "diff": "^5.1.0", "env-paths": "^3.0.0", @@ -1416,13 +1180,10 @@ "ini": "^2.0.0", "kleur": "^4.1.5", "lodash": "^4.17.21", - "mergexml": "^1.2.3", - "npm-watch": "^0.11.0", "plist": "^3.0.4", "prettier": "^2.7.1", "prompts": "^2.4.2", "replace": "^1.1.0", - "tempy": "^1.0.1", "tmp": "^0.2.1", "ts-node": "^10.2.1", "xcode": "^3.0.1", @@ -1431,7 +1192,7 @@ "yargs": "^17.2.1" } }, - "node_modules/@rigor789/trapezedev-project/node_modules/ini": { + "node_modules/@nstudio/trapezedev-project/node_modules/ini": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", @@ -1440,7 +1201,7 @@ "node": ">=10" } }, - "node_modules/@rigor789/trapezedev-project/node_modules/prettier": { + "node_modules/@nstudio/trapezedev-project/node_modules/prettier": { "version": "2.8.8", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", @@ -1455,78 +1216,138 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "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==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@prettier/plugin-xml": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@prettier/plugin-xml/-/plugin-xml-2.2.0.tgz", + "integrity": "sha512-UWRmygBsyj4bVXvDiqSccwT1kmsorcwQwaIy30yVh8T+Gspx4OlC0shX1y+ZuwXZvgnafmpRYKks0bAu9urJew==", + "license": "MIT", + "dependencies": { + "@xml-tools/parser": "^1.0.11", + "prettier": ">=2.4.0" + } + }, + "node_modules/@rigor789/resolve-package-path": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@rigor789/resolve-package-path/-/resolve-package-path-1.0.7.tgz", + "integrity": "sha512-/JqGCvHpj0PxS9cyZPP5LpiEy1pYszgWor/JTyreHQwLPQQdxO1mUYTtRribYcVosxH7FFs0GJBtJ652nlwKyw==", + "license": "MIT" + }, "node_modules/@sigstore/bundle": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.1.0.tgz", - "integrity": "sha512-Mm1E3/CmDDCz3nDhFKTuYdB47EdRFRQMOE/EAbiG1MJW77/w1b3P7Qx7JSrVJs8PfwOLOVcKQCHErIwCTyPbag==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-4.0.0.tgz", + "integrity": "sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A==", "license": "Apache-2.0", "dependencies": { - "@sigstore/protobuf-specs": "^0.4.0" + "@sigstore/protobuf-specs": "^0.5.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@sigstore/core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-2.0.0.tgz", - "integrity": "sha512-nYxaSb/MtlSI+JWcwTHQxyNmWeWrUXJJ/G4liLrGG7+tS4vAz6LF3xRXqLH6wPIVUoZQel2Fs4ddLx4NCpiIYg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-3.1.0.tgz", + "integrity": "sha512-o5cw1QYhNQ9IroioJxpzexmPjfCe7gzafd2RY3qnMpxr4ZEja+Jad/U8sgFpaue6bOaF+z7RVkyKVV44FN+N8A==", "license": "Apache-2.0", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@sigstore/protobuf-specs": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.4.0.tgz", - "integrity": "sha512-o09cLSIq9EKyRXwryWDOJagkml9XgQCoCSRjHOnHLnvsivaW7Qznzz6yjfV7PHJHhIvyp8OH7OX8w0Dc5bQK7A==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.5.0.tgz", + "integrity": "sha512-MM8XIwUjN2bwvCg1QvrMtbBmpcSHrkhFSCu1D11NyPvDQ25HEc4oG5/OcQfd/Tlf/OxmKWERDj0zGE23jQaMwA==", "license": "Apache-2.0", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@sigstore/sign": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.1.0.tgz", - "integrity": "sha512-knzjmaOHOov1Ur7N/z4B1oPqZ0QX5geUfhrVaqVlu+hl0EAoL4o+l0MSULINcD5GCWe3Z0+YJO8ues6vFlW0Yw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-4.1.0.tgz", + "integrity": "sha512-Vx1RmLxLGnSUqx/o5/VsCjkuN5L7y+vxEEwawvc7u+6WtX2W4GNa7b9HEjmcRWohw/d6BpATXmvOwc78m+Swdg==", "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^3.1.0", - "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.4.0", - "make-fetch-happen": "^14.0.2", - "proc-log": "^5.0.0", + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.1.0", + "@sigstore/protobuf-specs": "^0.5.0", + "make-fetch-happen": "^15.0.3", + "proc-log": "^6.1.0", "promise-retry": "^2.0.1" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@sigstore/tuf": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.1.0.tgz", - "integrity": "sha512-suVMQEA+sKdOz5hwP9qNcEjX6B45R+hFFr4LAWzbRc5O+U2IInwvay/bpG5a4s+qR35P/JK/PiKiRGjfuLy1IA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-4.0.1.tgz", + "integrity": "sha512-OPZBg8y5Vc9yZjmWCHrlWPMBqW5yd8+wFNl+thMdtcWz3vjVSoJQutF8YkrzI0SLGnkuFof4HSsWUhXrf219Lw==", "license": "Apache-2.0", "dependencies": { - "@sigstore/protobuf-specs": "^0.4.0", - "tuf-js": "^3.0.1" + "@sigstore/protobuf-specs": "^0.5.0", + "tuf-js": "^4.1.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@sigstore/verify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.1.0.tgz", - "integrity": "sha512-kAAM06ca4CzhvjIZdONAL9+MLppW3K48wOFy1TbuaWFW/OMfl8JuTgW0Bm02JB1WJGT/ET2eqav0KTEKmxqkIA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-3.1.0.tgz", + "integrity": "sha512-mNe0Iigql08YupSOGv197YdHpPPr+EzDZmfCgMc7RPNaZTw5aLN01nBl6CHJOh3BGtnMIj83EeN4butBchc8Ag==", "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^3.1.0", - "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.4.0" + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.1.0", + "@sigstore/protobuf-specs": "^0.5.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@simple-libs/child-process-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@simple-libs/child-process-utils/-/child-process-utils-1.0.1.tgz", + "integrity": "sha512-3nWd8irxvDI6v856wpPCHZ+08iQR0oHTZfzAZmnbsLzf+Sf1odraP6uKOHDZToXq3RPRV/LbqGVlSCogm9cJjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@simple-libs/stream-utils": "^1.1.0", + "@types/node": "^22.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://ko-fi.com/dangreen" + } + }, + "node_modules/@simple-libs/stream-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@simple-libs/stream-utils/-/stream-utils-1.1.0.tgz", + "integrity": "sha512-6rsHTjodIn/t90lv5snQjRPVtOosM7Vp0AKdrObymq45ojlgVwnpAqdc+0OBBrpEiy31zZ6/TKeIVqV1HwvnuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^22.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://ko-fi.com/dangreen" } }, "node_modules/@sindresorhus/is": { @@ -1562,14 +1383,13 @@ } }, "node_modules/@sinonjs/samsam": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.2.tgz", - "integrity": "sha512-v46t/fwnhejRSFTGqbpn9u+LQ9xJDse10gNnPgAcxgdoCDMXj/G2asWAC/8Qs+BAZDicX+MNZouXT1A7c83kVw==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.3.tgz", + "integrity": "sha512-hw6HbX+GyVZzmaYNh82Ecj1vdGZrqVIn/keDTg63IgAwiQPO+xCz99uG6Woqgb4tM0mUiFENKZ4cqd7IX94AXQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.1", - "lodash.get": "^4.4.2", "type-detect": "^4.1.0" } }, @@ -1597,9 +1417,9 @@ "license": "MIT" }, "node_modules/@trapezedev/gradle-parse": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/@trapezedev/gradle-parse/-/gradle-parse-7.0.10.tgz", - "integrity": "sha512-k822Is3jGroqOTKF0gAFm80LmhFJWBAyZvNtyuXq6uQUzDDe2fj/gHwixP6VFzlpaWKLP7IuR609Xv8gwJCXyg==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@trapezedev/gradle-parse/-/gradle-parse-7.1.3.tgz", + "integrity": "sha512-WQVF5pEJ5o/mUyvfGTG9nBKx9Te/ilKM3r2IT69GlbaooItT5ao7RyF1MUTBNjHLPk/xpGUY3c6PyVnjDlz0Vw==", "license": "SEE LICENSE" }, "node_modules/@ts-morph/common": { @@ -1613,13 +1433,28 @@ "path-browserify": "^1.0.1" } }, + "node_modules/@ts-morph/common/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/@ts-morph/common/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/@ts-morph/common/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -1629,9 +1464,9 @@ } }, "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", + "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", "license": "MIT" }, "node_modules/@tsconfig/node12": { @@ -1662,41 +1497,16 @@ } }, "node_modules/@tufjs/models": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-3.0.1.tgz", - "integrity": "sha512-UUYHISyhCU3ZgN8yaear3cGATHb3SMuKHsQ/nVbHXcmnBf+LzQ/cQfhNG+rfaSHgqGKNEm2cOCLVLELStUQ1JA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-4.1.0.tgz", + "integrity": "sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww==", "license": "MIT", "dependencies": { "@tufjs/canonical-json": "2.0.0", - "minimatch": "^9.0.5" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@tufjs/models/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" + "minimatch": "^10.1.1" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@types/archiver": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/archiver/-/archiver-6.0.3.tgz", - "integrity": "sha512-a6wUll6k3zX6qs5KlxIggs1P1JcYJaTCx2gnlr+f0S1yd2DoaEwoIK10HmBaLnZwWneBz+JBm0dwcZu0zECBcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/readdir-glob": "*" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@types/byline": { @@ -1710,13 +1520,14 @@ } }, "node_modules/@types/cacache": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/@types/cacache/-/cacache-17.0.2.tgz", - "integrity": "sha512-IrqHzVX2VRMDQQKa7CtKRnuoCLdRJiLW6hWU+w7i7+AaQ0Ii5bKwJxd5uRK4zBCyrHd3tG6G8zOm2LplxbSfQg==", + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@types/cacache/-/cacache-20.0.1.tgz", + "integrity": "sha512-QlKW3AFoFr/hvPHwFHMIVUH/ZCYeetBNou3PCmxu5LaNDvrtBlPJtIA6uhmU9JRt9oxj7IYoqoLcpxtzpPiTcw==", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*" + "@types/node": "*", + "minipass": "*" } }, "node_modules/@types/cardinal": { @@ -1727,9 +1538,9 @@ "license": "MIT" }, "node_modules/@types/chai": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.0.1.tgz", - "integrity": "sha512-5T8ajsg3M/FOncpLYW7sdOcD6yf4+722sze/tc4KQV0P8Z2rAr3SAuHCIkYmYpt8VbcQlnz8SxlOlPQYefe4cA==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", + "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", "dev": true, "license": "MIT", "dependencies": { @@ -1737,9 +1548,9 @@ } }, "node_modules/@types/chai-as-promised": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-8.0.1.tgz", - "integrity": "sha512-dAlDhLjJlABwAVYObo9TPWYTRg9NaQM5CXeaeJYcYAkvzUf0JRLIiog88ao2Wqy/20WUnhbbUZcgvngEbJ3YXQ==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-8.0.2.tgz", + "integrity": "sha512-meQ1wDr1K5KRCSvG2lX7n7/5wf70BeptTKst0axGvnN6zqaVpRqegoIbugiAPSqOW9K9aL8gDVrm7a2LXOtn2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1796,21 +1607,10 @@ "@types/node": "*" } }, - "node_modules/@types/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/minimatch": "^5.1.2", - "@types/node": "*" - } - }, "node_modules/@types/lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-w/P33JFeySuhN6JLkysYUK2gEmy9kHHFN7E8ro0tkfmlDOgxBDzWEZ/J8cWA+fHqFevpswDTFZnDx+R9lbL6xw==", + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-RDvF6wTulMPjrNdCoYRC8gNR880JNGT8uB+REUpC2Ns4pRqQJhGz90wh7rgdXDPpCczF3VGktDuFGVnz8zP7HA==", "dev": true, "license": "MIT" }, @@ -1827,19 +1627,6 @@ "marked": ">=6.0.0 <12" } }, - "node_modules/@types/marked-terminal/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/@types/marked-terminal/node_modules/marked": { "version": "11.2.0", "resolved": "https://registry.npmjs.org/marked/-/marked-11.2.0.tgz", @@ -1853,43 +1640,31 @@ "node": ">= 18" } }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "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==", - "license": "MIT" - }, "node_modules/@types/node": { - "version": "22.13.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.9.tgz", - "integrity": "sha512-acBjXdRJ3A6Pb3tqnw9HZmyR3Fiol3aGxRCK1x3d+6CDAMjl7I649wpSd+yNURCjbOUGu9tqtLKnTGxmK6CyGw==", + "version": "22.19.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.13.tgz", + "integrity": "sha512-akNQMv0wW5uyRpD2v2IEyRSZiR+BeGuoB6L310EgGObO44HSMNT8z1xzio28V8qOrgYaopIDNA18YgdXd+qTiw==", "license": "MIT", "dependencies": { - "undici-types": "~6.20.0" + "undici-types": "~6.21.0" } }, "node_modules/@types/node-fetch": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz", - "integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==", + "version": "2.6.13", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.13.tgz", + "integrity": "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", - "form-data": "^4.0.0" + "form-data": "^4.0.4" } }, "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/npm-package-arg": { @@ -1900,9 +1675,9 @@ "license": "MIT" }, "node_modules/@types/npm-registry-fetch": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/@types/npm-registry-fetch/-/npm-registry-fetch-8.0.7.tgz", - "integrity": "sha512-db9iBh7kDDg4lRT4k4XZ6IiecTEgFCID4qk+VDVPbtzU855q3KZLCn08ATr4H27ntRJVhulQ7GWjl24H42x96w==", + "version": "8.0.9", + "resolved": "https://registry.npmjs.org/@types/npm-registry-fetch/-/npm-registry-fetch-8.0.9.tgz", + "integrity": "sha512-7NxvodR5Yrop3pb6+n8jhJNyzwOX0+6F+iagNEoi9u1CGxruYAwZD8pvGc9prIkL0+FdX5Xp0p80J9QPrGUp/g==", "dev": true, "license": "MIT", "dependencies": { @@ -1914,9 +1689,9 @@ } }, "node_modules/@types/npmcli__arborist": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@types/npmcli__arborist/-/npmcli__arborist-6.3.0.tgz", - "integrity": "sha512-CXkuOBZDlcb+r0UMlmEAq3XOUZrL9XfZ2MXIwCSo726OBkkg+UIWlZ9h3n6To9w1WqMEIOZT2LkerhLgnsPV+Q==", + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@types/npmcli__arborist/-/npmcli__arborist-6.3.3.tgz", + "integrity": "sha512-kyrX932Qr+/Y4OB47Jamgc2YWa/HlXTCN0KVJsq04XDHUGkfbprJA8rd66zZXHmHmvnz1LR4X17zsE/H8Mklew==", "dev": true, "license": "MIT", "dependencies": { @@ -2009,16 +1784,6 @@ "@types/node": "*" } }, - "node_modules/@types/readdir-glob": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@types/readdir-glob/-/readdir-glob-1.1.5.tgz", - "integrity": "sha512-raiuEPUYqXu+nvtY2Pe8s8FEmZ3x5yAH4VkLdihcPdalvsHltomrRC9BzuStrJ9yk06470hS0Crw0f1pXqD+Hg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/retry": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.5.tgz", @@ -2027,32 +1792,21 @@ "license": "MIT" }, "node_modules/@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", "dev": true, "license": "MIT" }, "node_modules/@types/shelljs": { - "version": "0.8.15", - "resolved": "https://registry.npmjs.org/@types/shelljs/-/shelljs-0.8.15.tgz", - "integrity": "sha512-vzmnCHl6hViPu9GNLQJ+DZFd6BQI2DBTUeOvYHqkWQLMfKAAQYMb/xAmZkTogZI/vqXHCWkqDRymDI5p0QTi5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/glob": "~7.2.0", - "@types/node": "*" - } - }, - "node_modules/@types/shelljs/node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "version": "0.8.17", + "resolved": "https://registry.npmjs.org/@types/shelljs/-/shelljs-0.8.17.tgz", + "integrity": "sha512-IDksKYmQA2W9MkQjiyptbMmcQx+8+Ol6b7h6dPU5S05JyiQDSb/nZKnrMrZqGwgV6VkVdl6/SPCKPDlMRvqECg==", "dev": true, "license": "MIT", "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" + "@types/node": "*", + "glob": "^11.0.3" } }, "node_modules/@types/sinon": { @@ -2066,9 +1820,9 @@ } }, "node_modules/@types/sinonjs__fake-timers": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz", - "integrity": "sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==", + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-15.0.1.tgz", + "integrity": "sha512-Ko2tjWJq8oozHzHV+reuvS5KYIRAokHnGbDwGh/J64LntgpbuylF74ipEL24HCyRjf9FOlBiBHWBR1RlVKsI1w==", "dev": true, "license": "MIT" }, @@ -2109,14 +1863,14 @@ "minipass": "^4.0.0" } }, - "node_modules/@types/temp": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@types/temp/-/temp-0.9.4.tgz", - "integrity": "sha512-+VfWIwrlept2VBTj7Y2wQnI/Xfscy1u8Pyj/puYwss6V1IblXn1x7S0S9eFh6KyBolgLCm+rUFzhFAbdkR691g==", + "node_modules/@types/tar/node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" + "license": "ISC", + "engines": { + "node": ">=8" } }, "node_modules/@types/tunnel": { @@ -2144,9 +1898,9 @@ "license": "MIT" }, "node_modules/@types/ws": { - "version": "8.5.14", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.14.tgz", - "integrity": "sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", "dev": true, "license": "MIT", "dependencies": { @@ -2180,6 +1934,16 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/yazl": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@types/yazl/-/yazl-3.3.0.tgz", + "integrity": "sha512-mFL6lGkk2N5u5nIxpNV/K5LW3qVSbxhJrMxYGOOxZndWxMgCamr/iCsq/1t9kd8pEwhuNP91LC5qZm/qS9pOEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@xml-tools/parser": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@xml-tools/parser/-/parser-1.0.11.tgz", @@ -2190,10 +1954,9 @@ } }, "node_modules/@xmldom/xmldom": { - "version": "0.7.13", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.13.tgz", - "integrity": "sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==", - "deprecated": "this version is no longer supported, please update to at least 0.8.*", + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", + "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -2219,9 +1982,9 @@ } }, "node_modules/acorn": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -2231,9 +1994,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", "license": "MIT", "dependencies": { "acorn": "^8.11.0" @@ -2246,30 +2009,18 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", + "dev": true, "license": "MIT" }, "node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "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/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/amdefine": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", @@ -2281,19 +2032,10 @@ "node": ">=0.4.2" } }, - "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": "7.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", - "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", "license": "MIT", "dependencies": { "environment": "^1.0.0" @@ -2306,9 +2048,9 @@ } }, "node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "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" @@ -2345,459 +2087,176 @@ "license": "MIT" }, "node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "license": "ISC", "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/anymatch/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, - "node_modules/anymatch/node_modules/braces/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==", + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "license": "MIT", "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" + "sprintf-js": "~1.0.2" } }, - "node_modules/anymatch/node_modules/fill-range": { + "node_modules/arr-diff": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", "dev": true, "license": "MIT", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, "engines": { "node": ">=0.10.0" } }, - "node_modules/anymatch/node_modules/fill-range/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==", + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true, "license": "MIT", - "dependencies": { - "is-extendable": "^0.1.0" - }, "engines": { "node": ">=0.10.0" } }, - "node_modules/anymatch/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==", + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/anymatch/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "node_modules/array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", "dev": true, "license": "MIT", - "dependencies": { - "kind-of": "^3.0.2" - }, "engines": { "node": ">=0.10.0" } }, - "node_modules/anymatch/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true, + "license": "MIT" + }, + "node_modules/array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", "dev": true, "license": "MIT", - "dependencies": { - "is-buffer": "^1.1.5" - }, "engines": { "node": ">=0.10.0" } }, - "node_modules/anymatch/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", "dev": true, "license": "MIT", - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, "engines": { "node": ">=0.10.0" } }, - "node_modules/anymatch/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, "license": "MIT", - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/anymatch/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", "dev": true, "license": "MIT", - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, "engines": { "node": ">=0.10.0" } }, - "node_modules/archiver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", - "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", + "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", - "dependencies": { - "archiver-utils": "^5.0.2", - "async": "^3.2.4", - "buffer-crc32": "^1.0.0", - "readable-stream": "^4.0.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^3.0.0", - "zip-stream": "^6.0.1" - }, "engines": { - "node": ">= 14" + "node": ">=8" } }, - "node_modules/archiver-utils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", - "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", - "license": "MIT", - "dependencies": { - "glob": "^10.0.0", - "graceful-fs": "^4.2.0", - "is-stream": "^2.0.1", - "lazystream": "^1.0.0", - "lodash": "^4.17.15", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-each": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz", + "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "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==", + "license": "ISC", "engines": { - "node": ">= 14" + "node": ">= 4.0.0" } }, - "node_modules/archiver-utils/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "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" - }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "license": "(MIT OR Apache-2.0)", "bin": { - "glob": "dist/esm/bin.mjs" + "atob": "bin/atob.js" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/archiver-utils/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/archiver-utils/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/archiver-utils/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/archiver-utils/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/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "license": "MIT" - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", - "license": "MIT" - }, - "node_modules/array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "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/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "license": "MIT" - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "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/async-each": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz", - "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "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==", - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, - "license": "(MIT OR Apache-2.0)", - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" + "engines": { + "node": ">= 4.5.0" } }, "node_modules/await-to-js": { @@ -2810,34 +2269,24 @@ } }, "node_modules/axios": { - "version": "1.7.9", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", - "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", + "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", "proxy-from-env": "^1.1.0" } }, - "node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", - "license": "Apache-2.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/bare-events": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", - "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", - "license": "Apache-2.0", - "optional": true + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } }, "node_modules/base": { "version": "0.11.2", @@ -2871,6 +2320,20 @@ "node": ">=0.10.0" } }, + "node_modules/base/node_modules/is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -2901,29 +2364,31 @@ } }, "node_modules/bin-links": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-5.0.0.tgz", - "integrity": "sha512-sdleLVfCjBtgO5cNjA2HVRvWBJAHs4zwenaCPMNJAJU0yNxpzj80IpjOIimkpkr+mhlA+how5poQtt53PygbHA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-6.0.0.tgz", + "integrity": "sha512-X4CiKlcV2GjnCMwnKAfbVWpHa++65th9TuzAEYtZoATiOE2DQKhSp4CJlyLoTqdhBKlXjpXjCTYPNNFS33Fi6w==", "license": "ISC", "dependencies": { - "cmd-shim": "^7.0.0", - "npm-normalize-package-bin": "^4.0.0", - "proc-log": "^5.0.0", - "read-cmd-shim": "^5.0.0", - "write-file-atomic": "^6.0.0" + "cmd-shim": "^8.0.0", + "npm-normalize-package-bin": "^5.0.0", + "proc-log": "^6.0.0", + "read-cmd-shim": "^6.0.0", + "write-file-atomic": "^7.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/bindings": { @@ -3002,12 +2467,15 @@ } }, "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/braces": { @@ -3093,98 +2561,39 @@ "dev": true }, "node_modules/cacache": { - "version": "19.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", - "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==", + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-20.0.3.tgz", + "integrity": "sha512-3pUp4e8hv07k1QlijZu6Kn7c9+ZpWWk4j3F8N3xPuCExULobqJydKYOTj1FTq58srkJsXvO7LbGAH4C0ZU3WGw==", "license": "ISC", "dependencies": { - "@npmcli/fs": "^4.0.0", + "@npmcli/fs": "^5.0.0", "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", + "glob": "^13.0.0", + "lru-cache": "^11.1.0", "minipass": "^7.0.3", "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^7.0.2", - "ssri": "^12.0.0", - "tar": "^7.4.3", - "unique-filename": "^4.0.0" + "ssri": "^13.0.0", + "unique-filename": "^5.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/cacache/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "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/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/cacache/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/cacache/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/cacache/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==", + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", "license": "BlueOak-1.0.0", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -3254,36 +2663,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", - "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/camelcase-keys/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/chai": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", - "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", "dev": true, "license": "MIT", "dependencies": { @@ -3294,33 +2677,29 @@ "pathval": "^2.0.0" }, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/chai-as-promised": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-8.0.1.tgz", - "integrity": "sha512-OIEJtOL8xxJSH8JJWbIoRjybbzR52iFuDHuF8eb+nTPD6tgXLjRqsgnUGqQfFODxYvq5QdirT0pN9dZ0+Gz6rA==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-8.0.2.tgz", + "integrity": "sha512-1GadL+sEJVLzDjcawPM4kjfnL+p/9vrxiEUonowKOAzvVg0PixJUdtuDzdkDeQhK3zfOE76GqGkZIQ7/Adcrqw==", "dev": true, "license": "MIT", "dependencies": { - "check-error": "^2.0.0" + "check-error": "^2.1.1" }, "peerDependencies": { - "chai": ">= 2.1.2 < 6" + "chai": ">= 2.1.2 < 7" } }, "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" @@ -3336,9 +2715,9 @@ } }, "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", + "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==", "dev": true, "license": "MIT", "engines": { @@ -3355,18 +2734,27 @@ } }, "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "license": "MIT", "dependencies": { - "readdirp": "^4.0.1" + "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": ">= 14.16.0" + "node": ">= 8.10.0" }, "funding": { "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, "node_modules/chownr": { @@ -3394,42 +2782,6 @@ "node": ">=0.10.0" } }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-descriptor": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", - "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-accessor-descriptor": "^1.0.1", - "is-data-descriptor": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "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/cli-cursor": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", @@ -3467,6 +2819,22 @@ "npm": ">=5.0.0" } }, + "node_modules/cli-highlight/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/cli-highlight/node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -3478,6 +2846,27 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/cli-highlight/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/cli-highlight/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/cli-highlight/node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -3550,9 +2939,9 @@ } }, "node_modules/cli-truncate/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { @@ -3563,9 +2952,9 @@ } }, "node_modules/cli-truncate/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true, "license": "MIT" }, @@ -3618,13 +3007,13 @@ } }, "node_modules/cli-truncate/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -3657,12 +3046,12 @@ } }, "node_modules/cmd-shim": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-7.0.0.tgz", - "integrity": "sha512-rtpaCbr164TPPh+zFdkWpCyZuKkjpAzODfaZCf/SVJZzJN+4bHQb/LP3Jzq5/+84um3XXY8r548XiWKSborwVw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-8.0.0.tgz", + "integrity": "sha512-Jk/BK6NCapZ58BKUxlSI+ouKRbjH1NLZCgJkYoab+vEHUY3f6OzpNBN9u7HFSv9J6TRDGs4PLOHezoKGaFRSCA==", "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/code-block-writer": { @@ -3775,6 +3164,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, "license": "MIT", "dependencies": { "array-ify": "^1.0.0", @@ -3791,46 +3181,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/compress-commons": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", - "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "crc32-stream": "^6.0.0", - "is-stream": "^2.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, "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/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/config-chain/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, - "license": "ISC" - }, "node_modules/continuable-cache": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz", @@ -3838,50 +3194,49 @@ "dev": true }, "node_modules/conventional-changelog": { - "version": "3.1.25", - "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.25.tgz", - "integrity": "sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-6.0.0.tgz", + "integrity": "sha512-tuUH8H/19VjtD9Ig7l6TQRh+Z0Yt0NZ6w/cCkkyzUbGQTnUEmKfGtkC9gGfVgCfOL1Rzno5NgNF4KY8vR+Jo3w==", + "dev": true, "license": "MIT", "dependencies": { - "conventional-changelog-angular": "^5.0.12", - "conventional-changelog-atom": "^2.0.8", - "conventional-changelog-codemirror": "^2.0.8", - "conventional-changelog-conventionalcommits": "^4.5.0", - "conventional-changelog-core": "^4.2.1", - "conventional-changelog-ember": "^2.0.9", - "conventional-changelog-eslint": "^3.0.9", - "conventional-changelog-express": "^2.0.6", - "conventional-changelog-jquery": "^3.0.11", - "conventional-changelog-jshint": "^2.0.9", - "conventional-changelog-preset-loader": "^2.3.4" + "conventional-changelog-angular": "^8.0.0", + "conventional-changelog-atom": "^5.0.0", + "conventional-changelog-codemirror": "^5.0.0", + "conventional-changelog-conventionalcommits": "^8.0.0", + "conventional-changelog-core": "^8.0.0", + "conventional-changelog-ember": "^5.0.0", + "conventional-changelog-eslint": "^6.0.0", + "conventional-changelog-express": "^5.0.0", + "conventional-changelog-jquery": "^6.0.0", + "conventional-changelog-jshint": "^5.0.0", + "conventional-changelog-preset-loader": "^5.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/conventional-changelog-angular": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", - "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.1.0.tgz", + "integrity": "sha512-GGf2Nipn1RUCAktxuVauVr1e3r8QrLP/B0lEUsFktmGqc3ddbQkhoJZHJctVU829U1c6mTSWftrVOCHaL85Q3w==", + "dev": true, "license": "ISC", "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" + "compare-func": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/conventional-changelog-atom": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz", - "integrity": "sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-5.0.0.tgz", + "integrity": "sha512-WfzCaAvSCFPkznnLgLnfacRAzjgqjLUjvf3MftfsJzQdDICqkOOpcMtdJF3wTerxSpv2IAAjX8doM3Vozqle3g==", + "dev": true, "license": "ISC", - "dependencies": { - "q": "^1.5.1" - }, "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/conventional-changelog-cli": { @@ -3903,99 +3258,17 @@ "node": ">=18" } }, - "node_modules/conventional-changelog-cli/node_modules/@conventional-changelog/git-client": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@conventional-changelog/git-client/-/git-client-1.0.1.tgz", - "integrity": "sha512-PJEqBwAleffCMETaVm/fUgHldzBE35JFk3/9LL6NUA5EXa3qednu+UT6M7E5iBu3zIQZCULYIiZ90fBYHt6xUw==", + "node_modules/conventional-changelog-codemirror": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-5.0.0.tgz", + "integrity": "sha512-8gsBDI5Y3vrKUCxN6Ue8xr6occZ5nsDEc4C7jO/EovFGozx8uttCAyfhRrvoUAWi2WMm3OmYs+0mPJU7kQdYWQ==", "dev": true, - "license": "MIT", - "dependencies": { - "@types/semver": "^7.5.5", - "semver": "^7.5.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "conventional-commits-filter": "^5.0.0", - "conventional-commits-parser": "^6.0.0" - }, - "peerDependenciesMeta": { - "conventional-commits-filter": { - "optional": true - }, - "conventional-commits-parser": { - "optional": true - } - } - }, - "node_modules/conventional-changelog-cli/node_modules/@hutson/parse-repository-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-5.0.0.tgz", - "integrity": "sha512-e5+YUKENATs1JgYHMzTr2MW/NDcXGfYFAuOQU8gJgF/kEh4EqKgfGrfLI67bMD4tbhZVlkigz/9YYwWcbOFthg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/conventional-changelog-cli/node_modules/conventional-changelog": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-6.0.0.tgz", - "integrity": "sha512-tuUH8H/19VjtD9Ig7l6TQRh+Z0Yt0NZ6w/cCkkyzUbGQTnUEmKfGtkC9gGfVgCfOL1Rzno5NgNF4KY8vR+Jo3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "conventional-changelog-angular": "^8.0.0", - "conventional-changelog-atom": "^5.0.0", - "conventional-changelog-codemirror": "^5.0.0", - "conventional-changelog-conventionalcommits": "^8.0.0", - "conventional-changelog-core": "^8.0.0", - "conventional-changelog-ember": "^5.0.0", - "conventional-changelog-eslint": "^6.0.0", - "conventional-changelog-express": "^5.0.0", - "conventional-changelog-jquery": "^6.0.0", - "conventional-changelog-jshint": "^5.0.0", - "conventional-changelog-preset-loader": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/conventional-changelog-cli/node_modules/conventional-changelog-angular": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.0.0.tgz", - "integrity": "sha512-CLf+zr6St0wIxos4bmaKHRXWAcsCXrJU6F4VdNDrGRK3B8LDLKoX3zuMV5GhtbGkVR/LohZ6MT6im43vZLSjmA==", - "dev": true, - "license": "ISC", - "dependencies": { - "compare-func": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/conventional-changelog-cli/node_modules/conventional-changelog-atom": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-5.0.0.tgz", - "integrity": "sha512-WfzCaAvSCFPkznnLgLnfacRAzjgqjLUjvf3MftfsJzQdDICqkOOpcMtdJF3wTerxSpv2IAAjX8doM3Vozqle3g==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=18" - } - }, - "node_modules/conventional-changelog-cli/node_modules/conventional-changelog-codemirror": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-5.0.0.tgz", - "integrity": "sha512-8gsBDI5Y3vrKUCxN6Ue8xr6occZ5nsDEc4C7jO/EovFGozx8uttCAyfhRrvoUAWi2WMm3OmYs+0mPJU7kQdYWQ==", - "dev": true, - "license": "ISC", + "license": "ISC", "engines": { "node": ">=18" } }, - "node_modules/conventional-changelog-cli/node_modules/conventional-changelog-conventionalcommits": { + "node_modules/conventional-changelog-conventionalcommits": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-8.0.0.tgz", "integrity": "sha512-eOvlTO6OcySPyyyk8pKz2dP4jjElYunj9hn9/s0OB+gapTO8zwS9UQWrZ1pmF2hFs3vw1xhonOLGcGjy/zgsuA==", @@ -4008,7 +3281,7 @@ "node": ">=18" } }, - "node_modules/conventional-changelog-cli/node_modules/conventional-changelog-core": { + "node_modules/conventional-changelog-core": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-8.0.0.tgz", "integrity": "sha512-EATUx5y9xewpEe10UEGNpbSHRC6cVZgO+hXQjofMqpy+gFIrcGvH3Fl6yk2VFKh7m+ffenup2N7SZJYpyD9evw==", @@ -4030,7 +3303,27 @@ "node": ">=18" } }, - "node_modules/conventional-changelog-cli/node_modules/conventional-changelog-ember": { + "node_modules/conventional-changelog-core/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==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/conventional-changelog-core/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==", + "dev": true, + "license": "ISC" + }, + "node_modules/conventional-changelog-ember": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-5.0.0.tgz", "integrity": "sha512-RPflVfm5s4cSO33GH/Ey26oxhiC67akcxSKL8CLRT3kQX2W3dbE19sSOM56iFqUJYEwv9mD9r6k79weWe1urfg==", @@ -4040,7 +3333,7 @@ "node": ">=18" } }, - "node_modules/conventional-changelog-cli/node_modules/conventional-changelog-eslint": { + "node_modules/conventional-changelog-eslint": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-6.0.0.tgz", "integrity": "sha512-eiUyULWjzq+ybPjXwU6NNRflApDWlPEQEHvI8UAItYW/h22RKkMnOAtfCZxMmrcMO1OKUWtcf2MxKYMWe9zJuw==", @@ -4050,7 +3343,7 @@ "node": ">=18" } }, - "node_modules/conventional-changelog-cli/node_modules/conventional-changelog-express": { + "node_modules/conventional-changelog-express": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-5.0.0.tgz", "integrity": "sha512-D8Q6WctPkQpvr2HNCCmwU5GkX22BVHM0r4EW8vN0230TSyS/d6VQJDAxGb84lbg0dFjpO22MwmsikKL++Oo/oQ==", @@ -4060,7 +3353,7 @@ "node": ">=18" } }, - "node_modules/conventional-changelog-cli/node_modules/conventional-changelog-jquery": { + "node_modules/conventional-changelog-jquery": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-6.0.0.tgz", "integrity": "sha512-2kxmVakyehgyrho2ZHBi90v4AHswkGzHuTaoH40bmeNqUt20yEkDOSpw8HlPBfvEQBwGtbE+5HpRwzj6ac2UfA==", @@ -4070,7 +3363,7 @@ "node": ">=18" } }, - "node_modules/conventional-changelog-cli/node_modules/conventional-changelog-jshint": { + "node_modules/conventional-changelog-jshint": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-5.0.0.tgz", "integrity": "sha512-gGNphSb/opc76n2eWaO6ma4/Wqu3tpa2w7i9WYqI6Cs2fncDSI2/ihOfMvXveeTTeld0oFvwMVNV+IYQIk3F3g==", @@ -4083,7 +3376,7 @@ "node": ">=18" } }, - "node_modules/conventional-changelog-cli/node_modules/conventional-changelog-preset-loader": { + "node_modules/conventional-changelog-preset-loader": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-5.0.0.tgz", "integrity": "sha512-SetDSntXLk8Jh1NOAl1Gu5uLiCNSYenB5tm0YVeZKePRIgDW9lQImromTwLa3c/Gae298tsgOM+/CYT9XAl0NA==", @@ -4093,10 +3386,10 @@ "node": ">=18" } }, - "node_modules/conventional-changelog-cli/node_modules/conventional-changelog-writer": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-8.0.1.tgz", - "integrity": "sha512-hlqcy3xHred2gyYg/zXSMXraY2mjAYYo0msUCpK+BGyaVJMFCKWVXPIHiaacGO2GGp13kvHWXFhYmxT4QQqW3Q==", + "node_modules/conventional-changelog-writer": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-8.2.0.tgz", + "integrity": "sha512-Y2aW4596l9AEvFJRwFGJGiQjt2sBYTjPD18DdvxX9Vpz0Z7HQ+g1Z+6iYDAm1vR3QOJrDBkRHixHK/+FhkR6Pw==", "dev": true, "license": "MIT", "dependencies": { @@ -4112,7 +3405,7 @@ "node": ">=18" } }, - "node_modules/conventional-changelog-cli/node_modules/conventional-commits-filter": { + "node_modules/conventional-commits-filter": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-5.0.0.tgz", "integrity": "sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==", @@ -4122,10 +3415,10 @@ "node": ">=18" } }, - "node_modules/conventional-changelog-cli/node_modules/conventional-commits-parser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.1.0.tgz", - "integrity": "sha512-5nxDo7TwKB5InYBl4ZC//1g9GRwB/F3TXOGR9hgUjMGfvSP4Vu5NkpNro2+1+TIEy1vwxApl5ircECr2ri5JIw==", + "node_modules/conventional-commits-parser": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.2.1.tgz", + "integrity": "sha512-20pyHgnO40rvfI0NGF/xiEoFMkXDtkF8FwHvk5BokoFoCuTQRI8vrNCNFWUOfuolKJMm1tPCHc8GgYEtr1XRNA==", "dev": true, "license": "MIT", "dependencies": { @@ -4138,579 +3431,465 @@ "node": ">=18" } }, - "node_modules/conventional-changelog-cli/node_modules/git-raw-commits": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-5.0.0.tgz", - "integrity": "sha512-I2ZXrXeOc0KrCvC7swqtIFXFN+rbjnC7b2T943tvemIOVNl+XP8YnA9UVwqFhzzLClnSA60KR/qEjLpXzs73Qg==", + "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==", + "license": "MIT" + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", "dev": true, "license": "MIT", - "dependencies": { - "@conventional-changelog/git-client": "^1.0.0", - "meow": "^13.0.0" - }, - "bin": { - "git-raw-commits": "src/cli.js" - }, "engines": { - "node": ">=18" + "node": ">=0.10.0" } }, - "node_modules/conventional-changelog-cli/node_modules/git-semver-tags": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-8.0.0.tgz", - "integrity": "sha512-N7YRIklvPH3wYWAR2vysaqGLPRcpwQ0GKdlqTiVN5w1UmCdaeY3K8s6DMKRCh54DDdzyt/OAB6C8jgVtb7Y2Fg==", + "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==", "dev": true, + "license": "MIT" + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "license": "MIT" + }, + "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": { - "@conventional-changelog/git-client": "^1.0.0", - "meow": "^13.0.0" - }, - "bin": { - "git-semver-tags": "src/cli.js" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=18" + "node": ">= 8" } }, - "node_modules/conventional-changelog-cli/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==", - "dev": true, + "node_modules/cross-spawn/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/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": { - "lru-cache": "^10.0.1" + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">= 8" } }, - "node_modules/conventional-changelog-cli/node_modules/normalize-package-data": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", - "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", + "node_modules/csproj2ts": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/csproj2ts/-/csproj2ts-1.1.0.tgz", + "integrity": "sha512-sk0RTT51t4lUNQ7UfZrqjQx7q4g0m3iwNA6mvyh7gLsgQYvwKzfdyoAgicC9GqJvkoIkU0UmndV9c7VZ8pJ45Q==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "hosted-git-info": "^7.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" + "es6-promise": "^4.1.1", + "lodash": "^4.17.4", + "semver": "^5.4.1", + "xml2js": "^0.4.19" } }, - "node_modules/conventional-changelog-cli/node_modules/parse-json": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.1.0.tgz", - "integrity": "sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==", + "node_modules/csproj2ts/node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.22.13", - "index-to-position": "^0.1.2", - "type-fest": "^4.7.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "license": "MIT" + }, + "node_modules/csproj2ts/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/conventional-changelog-cli/node_modules/read-pkg": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", - "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", + "node_modules/csproj2ts/node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", "dev": true, "license": "MIT", "dependencies": { - "@types/normalize-package-data": "^2.4.3", - "normalize-package-data": "^6.0.0", - "parse-json": "^8.0.0", - "type-fest": "^4.6.0", - "unicorn-magic": "^0.1.0" + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4.0.0" } }, - "node_modules/conventional-changelog-cli/node_modules/type-fest": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.37.0.tgz", - "integrity": "sha512-S/5/0kFftkq27FPNye0XM1e2NsnoD/3FS+pBmbjmmtLT6I+i344KoOf7pvXreaFsDamWeaJX55nczA1m5PsBDg==", + "node_modules/csproj2ts/node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true, - "license": "(MIT OR CC0-1.0)", + "license": "MIT", "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4.0" } }, - "node_modules/conventional-changelog-codemirror": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz", - "integrity": "sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==", - "license": "ISC", - "dependencies": { - "q": "^1.5.1" + "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": ">=10" + "node": ">=4" } }, - "node_modules/conventional-changelog-conventionalcommits": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz", - "integrity": "sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==", - "license": "ISC", - "dependencies": { - "compare-func": "^2.0.0", - "lodash": "^4.17.15", - "q": "^1.5.1" - }, + "node_modules/date-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=4.0" } }, - "node_modules/conventional-changelog-core": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz", - "integrity": "sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==", + "node_modules/dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", + "dev": true, "license": "MIT", - "dependencies": { - "add-stream": "^1.0.0", - "conventional-changelog-writer": "^5.0.0", - "conventional-commits-parser": "^3.2.0", - "dateformat": "^3.0.0", - "get-pkg-repo": "^4.0.0", - "git-raw-commits": "^2.0.8", - "git-remote-origin-url": "^2.0.0", - "git-semver-tags": "^4.1.1", - "lodash": "^4.17.15", - "normalize-package-data": "^3.0.0", - "q": "^1.5.1", - "read-pkg": "^3.0.0", - "read-pkg-up": "^3.0.0", - "through2": "^4.0.0" - }, "engines": { - "node": ">=10" + "node": "*" } }, - "node_modules/conventional-changelog-ember": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz", - "integrity": "sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==", - "license": "ISC", + "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": { - "q": "^1.5.1" + "ms": "^2.1.3" }, "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-eslint": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz", - "integrity": "sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==", - "license": "ISC", - "dependencies": { - "q": "^1.5.1" + "node": ">=6.0" }, - "engines": { - "node": ">=10" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/conventional-changelog-express": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz", - "integrity": "sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==", - "license": "ISC", - "dependencies": { - "q": "^1.5.1" - }, + "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" - } - }, - "node_modules/conventional-changelog-jquery": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz", - "integrity": "sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==", - "license": "ISC", - "dependencies": { - "q": "^1.5.1" }, - "engines": { - "node": ">=10" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/conventional-changelog-jshint": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz", - "integrity": "sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==", - "license": "ISC", - "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=0.10" } }, - "node_modules/conventional-changelog-preset-loader": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", - "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=6" } }, - "node_modules/conventional-changelog-writer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", - "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", + "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/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "license": "MIT", "dependencies": { - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.7", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-changelog-writer": "cli.js" + "clone": "^1.0.2" }, - "engines": { - "node": ">=10" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/conventional-changelog-writer/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==", + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, "engines": { "node": ">=8" } }, - "node_modules/conventional-changelog-writer/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "license": "ISC" - }, - "node_modules/conventional-changelog-writer/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==", - "license": "MIT" - }, - "node_modules/conventional-changelog-writer/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==", + "node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" + "is-descriptor": "^0.1.0" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/conventional-changelog-writer/node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "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", - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.4.0" } }, - "node_modules/conventional-changelog-writer/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "dev": true, "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/conventional-changelog-writer/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==", + "node_modules/detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha512-BDKtmHlOzwI7iRuEkhzsnPoi5ypEhWAJB5RvHWe1kMr06js3uK5B3734i3ui5Yd+wOJV1cpE4JnivPD283GU/A==", + "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "repeating": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/conventional-changelog-writer/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/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==", "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/conventional-changelog-writer/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "node_modules/diff": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz", + "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, "license": "MIT", "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" + "is-obj": "^2.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/conventional-changelog-writer/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "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": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.4" } }, - "node_modules/conventional-changelog-writer/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "license": "(MIT OR CC0-1.0)", + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/email-validator": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/email-validator/-/email-validator-2.0.4.tgz", + "integrity": "sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==", "engines": { - "node": ">=8" + "node": ">4.0" } }, - "node_modules/conventional-changelog-writer/node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "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/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/conventional-changelog-writer/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==", - "license": "ISC", - "bin": { - "semver": "bin/semver" - } + "node_modules/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", + "license": "MIT" }, - "node_modules/conventional-changelog-writer/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" + "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/conventional-changelog-writer/node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "node_modules/env-paths": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", + "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, "engines": { - "node": ">= 0.4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/conventional-changelog-writer/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/conventional-changelog-writer/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "license": "(MIT OR CC0-1.0)", + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/conventional-changelog-writer/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==", - "license": "ISC", + "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": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/error/-/error-7.2.1.tgz", + "integrity": "sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==", + "dev": true, + "dependencies": { + "string-template": "~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": ">=10" + "node": ">= 0.4" } }, - "node_modules/conventional-commits-filter": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", - "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", + "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", - "dependencies": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - }, "engines": { - "node": ">=10" + "node": ">= 0.4" } }, - "node_modules/conventional-commits-parser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", - "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", + "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": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-commits-parser": "cli.js" + "es-errors": "^1.3.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" } }, - "node_modules/conventional-commits-parser/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==", + "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": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/conventional-commits-parser/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "license": "ISC" - }, - "node_modules/conventional-commits-parser/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "node_modules/es6-promise": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-0.1.2.tgz", + "integrity": "sha512-FkHS6f1w/2Nj2kO8NsnLj2ZuCvcXHEMhZfmZSIBtY+DY2mPDDWxnSLG9CyygFW0hrb5RhOXVOvHpEUHS/6nkhQ==", + "dev": true, "license": "MIT" }, - "node_modules/conventional-commits-parser/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==", + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/conventional-commits-parser/node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, "license": "MIT", - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, "engines": { "node": ">=10" }, @@ -4718,1508 +3897,191 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/conventional-commits-parser/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", + "node_modules/escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "p-try": "^2.0.0" + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" }, "engines": { - "node": ">=6" + "node": ">=0.12.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "source-map": "~0.2.0" } }, - "node_modules/conventional-commits-parser/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" + "node_modules/escodegen/node_modules/esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/conventional-commits-parser/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "license": "MIT", + "node_modules/escodegen/node_modules/source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", + "dev": true, + "optional": true, "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "amdefine": ">=0.0.4" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.8.0" } }, - "node_modules/conventional-commits-parser/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "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" + "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": ">=8" + "node": ">=4" } }, - "node_modules/conventional-commits-parser/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "license": "MIT", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, + "node_modules/estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==", + "dev": true, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/conventional-commits-parser/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "license": "(MIT OR CC0-1.0)", + "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": ">=8" + "node": ">=0.10.0" } }, - "node_modules/conventional-commits-parser/node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "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/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" } }, - "node_modules/conventional-commits-parser/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "license": "(MIT OR CC0-1.0)", + "node_modules/eventemitter2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "integrity": "sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.8.x" } }, - "node_modules/conventional-commits-parser/node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=16.17" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/conventional-commits-parser/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "license": "ISC", - "bin": { - "semver": "bin/semver" + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/conventional-commits-parser/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/conventional-commits-parser/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==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "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/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/crc32-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", - "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "license": "MIT" - }, - "node_modules/cross-fetch": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", - "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", - "license": "MIT", - "dependencies": { - "node-fetch": "^2.7.0" - } - }, - "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/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "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/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/csproj2ts": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/csproj2ts/-/csproj2ts-1.1.0.tgz", - "integrity": "sha512-sk0RTT51t4lUNQ7UfZrqjQx7q4g0m3iwNA6mvyh7gLsgQYvwKzfdyoAgicC9GqJvkoIkU0UmndV9c7VZ8pJ45Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "es6-promise": "^4.1.1", - "lodash": "^4.17.4", - "semver": "^5.4.1", - "xml2js": "^0.4.19" - } - }, - "node_modules/csproj2ts/node_modules/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/csproj2ts/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/csproj2ts/node_modules/xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, - "license": "MIT", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/csproj2ts/node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/cssesc": { + "node_modules/execa/node_modules/is-stream": { "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/dargs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", - "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/date-format": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", - "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", - "license": "MIT", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "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==", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/decamelize-keys/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/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==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", - "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/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", - "license": "MIT", - "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/del/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/del/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/del/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/del/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/del/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/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/detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha512-BDKtmHlOzwI7iRuEkhzsnPoi5ypEhWAJB5RvHWe1kMr06js3uK5B3734i3ui5Yd+wOJV1cpE4JnivPD283GU/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "repeating": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/dezalgo": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", - "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", - "license": "ISC", - "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", - "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/dir-glob/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/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "license": "MIT", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/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/email-validator": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/email-validator/-/email-validator-2.0.4.tgz", - "integrity": "sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==", - "engines": { - "node": ">4.0" - } - }, - "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/emojilib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", - "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", - "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/env-paths": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", - "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/environment": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/error/-/error-7.2.1.tgz", - "integrity": "sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==", - "dev": true, - "dependencies": { - "string-template": "~0.2.1" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "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-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-promise": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-0.1.2.tgz", - "integrity": "sha512-FkHS6f1w/2Nj2kO8NsnLj2ZuCvcXHEMhZfmZSIBtY+DY2mPDDWxnSLG9CyygFW0hrb5RhOXVOvHpEUHS/6nkhQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^2.7.1", - "estraverse": "^1.9.1", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=0.12.0" - }, - "optionalDependencies": { - "source-map": "~0.2.0" - } - }, - "node_modules/escodegen/node_modules/esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", - "dev": true, - "optional": true, - "dependencies": { - "amdefine": ">=0.0.4" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "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/estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/eventemitter2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", - "integrity": "sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "dev": true, - "license": "MIT" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/execa/node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/execa/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/execa/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==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/exif-parser": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", - "integrity": "sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw==" - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/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/expand-brackets/node_modules/is-descriptor": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", - "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-accessor-descriptor": "^1.0.1", - "is-data-descriptor": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/expand-brackets/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/expand-brackets/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/exponential-backoff": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", - "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", - "license": "Apache-2.0" - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true, - "license": "MIT" - }, - "node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/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/extglob/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/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "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-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/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/faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha512-Xhj93RXbMSq8urNCUq4p9l0P6hnySJ/7YNRhYNug0bLOuii7pKO7xQFb5mx9xZXWCar88pLPb805PvUkwrLZpQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/file-sync-cmp": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz", - "integrity": "sha512-0k45oWBokCqh2MOexeYKpyqmGKG+8mQ2Wd8iawx+uWd/weWJQAZ6SoPybagdCI4xFisag8iAR77WPm4h3pTfxA==", - "dev": true, - "license": "MIT" - }, - "node_modules/file-type": { - "version": "16.5.4", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", - "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", - "license": "MIT", - "dependencies": { - "readable-web-to-node-stream": "^3.0.0", - "strtok3": "^6.2.4", - "token-types": "^4.1.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/file-type?sponsor=1" - } - }, - "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==", - "dev": true, - "license": "MIT", - "optional": true - }, - "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-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/find-up-simple": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", - "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/findup-sync": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", - "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.3", - "micromatch": "^4.0.4", - "resolve-dir": "^1.0.1" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", - "dev": true, - "license": "MIT", - "dependencies": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "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/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "license": "ISC" - }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/font-finder": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/font-finder/-/font-finder-1.1.0.tgz", - "integrity": "sha512-wpCL2uIbi6GurJbU7ZlQ3nGd61Ho+dSU6U83/xJT5UPFfN35EeCW/rOtS+5k+IuEZu2SYmHzDIPL9eA5tSYRAw==", - "license": "MIT", - "dependencies": { - "get-system-fonts": "^2.0.0", - "promise-stream-reader": "^1.0.1" - }, - "engines": { - "node": ">8.0.0" - } - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "node_modules/execa/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "license": "MIT", "dependencies": { - "for-in": "^1.0.1" + "path-key": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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" - }, + "node_modules/execa/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=14" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/foreground-child/node_modules/signal-exit": { + "node_modules/execa/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==", + "dev": true, "license": "ISC", "engines": { "node": ">=14" @@ -6228,435 +4090,263 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/formidable": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.2.tgz", - "integrity": "sha512-Jqc1btCy3QzRbJaICGwKcBfGWuLADRerLzDqi2NwSt/UkXLsHJw2TVResiaoBufHVHy9aSgClOHCeJsSsFLTbg==", - "license": "MIT", - "dependencies": { - "dezalgo": "^1.0.4", - "hexoid": "^2.0.0", - "once": "^1.4.0" - }, - "funding": { - "url": "https://ko-fi.com/tunnckoCore/commissions" - } + "node_modules/exif-parser": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", + "integrity": "sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw==" }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true, - "license": "MIT", - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "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/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-minipass/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/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==", - "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": ">= 0.8.0" } }, - "node_modules/gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", "dev": true, "license": "MIT", "dependencies": { - "globule": "^1.0.0" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "engines": { - "node": ">= 4.0.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": ">=0.10.0" } }, - "node_modules/get-east-asian-width": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", - "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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-pkg-repo": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", - "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", - "license": "MIT", - "dependencies": { - "@hutson/parse-repository-url": "^3.0.0", - "hosted-git-info": "^4.0.0", - "through2": "^2.0.0", - "yargs": "^16.2.0" - }, - "bin": { - "get-pkg-repo": "src/cli.js" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-pkg-repo/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==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/get-pkg-repo/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "license": "ISC", "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" + "ms": "2.0.0" } }, - "node_modules/get-pkg-repo/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" }, - "node_modules/get-pkg-repo/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==", + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, "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" + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/get-pkg-repo/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==", + "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": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, "license": "MIT" }, - "node_modules/get-pkg-repo/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "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": { - "safe-buffer": "~5.1.0" + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/get-pkg-repo/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, "license": "MIT", "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/get-pkg-repo/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/get-pkg-repo/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "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" + "is-descriptor": "^1.0.0" }, "engines": { - "node": ">=10" - } - }, - "node_modules/get-pkg-repo/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==", - "license": "ISC", - "engines": { - "node": ">=10" + "node": ">=0.10.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==", + "node_modules/extglob/node_modules/is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, "license": "MIT", "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" }, "engines": { "node": ">= 0.4" } }, - "node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "node_modules/fast-check": { + "version": "3.23.2", + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.23.2.tgz", + "integrity": "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], "license": "MIT", - "engines": { - "node": ">=16" + "dependencies": { + "pure-rand": "^6.1.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-system-fonts": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-system-fonts/-/get-system-fonts-2.0.2.tgz", - "integrity": "sha512-zzlgaYnHMIEgHRrfC7x0Qp0Ylhw/sHpM6MHXeVBTYIsvGf5GpbnClB+Q6rAPdn+0gd2oZZIo6Tj3EaWrt4VhDQ==", - "license": "MIT", "engines": { - "node": ">8.0.0" + "node": ">=8.0.0" } }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", - "dev": true, + "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": ">=0.10.0" + "node": ">=8.6.0" } }, - "node_modules/getobject": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz", - "integrity": "sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==", + "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, - "engines": { - "node": ">=10" - } + "license": "MIT" }, - "node_modules/gifwrap": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/gifwrap/-/gifwrap-0.10.1.tgz", - "integrity": "sha512-2760b1vpJHNmLzZ/ubTtNnEx5WApN/PYWJvXvgS+tL1egTTthayFYIQQNi136FLEDcN/IyEY2EcGpIITD6eYUw==", - "license": "MIT", + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "license": "ISC", "dependencies": { - "image-q": "^4.0.0", - "omggif": "^1.0.10" + "reusify": "^1.0.4" } }, - "node_modules/git-raw-commits": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", - "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", + "node_modules/faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha512-Xhj93RXbMSq8urNCUq4p9l0P6hnySJ/7YNRhYNug0bLOuii7pKO7xQFb5mx9xZXWCar88pLPb805PvUkwrLZpQ==", + "dev": true, "license": "MIT", "dependencies": { - "dargs": "^7.0.0", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "git-raw-commits": "cli.js" + "websocket-driver": ">=0.5.1" }, "engines": { - "node": ">=10" + "node": ">=0.4.0" } }, - "node_modules/git-raw-commits/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==", + "node_modules/file-sync-cmp": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz", + "integrity": "sha512-0k45oWBokCqh2MOexeYKpyqmGKG+8mQ2Wd8iawx+uWd/weWJQAZ6SoPybagdCI4xFisag8iAR77WPm4h3pTfxA==", + "dev": true, + "license": "MIT" + }, + "node_modules/file-type": { + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", + "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "readable-web-to-node-stream": "^3.0.0", + "strtok3": "^6.2.4", + "token-types": "^4.1.1" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" } }, - "node_modules/git-raw-commits/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "license": "ISC" - }, - "node_modules/git-raw-commits/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==", - "license": "MIT" + "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==", + "dev": true, + "license": "MIT", + "optional": true }, - "node_modules/git-raw-commits/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==", + "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": { - "p-locate": "^4.1.0" + "to-regex-range": "^5.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/git-raw-commits/node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "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": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { "node": ">=10" @@ -6665,444 +4355,415 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/git-raw-commits/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/find-up-simple": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", + "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", + "dev": true, "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, "engines": { - "node": ">=6" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/git-raw-commits/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==", + "node_modules/findup-sync": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", + "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", + "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "detect-file": "^1.0.0", + "is-glob": "^4.0.3", + "micromatch": "^4.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" }, "engines": { - "node": ">=8" + "node": ">= 0.10" } }, - "node_modules/git-raw-commits/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true, "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": ">= 0.10" + } + }, + "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/git-raw-commits/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "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==", + "license": "ISC" + }, + "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", - "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": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/git-raw-commits/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "node_modules/font-finder": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/font-finder/-/font-finder-1.1.0.tgz", + "integrity": "sha512-wpCL2uIbi6GurJbU7ZlQ3nGd61Ho+dSU6U83/xJT5UPFfN35EeCW/rOtS+5k+IuEZu2SYmHzDIPL9eA5tSYRAw==", "license": "MIT", "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" + "get-system-fonts": "^2.0.0", + "promise-stream-reader": "^1.0.1" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">8.0.0" } }, - "node_modules/git-raw-commits/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "license": "(MIT OR CC0-1.0)", + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/git-raw-commits/node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "license": "BSD-2-Clause", + "node_modules/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "dev": true, + "license": "MIT", "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/git-raw-commits/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "license": "(MIT OR CC0-1.0)", + "for-in": "^1.0.1" + }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/git-raw-commits/node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "license": "MIT", + "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": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/git-raw-commits/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "node_modules/foreground-child/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", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/git-raw-commits/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/git-raw-commits/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==", - "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": ">=10" + "node": ">= 6" } }, - "node_modules/git-remote-origin-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", - "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==", + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, "license": "MIT", "dependencies": { - "gitconfiglocal": "^1.0.0", - "pify": "^2.3.0" + "map-cache": "^0.2.2" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/git-semver-tags": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", - "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", + "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==", "license": "MIT", "dependencies": { - "meow": "^8.0.0", - "semver": "^6.0.0" - }, - "bin": { - "git-semver-tags": "cli.js" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { "node": ">=10" } }, - "node_modules/git-semver-tags/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", + "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": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "minipass": "^7.0.3" }, "engines": { - "node": ">=8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/git-semver-tags/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, "license": "ISC" }, - "node_modules/git-semver-tags/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==", - "license": "MIT" - }, - "node_modules/git-semver-tags/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==", + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=8" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/git-semver-tags/node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "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", - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" - }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/git-semver-tags/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "globule": "^1.0.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 4.0.0" } }, - "node_modules/git-semver-tags/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==", + "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-east-asian-width": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", + "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", + "dev": true, "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/git-semver-tags/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/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": { - "@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" + "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": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/git-semver-tags/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "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": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/git-semver-tags/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, "license": "MIT", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, "engines": { - "node": ">=8" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/git-semver-tags/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "license": "(MIT OR CC0-1.0)", + "node_modules/get-system-fonts": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-system-fonts/-/get-system-fonts-2.0.2.tgz", + "integrity": "sha512-zzlgaYnHMIEgHRrfC7x0Qp0Ylhw/sHpM6MHXeVBTYIsvGf5GpbnClB+Q6rAPdn+0gd2oZZIo6Tj3EaWrt4VhDQ==", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">8.0.0" } }, - "node_modules/git-semver-tags/node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "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/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/git-semver-tags/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==", - "license": "ISC", - "bin": { - "semver": "bin/semver" + "node_modules/getobject": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz", + "integrity": "sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==", + "dev": true, + "engines": { + "node": ">=10" } }, - "node_modules/git-semver-tags/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" + "node_modules/gifwrap": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/gifwrap/-/gifwrap-0.10.1.tgz", + "integrity": "sha512-2760b1vpJHNmLzZ/ubTtNnEx5WApN/PYWJvXvgS+tL1egTTthayFYIQQNi136FLEDcN/IyEY2EcGpIITD6eYUw==", + "license": "MIT", + "dependencies": { + "image-q": "^4.0.0", + "omggif": "^1.0.10" } }, - "node_modules/git-semver-tags/node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "node_modules/git-raw-commits": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-5.0.0.tgz", + "integrity": "sha512-I2ZXrXeOc0KrCvC7swqtIFXFN+rbjnC7b2T943tvemIOVNl+XP8YnA9UVwqFhzzLClnSA60KR/qEjLpXzs73Qg==", + "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "@conventional-changelog/git-client": "^1.0.0", + "meow": "^13.0.0" }, "bin": { - "resolve": "bin/resolve" + "git-raw-commits": "src/cli.js" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "node_modules/git-semver-tags/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", + "node_modules/git-semver-tags": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-8.0.0.tgz", + "integrity": "sha512-N7YRIklvPH3wYWAR2vysaqGLPRcpwQ0GKdlqTiVN5w1UmCdaeY3K8s6DMKRCh54DDdzyt/OAB6C8jgVtb7Y2Fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@conventional-changelog/git-client": "^1.0.0", + "meow": "^13.0.0" + }, "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/git-semver-tags/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" + "git-semver-tags": "src/cli.js" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/git-semver-tags/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==", - "license": "ISC", "engines": { - "node": ">=10" - } - }, - "node_modules/gitconfiglocal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", - "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", - "license": "BSD", - "dependencies": { - "ini": "^1.3.2" + "node": ">=18" } }, - "node_modules/gitconfiglocal/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, "node_modules/glob": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.1.tgz", - "integrity": "sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==", - "license": "ISC", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz", + "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "BlueOak-1.0.0", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^4.0.1", - "minimatch": "^10.0.0", + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.1.1", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^2.0.0" @@ -7129,15 +4790,6 @@ "node": ">= 6" } }, - "node_modules/glob/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/global-modules": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", @@ -7197,26 +4849,6 @@ "which": "bin/which" } }, - "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/globule": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz", @@ -7232,10 +4864,17 @@ "node": ">= 0.10" } }, + "node_modules/globule/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/globule/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.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": { @@ -7247,7 +4886,7 @@ "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { @@ -7266,9 +4905,9 @@ } }, "node_modules/globule/node_modules/minimatch": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", - "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -7537,6 +5176,46 @@ "node": ">=10" } }, + "node_modules/grunt-legacy-log-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "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/grunt-legacy-log-utils/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/grunt-legacy-log-utils/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/grunt-legacy-util": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz", @@ -7614,6 +5293,29 @@ "node": ">=8" } }, + "node_modules/grunt-shell/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/grunt-shell/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/grunt-template": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/grunt-template/-/grunt-template-1.0.0.tgz", @@ -7651,6 +5353,40 @@ "typescript": ">=1" } }, + "node_modules/grunt-ts/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "license": "ISC", + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/grunt-ts/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-ts/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/grunt-ts/node_modules/braces": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", @@ -7692,8 +5428,22 @@ "readdirp": "^2.2.1", "upath": "^1.1.1" }, - "optionalDependencies": { - "fsevents": "^1.2.7" + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/grunt-ts/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, "node_modules/grunt-ts/node_modules/detect-newline": { @@ -7706,19 +5456,6 @@ "node": ">=0.10.0" } }, - "node_modules/grunt-ts/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/grunt-ts/node_modules/fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -7779,12 +5516,42 @@ "node": ">=0.10.0" } }, + "node_modules/grunt-ts/node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-ts/node_modules/is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/grunt-ts/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==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, "engines": { "node": ">=0.10.0" } @@ -7802,7 +5569,7 @@ "node": ">=0.10.0" } }, - "node_modules/grunt-ts/node_modules/kind-of": { + "node_modules/grunt-ts/node_modules/is-number/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", @@ -7854,29 +5621,6 @@ "node": ">=0.10.0" } }, - "node_modules/grunt-ts/node_modules/micromatch/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-ts/node_modules/micromatch/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/grunt-ts/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -7960,10 +5704,17 @@ "node": ">=0.10.0" } }, + "node_modules/grunt/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/grunt/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.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": { @@ -7971,21 +5722,11 @@ "concat-map": "0.0.1" } }, - "node_modules/grunt/node_modules/dateformat": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", - "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/grunt/node_modules/glob": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { @@ -8004,9 +5745,9 @@ } }, "node_modules/grunt/node_modules/minimatch": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", - "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -8033,6 +5774,7 @@ "version": "4.7.8", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, "license": "MIT", "dependencies": { "minimist": "^1.2.5", @@ -8054,20 +5796,12 @@ "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/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==", - "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", @@ -8092,12 +5826,13 @@ } }, "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==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, "node_modules/has-symbols": { @@ -8217,15 +5952,6 @@ "he": "bin/he" } }, - "node_modules/hexoid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-2.0.0.tgz", - "integrity": "sha512-qlspKUK7IlSQv2o+5I7yhUd7TxlOG2Vr5LTa3ve2XSNVKAL/n/u/7KLvKmFNimomDIKvZFXWHv0T12mv7rT8Aw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/highlight.js": { "version": "10.7.3", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", @@ -8258,27 +5984,27 @@ } }, "node_modules/hosted-git-info": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.0.2.tgz", - "integrity": "sha512-sYKnA7eGln5ov8T8gnYlkSOxFJvywzEx9BueN6xo/GKO8PGiI6uK6xx+DIGe45T3bdVjLAQDQW1aicT8z8JwQg==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.2.tgz", + "integrity": "sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==", "license": "ISC", "dependencies": { - "lru-cache": "^10.0.1" + "lru-cache": "^11.1.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", "license": "BSD-2-Clause" }, "node_modules/http-parser-js": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.9.tgz", - "integrity": "sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", "dev": true, "license": "MIT" }, @@ -8338,7 +6064,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -8367,46 +6093,16 @@ ], "license": "BSD-3-Clause" }, - "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/ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "license": "ISC" - }, "node_modules/ignore-walk": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-7.0.0.tgz", - "integrity": "sha512-T4gbf83A4NH95zvhVYZc+qWocBBGlpzUXLPGurJggw/WIOwicfXJChLDP/iBZnN5WqROSu5Bm3hhle4z8a8YGQ==", - "license": "ISC", - "dependencies": { - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/ignore-walk/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-8.0.0.tgz", + "integrity": "sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A==", "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "minimatch": "^10.0.3" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/image-q": { @@ -8433,19 +6129,10 @@ "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/index-to-position": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-0.1.2.tgz", - "integrity": "sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz", + "integrity": "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==", "dev": true, "license": "MIT", "engines": { @@ -8460,6 +6147,7 @@ "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.", + "dev": true, "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -8473,12 +6161,12 @@ "license": "ISC" }, "node_modules/ini": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz", - "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", + "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==", "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/interpret": { @@ -8520,49 +6208,184 @@ "ios-mobileprovision-finder": "src/ios-mobileprovision-finder.js" } }, - "node_modules/ios-mobileprovision-finder/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "node_modules/ios-sim-portable": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/ios-sim-portable/-/ios-sim-portable-4.5.1.tgz", + "integrity": "sha512-g7qWaHXiFw7MuMrbwSQjeBpPl5zoHyhA6xArT2yhYg3U+WsoEy6d7x1Mgf6J77B+tvBJDWMjf2fjpuRBbQZggA==", + "license": "Apache-2.0", + "dependencies": { + "bplist-parser": "0.3.2", + "lodash": "4.17.21", + "plist": "3.0.6", + "shelljs": "~0.9.2", + "yargs": "17.7.1" + }, + "bin": { + "ios-sim-portable": "bin/ios-sim-portable.js", + "isim": "bin/ios-sim-portable.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/ios-sim-portable/node_modules/cross-spawn": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/ios-sim-portable/node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ios-sim-portable/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ios-sim-portable/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ios-sim-portable/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/ios-sim-portable/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/ios-sim-portable/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ios-sim-portable/node_modules/plist": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.6.tgz", + "integrity": "sha512-WiIVYyrp8TD4w8yCvyeIr+lkmrGRd5u0VbRnU+tP/aRLxP/YadJUYOMZJ/6hIa3oUyVCsycXvtNRgd5XBJIbiA==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ios-sim-portable/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/ios-sim-portable/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/ios-sim-portable/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ios-sim-portable/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "license": "MIT", "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=0.10.0" } }, - "node_modules/ios-sim-portable": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/ios-sim-portable/-/ios-sim-portable-4.5.0.tgz", - "integrity": "sha512-fJ6HewuZh6uoUkljXbTZF1MhDiSUs33C6WWPd+M7UuwHsf0e6urjURvxSS5MkkSedIVJyY6vCRup781HieW7NQ==", - "license": "Apache-2.0", + "node_modules/ios-sim-portable/node_modules/shelljs": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.9.2.tgz", + "integrity": "sha512-S3I64fEiKgTZzKCC46zT/Ib9meqofLrQVbpSswtjFfAVDW+AZ54WTnAM/3/yENoxz/V1Cy6u3kiiEbQ4DNphvw==", + "license": "BSD-3-Clause", "dependencies": { - "bplist-parser": "0.3.2", - "lodash": "4.17.21", - "plist": "3.0.6", - "shelljs": "~0.8.4", - "yargs": "17.7.1" + "execa": "^1.0.0", + "fast-glob": "^3.3.2", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" }, "bin": { - "ios-sim-portable": "bin/ios-sim-portable.js", - "isim": "bin/ios-sim-portable.js" + "shjs": "bin/shjs" }, "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "node_modules/ios-sim-portable/node_modules/plist": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.6.tgz", - "integrity": "sha512-WiIVYyrp8TD4w8yCvyeIr+lkmrGRd5u0VbRnU+tP/aRLxP/YadJUYOMZJ/6hIa3oUyVCsycXvtNRgd5XBJIbiA==", - "license": "MIT", + "node_modules/ios-sim-portable/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "license": "ISC", "dependencies": { - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" + "isexe": "^2.0.0" }, - "engines": { - "node": ">=6" + "bin": { + "which": "bin/which" } }, "node_modules/ios-sim-portable/node_modules/yargs": { @@ -8584,24 +6407,14 @@ } }, "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", "license": "MIT", - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, "engines": { "node": ">= 12" } }, - "node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "license": "BSD-3-Clause" - }, "node_modules/is-absolute": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", @@ -8630,22 +6443,21 @@ } }, "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==", + "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/is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", - "dev": true, + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "license": "MIT", "dependencies": { - "binary-extensions": "^1.0.0" + "binary-extensions": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/is-buffer": { @@ -8659,6 +6471,7 @@ "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -8684,9 +6497,9 @@ } }, "node_modules/is-descriptor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", - "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", "dev": true, "license": "MIT", "dependencies": { @@ -8713,14 +6526,11 @@ } }, "node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "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", - "dependencies": { - "is-plain-object": "^2.0.4" - }, "engines": { "node": ">=0.10.0" } @@ -8790,24 +6600,17 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -8861,18 +6664,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", - "license": "MIT", - "dependencies": { - "text-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-unc-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", @@ -8931,15 +6722,16 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, "license": "MIT" }, "node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "license": "ISC", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", + "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", + "license": "BlueOak-1.0.0", "engines": { - "node": ">=16" + "node": ">=20" } }, "node_modules/isobject": { @@ -8986,10 +6778,17 @@ "dev": true, "license": "MIT" }, + "node_modules/istanbul/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/istanbul/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.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": { @@ -9015,7 +6814,7 @@ "version": "5.0.15", "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { @@ -9029,16 +6828,6 @@ "node": "*" } }, - "node_modules/istanbul/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/istanbul/node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -9047,9 +6836,9 @@ "license": "ISC" }, "node_modules/istanbul/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -9085,19 +6874,6 @@ "nopt": "bin/nopt.js" } }, - "node_modules/istanbul/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/istanbul/node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -9112,12 +6888,12 @@ } }, "node_modules/jackspeak": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.0.tgz", - "integrity": "sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.2.3.tgz", + "integrity": "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==", "license": "BlueOak-1.0.0", "dependencies": { - "@isaacs/cliui": "^8.0.2" + "@isaacs/cliui": "^9.0.0" }, "engines": { "node": "20 || >=22" @@ -9174,12 +6950,13 @@ "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": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "dev": true, "license": "MIT", "dependencies": { @@ -9190,12 +6967,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "license": "MIT" - }, "node_modules/jsmin2": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/jsmin2/-/jsmin2-1.2.1.tgz", @@ -9203,19 +6974,13 @@ "dev": true, "license": "The Software shall be used for Good, not Evil. (see LICENSE)" }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "license": "MIT" - }, "node_modules/json-parse-even-better-errors": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz", - "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-5.0.0.tgz", + "integrity": "sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ==", "license": "MIT", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/json-stringify-nice": { @@ -9227,16 +6992,10 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "license": "ISC" - }, "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -9254,22 +7013,6 @@ ], "license": "MIT" }, - "node_modules/JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "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", @@ -9293,6 +7036,7 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -9307,77 +7051,6 @@ "node": ">=6" } }, - "node_modules/ky": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/ky/-/ky-1.7.5.tgz", - "integrity": "sha512-HzhziW6sc5m0pwi5M196+7cEBtbt0lCYi67wNsiwMUmz833wloE0gbzJPWKs1gliFKQb34huItDQX97LyOdPdA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sindresorhus/ky?sponsor=1" - } - }, - "node_modules/latest-version": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-9.0.0.tgz", - "integrity": "sha512-7W0vV3rqv5tokqkBAFV1LbR7HPOWzXQDpDgEuib/aJ1jsZZx6x3c2mBI+TJhJzOhkGeaLbCKEHXEXLfirtG2JA==", - "dev": true, - "license": "MIT", - "dependencies": { - "package-json": "^10.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "license": "MIT", - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/lazystream/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/lazystream/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/lazystream/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/levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -9429,13 +7102,13 @@ } }, "node_modules/liftup/node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -9462,16 +7135,10 @@ "url": "https://github.com/sponsors/antonk52" } }, - "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==", - "license": "MIT" - }, "node_modules/lint-staged": { - "version": "15.4.3", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.4.3.tgz", - "integrity": "sha512-FoH1vOeouNh1pw+90S+cnuoFwRfUD9ijY2GKy5h7HS3OR7JVir2N2xrsa0+Twc1B7cW72L+88geG5cW4wIhn7g==", + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.5.2.tgz", + "integrity": "sha512-YUSOLq9VeRNAo/CTaVmhGDKG+LBtA8KF1X4K5+ykMSwWST1vDxJRB2kv2COgLb1fvpCo+A/y9A0G0znNVmdx4w==", "dev": true, "license": "MIT", "dependencies": { @@ -9496,23 +7163,10 @@ "url": "https://opencollective.com/lint-staged" } }, - "node_modules/lint-staged/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/listr2": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz", - "integrity": "sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==", + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.3.3.tgz", + "integrity": "sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9528,9 +7182,9 @@ } }, "node_modules/listr2/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { @@ -9541,9 +7195,9 @@ } }, "node_modules/listr2/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true, "license": "MIT" }, @@ -9566,13 +7220,13 @@ } }, "node_modules/listr2/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -9582,63 +7236,30 @@ } }, "node_modules/listr2/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/livereload-js": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz", - "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==", - "dev": true, - "license": "MIT" - }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/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/load-json-file/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "license": "MIT", + "strip-ansi": "^7.1.0" + }, "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/livereload-js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz", + "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==", + "dev": true, + "license": "MIT" + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -9656,23 +7277,9 @@ } }, "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.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.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", "license": "MIT" }, "node_modules/lodash.merge": { @@ -9697,6 +7304,43 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/log-symbols/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/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/log-update": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", @@ -9718,9 +7362,9 @@ } }, "node_modules/log-update/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { @@ -9731,20 +7375,20 @@ } }, "node_modules/log-update/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true, "license": "MIT" }, "node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", - "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", "dev": true, "license": "MIT", "dependencies": { - "get-east-asian-width": "^1.0.0" + "get-east-asian-width": "^1.3.1" }, "engines": { "node": ">=18" @@ -9754,9 +7398,9 @@ } }, "node_modules/log-update/node_modules/slice-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", - "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", "dev": true, "license": "MIT", "dependencies": { @@ -9789,13 +7433,13 @@ } }, "node_modules/log-update/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -9805,9 +7449,9 @@ } }, "node_modules/log-update/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, "license": "MIT", "dependencies": { @@ -9839,17 +7483,20 @@ } }, "node_modules/loupe": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", - "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", "dev": true, "license": "MIT" }, "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" + "version": "11.2.6", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", + "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } }, "node_modules/make-error": { "version": "1.3.6", @@ -9858,34 +7505,25 @@ "license": "ISC" }, "node_modules/make-fetch-happen": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz", - "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==", + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-15.0.4.tgz", + "integrity": "sha512-vM2sG+wbVeVGYcCm16mM3d5fuem9oC28n436HjsGO3LcxoTI8LNVa4rwZDn3f76+cWyT4GGJDxjTYU1I2nr6zw==", "license": "ISC", "dependencies": { - "@npmcli/agent": "^3.0.0", - "cacache": "^19.0.1", + "@gar/promise-retry": "^1.0.0", + "@npmcli/agent": "^4.0.0", + "cacache": "^20.0.1", "http-cache-semantics": "^4.1.1", "minipass": "^7.0.2", - "minipass-fetch": "^4.0.0", + "minipass-fetch": "^5.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^1.0.0", - "proc-log": "^5.0.0", - "promise-retry": "^2.0.1", - "ssri": "^12.0.0" + "proc-log": "^6.0.0", + "ssri": "^13.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/make-fetch-happen/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": "^20.17.0 || >=22.9.0" } }, "node_modules/make-iterator": { @@ -9911,18 +7549,6 @@ "node": ">=0.10.0" } }, - "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==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", @@ -9937,9 +7563,9 @@ } }, "node_modules/marked": { - "version": "15.0.7", - "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.7.tgz", - "integrity": "sha512-dgLIeKGLx5FwziAnsk4ONoGwHwGPJzselimvlVskE9XLN4Orv9u2VA3GWw/lYUqjfA0rUT/6fqKwfZJapP9BEg==", + "version": "15.0.12", + "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", + "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", "license": "MIT", "bin": { "marked": "bin/marked.js" @@ -9969,18 +7595,6 @@ "marked": ">=1 <16" } }, - "node_modules/marked-terminal/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -10007,7 +7621,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, "license": "MIT" }, "node_modules/merge2": { @@ -10019,26 +7632,6 @@ "node": ">= 8" } }, - "node_modules/mergexml": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/mergexml/-/mergexml-1.2.4.tgz", - "integrity": "sha512-yiOlDqcVCz7AG1eSboonc18FTlfqDEKYfGoAV3Lul98u6YRV/s0kjtf4bjk47t0hLTFJR0BSYMd6BpmX3xDjNQ==", - "license": "ISC", - "dependencies": { - "@xmldom/xmldom": "^0.7.0", - "formidable": "^3.5.1", - "xpath": "0.0.27" - } - }, - "node_modules/mergexml/node_modules/xpath": { - "version": "0.0.27", - "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.27.tgz", - "integrity": "sha512-fg03WRxtkCV6ohClePNAECYsmpKKTv5L8y/X3Dn1hQrec3POx2jHZ/0P2qQ6HvsrU1BmeqXcof3NGGueG6LxwQ==", - "license": "MIT", - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -10111,25 +7704,16 @@ "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==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/minimatch": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", - "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", - "license": "ISC", + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^5.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -10139,42 +7723,19 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, "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==", - "license": "MIT", - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/minimist-options/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==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", - "dev": true, - "license": "ISC", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, "node_modules/minipass-collect": { @@ -10189,39 +7750,38 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/minipass-collect/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-fetch": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.1.tgz", - "integrity": "sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-5.0.2.tgz", + "integrity": "sha512-2d0q2a8eCi2IRg/IGubCNRJoYbA1+YPXAzQVRFmB45gdGZafyivnZ5YSEfo3JikbjGxOdntGFvBQGqaSMXlAFQ==", "license": "MIT", "dependencies": { "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", + "minipass-sized": "^2.0.0", "minizlib": "^3.0.1" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" }, "optionalDependencies": { - "encoding": "^0.1.13" + "iconv-lite": "^0.7.2" } }, - "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", + "node_modules/minipass-fetch/node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/minipass-flush": { @@ -10285,136 +7845,27 @@ "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==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-2.0.0.tgz", + "integrity": "sha512-zSsHhto5BcUVM2m1LurnXY6M//cGhVaegT71OfOXoprxT6o780GZd792ea6FfrQkuU4usHZIUczAQMRUE2plzA==", "license": "ISC", "dependencies": { - "yallist": "^4.0.0" + "minipass": "^7.1.2" }, "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/minizlib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", - "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", - "license": "MIT", - "dependencies": { - "minipass": "^7.0.4", - "rimraf": "^5.0.5" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/minizlib/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "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/minizlib/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/minizlib/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/minizlib/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/minizlib/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/minizlib/node_modules/rimraf": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", - "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", - "license": "ISC", + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "license": "MIT", "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" + "minipass": "^7.1.2" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">= 18" } }, "node_modules/mixin-deep": { @@ -10431,6 +7882,19 @@ "node": ">=0.10.0" } }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/mkdirp": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", @@ -10447,29 +7911,30 @@ } }, "node_modules/mocha": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.1.0.tgz", - "integrity": "sha512-8uJR5RTC2NgpY3GrYcgpZrsEd9zKbPDpob1RezyR2upGHRQtHWofmzTMzTMSV6dru3tj5Ukt0+Vnq1qhFEEwAg==", + "version": "11.7.5", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.5.tgz", + "integrity": "sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig==", "dev": true, "license": "MIT", "dependencies": { - "ansi-colors": "^4.1.3", "browser-stdout": "^1.3.1", - "chokidar": "^3.5.3", + "chokidar": "^4.0.1", "debug": "^4.3.5", - "diff": "^5.2.0", + "diff": "^7.0.0", "escape-string-regexp": "^4.0.0", "find-up": "^5.0.0", "glob": "^10.4.5", "he": "^1.2.0", + "is-path-inside": "^3.0.3", "js-yaml": "^4.1.0", "log-symbols": "^4.1.0", - "minimatch": "^5.1.6", + "minimatch": "^9.0.5", "ms": "^2.1.3", + "picocolors": "^1.1.1", "serialize-javascript": "^6.0.2", "strip-json-comments": "^3.1.1", "supports-color": "^8.1.1", - "workerpool": "^6.5.1", + "workerpool": "^9.2.0", "yargs": "^17.7.2", "yargs-parser": "^21.1.1", "yargs-unparser": "^2.0.0" @@ -10482,18 +7947,35 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/mocha/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==", + "node_modules/mocha/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==", "dev": true, "license": "ISC", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "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": ">= 8" + "node": ">=12" + } + }, + "node_modules/mocha/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/mocha/node_modules/argparse": { @@ -10503,48 +7985,61 @@ "dev": true, "license": "Python-2.0" }, - "node_modules/mocha/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==", + "node_modules/mocha/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/mocha/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==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "balanced-match": "^1.0.0" } }, "node_modules/mocha/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, "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" + "readdirp": "^4.0.1" }, "engines": { - "node": ">= 8.10.0" + "node": ">= 14.16.0" }, "funding": { "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" } }, + "node_modules/mocha/node_modules/diff": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/mocha/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==", + "dev": true, + "license": "MIT" + }, "node_modules/mocha/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { @@ -10562,31 +8057,12 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mocha/node_modules/glob/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/mocha/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==", + "node_modules/mocha/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, "engines": { "node": ">=8" } @@ -10608,9 +8084,9 @@ } }, "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==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", "dependencies": { @@ -10620,27 +8096,27 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/mocha/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==", + "dev": true, + "license": "ISC" + }, "node_modules/mocha/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/mocha/node_modules/path-scurry": { @@ -10661,16 +8137,51 @@ } }, "node_modules/mocha/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "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/mocha/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==", "dev": true, "license": "MIT", "dependencies": { - "picomatch": "^2.2.1" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=8.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/mocha/node_modules/supports-color": { @@ -10689,13 +8200,22 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", + "node_modules/mocha/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==", + "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/ms": { @@ -10725,31 +8245,86 @@ } }, "node_modules/nan": { - "version": "2.22.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.2.tgz", - "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==", + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.25.0.tgz", + "integrity": "sha512-0M90Ag7Xn5KMLLZ7zliPWP3rT90P6PN+IzVFS0VqmnPktBk3700xUVv8Ikm9EUaUE5SDWdp/BIxdENzVznpm1g==", "dev": true, "license": "MIT", "optional": true }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/nanomatch/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "license": "MIT", "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "is-plain-object": "^2.0.4" }, "engines": { "node": ">=0.10.0" @@ -10836,6 +8411,13 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "license": "MIT" }, "node_modules/nise": { @@ -10867,48 +8449,28 @@ "node": ">=18" } }, - "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-gyp": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.1.0.tgz", - "integrity": "sha512-/+7TuHKnBpnMvUQnsYEb0JOozDZqarQbfNuSGLXIjhStMT0fbw7IdSqWgopOP5xhRZE+lsbIvAHcekddruPZgQ==", + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.2.0.tgz", + "integrity": "sha512-q23WdzrQv48KozXlr0U1v9dwO/k59NHeSzn6loGcasyf0UnSrtzs8kRxM+mfwJSf0DkX0s43hcqgnSO4/VNthQ==", "license": "MIT", "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", - "glob": "^10.3.10", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^14.0.3", - "nopt": "^8.0.0", - "proc-log": "^5.0.0", + "make-fetch-happen": "^15.0.0", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", "semver": "^7.3.5", - "tar": "^7.4.3", - "which": "^5.0.0" + "tar": "^7.5.4", + "tinyglobby": "^0.2.12", + "which": "^6.0.0" }, "bin": { "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/node-gyp/node_modules/env-paths": { @@ -10920,292 +8482,63 @@ "node": ">=6" } }, - "node_modules/node-gyp/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "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/node-gyp/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/node-gyp/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/node-gyp/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/node-gyp/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/nodemon": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.3.tgz", - "integrity": "sha512-7jH/NXbFPxVaMwmBCC2B9F/V6X1VkEdNgx3iu9jji8WxWcvhMWkmhNWhI5077zknOnZnBzba9hZP6bCPJLSReQ==", - "license": "MIT", - "dependencies": { - "chokidar": "^3.5.2", - "debug": "^4", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^7.5.3", - "simple-update-notifier": "^2.0.0", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "bin": { - "nodemon": "bin/nodemon.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" - } - }, - "node_modules/nodemon/node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/nodemon/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==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nodemon/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/nodemon/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "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" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/nodemon/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/nodemon/node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nodemon/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/nodemon/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/nodemon/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/nopt": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", - "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz", + "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==", "license": "ISC", "dependencies": { - "abbrev": "^3.0.0" + "abbrev": "^4.0.0" }, "bin": { "nopt": "bin/nopt.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/nopt/node_modules/abbrev": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.0.tgz", - "integrity": "sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz", + "integrity": "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==", "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" + "hosted-git-info": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" }, "engines": { - "node": ">=10" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/normalize-package-data/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "dev": true, "license": "ISC", "dependencies": { - "lru-cache": "^6.0.0" + "lru-cache": "^10.0.1" }, "engines": { - "node": ">=10" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/normalize-package-data/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/normalize-package-data/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, "license": "ISC" }, "node_modules/normalize-path": { @@ -11218,113 +8551,104 @@ } }, "node_modules/npm-bundled": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-4.0.0.tgz", - "integrity": "sha512-IxaQZDMsqfQ2Lz37VvyyEtKLe8FsRZuysmedy/N06TU1RyVppYKXrO4xIhR0F+7ubIBox6Q7nir6fQI3ej39iA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-5.0.0.tgz", + "integrity": "sha512-JLSpbzh6UUXIEoqPsYBvVNVmyrjVZ1fzEFbqxKkTJQkWBO3xFzFT+KDnSKQWwOQNbuWRwt5LSD6HOTLGIWzfrw==", "license": "ISC", "dependencies": { - "npm-normalize-package-bin": "^4.0.0" + "npm-normalize-package-bin": "^5.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm-install-checks": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-7.1.1.tgz", - "integrity": "sha512-u6DCwbow5ynAX5BdiHQ9qvexme4U3qHW3MWe5NqH+NeBm0LbiH6zvGjNNew1fY+AZZUtVHbOPF3j7mJxbUzpXg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-8.0.0.tgz", + "integrity": "sha512-ScAUdMpyzkbpxoNekQ3tNRdFI8SJ86wgKZSQZdUxT+bj0wVFpsEMWnkXP0twVe1gJyNF5apBWDJhhIbgrIViRA==", "license": "BSD-2-Clause", "dependencies": { "semver": "^7.1.1" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm-normalize-package-bin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz", - "integrity": "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-5.0.0.tgz", + "integrity": "sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag==", "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm-package-arg": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", - "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==", + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-13.0.2.tgz", + "integrity": "sha512-IciCE3SY3uE84Ld8WZU23gAPPV9rIYod4F+rc+vJ7h7cwAJt9Vk6TVsK60ry7Uj3SRS3bqRRIGuTp9YVlk6WNA==", "license": "ISC", "dependencies": { - "hosted-git-info": "^8.0.0", - "proc-log": "^5.0.0", + "hosted-git-info": "^9.0.0", + "proc-log": "^6.0.0", "semver": "^7.3.5", - "validate-npm-package-name": "^6.0.0" + "validate-npm-package-name": "^7.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm-packlist": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.0.tgz", - "integrity": "sha512-rht9U6nS8WOBDc53eipZNPo5qkAV4X2rhKE2Oj1DYUQ3DieXfj0mKkVmjnf3iuNdtMd8WfLdi2L6ASkD/8a+Kg==", + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.4.tgz", + "integrity": "sha512-uMW73iajD8hiH4ZBxEV3HC+eTnppIqwakjOYuvgddnalIw2lJguKviK1pcUJDlIWm1wSJkchpDZDSVVsZEYRng==", "license": "ISC", "dependencies": { - "ignore-walk": "^7.0.0" + "ignore-walk": "^8.0.0", + "proc-log": "^6.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm-pick-manifest": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-10.0.0.tgz", - "integrity": "sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-11.0.3.tgz", + "integrity": "sha512-buzyCfeoGY/PxKqmBqn1IUJrZnUi1VVJTdSSRPGI60tJdUhUoSQFhs0zycJokDdOznQentgrpf8LayEHyyYlqQ==", "license": "ISC", "dependencies": { - "npm-install-checks": "^7.1.0", - "npm-normalize-package-bin": "^4.0.0", - "npm-package-arg": "^12.0.0", + "npm-install-checks": "^8.0.0", + "npm-normalize-package-bin": "^5.0.0", + "npm-package-arg": "^13.0.0", "semver": "^7.3.5" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm-registry-fetch": { - "version": "18.0.2", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-18.0.2.tgz", - "integrity": "sha512-LeVMZBBVy+oQb5R6FDV9OlJCcWDU+al10oKpe+nsvcHnG24Z3uM3SvJYKfGJlfGjVU8v9liejCrUR/M5HO5NEQ==", + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-19.1.1.tgz", + "integrity": "sha512-TakBap6OM1w0H73VZVDf44iFXsOS3h+L4wVMXmbWOQroZgFhMch0juN6XSzBNlD965yIKvWg2dfu7NSiaYLxtw==", "license": "ISC", "dependencies": { - "@npmcli/redact": "^3.0.0", + "@npmcli/redact": "^4.0.0", "jsonparse": "^1.3.1", - "make-fetch-happen": "^14.0.0", + "make-fetch-happen": "^15.0.0", "minipass": "^7.0.2", - "minipass-fetch": "^4.0.0", + "minipass-fetch": "^5.0.0", "minizlib": "^3.0.1", - "npm-package-arg": "^12.0.0", - "proc-log": "^5.0.0" + "npm-package-arg": "^13.0.0", + "proc-log": "^6.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm-registry-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": "^20.17.0 || >=22.9.0" } }, "node_modules/npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "dev": true, "license": "MIT", "dependencies": { "path-key": "^2.0.0" @@ -11337,25 +8661,11 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, - "node_modules/npm-watch": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/npm-watch/-/npm-watch-0.11.0.tgz", - "integrity": "sha512-wAOd0moNX2kSA2FNvt8+7ORwYaJpQ1ZoWjUYdb1bBCxq4nkWuU0IiJa9VpVxrj5Ks+FGXQd62OC/Bjk0aSr+dg==", - "license": "MIT", - "dependencies": { - "nodemon": "^2.0.7", - "through2": "^4.0.2" - }, - "bin": { - "npm-watch": "cli.js" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -11380,33 +8690,6 @@ "node": ">=0.10.0" } }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", - "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-accessor-descriptor": "^1.0.1", - "is-data-descriptor": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/object-copy/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -11578,6 +8861,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ora/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/ora/node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -11590,6 +8889,15 @@ "node": ">=8" } }, + "node_modules/ora/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/ora/node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -11627,10 +8935,23 @@ "node": ">=8" } }, + "node_modules/ora/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/os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -11640,22 +8961,33 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/osenv": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", - "integrity": "sha512-W6FhbLxEWdiyX2/fCl2YBZUJOYWaCHJa+jJwUVMX0iFYJmwyd0uzKx4NxFdj3xo9C0pumQ6G/fvd1MbNhsqQbQ==", + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "deprecated": "This package is no longer supported.", + "dev": true, "license": "ISC", "dependencies": { "os-homedir": "^1.0.0", "os-tmpdir": "^1.0.0" } }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -11689,9 +9021,9 @@ } }, "node_modules/p-map": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", - "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", "license": "MIT", "engines": { "node": ">=18" @@ -11709,25 +9041,6 @@ "node": ">=6" } }, - "node_modules/package-json": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-10.0.1.tgz", - "integrity": "sha512-ua1L4OgXSBdsu1FPb7F3tYH0F48a6kxvod4pLUlGY9COeJAJQNX/sNH2IiEmsxw7lqYiAwrdHMjz1FctOsyDQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ky": "^1.2.0", - "registry-auth-token": "^5.0.2", - "registry-url": "^6.0.1", - "semver": "^7.6.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "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", @@ -11735,28 +9048,28 @@ "license": "BlueOak-1.0.0" }, "node_modules/pacote": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.0.0.tgz", - "integrity": "sha512-lcqexq73AMv6QNLo7SOpz0JJoaGdS3rBFgF122NZVl1bApo2mfu+XzUBU/X/XsiJu+iUmKpekRayqQYAs+PhkA==", + "version": "21.0.4", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.0.4.tgz", + "integrity": "sha512-RplP/pDW0NNNDh3pnaoIWYPvNenS7UqMbXyvMqJczosiFWTeGGwJC2NQBLqKf4rGLFfwCOnntw1aEp9Jiqm1MA==", "license": "ISC", "dependencies": { - "@npmcli/git": "^6.0.0", - "@npmcli/installed-package-contents": "^3.0.0", - "@npmcli/package-json": "^6.0.0", - "@npmcli/promise-spawn": "^8.0.0", - "@npmcli/run-script": "^9.0.0", - "cacache": "^19.0.0", + "@npmcli/git": "^7.0.0", + "@npmcli/installed-package-contents": "^4.0.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "@npmcli/run-script": "^10.0.0", + "cacache": "^20.0.0", "fs-minipass": "^3.0.0", "minipass": "^7.0.2", - "npm-package-arg": "^12.0.0", - "npm-packlist": "^10.0.0", - "npm-pick-manifest": "^10.0.0", - "npm-registry-fetch": "^18.0.0", - "proc-log": "^5.0.0", + "npm-package-arg": "^13.0.0", + "npm-packlist": "^10.0.1", + "npm-pick-manifest": "^11.0.1", + "npm-registry-fetch": "^19.0.0", + "proc-log": "^6.0.0", "promise-retry": "^2.0.1", - "sigstore": "^3.0.0", - "ssri": "^12.0.0", - "tar": "^6.1.11" + "sigstore": "^4.0.0", + "ssri": "^13.0.0", + "tar": "^7.4.3" }, "bin": { "pacote": "bin/index.js" @@ -11765,117 +9078,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/pacote/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/pacote/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/pacote/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/pacote/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/pacote/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/pacote/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/pacote/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/pacote/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/pacote/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/pacote/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/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -11905,17 +9107,17 @@ } }, "node_modules/parse-conflict-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-4.0.0.tgz", - "integrity": "sha512-37CN2VtcuvKgHUs8+0b1uJeEsbGn61GRHz469C94P5xiOoqpDYJYwjg4RY9Vmz39WyZAVkR5++nbJwLMIgOCnQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-5.0.1.tgz", + "integrity": "sha512-ZHEmNKMq1wyJXNwLxyHnluPfRAFSIliBvbK/UiOceROt4Xh9Pz0fq49NytIaeaCUf5VR86hwQ/34FCcNU5/LKQ==", "license": "ISC", "dependencies": { - "json-parse-even-better-errors": "^4.0.0", + "json-parse-even-better-errors": "^5.0.0", "just-diff": "^6.0.0", "just-diff-apply": "^5.2.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/parse-filepath": { @@ -11934,16 +9136,21 @@ } }, "node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", + "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", + "dev": true, "license": "MIT", "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "@babel/code-frame": "^7.26.2", + "index-to-position": "^1.1.0", + "type-fest": "^4.39.1" }, "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/parse-passwd": { @@ -12013,6 +9220,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -12031,6 +9239,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, "license": "MIT" }, "node_modules/path-root": { @@ -12057,74 +9266,36 @@ } }, "node_modules/path-scurry": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", - "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz", - "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==", - "license": "ISC", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/path-scurry/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/path-to-regexp": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", - "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=16" - } - }, - "node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "license": "MIT", - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/path-type/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" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/pathval": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", "dev": true, "license": "MIT", "engines": { @@ -12160,6 +9331,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, "license": "ISC" }, "node_modules/picomatch": { @@ -12182,18 +9354,9 @@ "license": "MIT", "bin": { "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "license": "MIT", + }, "engines": { - "node": ">=0.10.0" + "node": ">=0.10" } }, "node_modules/pixelmatch": { @@ -12241,6 +9404,12 @@ "plist": "3.0.6" } }, + "node_modules/plist-merge-patch/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/plist-merge-patch/node_modules/plist": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.6.tgz", @@ -12254,15 +9423,6 @@ "node": ">=6" } }, - "node_modules/plist/node_modules/@xmldom/xmldom": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/pngjs": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", @@ -12283,9 +9443,9 @@ } }, "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==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -12305,9 +9465,9 @@ } }, "node_modules/prettier": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.2.tgz", - "integrity": "sha512-lc6npv5PH7hVqozBR7lkBNOGXV9vMwROAPlumdBkX0wTbbzPu/U1hk5yL8p2pt4Xoc+2mkT8t/sow2YrV/M5qg==", + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.3.tgz", + "integrity": "sha512-QgODejq9K3OzoBbuyobZlUhznP5SKwPqp+6Q6xw6o8gnhr4O85L2U915iM2IDcfF2NPXVaM9zlo9tdwipnYwzg==", "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" @@ -12320,12 +9480,12 @@ } }, "node_modules/proc-log": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", - "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/process": { @@ -12341,15 +9501,16 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, "license": "MIT" }, "node_modules/proggy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proggy/-/proggy-3.0.0.tgz", - "integrity": "sha512-QE8RApCM3IaRRxVzxrjbgNMpQEX6Wu0p0KBeoSiSEw5/bsGwZHsshF4LCxH2jp/r6BU+bqA3LrMDEYNfJnpD8Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/proggy/-/proggy-4.0.0.tgz", + "integrity": "sha512-MbA4R+WQT76ZBm/5JUpV9yqcJt92175+Y0Bodg3HgiXzrmKu7Ggq+bpn6y6wHH+gN9NcyKn3yg1+d47VaKwNAQ==", "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/promise-all-reject-late": { @@ -12383,6 +9544,15 @@ "node": ">=10" } }, + "node_modules/promise-retry/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/promise-stream-reader": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-stream-reader/-/promise-stream-reader-1.0.1.tgz", @@ -12425,12 +9595,14 @@ "signal-exit": "^3.0.2" } }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true, - "license": "ISC" + "node_modules/proper-lockfile/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/proxy-from-env": { "version": "1.1.0", @@ -12439,31 +9611,38 @@ "license": "MIT" }, "node_modules/proxy-lib": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/proxy-lib/-/proxy-lib-0.4.0.tgz", - "integrity": "sha512-oUDDpf0NTtKPyXjBNUcKzwZhA9GjEdu8Z47GsxGv5rZvKyCqsSrHurJtlL1yp7uVzA2NOmxd4aX7qmB1ZOdCwQ==", - "license": "Apache-2.0", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/proxy-lib/-/proxy-lib-0.4.1.tgz", + "integrity": "sha512-PvdxnMi+iTIjv5CWDAv5JqWcXthPwVGJ5fp1uWwsCKLsSpjfBlLTFtKIBC5kQyH6EpzxqJuUoapYP25tOpxLWQ==", + "license": "Apache-2.0" + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "license": "MIT", "dependencies": { - "osenv": "0.1.4" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "node_modules/pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], "license": "MIT" }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", - "license": "MIT", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, "node_modules/qr-image": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/qr-image/-/qr-image-3.2.0.tgz", @@ -12479,9 +9658,9 @@ } }, "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -12514,15 +9693,6 @@ ], "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==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -12537,6 +9707,7 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz", "integrity": "sha512-WmJJU2e9Y6M5UzTOkHaM7xJGAPQD8PNzx3bAd2+uhZAim6wDk6dAZxPVYLF67XhbR4hmKGh33Lpmh4XWrCH5Mg==", + "deprecated": "No longer maintained. Please upgrade to a stable version.", "dev": true, "license": "MIT", "dependencies": { @@ -12554,59 +9725,13 @@ "dev": true, "license": "MIT" }, - "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/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/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": "5.0.0", - "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-5.0.0.tgz", - "integrity": "sha512-SEbJV7tohp3DAAILbEMPXavBjAnMN0tVnh4+9G8ihV4Pq3HYF9h8QNez9zkJ1ILkv9G2BjdzwctznGZXgu/HGw==", - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/read-package-json-fast": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-4.0.0.tgz", - "integrity": "sha512-qpt8EwugBWDw2cgE2W+/3oxC+KTez2uSVR8JU9Q36TXPAGCaozfQUs59v4j4GFpWTaw0i6hAZSvOmu1J0uOEUg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-6.0.0.tgz", + "integrity": "sha512-1zM5HuOfagXCBWMN83fuFI/x+T/UhZ7k+KIzhrHXcQoeX5+7gmaDYjELQHmmzIodumBHeByBJT4QYS7ufAgs7A==", "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^4.0.0", - "npm-normalize-package-bin": "^4.0.0" - }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/read-package-up": { @@ -12627,53 +9752,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-package-up/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==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/read-package-up/node_modules/normalize-package-data": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", - "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^7.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/read-package-up/node_modules/parse-json": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.1.0.tgz", - "integrity": "sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.22.13", - "index-to-position": "^0.1.2", - "type-fest": "^4.7.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-package-up/node_modules/read-pkg": { + "node_modules/read-pkg": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", @@ -12693,160 +9772,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-package-up/node_modules/type-fest": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.37.0.tgz", - "integrity": "sha512-S/5/0kFftkq27FPNye0XM1e2NsnoD/3FS+pBmbjmmtLT6I+i344KoOf7pvXreaFsDamWeaJX55nczA1m5PsBDg==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", - "license": "MIT", - "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", - "license": "MIT", - "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "license": "MIT", - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "license": "MIT", - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "license": "MIT", - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "license": "MIT", - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "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==", - "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/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.0", - "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/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==", - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, "node_modules/readable-stream": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", @@ -12903,38 +9828,16 @@ "url": "https://github.com/sponsors/Borewit" } }, - "node_modules/readdir-glob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.1.0" - } - }, - "node_modules/readdir-glob/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/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "license": "MIT", - "engines": { - "node": ">= 14.18.0" + "dependencies": { + "picomatch": "^2.2.1" }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" + "engines": { + "node": ">=8.10.0" } }, "node_modules/rechoir": { @@ -12951,13 +9854,13 @@ } }, "node_modules/rechoir/node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -12971,19 +9874,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "license": "MIT", - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -12998,41 +9888,39 @@ "node": ">=0.10.0" } }, - "node_modules/regexp-to-ast": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz", - "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==", - "license": "MIT" - }, - "node_modules/registry-auth-token": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.0.tgz", - "integrity": "sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==", + "node_modules/regex-not/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", "dev": true, "license": "MIT", "dependencies": { - "@pnpm/npm-conf": "^2.1.0" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" }, "engines": { - "node": ">=14" + "node": ">=0.10.0" } }, - "node_modules/registry-url": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", - "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "node_modules/regex-not/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "license": "MIT", "dependencies": { - "rc": "1.2.8" + "is-plain-object": "^2.0.4" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, + "node_modules/regexp-to-ast": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz", + "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==", + "license": "MIT" + }, "node_modules/remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", @@ -13103,10 +9991,16 @@ "node": ">=4" } }, + "node_modules/replace/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/replace/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.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", @@ -13215,9 +10109,9 @@ } }, "node_modules/replace/node_modules/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -13453,9 +10347,9 @@ } }, "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "license": "MIT", "engines": { "node": ">= 4" @@ -13491,10 +10385,17 @@ "rimraf": "bin.js" } }, + "node_modules/rimraf/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.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": { @@ -13506,7 +10407,7 @@ "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", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { @@ -13525,9 +10426,9 @@ } }, "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==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -13604,15 +10505,18 @@ "license": "MIT" }, "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", - "license": "ISC" + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.4.tgz", + "integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } }, "node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "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" @@ -13653,29 +10557,6 @@ "node": ">=0.10.0" } }, - "node_modules/set-value/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/set-value/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/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -13698,74 +10579,105 @@ } }, "node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.10.0.tgz", + "integrity": "sha512-Jex+xw5Mg2qMZL3qnzXIfaxEtBaC4n7xifqaqtrZDdlheR70OGkydrPJWT0V1cA1k3nanC86x9FwAmQl6w3Klw==", "license": "BSD-3-Clause", "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" + "execa": "^5.1.1", + "fast-glob": "^3.3.2" }, "engines": { - "node": ">=4" + "node": ">=18" } }, - "node_modules/shelljs/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/shelljs/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/shelljs/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" - }, + "node_modules/shelljs/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", "engines": { - "node": "*" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/shelljs/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", + "node_modules/shelljs/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/shelljs/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/shelljs/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "path-key": "^3.0.0" }, "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/shelljs/node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "node_modules/shelljs/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": { - "resolve": "^1.1.6" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">= 0.10" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shelljs/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "license": "MIT", + "engines": { + "node": ">=6" } }, "node_modules/side-channel": { @@ -13851,31 +10763,31 @@ "license": "ISC" }, "node_modules/sigstore": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.1.0.tgz", - "integrity": "sha512-ZpzWAFHIFqyFE56dXqgX/DkDRZdz+rRcjoIk/RQU4IX0wiCv1l8S7ZrXDHcCc+uaf+6o7w3h2l3g6GYG5TKN9Q==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-4.1.0.tgz", + "integrity": "sha512-/fUgUhYghuLzVT/gaJoeVehLCgZiUxPCPMcyVNY0lIf/cTCz58K/WTI7PefDarXxp9nUKpEwg1yyz3eSBMTtgA==", "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^3.1.0", - "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.4.0", - "@sigstore/sign": "^3.1.0", - "@sigstore/tuf": "^3.1.0", - "@sigstore/verify": "^2.1.0" + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.1.0", + "@sigstore/protobuf-specs": "^0.5.0", + "@sigstore/sign": "^4.1.0", + "@sigstore/tuf": "^4.0.1", + "@sigstore/verify": "^3.1.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/simple-git": { - "version": "3.27.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.27.0.tgz", - "integrity": "sha512-ivHoFS9Yi9GY49ogc6/YAi3Fl9ROnF4VyubNylgCkA+RVqLaKWnDSzXOVzya8csELIaWaYNutsEuAhZrtOjozA==", + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.30.0.tgz", + "integrity": "sha512-q6lxyDsCmEal/MEGhP1aVyQ3oxnagGlBDOVSIB4XUVLl1iZh0Pah6ebC9V4xBap/RfgP2WlI8EKs0WS0rMEJHg==", "license": "MIT", "dependencies": { "@kwsites/file-exists": "^1.1.1", "@kwsites/promise-deferred": "^1.1.1", - "debug": "^4.3.5" + "debug": "^4.4.0" }, "funding": { "type": "github", @@ -13894,32 +10806,14 @@ } }, "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "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.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "license": "MIT" - }, - "node_modules/simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/simple-xml-to-json": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/simple-xml-to-json/-/simple-xml-to-json-1.2.3.tgz", @@ -13930,14 +10824,14 @@ } }, "node_modules/sinon": { - "version": "19.0.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-19.0.2.tgz", - "integrity": "sha512-euuToqM+PjO4UgXeLETsfQiuoyPXlqFezr6YZDFwHR3t4qaX0fZUe1MfPMznTL5f8BWrVS89KduLdMUsxFCO6g==", + "version": "19.0.5", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-19.0.5.tgz", + "integrity": "sha512-r15s9/s+ub/d4bxNXqIUmwp6imVSdTorIRaxoecYjqTVLZ8RuoXr/4EDGwIBo6Waxn7f2gnURX9zuhAfCwaF6Q==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.1", - "@sinonjs/fake-timers": "^13.0.2", + "@sinonjs/fake-timers": "^13.0.5", "@sinonjs/samsam": "^8.0.1", "diff": "^7.0.0", "nise": "^6.1.1", @@ -13958,6 +10852,29 @@ "node": ">=0.3.1" } }, + "node_modules/sinon/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/sinon/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/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -13976,15 +10893,6 @@ "node": ">=8" } }, - "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", @@ -14058,92 +10966,56 @@ }, "engines": { "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + } + }, + "node_modules/snapdragon-node/node_modules/is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", "dev": true, "license": "MIT", "dependencies": { - "is-descriptor": "^0.1.0" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "node_modules/snapdragon/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==", + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "license": "MIT", "dependencies": { - "is-extendable": "^0.1.0" + "kind-of": "^3.2.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/snapdragon/node_modules/is-descriptor": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", - "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "license": "MIT", "dependencies": { - "is-accessor-descriptor": "^1.0.1", - "is-data-descriptor": "^1.0.1" + "is-buffer": "^1.1.5" }, "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" } }, - "node_modules/snapdragon/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==", + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "ms": "2.0.0" } }, "node_modules/snapdragon/node_modules/ms": { @@ -14164,12 +11036,12 @@ } }, "node_modules/socks": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", - "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", + "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": "^9.0.5", + "ip-address": "^10.0.1", "smart-buffer": "^4.2.0" }, "engines": { @@ -14192,12 +11064,12 @@ } }, "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", "license": "BSD-3-Clause", "engines": { - "node": ">= 8" + "node": ">= 12" } }, "node_modules/source-map-resolve": { @@ -14248,12 +11120,24 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, + "node_modules/spdx-correct/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.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", @@ -14261,9 +11145,9 @@ "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==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", @@ -14271,23 +11155,11 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", - "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", + "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", "license": "CC0-1.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-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -14301,27 +11173,31 @@ "node": ">=0.10.0" } }, - "node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "license": "ISC", + "node_modules/split-string/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "license": "MIT", "dependencies": { - "readable-stream": "^3.0.0" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/split2/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==", + "node_modules/split-string/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "is-plain-object": "^2.0.4" }, "engines": { - "node": ">= 6" + "node": ">=0.10.0" } }, "node_modules/sprintf-js": { @@ -14332,24 +11208,15 @@ "license": "BSD-3-Clause" }, "node_modules/ssri": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", - "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-13.0.1.tgz", + "integrity": "sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ==", "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/ssri/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": "^20.17.0 || >=22.9.0" } }, "node_modules/static-extend": { @@ -14366,33 +11233,6 @@ "node": ">=0.10.0" } }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-descriptor": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", - "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-accessor-descriptor": "^1.0.1", - "is-data-descriptor": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/stream-buffers": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", @@ -14448,19 +11288,6 @@ "node": ">= 4.0.0" } }, - "node_modules/streamx": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", - "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", - "license": "MIT", - "dependencies": { - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" - } - }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -14505,6 +11332,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -14532,6 +11360,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -14544,6 +11373,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -14571,6 +11401,15 @@ "node": ">=0.10.0" } }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/strip-final-newline": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", @@ -14584,18 +11423,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", - "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", @@ -14627,15 +11454,16 @@ } }, "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==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "has-flag": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=0.8.0" } }, "node_modules/supports-hyperlinks": { @@ -14654,144 +11482,64 @@ "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" } }, - "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/tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", - "license": "ISC", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "node_modules/supports-hyperlinks/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/tar/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": ">=8" } }, - "node_modules/temp": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", - "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", + "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": { - "mkdirp": "^0.5.1", - "rimraf": "~2.6.2" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=8" } }, - "node_modules/temp-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", - "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", + "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==", "dev": true, "license": "MIT", "engines": { - "node": ">=14.16" - } - }, - "node_modules/temp/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/temp/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": "*" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/temp/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": "*" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/temp/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", + "node_modules/tar": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.9.tgz", + "integrity": "sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==", + "license": "BlueOak-1.0.0", "dependencies": { - "minimist": "^1.2.6" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" }, - "bin": { - "mkdirp": "bin/cmd.js" + "engines": { + "node": ">=18" } }, - "node_modules/temp/node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "node_modules/temp-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", + "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" } }, "node_modules/tempfile": { @@ -14810,52 +11558,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tempy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", - "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", - "license": "MIT", - "dependencies": { - "del": "^6.0.0", - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/text-decoder": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", - "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", - "license": "Apache-2.0", - "dependencies": { - "b4a": "^1.6.4" - } - }, - "node_modules/text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", @@ -14877,35 +11579,6 @@ "node": ">=0.8" } }, - "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/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "license": "MIT", - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/through2/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/tiny-lr": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-1.1.1.tgz", @@ -14937,10 +11610,55 @@ "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", "license": "MIT" }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "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/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/tmp": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", "license": "MIT", "engines": { "node": ">=14.14" @@ -15000,6 +11718,61 @@ "node": ">=8.0" } }, + "node_modules/to-regex/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/to-regex/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/token-types": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", @@ -15017,21 +11790,6 @@ "url": "https://github.com/sponsors/Borewit" } }, - "node_modules/touch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", - "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", - "license": "ISC", - "bin": { - "nodetouch": "bin/nodetouch.js" - } - }, - "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/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -15050,15 +11808,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "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==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/ts-morph": { "version": "25.0.1", "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-25.0.1.tgz", @@ -15113,9 +11862,9 @@ } }, "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" @@ -15128,17 +11877,17 @@ "license": "0BSD" }, "node_modules/tuf-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-3.0.1.tgz", - "integrity": "sha512-+68OP1ZzSF84rTckf3FA95vJ1Zlx/uaXyiiKyPd1pA4rZNkpEvDAKmsu1xUSmbF/chCRYgZ6UZkDwC7PmzmAyA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-4.1.0.tgz", + "integrity": "sha512-50QV99kCKH5P/Vs4E2Gzp7BopNV+KzTXqWeaxrfu5IQJBOULRsTIS9seSsOVT8ZnGXzCyx55nYWAi4qJzpZKEQ==", "license": "MIT", "dependencies": { - "@tufjs/models": "3.0.1", - "debug": "^4.3.6", - "make-fetch-happen": "^14.0.1" + "@tufjs/models": "4.1.0", + "debug": "^4.4.3", + "make-fetch-happen": "^15.0.1" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/tunnel": { @@ -15174,12 +11923,13 @@ } }, "node_modules/type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=10" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -15202,6 +11952,7 @@ "version": "3.19.3", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, "license": "BSD-2-Clause", "optional": true, "bin": { @@ -15221,12 +11972,6 @@ "node": ">=0.10.0" } }, - "node_modules/undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "license": "MIT" - }, "node_modules/underscore.string": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz", @@ -15249,9 +11994,9 @@ "license": "BSD-3-Clause" }, "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "license": "MIT" }, "node_modules/unicode-emoji-modifier-base": { @@ -15292,50 +12037,28 @@ "node": ">=0.10.0" } }, - "node_modules/union-value/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/unique-filename": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", - "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-5.0.0.tgz", + "integrity": "sha512-2RaJTAvAb4owyjllTfXzFClJ7WsGxlykkPvCr9pA//LD9goVq+m4PPAeBgNodGZ7nSrntT/auWpJ6Y5IFXcfjg==", "license": "ISC", "dependencies": { - "unique-slug": "^5.0.0" + "unique-slug": "^6.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/unique-slug": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", - "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-6.0.0.tgz", + "integrity": "sha512-4Lup7Ezn8W3d52/xBhZBVdx323ckxa7DEvd9kPQHppTkLoJXw6ltrBCyj5pnrxj0qKDxYMJ56CoxNuFCscdTiw==", "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4" }, "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "license": "MIT", - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/universal-analytics": { @@ -15510,19 +12233,31 @@ "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==", + "dev": true, "license": "Apache-2.0", "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, + "node_modules/validate-npm-package-license/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, "node_modules/validate-npm-package-name": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.0.tgz", - "integrity": "sha512-d7KLgL1LD3U3fgnvWEY1cQXoO/q6EQ1BSz48Sa149V/5zVTAbgmZIpyI8TRi6U9/JNyeYLlTKsEMPtLC27RFUg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-7.0.2.tgz", + "integrity": "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==", "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/walk-up-path": { @@ -15543,12 +12278,6 @@ "defaults": "^1.0.3" } }, - "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/websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", @@ -15574,29 +12303,19 @@ "node": ">=0.8.0" } }, - "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": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", + "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", "license": "ISC", "dependencies": { - "isexe": "^3.1.1" + "isexe": "^4.0.0" }, "bin": { "node-which": "bin/which.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/which-module": { @@ -15625,12 +12344,13 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, "license": "MIT" }, "node_modules/workerpool": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", - "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.4.tgz", + "integrity": "sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==", "dev": true, "license": "Apache-2.0" }, @@ -15656,6 +12376,7 @@ "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", @@ -15676,16 +12397,15 @@ "license": "ISC" }, "node_modules/write-file-atomic": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-6.0.0.tgz", - "integrity": "sha512-GmqrO8WJ1NuzJ2DrziEI2o57jKAVIQNf8a18W3nCYU3H7PNWqCCVTeH6/NQE93CIllIgQS98rrmVkYgTX9fFJQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-7.0.1.tgz", + "integrity": "sha512-OTIk8iR8/aCRWBqvxrzxR0hgxWpnYBblY1S5hDWBQfk/VFmJwzmJgQFN3WsoUKHISv2eAwe+PpbUzyL1CKTLXg==", "license": "ISC", "dependencies": { - "imurmurhash": "^0.1.4", "signal-exit": "^4.0.1" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/write-file-atomic/node_modules/signal-exit": { @@ -15701,9 +12421,9 @@ } }, "node_modules/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -15801,15 +12521,6 @@ "node": ">=0.6.0" } }, - "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": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -15829,16 +12540,19 @@ } }, "node_modules/yaml": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", - "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", "dev": true, "license": "ISC", "bin": { "yaml": "bin.mjs" }, "engines": { - "node": ">= 14" + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" } }, "node_modules/yargs": { @@ -15906,6 +12620,15 @@ "node": "*" } }, + "node_modules/yazl": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-3.3.1.tgz", + "integrity": "sha512-BbETDVWG+VcMUle37k5Fqp//7SDOK2/1+T7X8TD96M3D9G8jK5VLUdQVdVjGi8im7FGkazX7kk5hkU8X4L5Bng==", + "license": "MIT", + "dependencies": { + "buffer-crc32": "^1.0.0" + } + }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", @@ -15928,24 +12651,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/zip-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", - "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", - "license": "MIT", - "dependencies": { - "archiver-utils": "^5.0.0", - "compress-commons": "^6.0.2", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/zod": { - "version": "3.24.2", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz", - "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==", + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" diff --git a/package.json b/package.json index 89cf4e48ed..4ccda12dff 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nativescript", "main": "./lib/nativescript-cli-lib.js", - "version": "8.9.1", + "version": "9.0.6", "author": "NativeScript ", "description": "Command-line interface for building NativeScript projects", "bin": { @@ -50,21 +50,19 @@ }, "keywords": [ "nativescript", - "telerik", - "mobile" + "typescript", + "javascript" ], "dependencies": { - "@foxt/js-srp": "^0.0.3-patch2", - "@nativescript/doctor": "2.0.16-rc.0", - "@npmcli/arborist": "^9.0.0", + "@foxt/js-srp": "0.0.3-patch2", + "@nativescript/doctor": "2.0.17", + "@nativescript/hook": "3.0.5", + "@npmcli/arborist": "9.1.8", + "@nstudio/trapezedev-project": "7.2.3", "@rigor789/resolve-package-path": "1.0.7", - "@rigor789/trapezedev-project": "7.1.2", - "ansi-colors": "^4.1.3", - "archiver": "^7.0.1", - "axios": "1.7.9", + "axios": "1.13.5", "byline": "5.0.0", - "chalk": "4.1.2", - "chokidar": "4.0.3", + "chokidar": "^3.6.0", "cli-table3": "0.6.5", "color": "4.2.3", "convert-source-map": "2.0.0", @@ -72,57 +70,54 @@ "email-validator": "2.0.4", "esprima": "4.0.1", "font-finder": "1.1.0", - "glob": "11.0.1", "ios-device-lib": "0.9.4", "ios-mobileprovision-finder": "1.2.1", - "ios-sim-portable": "4.5.0", + "ios-sim-portable": "4.5.1", "jimp": "1.6.0", - "lodash": "4.17.21", + "lodash": "4.17.23", "log4js": "6.9.1", - "marked": "15.0.7", + "marked": "15.0.12", "marked-terminal": "7.3.0", - "minimatch": "10.0.1", + "minimatch": "10.2.4", "mkdirp": "3.0.1", "mute-stream": "2.0.0", "nativescript-dev-xcode": "0.8.1", "open": "8.4.2", "ora": "5.4.1", - "pacote": "21.0.0", + "pacote": "21.0.4", "pbxproj-dom": "1.2.0", "plist": "3.1.0", "plist-merge-patch": "0.2.0", - "prettier": "3.5.2", + "prettier": "3.7.3", "prompts": "2.4.2", "proper-lockfile": "4.1.2", - "proxy-lib": "0.4.0", + "proxy-lib": "0.4.1", "qr-image": "3.2.0", "qrcode-terminal": "0.12.0", - "semver": "7.7.1", - "shelljs": "0.8.5", - "simple-git": "3.27.0", + "semver": "7.7.3", + "shelljs": "0.10.0", + "simple-git": "3.30.0", "simple-plist": "1.4.0", - "source-map": "0.7.4", - "tar": "7.4.3", - "temp": "0.9.4", + "source-map": "0.7.6", + "tar": "7.5.9", "ts-morph": "25.0.1", "tunnel": "0.0.6", "typescript": "5.7.3", "universal-analytics": "0.5.3", "uuid": "11.1.0", "winreg": "1.2.5", - "ws": "8.18.1", + "ws": "8.18.3", "xml2js": "0.6.2", - "yargs": "17.7.2" + "yargs": "17.7.2", + "yazl": "^3.3.1" }, "devDependencies": { - "@types/archiver": "^6.0.3", "@types/byline": "^4.2.36", - "@types/chai": "5.0.1", - "@types/chai-as-promised": "8.0.1", + "@types/chai": "5.2.2", + "@types/chai-as-promised": "8.0.2", "@types/color": "4.2.0", "@types/convert-source-map": "2.0.3", - "@types/glob": "^8.1.0", - "@types/lodash": "4.17.15", + "@types/lodash": "4.17.23", "@types/marked-terminal": "^6.1.1", "@types/node": "^22.0.0", "@types/npmcli__arborist": "^6.3.0", @@ -132,21 +127,23 @@ "@types/proper-lockfile": "4.1.4", "@types/qr-image": "3.2.9", "@types/retry": "0.12.5", - "@types/semver": "7.5.8", + "@types/semver": "7.7.1", "@types/shelljs": "^0.8.11", "@types/sinon": "^17.0.3", "@types/tabtab": "^3.0.2", "@types/tar": "6.1.13", - "@types/temp": "0.9.4", "@types/tunnel": "0.0.7", "@types/universal-analytics": "0.4.8", "@types/uuid": "^10.0.0", - "@types/ws": "8.5.14", + "@types/ws": "8.18.1", "@types/xml2js": "0.4.14", "@types/yargs": "17.0.33", - "chai": "5.2.0", - "chai-as-promised": "8.0.1", + "@types/yazl": "^3.3.0", + "braces": ">=3.0.3", + "chai": "5.3.3", + "chai-as-promised": "8.0.2", "conventional-changelog-cli": "^5.0.0", + "fast-check": "3.23.2", "grunt": "1.6.1", "grunt-contrib-clean": "2.0.1", "grunt-contrib-copy": "1.0.0", @@ -156,21 +153,31 @@ "grunt-ts": "6.0.0-beta.22", "husky": "9.1.7", "istanbul": "0.4.5", - "latest-version": "9.0.0", - "lint-staged": "~15.4.3", - "mocha": "11.1.0", - "sinon": "19.0.2", - "source-map-support": "0.5.21" + "lint-staged": "~15.5.2", + "mocha": "11.7.5", + "sinon": "19.0.5", + "source-map-support": "0.5.21", + "xml2js": ">=0.5.0" }, "optionalDependencies": { "fsevents": "*" }, "overrides": { + "@conventional-changelog/git-client": "2.5.1", "jimp": { "xml2js": "0.6.2" }, "npm-watch": { "nodemon": "3.0.3" + }, + "grunt": { + "minimatch": "3.1.5" + }, + "globule": { + "minimatch": "3.1.5" + }, + "replace": { + "minimatch": "3.1.5" } }, "analyze": true, diff --git a/packages/doctor/package.json b/packages/doctor/package.json index 1b48afc27a..50bff723d6 100644 --- a/packages/doctor/package.json +++ b/packages/doctor/package.json @@ -1,6 +1,6 @@ { "name": "@nativescript/doctor", - "version": "2.0.16-rc.0", + "version": "2.0.17", "description": "Library that helps identifying if the environment can be used for development of {N} apps.", "main": "src/index.js", "types": "./typings/nativescript-doctor.d.ts", @@ -41,15 +41,15 @@ }, "homepage": "https://github.com/NativeScript/nativescript-doctor#readme", "devDependencies": { - "@types/chai": "5.0.1", - "@types/lodash": "4.17.15", + "@types/chai": "5.2.2", + "@types/lodash": "4.17.21", "@types/mocha": "10.0.10", - "@types/semver": "7.5.8", - "@types/shelljs": "0.8.15", + "@types/semver": "7.7.1", + "@types/shelljs": "0.8.17", "@types/temp": "0.9.4", "@types/winreg": "1.2.36", "@types/yauzl": "2.10.3", - "chai": "5.1.2", + "chai": "5.3.3", "conventional-changelog-cli": "^5.0.0", "grunt": "1.6.1", "grunt-contrib-clean": "2.0.1", @@ -58,17 +58,16 @@ "grunt-ts": "6.0.0-beta.22", "grunt-tslint": "5.0.2", "istanbul": "0.4.5", - "mocha": "11.1.0", - "rimraf": "6.0.1", + "mocha": "11.7.5", + "rimraf": "6.1.2", "tslint": "6.1.3", "tslint-microsoft-contrib": "6.2.0", - "typescript": "~5.4.0" + "typescript": "~5.9.2" }, "dependencies": { "lodash": "4.17.21", - "semver": "7.6.3", - "shelljs": "0.8.5", - "temp": "0.9.4", + "semver": "7.7.3", + "shelljs": "0.10.0", "winreg": "1.2.5", "yauzl": "3.2.0" } diff --git a/packages/doctor/src/android-tools-info.ts b/packages/doctor/src/android-tools-info.ts index 3950b56587..90b7ad5989 100644 --- a/packages/doctor/src/android-tools-info.ts +++ b/packages/doctor/src/android-tools-info.ts @@ -32,6 +32,7 @@ export class AndroidToolsInfo implements NativeScriptDoctor.IAndroidToolsInfo { "android-33", "android-34", "android-35", + "android-36", ]; const isRuntimeVersionLessThan = (targetVersion: string) => { @@ -70,11 +71,11 @@ export class AndroidToolsInfo implements NativeScriptDoctor.IAndroidToolsInfo { private childProcess: ChildProcess, private fs: FileSystem, private hostInfo: HostInfo, - private helpers: Helpers + private helpers: Helpers, ) {} public getToolsInfo( - config: Partial = {} + config: Partial = {}, ): NativeScriptDoctor.IAndroidToolsInfoData { if (!this.toolsInfo) { const infoData: NativeScriptDoctor.IAndroidToolsInfoData = @@ -83,7 +84,7 @@ export class AndroidToolsInfo implements NativeScriptDoctor.IAndroidToolsInfo { infoData.installedTargets = this.getInstalledTargets(); infoData.compileSdkVersion = this.getCompileSdk( infoData.installedTargets, - config.projectDir + config.projectDir, ); infoData.buildToolsVersion = this.getBuildToolsVersion(config.projectDir); @@ -94,14 +95,14 @@ export class AndroidToolsInfo implements NativeScriptDoctor.IAndroidToolsInfo { } public validateInfo( - config: Partial = {} + config: Partial = {}, ): NativeScriptDoctor.IWarning[] { const errors: NativeScriptDoctor.IWarning[] = []; const toolsInfoData = this.getToolsInfo(config); const isAndroidHomeValid = this.isAndroidHomeValid(); if (!toolsInfoData.compileSdkVersion) { const supportedTargetsForAndroidRuntime = this.getSupportedTargets( - config.projectDir + config.projectDir, ); errors.push({ warning: [ @@ -109,7 +110,7 @@ export class AndroidToolsInfo implements NativeScriptDoctor.IAndroidToolsInfo { `To be able to build for Android with your current android runtime, install one of the following supported Android SDK targets:`, ...supportedTargetsForAndroidRuntime.map((target) => ` ${target}`), `Supported targets vary based on what android runtime you have installed. Currently your app uses @nativescript/android ${this.getRuntimeVersion( - { projectDir: config.projectDir } + { projectDir: config.projectDir }, )}`, ].join("\n"), additionalInformation: `Run \`\$ ${this.getPathToSdkManagementTool()}\` to manage your Android SDK versions.`, @@ -120,7 +121,7 @@ export class AndroidToolsInfo implements NativeScriptDoctor.IAndroidToolsInfo { if (!toolsInfoData.buildToolsVersion) { const buildToolsRange = this.getBuildToolsRange(config.projectDir); const versionRangeMatches = buildToolsRange.match( - /^.*?([\d\.]+)\s+.*?([\d\.]+)$/ + /^.*?([\d\.]+)\s+.*?([\d\.]+)$/, ); let message = `You can install any version in the following range: '${buildToolsRange}'.`; @@ -154,7 +155,7 @@ export class AndroidToolsInfo implements NativeScriptDoctor.IAndroidToolsInfo { } public static unsupportedJavaMessage( - installedJavaCompilerVersion: string + installedJavaCompilerVersion: string, ): string { return `Javac version ${installedJavaCompilerVersion} is not supported. You must install a java version greater than ${ AndroidToolsInfo.MIN_JAVA_VERSION @@ -168,7 +169,7 @@ export class AndroidToolsInfo implements NativeScriptDoctor.IAndroidToolsInfo { public validateJavacVersion( installedJavaCompilerVersion: string, projectDir?: string, - runtimeVersion?: string + runtimeVersion?: string, ): NativeScriptDoctor.IWarning[] { const errors: NativeScriptDoctor.IWarning[] = []; @@ -195,17 +196,17 @@ export class AndroidToolsInfo implements NativeScriptDoctor.IAndroidToolsInfo { if ( semver.lt( installedJavaCompilerSemverVersion, - AndroidToolsInfo.MIN_JAVA_VERSION + AndroidToolsInfo.MIN_JAVA_VERSION, ) || (AndroidToolsInfo.MAX_JAVA_VERSION ? semver.gte( installedJavaCompilerSemverVersion, - AndroidToolsInfo.MAX_JAVA_VERSION - ) + AndroidToolsInfo.MAX_JAVA_VERSION, + ) : false) ) { warning = AndroidToolsInfo.unsupportedJavaMessage( - installedJavaCompilerVersion + installedJavaCompilerVersion, ); } else { runtimeVersion = this.getRuntimeVersion({ runtimeVersion, projectDir }); @@ -287,7 +288,7 @@ export class AndroidToolsInfo implements NativeScriptDoctor.IAndroidToolsInfo { }); } else if ( expectedDirectoriesInAndroidHome.map((dir) => - this.fs.exists(path.join(this.androidHome, dir)) + this.fs.exists(path.join(this.androidHome, dir)), ).length === 0 ) { errors.push({ @@ -315,7 +316,7 @@ export class AndroidToolsInfo implements NativeScriptDoctor.IAndroidToolsInfo { if (!_.includes(supportedTargets, newTarget)) { const supportedVersions = supportedTargets.sort(); const minSupportedVersion = this.parseAndroidSdkString( - _.first(supportedVersions) + _.first(supportedVersions), ); if (!targetSupported && targetSdk && targetSdk < minSupportedVersion) { @@ -338,7 +339,7 @@ export class AndroidToolsInfo implements NativeScriptDoctor.IAndroidToolsInfo { const newTarget = `${this.ANDROID_TARGET_PREFIX}-${targetSdk}`; const targetSupported = _.includes( this.getSupportedTargets(projectDir), - newTarget + newTarget, ); if ( @@ -368,7 +369,7 @@ export class AndroidToolsInfo implements NativeScriptDoctor.IAndroidToolsInfo { const pathToEmulatorFromAndroidStudio = path.join( this.androidHome, emulatorExecutableName, - emulatorExecutableName + emulatorExecutableName, ); const realFilePath = this.hostInfo.isWindows ? `${pathToEmulatorFromAndroidStudio}.exe` @@ -380,7 +381,7 @@ export class AndroidToolsInfo implements NativeScriptDoctor.IAndroidToolsInfo { this.pathToEmulatorExecutable = path.join( this.androidHome, "tools", - emulatorExecutableName + emulatorExecutableName, ); } } @@ -402,12 +403,12 @@ export class AndroidToolsInfo implements NativeScriptDoctor.IAndroidToolsInfo { this.androidHome, "tools", "bin", - sdkmanagerName + sdkmanagerName, ); const pathToAndroidExecutable = path.join( this.androidHome, "tools", - "android" + "android", ); const pathToExecutable = this.fs.exists(pathToSdkmanager) ? pathToSdkmanager @@ -415,7 +416,7 @@ export class AndroidToolsInfo implements NativeScriptDoctor.IAndroidToolsInfo { sdkManagementToolPath = pathToExecutable.replace( this.androidHome, - this.hostInfo.isWindows ? "%ANDROID_HOME%" : "$ANDROID_HOME" + this.hostInfo.isWindows ? "%ANDROID_HOME%" : "$ANDROID_HOME", ); } @@ -424,15 +425,15 @@ export class AndroidToolsInfo implements NativeScriptDoctor.IAndroidToolsInfo { private getCompileSdk( installedTargets: string[], - projectDir: string + projectDir: string, ): number { const latestValidAndroidTarget = this.getLatestValidAndroidTarget( installedTargets, - projectDir + projectDir, ); if (latestValidAndroidTarget) { const integerVersion = this.parseAndroidSdkString( - latestValidAndroidTarget + latestValidAndroidTarget, ); if ( @@ -482,7 +483,7 @@ export class AndroidToolsInfo implements NativeScriptDoctor.IAndroidToolsInfo { const buildToolsRange = this.getBuildToolsRange(projectDir); buildToolsVersion = this.getMatchingDir( pathToBuildTools, - buildToolsRange + buildToolsRange, ); } @@ -491,17 +492,17 @@ export class AndroidToolsInfo implements NativeScriptDoctor.IAndroidToolsInfo { private getLatestValidAndroidTarget( installedTargets: string[], - projectDir: string + projectDir: string, ): string { return _.findLast( this.getSupportedTargets(projectDir).sort(), - (supportedTarget) => _.includes(installedTargets, supportedTarget) + (supportedTarget) => _.includes(installedTargets, supportedTarget), ); } private parseAndroidSdkString(androidSdkString: string): number { return parseInt( - androidSdkString.replace(`${this.ANDROID_TARGET_PREFIX}-`, "") + androidSdkString.replace(`${this.ANDROID_TARGET_PREFIX}-`, ""), ); } @@ -522,7 +523,7 @@ export class AndroidToolsInfo implements NativeScriptDoctor.IAndroidToolsInfo { const supportedTargets = this.getSupportedTargets(projectDir); return this.parseAndroidSdkString( - supportedTargets.sort()[supportedTargets.length - 1] + supportedTargets.sort()[supportedTargets.length - 1], ); } @@ -580,7 +581,7 @@ export class AndroidToolsInfo implements NativeScriptDoctor.IAndroidToolsInfo { depName === Constants.ANDROID_SCOPED_RUNTIME || depName === Constants.ANDROID_OLD_RUNTIME ); - } + }, ); if (foundRuntime) { @@ -592,7 +593,7 @@ export class AndroidToolsInfo implements NativeScriptDoctor.IAndroidToolsInfo { `${foundRuntime}/package.json`, { paths: [projectDir], - } + }, ); version = require(packagePath).version; } catch (err) { @@ -635,7 +636,7 @@ export class AndroidToolsInfo implements NativeScriptDoctor.IAndroidToolsInfo { if (!semver.validRange(runtimeVersion)) { try { const npmViewOutput = this.childProcess.execSync( - `npm view ${runtimePackage.name} dist-tags --json` + `npm view ${runtimePackage.name} dist-tags --json`, ); const jsonNpmViewOutput = JSON.parse(npmViewOutput); @@ -649,7 +650,7 @@ export class AndroidToolsInfo implements NativeScriptDoctor.IAndroidToolsInfo { if (runtimeVersion && !semver.validRange(runtimeVersion)) { // If we got here, something terribly wrong happened. throw new Error( - `The determined Android runtime version ${runtimeVersion} is not valid. Unable to verify if the current system is setup for Android development.` + `The determined Android runtime version ${runtimeVersion} is not valid. Unable to verify if the current system is setup for Android development.`, ); } @@ -660,7 +661,7 @@ export class AndroidToolsInfo implements NativeScriptDoctor.IAndroidToolsInfo { private getMaxSupportedCompileVersion( config: Partial & { runtimeVersion?: string; - } + }, ): number { if ( config.runtimeVersion && @@ -669,7 +670,7 @@ export class AndroidToolsInfo implements NativeScriptDoctor.IAndroidToolsInfo { return 28; } return this.parseAndroidSdkString( - _.last(this.getSupportedTargets(config.projectDir).sort()) + _.last(this.getSupportedTargets(config.projectDir).sort()), ); } } diff --git a/packages/doctor/src/declarations.d.ts b/packages/doctor/src/declarations.d.ts index e678f05bd2..f800c683ad 100644 --- a/packages/doctor/src/declarations.d.ts +++ b/packages/doctor/src/declarations.d.ts @@ -5,12 +5,12 @@ interface IProcessInfo { /** * The stdout of the process. */ - stdout: string; + stdout: string | Buffer; /** * The stderr of the process. */ - stderr: string; + stderr: string | Buffer; /** * The exit code of the process. diff --git a/packages/doctor/src/sys-info.ts b/packages/doctor/src/sys-info.ts index 58d1719be5..7c71d43491 100644 --- a/packages/doctor/src/sys-info.ts +++ b/packages/doctor/src/sys-info.ts @@ -1,12 +1,12 @@ -import { ChildProcess } from "./wrappers/child-process"; -import { FileSystem } from "./wrappers/file-system"; -import { HostInfo } from "./host-info"; -import { ExecOptions } from "child_process"; -import { WinReg } from "./winreg"; -import { Helpers } from "./helpers"; -import { platform, EOL, homedir } from "os"; +import type { ChildProcess } from "./wrappers/child-process"; +import type { FileSystem } from "./wrappers/file-system"; +import type { HostInfo } from "./host-info"; +import type { ExecOptions } from "child_process"; +import type { WinReg } from "./winreg"; +import type { Helpers } from "./helpers"; +import { platform, EOL, homedir, tmpdir } from "os"; import * as path from "path"; -import * as temp from "temp"; +import * as fs from "fs"; import * as semver from "semver"; import { Constants } from "./constants"; @@ -58,8 +58,11 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { private helpers: Helpers, private hostInfo: HostInfo, private winReg: WinReg, - private androidToolsInfo: NativeScriptDoctor.IAndroidToolsInfo - ) {} + private androidToolsInfo: NativeScriptDoctor.IAndroidToolsInfo, + ) { + // keep reference to preserve constructor signature compatibility + void this.winReg; + } public getJavaCompilerVersion(): Promise { return this.getValueForProperty( @@ -68,15 +71,15 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { const javacVersion = process.env["JAVA_HOME"] ? await this.getVersionOfJavaExecutableFromJavaHome( Constants.JAVAC_EXECUTABLE_NAME, - SysInfo.JAVA_COMPILER_VERSION_REGEXP - ) + SysInfo.JAVA_COMPILER_VERSION_REGEXP, + ) : await this.getVersionOfJavaExecutableFromPath( Constants.JAVAC_EXECUTABLE_NAME, - SysInfo.JAVA_COMPILER_VERSION_REGEXP - ); + SysInfo.JAVA_COMPILER_VERSION_REGEXP, + ); return javacVersion; - } + }, ); } @@ -88,7 +91,7 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { (await this.getJavaVersionFromJavaHome()) || (await this.getJavaVersionFromPath()); return javaVersion; - } + }, ); } @@ -98,13 +101,13 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { async (): Promise => { const javaPath = (await this.getJavaExecutablePathFromJavaHome( - Constants.JAVA_EXECUTABLE_NAME + Constants.JAVA_EXECUTABLE_NAME, )) || (await this.getJavaExecutablePathFromPath( - Constants.JAVA_EXECUTABLE_NAME + Constants.JAVA_EXECUTABLE_NAME, )); return javaPath; - } + }, ); } @@ -114,9 +117,9 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { (): Promise => { return this.getVersionOfJavaExecutableFromPath( Constants.JAVA_EXECUTABLE_NAME, - SysInfo.JAVA_VERSION_REGEXP + SysInfo.JAVA_VERSION_REGEXP, ); - } + }, ); } @@ -126,9 +129,9 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { (): Promise => { return this.getVersionOfJavaExecutableFromJavaHome( Constants.JAVA_EXECUTABLE_NAME, - SysInfo.JAVA_VERSION_REGEXP + SysInfo.JAVA_VERSION_REGEXP, ); - } + }, ); } @@ -145,7 +148,7 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { return this.getVersionFromString(output); } } - } + }, ); } @@ -160,7 +163,7 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { } return null; - } + }, ); } @@ -170,7 +173,7 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { async (): Promise => { const output = await this.execCommand("npm -v"); return output ? output.split("\n")[0] : null; - } + }, ); } @@ -180,7 +183,7 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { async (): Promise => { const output = await this.execCommand("node-gyp -v"); return output ? this.getVersionFromString(output) : null; - } + }, ); } @@ -190,7 +193,7 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { async (): Promise => { const output = await this.execCommand("which xcodeproj"); return output ? output.trim() : null; - } + }, ); } @@ -212,12 +215,12 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { coreFoundationDir = path.join( commonProgramFiles, "Apple", - "Apple Application Support" + "Apple Application Support", ); mobileDeviceDir = path.join( commonProgramFiles, "Apple", - "Mobile Device Support" + "Mobile Device Support", ); } else if (this.hostInfo.isDarwin) { coreFoundationDir = @@ -230,7 +233,7 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { (await this.fileSystem.exists(coreFoundationDir)) && (await this.fileSystem.exists(mobileDeviceDir)) ); - } + }, ); } @@ -249,7 +252,7 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { } } } - } + }, ); } @@ -258,7 +261,7 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { () => this.osCache, async (): Promise => { return await (this.hostInfo.isWindows ? this.winVer() : this.unixVer()); - } + }, ); } @@ -276,14 +279,14 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { pathToAdb, ["version"], "close", - { ignoreError: true } + { ignoreError: true }, ); } return output && output.stdout - ? this.getVersionFromString(output.stdout) + ? this.getVersionFromString(output.stdout as string) : null; - } + }, ); } @@ -297,7 +300,7 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { } catch (err) { return false; } - } + }, ); } @@ -309,11 +312,11 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { this.androidToolsInfo.getPathToEmulatorExecutable(), ["-help"], "close", - { ignoreError: true } + { ignoreError: true }, ); return output && output.stdout.indexOf("usage: emulator") >= 0; - } + }, ); } @@ -324,7 +327,7 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { const output = await this.execCommand("mono --version"); const match = this.monoVerRegExp.exec(output); return match ? match[1] : null; - } + }, ); } @@ -338,11 +341,11 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { } const output = await this.execCommand( - `${this.helpers.quoteString(gitPath)} --version` + `${this.helpers.quoteString(gitPath)} --version`, ); const matches = SysInfo.GIT_VERSION_REGEXP.exec(output); return matches && matches[1]; - } + }, ); } @@ -354,12 +357,12 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { const matches = SysInfo.GRADLE_VERSION_REGEXP.exec(output); return matches && matches[1]; - } + }, ); } public async getSysInfo( - config?: NativeScriptDoctor.ISysInfoConfig + config?: NativeScriptDoctor.ISysInfoConfig, ): Promise { if ( config && @@ -370,7 +373,7 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { return ( Object.assign( await this.getCommonSysInfo(), - await this.getAndroidSysInfo(config) + await this.getAndroidSysInfo(config), ) ); } @@ -389,7 +392,7 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { return Object.assign( await this.getCommonSysInfo(), await this.getAndroidSysInfo(), - await this.getiOSSysInfo() + await this.getiOSSysInfo(), ); } @@ -397,52 +400,43 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { return this.getValueForProperty( () => this.isCocoaPodsWorkingCorrectlyCache, async (): Promise => { - if (this.hostInfo.isDarwin) { - if (!this.fileSystem.exists(path.join(homedir(), ".cocoapods"))) { - return true; - } - temp.track(); - const tempDirectory = temp.mkdirSync("nativescript-check-cocoapods"); - const pathToXCodeProjectZip = path.join( - __dirname, - "..", - "resources", - "cocoapods-verification", - "cocoapods.zip" - ); + if (!this.hostInfo.isDarwin) { + return false; + } + if (!this.fileSystem.exists(path.join(homedir(), ".cocoapods"))) { + return true; + } + + const tempDirectory = fs.mkdtempSync( + path.join(tmpdir(), "nativescript-check-cocoapods-"), + ); + const pathToXCodeProjectZip = path.join( + __dirname, + "..", + "resources", + "cocoapods-verification", + "cocoapods.zip", + ); + try { await this.fileSystem.extractZip( pathToXCodeProjectZip, - tempDirectory + tempDirectory, ); - const xcodeProjectDir = path.join(tempDirectory, "cocoapods"); - - try { - const spawnResult = await this.childProcess.spawnFromEvent( - "pod", - ["install"], - "exit", - { spawnOptions: { cwd: xcodeProjectDir } } - ); - if (spawnResult.exitCode) { - this.fileSystem.deleteEntry(tempDirectory); - return false; - } else { - const exists = this.fileSystem.exists( - path.join(xcodeProjectDir, "cocoapods.xcworkspace") - ); - this.fileSystem.deleteEntry(tempDirectory); - return exists; - } - } catch (err) { - this.fileSystem.deleteEntry(tempDirectory); - return null; - } - } else { + const spawnResult = await this.childProcess.spawnFromEvent( + "pod", + ["install"], + "exit", + { spawnOptions: { cwd: xcodeProjectDir } }, + ); + return !spawnResult.exitCode; + } catch (err) { return false; + } finally { + this.fileSystem.deleteEntry(tempDirectory); } - } + }, ); } @@ -450,9 +444,9 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { return this.getValueForProperty( () => this.nativeScriptCliVersionCache, async (): Promise => { - const output = await this.execCommand("tns --version"); + const output = await this.execCommand("ns --version"); return output ? this.getVersionFromCLIOutput(output.trim()) : output; - } + }, ); } @@ -483,7 +477,7 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { } return { shouldUseXcproj, xcprojAvailable }; - } + }, ); } @@ -505,7 +499,7 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { } return null; - } + }, ); } @@ -519,7 +513,7 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { } else { return false; } - } + }, ); } @@ -563,7 +557,9 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { } const children = this.fileSystem.readDirectory(github); - const git = children.filter((child) => /^PortableGit/.test(child))[0]; + const git = children.filter((child: string) => + /^PortableGit/.test(child), + )[0]; if (!this.fileSystem.exists(git)) { return null; } @@ -585,9 +581,28 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { return result && result.split("\n")[0].trim(); } + private async winVer(): Promise { + try { + // Using `ver` is sufficient for an OS string on Windows. + const output = await this.execCommand("ver"); + return output ? output.trim() : null; + } catch { + return null; + } + } + + private async unixVer(): Promise { + try { + const output = await this.execCommand("uname -a"); + return output ? output.trim() : null; + } catch { + return null; + } + } + private async getValueForProperty( property: Function, - getValueMethod: () => Promise + getValueMethod: () => Promise, ): Promise { if (this.shouldCache) { const propertyName = this.helpers.getPropertyName(property); @@ -607,7 +622,7 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { private async exec( cmd: string, - execOptions?: ExecOptions + execOptions?: ExecOptions, ): Promise { if (cmd) { try { @@ -622,50 +637,31 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { private async execCommand( cmd: string, - execOptions?: ExecOptions + execOptions?: ExecOptions, ): Promise { const output = await this.exec(cmd, execOptions); - return output && output.stdout; + return output && (output.stdout as string); } - private getVersionFromString(versionString: string): string { - const matches = versionString.match(SysInfo.VERSION_REGEXP); - if (matches) { - return `${matches[1]}.${matches[2]}.${matches[3] || 0}`; + private getVersionFromString(output: string): string { + if (!output) { + return null; } - - return null; + const match = SysInfo.VERSION_REGEXP.exec(output); + return match && match[0] ? match[0].trim() : null; } - private getVersionFromCLIOutput(commandOutput: string): string { - const matches = commandOutput.match(SysInfo.CLI_OUTPUT_VERSION_REGEXP); - return matches && matches[0]; - } - - private async winVer(): Promise { - let productName: string; - let currentVersion: string; - let currentBuild: string; - const hive = this.winReg.registryKeys.HKLM; - const key = "\\Software\\Microsoft\\Windows NT\\CurrentVersion"; - - productName = await this.winReg.getRegistryValue("ProductName", hive, key); - currentVersion = await this.winReg.getRegistryValue( - "CurrentVersion", - hive, - key - ); - currentBuild = await this.winReg.getRegistryValue( - "CurrentBuild", - hive, - key - ); - - return `${productName} ${currentVersion}.${currentBuild}`; - } - - private unixVer(): Promise { - return this.execCommand("uname -a"); + private getVersionFromCLIOutput(output: string): string { + if (!output) { + return null; + } + const lines = output.split(/\r?\n/); + for (const line of lines) { + if (SysInfo.CLI_OUTPUT_VERSION_REGEXP.test(line)) { + return line.trim(); + } + } + return null; } private getCommonSysInfo(): Promise { @@ -687,7 +683,7 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { result.gitVer = await this.getGitVersion(); return result; - } + }, ); } @@ -708,12 +704,12 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { result.pythonInfo = await this.getPythonInfo(); return result; - } + }, ); } private async getAndroidSysInfo( - config?: NativeScriptDoctor.ISysInfoConfig + config?: NativeScriptDoctor.ISysInfoConfig, ): Promise { return this.getValueForProperty( () => this.androidSysInfoCache, @@ -726,7 +722,9 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { result.javaVersion = await this.getJavaVersion(); result.javaPath = await this.getJavaPath(); result.adbVer = await this.getAdbVersion( - config && config.androidToolsInfo && config.androidToolsInfo.pathToAdb + config && + config.androidToolsInfo && + config.androidToolsInfo.pathToAdb, ); result.androidInstalled = await this.isAndroidInstalled(); result.monoVer = await this.getMonoVersion(); @@ -735,13 +733,13 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { await this.isAndroidSdkConfiguredCorrectly(); return result; - } + }, ); } private async getVersionOfJavaExecutableFromJavaHome( javaExecutableName: string, - regExp: RegExp + regExp: RegExp, ): Promise { let javaExecutableVersion: string = null; const javaExecutablePath = @@ -749,7 +747,7 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { if (javaExecutablePath) { javaExecutableVersion = await this.getVersionOfJavaExecutable( javaExecutablePath, - regExp + regExp, ); } @@ -757,7 +755,7 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { } private getJavaExecutablePathFromJavaHome( - javaExecutableName: string + javaExecutableName: string, ): string { let javaExecutablePath: string = null; @@ -771,7 +769,7 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { const pathToJavaExecutable = path.join( javaHome, "bin", - javaExecutableFile + javaExecutableFile, ); if (this.fileSystem.exists(pathToJavaExecutable)) { javaExecutablePath = pathToJavaExecutable; @@ -786,17 +784,16 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { private async getVersionOfJavaExecutableFromPath( javaExecutableName: string, - regExp: RegExp + regExp: RegExp, ): Promise { let javaExecutableVersion: string = null; - const javaExecutablePath = await this.getJavaExecutablePathFromPath( - javaExecutableName - ); + const javaExecutablePath = + await this.getJavaExecutablePathFromPath(javaExecutableName); if (javaExecutablePath) { javaExecutableVersion = await this.getVersionOfJavaExecutable( javaExecutablePath, - regExp + regExp, ); } @@ -804,7 +801,7 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { } private async getJavaExecutablePathFromPath( - javaExecutableName: string + javaExecutableName: string, ): Promise { let javaExecutablePath: string = null; @@ -822,7 +819,7 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { private async getVersionOfJavaExecutable( executable: string, - regExp: RegExp + regExp: RegExp, ): Promise { try { const output = await this.childProcess.exec(`"${executable}" -version`); diff --git a/packages/doctor/test/android-tools-info.ts b/packages/doctor/test/android-tools-info.ts index afa3c5fcf7..f8121b0da6 100644 --- a/packages/doctor/test/android-tools-info.ts +++ b/packages/doctor/test/android-tools-info.ts @@ -42,7 +42,7 @@ describe("androidToolsInfo", () => { devDependencies: { "@nativescript/android": runtimeVersion, }, - } + } : null; }, readDirectory: (path: string) => { @@ -70,6 +70,7 @@ describe("androidToolsInfo", () => { "android-33", "android-34", "android-35", + "android-36", ]; } }, @@ -105,7 +106,7 @@ describe("androidToolsInfo", () => { const androidToolsInfo = getAndroidToolsInfo("8.2.0"); const toolsInfo = androidToolsInfo.getToolsInfo({ projectDir: "test" }); - assert.equal(toolsInfo.compileSdkVersion, 35); + assert.equal(toolsInfo.compileSdkVersion, 36); }); }); @@ -113,7 +114,7 @@ describe("androidToolsInfo", () => { const assertSupportedRange = ( runtimeVersion: string, min: number, - max: number + max: number, ) => { let cnt = 0; const androidToolsInfo = getAndroidToolsInfo(runtimeVersion); @@ -139,7 +140,7 @@ describe("androidToolsInfo", () => { it("runtime 8.2.0 should support android-17 - android-34", () => { const min = 17; - const max = 35; + const max = 36; assertSupportedRange("8.2.0", min, max); assertSupportedRange("8.3.0", min, max); }); @@ -210,7 +211,7 @@ describe("androidToolsInfo", () => { const androidToolsInfo = getAndroidToolsInfo(runtimeVersion); const actualWarnings = androidToolsInfo.validateJavacVersion( javacVersion, - "/Users/username/projectDir" + "/Users/username/projectDir", ); let expectedWarnings: NativeScriptDoctor.IWarning[] = []; @@ -227,7 +228,7 @@ describe("androidToolsInfo", () => { assert.deepEqual(actualWarnings, expectedWarnings); }); - } + }, ); const npmTagsTestData: ITestData[] = [ @@ -322,12 +323,12 @@ describe("androidToolsInfo", () => { childProcess, fs, hostInfo, - helpers + helpers, ); const actualWarnings = androidToolsInfo.validateJavacVersion( javacVersion, - "/Users/username/projectDir" + "/Users/username/projectDir", ); let expectedWarnings: NativeScriptDoctor.IWarning[] = []; if (warnings && warnings.length) { @@ -344,10 +345,10 @@ describe("androidToolsInfo", () => { assert.deepEqual(actualWarnings, expectedWarnings); assert.equal( execSyncCommand, - "npm view tns-android dist-tags --json" + "npm view tns-android dist-tags --json", ); }); - } + }, ); }); diff --git a/packages/doctor/test/sys-info.ts b/packages/doctor/test/sys-info.ts index 928cb7f0c4..5b41c32487 100644 --- a/packages/doctor/test/sys-info.ts +++ b/packages/doctor/test/sys-info.ts @@ -82,7 +82,7 @@ const androidToolsInfo: NativeScriptDoctor.IAndroidToolsInfo = { }; function createChildProcessResults( - childProcessResult: IChildProcessResults + childProcessResult: IChildProcessResults, ): IDictionary { return { "uname -a": childProcessResult.uname, @@ -110,7 +110,7 @@ function createChildProcessResults( '"C:\\Program Files/Git/cmd/git.exe" --version': childProcessResult.gitVersion, // When running Windows test on the Non-Windows platform "gradle -v": childProcessResult.gradleVersion, - "tns --version": childProcessResult.nativeScriptCliVersion, + "ns --version": childProcessResult.nativeScriptCliVersion, emulator: { shouldThrowError: false }, "which git": childProcessResult.git, "python3 --version": childProcessResult.pythonInfo, @@ -120,7 +120,7 @@ function createChildProcessResults( function getResultFromChildProcess( childProcessResultDescription: IChildProcessResultDescription, command: string, - options?: ISpawnFromEventOptions + options?: ISpawnFromEventOptions, ): any { if (childProcessResultDescription.shouldThrowError) { if (options && options.ignoreError) { @@ -141,7 +141,7 @@ function getResultFromChildProcess( function mockSysInfo( childProcessResult: IChildProcessResults, hostInfoOptions?: IHostInfoMockOptions, - fileSystemOptions?: IFileSystemMockOptions + fileSystemOptions?: IFileSystemMockOptions, ): SysInfo { hostInfoOptions = hostInfoOptions || {}; const winreg: any = { @@ -149,7 +149,7 @@ function mockSysInfo( valueName: string, hive?: IHiveId, key?: string, - host?: string + host?: string, ) => { return { value: "registryKey" }; }, @@ -170,19 +170,19 @@ function mockSysInfo( exec: async (command: string) => { return getResultFromChildProcess( childProcessResultDictionary[command], - command + command, ); }, spawnFromEvent: async ( command: string, args: string[], event: string, - options: ISpawnFromEventOptions + options: ISpawnFromEventOptions, ) => { return getResultFromChildProcess( childProcessResultDictionary[command], command, - options + options, ); }, execFile: async (): Promise => { @@ -204,7 +204,7 @@ function mockSysInfo( helpers, hostInfo, winreg, - androidToolsInfo + androidToolsInfo, ); } @@ -239,7 +239,7 @@ describe("SysInfo unit tests", () => { spawnFromEvent: async ( command: string, args: string[], - event: string + event: string, ) => { spawnFromEventCommand = `${command} ${args.join(" ")}`; return { stdout: "", stderr: "" }; @@ -271,7 +271,7 @@ describe("SysInfo unit tests", () => { helpers, hostInfo, null, - androidToolsInfo + androidToolsInfo, ); }); @@ -414,7 +414,7 @@ Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)`), assert.deepEqual(result.javaVersion, "1.8.0_202"); assert.deepEqual( result.nodeGypVer, - childProcessResult.nodeGypVersion.result.stdout + childProcessResult.nodeGypVersion.result.stdout, ); assert.deepEqual(result.adbVer, "1.0.32"); assert.deepEqual(result.androidInstalled, true); @@ -423,7 +423,7 @@ Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)`), assert.deepEqual(result.gitVer, "1.9.5"); assert.deepEqual( result.nativeScriptCliVersion, - childProcessResult.nativeScriptCliVersion.result.stdout + childProcessResult.nativeScriptCliVersion.result.stdout, ); }; @@ -439,7 +439,7 @@ Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)`), sysInfo = mockSysInfo( childProcessResult, { isWindows: true, isDarwin: false, dotNetVersion }, - { existsResult: true } + { existsResult: true }, ); const result = await sysInfo.getSysInfo(); process.env[PROGRAM_FILES] = originalProgramFiles; @@ -459,7 +459,7 @@ Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)`), assert.deepEqual(result.xcodeVer, "6.4.0"); assert.deepEqual( result.cocoaPodsVer, - childProcessResult.podVersion.result.stdout + childProcessResult.podVersion.result.stdout, ); }); @@ -554,7 +554,7 @@ Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)`), sysInfo = mockSysInfo( childProcessResult, { isWindows: false, isDarwin: false, dotNetVersion: "4.5.1" }, - null + null, ); const adbVersion = await sysInfo.getAdbVersion(); const isAndroidSdkConfiguredCorrectly = @@ -569,7 +569,7 @@ Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)`), sysInfo = mockSysInfo( childProcessResult, { isWindows: true, isDarwin: false, dotNetVersion: "4.5.1" }, - null + null, ); const pythonInfo = await sysInfo.getPythonInfo(); assert.deepEqual(pythonInfo, null); @@ -578,7 +578,7 @@ Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)`), sysInfo = mockSysInfo( childProcessResult, { isWindows: false, isDarwin: false, dotNetVersion: "4.5.1" }, - null + null, ); const pythonInfo = await sysInfo.getPythonInfo(); assert.deepEqual(pythonInfo, null); @@ -588,7 +588,7 @@ Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)`), sysInfo = mockSysInfo( childProcessResult, { isWindows: false, isDarwin: true, dotNetVersion: "4.5.1" }, - null + null, ); const pythonInfo = await sysInfo.getPythonInfo(); assert.deepEqual(pythonInfo, { @@ -600,7 +600,7 @@ Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)`), sysInfo = mockSysInfo( childProcessResult, { isWindows: false, isDarwin: true, dotNetVersion: "4.5.1" }, - null + null, ); const pythonInfo = await sysInfo.getPythonInfo(); assert.deepEqual(pythonInfo, { @@ -636,7 +636,7 @@ Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)`), testData.forEach((testCase) => { describe(testCase.testedProperty, () => { - it("is null when tns is not installed", async () => { + it("is null when ns is not installed", async () => { childProcessResult[testCase.testedProperty] = { shouldThrowError: true, }; @@ -665,7 +665,7 @@ Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)`), it("is correct when there are warnings in the command's output", async () => { childProcessResult[testCase.testedProperty] = { result: setStdOut( - `Some warning due to invalid extensions${EOL}3.0.0` + `Some warning due to invalid extensions${EOL}3.0.0`, ), }; sysInfo = mockSysInfo(childProcessResult, { @@ -790,17 +790,17 @@ ${expectedCliVersion}`; assert.deepEqual(result.nodeVer, "6.0.0"); assert.deepEqual( result.nodeGypVer, - childProcessResult.nodeGypVersion.result.stdout + childProcessResult.nodeGypVersion.result.stdout, ); assert.deepEqual(result.gitVer, "1.9.5"); assert.deepEqual( result.nativeScriptCliVersion, - childProcessResult.nativeScriptCliVersion.result.stdout + childProcessResult.nativeScriptCliVersion.result.stdout, ); }; const assertAndroidSysInfo = ( - result: NativeScriptDoctor.IAndroidSysInfoData + result: NativeScriptDoctor.IAndroidSysInfoData, ) => { assert.deepEqual(result.adbVer, "1.0.32"); assert.deepEqual(result.androidInstalled, false); @@ -847,7 +847,7 @@ ${expectedCliVersion}`; sysInfo = mockSysInfo( childProcessResult, { isWindows: false, isDarwin: true, dotNetVersion }, - { existsResult: true } + { existsResult: true }, ); const result = await sysInfo.getSysInfo({ platform: "Android" }); diff --git a/packages/doctor/typings/interfaces.ts b/packages/doctor/typings/interfaces.ts index 1d873a78b8..ca63f2985b 100644 --- a/packages/doctor/typings/interfaces.ts +++ b/packages/doctor/typings/interfaces.ts @@ -212,7 +212,7 @@ declare module NativeScriptDoctor { canExecuteLocalBuild( platform: string, projectDir?: string, - runtimeVersion?: string + runtimeVersion?: string, ): Promise; /** @@ -271,7 +271,7 @@ declare module NativeScriptDoctor { */ gitVer: string; /** - * NativeScript CLI version string, as returned by `tns --version`. + * NativeScript CLI version string, as returned by `ns --version`. * @type {string} */ nativeScriptCliVersion: string; @@ -492,7 +492,7 @@ declare module NativeScriptDoctor { validateJavacVersion( installedJavaVersion: string, projectDir?: string, - runtimeVersion?: string + runtimeVersion?: string, ): NativeScriptDoctor.IWarning[]; /** @@ -513,7 +513,7 @@ declare module NativeScriptDoctor { * @return {NativeScriptDoctor.IWarning[]} An array of errors from the validation checks. If there are no errors will return []. */ validateMinSupportedTargetSdk( - options: ITargetValidationOptions + options: ITargetValidationOptions, ): NativeScriptDoctor.IWarning[]; /** @@ -522,7 +522,7 @@ declare module NativeScriptDoctor { * @return {NativeScriptDoctor.IWarning[]} An array of errors from the validation checks. If there are no errors will return []. */ validataMaxSupportedTargetSdk( - options: ITargetValidationOptions + options: ITargetValidationOptions, ): NativeScriptDoctor.IWarning[]; /** diff --git a/packages/nativescript-envinfo/package.json b/packages/nativescript-envinfo/package.json index 3599b65593..64e5f94477 100644 --- a/packages/nativescript-envinfo/package.json +++ b/packages/nativescript-envinfo/package.json @@ -9,7 +9,7 @@ "prepack": "tsc" }, "dependencies": { - "@types/envinfo": "^7.8.1", - "envinfo": "^7.8.1" + "@types/envinfo": "^7.8.4", + "envinfo": "^7.21.0" } } diff --git a/packages/nativescript-envinfo/yarn.lock b/packages/nativescript-envinfo/yarn.lock index 2bb724c50e..5be003ebbc 100644 --- a/packages/nativescript-envinfo/yarn.lock +++ b/packages/nativescript-envinfo/yarn.lock @@ -2,12 +2,12 @@ # yarn lockfile v1 -"@types/envinfo@^7.8.1": - version "7.8.1" - resolved "https://registry.yarnpkg.com/@types/envinfo/-/envinfo-7.8.1.tgz#1915df82c16d637e92146645c70db9360eb099c6" - integrity sha512-pTyshpmGxqB9lRwG75v2YR0oqKYpCrklOYlZWQ88z/JB0fimT8EVmYekuIwpU3IxPZDHSXCqXKzkCrtAcKY25g== +"@types/envinfo@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@types/envinfo/-/envinfo-7.8.4.tgz#f13ec1050b8e260d6d7c149ba5b99f65d2b74058" + integrity sha512-K5WaRgSlqjc408IyPbxOFnz7rVG9E8ELhj7XR3Ncui15EgeyIXTcCfmwrRnU4uEOCJQhzZRAQurYznEEc1dD2g== -envinfo@^7.8.1: - version "7.8.1" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" - integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== +envinfo@^7.21.0: + version "7.21.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.21.0.tgz#04a251be79f92548541f37d13c8b6f22940c3bae" + integrity sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow== diff --git a/scripts/get-next-version.js b/scripts/get-next-version.js new file mode 100644 index 0000000000..5f6be10cbf --- /dev/null +++ b/scripts/get-next-version.js @@ -0,0 +1,60 @@ +const semver = require("semver"); +const child_process = require("child_process"); +const fs = require("fs"); + +const currentVersion = + process.env.NPM_VERSION || require("../package.json").version; + +if (!currentVersion) { + throw new Error("Invalid current version"); +} +const currentTag = process.env.NPM_TAG || "next"; +const runID = process.env.GITHUB_RUN_ID || 0; + +let prPrerelease = ""; + +if (currentTag === "pr" && process.env.GITHUB_EVENT_PATH) { + try { + const ev = JSON.parse(fs.readFileSync(process.env.GITHUB_EVENT_PATH, "utf8")); + const prNum = ev.pull_request.number; + // add extra PR number to version-pr.PRNUM-.... + prPrerelease = `${prNum}-`; + } catch (e) { + // don't add pr prerelease + } +} + +// Format date as YYYY-MM-DD using native Date +const now = new Date(); +const dateStr = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, "0")}-${String(now.getDate()).padStart(2, "0")}`; + +const preRelease = `${currentTag}.${prPrerelease}${dateStr}-${runID}`; + +let lastTagVersion = ( + process.env.LAST_TAGGED_VERSION || + child_process + .spawnSync("git", ["describe", "--tags", "--abbrev=0", "--match=v*"]) + .stdout.toString() +) + .trim() + .substring(1); +if (!semver.parse(lastTagVersion)) { + throw new Error("Invalid last tag version"); +} + +function setPreRelease(version) { + const parsed = semver.parse(version); + return semver.parse( + `${parsed.major}.${parsed.minor}.${parsed.patch}-${preRelease}` + ); +} + +let nextVersion = setPreRelease(currentVersion); + +// bump patch if the current version is lower or equal to the last tagged version +if (semver.lte(nextVersion, lastTagVersion)) { + nextVersion = semver.inc(lastTagVersion, "patch"); + nextVersion = setPreRelease(nextVersion); +} + +console.log(nextVersion.version); diff --git a/scripts/get-npm-tag.js b/scripts/get-npm-tag.js new file mode 100644 index 0000000000..68cd158cd4 --- /dev/null +++ b/scripts/get-npm-tag.js @@ -0,0 +1,19 @@ +const semver = require("semver"); + +const currentVersion = + process.env.NPM_VERSION || require("../package.json").version; + +function validateNpmTag(version) { + const parsed = semver.parse(version); + return ( + parsed.prerelease.length === 0 || /^[a-zA-Z]+$/.test(parsed.prerelease[0]) + ); +} + +function getNpmTag(version) { + if (!validateNpmTag(version)) throw new Error("Invalid npm tag"); + const parsed = semver.parse(version); + return parsed.prerelease[0] || "latest"; +} + +console.log(getNpmTag(currentVersion)); diff --git a/test/controllers/add-platform-controller.ts b/test/controllers/add-platform-controller.ts index cc2b9e62ae..f7680f789f 100644 --- a/test/controllers/add-platform-controller.ts +++ b/test/controllers/add-platform-controller.ts @@ -45,7 +45,7 @@ function createInjector(data?: { latestFrameworkVersion: string }) { logger.info = (message: string) => (actualMessage = message); const packageInstallationManager = injector.resolve( - "packageInstallationManager" + "packageInstallationManager", ); packageInstallationManager.getLatestCompatibleVersion = async () => version; @@ -68,11 +68,11 @@ const projectDir = "/my/test/dir"; describe("PlatformController", () => { const testCases = [ { - name: "should add the platform (tns platform add @7.0.0)", + name: "should add the platform (ns platform add @7.0.0)", latestFrameworkVersion: "7.0.0", }, { - name: "should add the latest compatible version (tns platform add )", + name: "should add the latest compatible version (ns platform add )", latestFrameworkVersion, getPlatformParam: (platform: string) => `${platform}@${latestFrameworkVersion}`, @@ -117,7 +117,7 @@ describe("PlatformController", () => { const frameworkPath = "invalidPath"; const errorMessage = format( AddPlaformErrors.InvalidFrameworkPathStringFormat, - frameworkPath + frameworkPath, ); const injector = createInjector(); @@ -129,7 +129,7 @@ describe("PlatformController", () => { await assert.isRejected( platformController.addPlatform({ projectDir, platform, frameworkPath }), - errorMessage + errorMessage, ); }); @@ -185,7 +185,7 @@ describe("PlatformController", () => { assert(writeFileCalled, "expected to write gradle.properties"); assert( writeFileContents.includes("# App configuration"), - "expected gradle.properties to have the project data written to it" + "expected gradle.properties to have the project data written to it", ); }); }); diff --git a/test/controllers/prepare-controller.ts b/test/controllers/prepare-controller.ts index a8bf78ad3b..e3982de1e4 100644 --- a/test/controllers/prepare-controller.ts +++ b/test/controllers/prepare-controller.ts @@ -38,7 +38,7 @@ function createTestInjector(data: { hasNativeChanges: boolean }): IInjector { }, }); - injector.register("webpackCompilerService", { + injector.register("bundlerCompilerService", { on: () => ({}), emit: () => ({}), compileWithWatch: async () => { @@ -119,7 +119,7 @@ describe("prepareController", () => { injector.resolve("prepareController"); const prepareNativePlatformService = injector.resolve( - "prepareNativePlatformService" + "prepareNativePlatformService", ); prepareNativePlatformService.prepareNativePlatform = async () => { const nativeFilesWatcher = (prepareController).watchersData[ @@ -128,7 +128,7 @@ describe("prepareController", () => { nativeFilesWatcher.emit( "all", "change", - "my/project/App_Resources/some/file" + "my/project/App_Resources/some/file", ); isNativePrepareCalled = true; return false; diff --git a/test/ios-entitlements-service.ts b/test/ios-entitlements-service.ts index 455e9900fe..282754705b 100644 --- a/test/ios-entitlements-service.ts +++ b/test/ios-entitlements-service.ts @@ -1,4 +1,5 @@ -import * as temp from "temp"; +import { mkdtempSync } from "fs"; +import { tmpdir } from "os"; import { EOL } from "os"; import { assert } from "chai"; import { IOSEntitlementsService } from "../lib/services/ios-entitlements-service"; @@ -13,8 +14,7 @@ import { IProjectData } from "../lib/definitions/project"; import { IInjector } from "../lib/common/definitions/yok"; import { IFileSystem } from "../lib/common/declarations"; -// start tracking temporary folders/files -temp.track(); +// start temporary folders/files helpers describe("IOSEntitlements Service Tests", () => { const createTestInjector = (): IInjector => { @@ -29,7 +29,7 @@ describe("IOSEntitlements Service Tests", () => { testInjector.register("mobileHelper", MobileHelperLib.MobileHelper); testInjector.register( "devicePlatformsConstants", - DevicePlatformsConstantsLib.DevicePlatformsConstants + DevicePlatformsConstantsLib.DevicePlatformsConstants, ); testInjector.register("errors", ErrorsLib.Errors); @@ -56,8 +56,10 @@ describe("IOSEntitlements Service Tests", () => { projectData = injector.resolve("projectData"); projectData.projectName = "testApp"; - projectData.platformsDir = temp.mkdirSync("platformsDir"); - projectData.projectDir = temp.mkdirSync("projectDir"); + projectData.platformsDir = mkdtempSync( + path.join(tmpdir(), "platformsDir-"), + ); + projectData.projectDir = mkdtempSync(path.join(tmpdir(), "projectDir-")); projectData.appDirectoryPath = projectData.getAppDirectoryPath(); projectData.appResourcesDirectoryPath = projectData.getAppResourcesDirectoryPath(); @@ -74,7 +76,7 @@ describe("IOSEntitlements Service Tests", () => { const expected = path.join("testApp", "testApp.entitlements"); const actual = iOSEntitlementsService.getPlatformsEntitlementsRelativePath( - projectData + projectData, ); assert.equal(actual, expected); }); @@ -84,7 +86,7 @@ describe("IOSEntitlements Service Tests", () => { projectData.platformsDir, "ios", "testApp", - "testApp.entitlements" + "testApp.entitlements", ); const actual = iOSEntitlementsService.getPlatformsEntitlementsPath(projectData); @@ -149,7 +151,7 @@ describe("IOSEntitlements Service Tests", () => { )).getDefaultAppEntitlementsPath(projectData); fs.writeFile( appResourcesEntitlement, - defaultAppResourcesEntitlementsContent + defaultAppResourcesEntitlementsContent, ); // act @@ -162,7 +164,9 @@ describe("IOSEntitlements Service Tests", () => { it("Merge uses the entitlements file from a Plugin", async () => { const pluginsService = injector.resolve("pluginsService"); - const testPluginFolderPath = temp.mkdirSync("testPlugin"); + const testPluginFolderPath = mkdtempSync( + path.join(tmpdir(), "testPlugin-"), + ); pluginsService.getAllInstalledPlugins = async () => [ { pluginPlatformsFolderPath: (platform: string) => { @@ -172,7 +176,7 @@ describe("IOSEntitlements Service Tests", () => { ]; const pluginAppEntitlementsPath = path.join( testPluginFolderPath, - IOSEntitlementsService.DefaultEntitlementsName + IOSEntitlementsService.DefaultEntitlementsName, ); fs.writeFile(pluginAppEntitlementsPath, defaultPluginEntitlementsContent); @@ -191,12 +195,14 @@ describe("IOSEntitlements Service Tests", () => { )).getDefaultAppEntitlementsPath(projectData); fs.writeFile( appResourcesEntitlement, - namedAppResourcesEntitlementsContent + namedAppResourcesEntitlementsContent, ); // setup plugin entitlements const pluginsService = injector.resolve("pluginsService"); - const testPluginFolderPath = temp.mkdirSync("testPlugin"); + const testPluginFolderPath = mkdtempSync( + path.join(tmpdir(), "testPlugin-"), + ); pluginsService.getAllInstalledPlugins = async () => [ { pluginPlatformsFolderPath: (platform: string) => { @@ -206,7 +212,7 @@ describe("IOSEntitlements Service Tests", () => { ]; const pluginAppEntitlementsPath = path.join( testPluginFolderPath, - IOSEntitlementsService.DefaultEntitlementsName + IOSEntitlementsService.DefaultEntitlementsName, ); fs.writeFile(pluginAppEntitlementsPath, defaultPluginEntitlementsContent); diff --git a/test/ios-project-service.ts b/test/ios-project-service.ts index 330976a257..a8f7a9e1a1 100644 --- a/test/ios-project-service.ts +++ b/test/ios-project-service.ts @@ -38,7 +38,9 @@ import { ProjectConfigServiceStub, } from "./stubs"; import { xcode } from "../lib/node/xcode"; -import * as temp from "temp"; +import { mkdtempSync } from "fs"; +import { tmpdir } from "os"; +import * as path from "path"; import { CocoaPodsPlatformManager } from "../lib/services/cocoapods-platform-manager"; import { XcodebuildService } from "../lib/services/ios/xcodebuild-service"; import { XcodebuildCommandService } from "../lib/services/ios/xcodebuild-command-service"; @@ -51,7 +53,6 @@ import { IXcconfigService } from "../lib/declarations"; import { IInjector } from "../lib/common/definitions/yok"; import { IStringDictionary, IFileSystem } from "../lib/common/declarations"; import { DevicePlatformsConstants } from "../lib/common/mobile/device-platforms-constants"; -temp.track(); class IOSSimulatorDiscoveryMock extends DeviceDiscovery { public async startLookingForDevices(): Promise { @@ -66,7 +67,7 @@ class IOSSimulatorDiscoveryMock extends DeviceDiscovery { function createTestInjector( projectPath: string, projectName: string, - xCode?: IXcode + xCode?: IXcode, ): IInjector { const testInjector = new yok.Yok(); testInjector.register("childProcess", ChildProcessLib.ChildProcess); @@ -80,7 +81,7 @@ function createTestInjector( testInjector.register("cocoapodsService", CocoaPodsService); testInjector.register( "iOSProjectService", - iOSProjectServiceLib.IOSProjectService + iOSProjectServiceLib.IOSProjectService, ); testInjector.register("iOSProvisionService", {}); testInjector.register("xcconfigService", XcconfigService); @@ -103,11 +104,11 @@ function createTestInjector( overridePods: false, }, }); - projectData.projectDir = temp.mkdirSync("projectDir"); + projectData.projectDir = mkdtempSync(path.join(tmpdir(), "projectDir-")); projectData.appDirectoryPath = join(projectData.projectDir, "app"); projectData.appResourcesDirectoryPath = join( projectData.appDirectoryPath, - "App_Resources" + "App_Resources", ); testInjector.register("projectData", projectData); testInjector.register("projectHelper", {}); @@ -175,7 +176,7 @@ function createTestInjector( return ""; } }, - } + }, ); testInjector.register("userSettingsService", { getSettingValue: async (settingName: string): Promise => undefined, @@ -197,7 +198,7 @@ function createTestInjector( testInjector.register("filesHashService", { hasChangesInShasums: ( oldPluginNativeHashes: IStringDictionary, - currentPluginNativeHashes: IStringDictionary + currentPluginNativeHashes: IStringDictionary, ) => true, generateHashes: async (files: string[]): Promise => ({}), }); @@ -205,7 +206,7 @@ function createTestInjector( extractPackage: async ( packageName: string, destinationDirectory: string, - options?: IPacoteExtractOptions + options?: IPacoteExtractOptions, ): Promise => undefined, }); testInjector.register("iOSExtensionsService", { @@ -248,7 +249,7 @@ function createTestInjector( function createPackageJson( testInjector: IInjector, projectPath: string, - projectName: string + projectName: string, ) { const packageJsonData = { name: projectName, @@ -291,7 +292,7 @@ describe("Cocoapods support", () => { it("adds а base Podfile", async () => { const projectName = "projectDirectory"; - const projectPath = temp.mkdirSync(projectName); + const projectPath = mkdtempSync(path.join(tmpdir(), `${projectName}-`)); const testInjector = createTestInjector(projectPath, projectName); const fs: IFileSystem = testInjector.resolve("fs"); @@ -333,7 +334,7 @@ describe("Cocoapods support", () => { projectData.appDirectoryPath, "App_Resources", "iOS", - "Podfile" + "Podfile", ); const pluginPodfileContent = [ "source 'https://github.com/CocoaPods/Specs.git'", @@ -348,13 +349,13 @@ describe("Cocoapods support", () => { basePodfileModuleName, basePodfilePath, projectData, - iOSProjectService.getPlatformData(projectData) + iOSProjectService.getPlatformData(projectData), ); const projectPodfilePath = join(platformsFolderPath, "Podfile"); assert.isTrue( fs.exists(projectPodfilePath), - `File ${projectPodfilePath} must exist as we have already applied Podfile to it.` + `File ${projectPodfilePath} must exist as we have already applied Podfile to it.`, ); const actualProjectPodfileContent = fs.readText(projectPodfilePath); @@ -385,17 +386,17 @@ describe("Cocoapods support", () => { basePodfileModuleName, basePodfilePath, projectData, - iOSProjectService.getPlatformData(projectData) + iOSProjectService.getPlatformData(projectData), ); assert.isFalse( fs.exists(projectPodfilePath), - `The projectPodfilePath (${projectPodfilePath}) must not exist when all Podfiles have been deleted and project is prepared again. (i.e. CLI should delete the project Podfile in this case)` + `The projectPodfilePath (${projectPodfilePath}) must not exist when all Podfiles have been deleted and project is prepared again. (i.e. CLI should delete the project Podfile in this case)`, ); }); it("adds plugin with Podfile", async () => { const projectName = "projectDirectory"; - const projectPath = temp.mkdirSync(projectName); + const projectPath = mkdtempSync(path.join(tmpdir(), `${projectName}-`)); const testInjector = createTestInjector(projectPath, projectName); const fs: IFileSystem = testInjector.resolve("fs"); @@ -418,13 +419,13 @@ describe("Cocoapods support", () => { const iOSProjectService = testInjector.resolve("iOSProjectService"); iOSProjectService.prepareFrameworks = ( pluginPlatformsFolderPath: string, - pluginData: IPluginData + pluginData: IPluginData, ): Promise => { return Promise.resolve(); }; iOSProjectService.prepareStaticLibs = ( pluginPlatformsFolderPath: string, - pluginData: IPluginData + pluginData: IPluginData, ): Promise => { return Promise.resolve(); }; @@ -440,15 +441,15 @@ describe("Cocoapods support", () => { }; iOSProjectService.savePbxProj = (): Promise => Promise.resolve(); - const pluginPath = temp.mkdirSync("pluginDirectory"); + const pluginPath = mkdtempSync(path.join(tmpdir(), "pluginDirectory-")); const samplePluginPlatformsFolderPath = join( pluginPath, "platforms", - "ios" + "ios", ); const pluginPodfilePath = join( samplePluginPlatformsFolderPath, - "Podfile" + "Podfile", ); const pluginPodfileContent = [ "source 'https://github.com/CocoaPods/Specs.git'", @@ -505,7 +506,7 @@ describe("Cocoapods support", () => { }); it("adds and removes plugin with Podfile", async () => { const projectName = "projectDirectory2"; - const projectPath = temp.mkdirSync(projectName); + const projectPath = mkdtempSync(path.join(tmpdir(), `${projectName}-`)); const testInjector = createTestInjector(projectPath, projectName); const fs: IFileSystem = testInjector.resolve("fs"); @@ -528,25 +529,25 @@ describe("Cocoapods support", () => { const iOSProjectService = testInjector.resolve("iOSProjectService"); iOSProjectService.prepareFrameworks = ( pluginPlatformsPath: string, - pluginData: IPluginData + pluginData: IPluginData, ): Promise => { return Promise.resolve(); }; iOSProjectService.prepareStaticLibs = ( pluginPlatformsPath: string, - pluginData: IPluginData + pluginData: IPluginData, ): Promise => { return Promise.resolve(); }; iOSProjectService.removeFrameworks = ( pluginPlatformsPath: string, - pluginData: IPluginData + pluginData: IPluginData, ): Promise => { return Promise.resolve(); }; iOSProjectService.removeStaticLibs = ( pluginPlatformsPath: string, - pluginData: IPluginData + pluginData: IPluginData, ): Promise => { return Promise.resolve(); }; @@ -568,15 +569,15 @@ describe("Cocoapods support", () => { }; iOSProjectService.savePbxProj = (): Promise => Promise.resolve(); - const pluginPath = temp.mkdirSync("pluginDirectory"); + const pluginPath = mkdtempSync(path.join(tmpdir(), "pluginDirectory-")); const samplePluginPlatformsFolderPath = join( pluginPath, "platforms", - "ios" + "ios", ); const pluginPodfilePath = join( samplePluginPlatformsFolderPath, - "Podfile" + "Podfile", ); const pluginPodfileContent = [ "source 'https://github.com/CocoaPods/Specs.git'", @@ -633,7 +634,7 @@ describe("Cocoapods support", () => { await iOSProjectService.removePluginNativeCode( samplePluginData, - projectData + projectData, ); assert.isFalse(fs.exists(projectPodfilePath)); @@ -658,13 +659,13 @@ describe("Cocoapods support", () => { describe("Source code support", () => { if (require("os").platform() !== "darwin") { console.log( - "Skipping Source code in plugin tests. They cannot work on windows" + "Skipping Source code in plugin tests. They cannot work on windows", ); } else { const getProjectWithoutPlugins = async (files: string[]) => { // Arrange const projectName = "projectDirectory"; - const projectPath = temp.mkdirSync(projectName); + const projectPath = mkdtempSync(path.join(tmpdir(), `${projectName}-`)); const testInjector = createTestInjector(projectPath, projectName, xcode); const fs: IFileSystem = testInjector.resolve("fs"); @@ -699,7 +700,7 @@ describe("Source code support", () => { const platformSpecificAppResourcesPath = join( projectData.appResourcesDirectoryPath, - iOSProjectService.getPlatformData(projectData).normalizedPlatformName + iOSProjectService.getPlatformData(projectData).normalizedPlatformName, ); files.forEach((file) => { @@ -711,7 +712,7 @@ describe("Source code support", () => { await iOSProjectService.prepareNativeSourceCode( "src", platformSpecificAppResourcesPath, - projectData + projectData, ); return pbxProj; @@ -719,11 +720,11 @@ describe("Source code support", () => { const preparePluginWithFiles = async ( files: string[], - prepareMethodToCall: string + prepareMethodToCall: string, ) => { // Arrange const projectName = "projectDirectory"; - const projectPath = temp.mkdirSync(projectName); + const projectPath = mkdtempSync(path.join(tmpdir(), `${projectName}-`)); const testInjector = createTestInjector(projectPath, projectName, xcode); const fs: IFileSystem = testInjector.resolve("fs"); @@ -756,7 +757,7 @@ describe("Source code support", () => { .forEach((methodName) => { iOSProjectService[methodName] = ( pluginPlatformsFolderPath: string, - pluginData: IPluginData + pluginData: IPluginData, ): Promise => { return Promise.resolve(); }; @@ -773,11 +774,11 @@ describe("Source code support", () => { return Promise.resolve(); }; - const pluginPath = temp.mkdirSync("pluginDirectory"); + const pluginPath = mkdtempSync(path.join(tmpdir(), "pluginDirectory-")); const samplePluginPlatformsFolderPath = join( pluginPath, "platforms", - "ios" + "ios", ); files.forEach((file) => { const fullPath = join(samplePluginPlatformsFolderPath, file); @@ -797,7 +798,7 @@ describe("Source code support", () => { // Act await iOSProjectService.preparePluginNativeCode( samplePluginData, - projectData + projectData, ); return pbxProj; @@ -817,7 +818,7 @@ describe("Source code support", () => { ]; const projectName = "projectDirectory"; - const projectPath = temp.mkdirSync(projectName); + const projectPath = mkdtempSync(path.join(tmpdir(), `${projectName}-`)); const testInjector = createTestInjector(projectPath, projectName, xcode); const fs: IFileSystem = testInjector.resolve("fs"); @@ -828,7 +829,7 @@ describe("Source code support", () => { const pbxFileReference = pbxProj.hash.project.objects.PBXFileReference; const pbxFileReferenceValues = Object.keys(pbxFileReference).map( - (key) => pbxFileReference[key] + (key) => pbxFileReference[key], ); const buildPhaseFiles = pbxProj.hash.project.objects.PBXSourcesBuildPhase[ @@ -843,26 +844,26 @@ describe("Source code support", () => { assert.notEqual( pbxFileReferenceValues.indexOf(baseName), -1, - `${baseName} not added to PBXFileRefereces` + `${baseName} not added to PBXFileRefereces`, ); const buildPhaseFile = buildPhaseFiles.find((fileObject: any) => - fileObject.comment.startsWith(baseName) + fileObject.comment.startsWith(baseName), ); if (shouldBeAdded && !extname(baseName).startsWith(".h")) { assert.isDefined( buildPhaseFile, - `${baseName} not added to PBXSourcesBuildPhase` + `${baseName} not added to PBXSourcesBuildPhase`, ); assert.include( buildPhaseFile.comment, "in Sources", - `${baseName} must be added to Sources group` + `${baseName} must be added to Sources group`, ); } else { assert.isUndefined( buildPhaseFile, - `${baseName} is added to PBXSourcesBuildPhase, but it shouldn't have been.` + `${baseName} is added to PBXSourcesBuildPhase, but it shouldn't have been.`, ); } }); @@ -883,12 +884,12 @@ describe("Source code support", () => { const pbxProj = await preparePluginWithFiles( sourceFileNames, - "prepareNativeSourceCode" + "prepareNativeSourceCode", ); const pbxFileReference = pbxProj.hash.project.objects.PBXFileReference; const pbxFileReferenceValues = Object.keys(pbxFileReference).map( - (key) => pbxFileReference[key] + (key) => pbxFileReference[key], ); const buildPhaseFiles = pbxProj.hash.project.objects.PBXSourcesBuildPhase[ @@ -903,26 +904,26 @@ describe("Source code support", () => { assert.notEqual( pbxFileReferenceValues.indexOf(baseName), -1, - `${baseName} not added to PBXFileRefereces` + `${baseName} not added to PBXFileRefereces`, ); const buildPhaseFile = buildPhaseFiles.find((fileObject: any) => - fileObject.comment.startsWith(baseName) + fileObject.comment.startsWith(baseName), ); if (shouldBeAdded && !extname(baseName).startsWith(".h")) { assert.isDefined( buildPhaseFile, - `${baseName} not added to PBXSourcesBuildPhase` + `${baseName} not added to PBXSourcesBuildPhase`, ); assert.include( buildPhaseFile.comment, "in Sources", - `${baseName} must be added to Sources group` + `${baseName} must be added to Sources group`, ); } else { assert.isUndefined( buildPhaseFile, - `${baseName} was added to PBXSourcesBuildPhase, but it shouldn't have been` + `${baseName} was added to PBXSourcesBuildPhase, but it shouldn't have been`, ); } }); @@ -937,12 +938,12 @@ describe("Source code support", () => { const pbxProj = await preparePluginWithFiles( resFileNames, - "prepareResources" + "prepareResources", ); const pbxFileReference = pbxProj.hash.project.objects.PBXFileReference; const pbxFileReferenceValues = Object.keys(pbxFileReference).map( - (key) => pbxFileReference[key] + (key) => pbxFileReference[key], ); const buildPhaseFiles = pbxProj.hash.project.objects.PBXResourcesBuildPhase[ @@ -956,20 +957,20 @@ describe("Source code support", () => { assert.isTrue( pbxFileReferenceValues.indexOf(fileName) !== -1, - `Resource ${filename} not added to PBXFileRefereces` + `Resource ${filename} not added to PBXFileRefereces`, ); const buildPhaseFile = buildPhaseFiles.find((fileObject: any) => - fileObject.comment.startsWith(fileName) + fileObject.comment.startsWith(fileName), ); assert.isDefined( buildPhaseFile, - `${fileToCheck} not added to PBXResourcesBuildPhase` + `${fileToCheck} not added to PBXResourcesBuildPhase`, ); assert.include( buildPhaseFile.comment, "in Resources", - `${fileToCheck} must be added to Resources group` + `${fileToCheck} must be added to Resources group`, ); }); }); @@ -983,18 +984,22 @@ describe("Static libraries support", () => { } const projectName = "TNSApp"; - const projectPath = temp.mkdirSync(projectName); + const projectPath = mkdtempSync(path.join(tmpdir(), `${projectName}-`)); const libraryName = "testLibrary1"; const headers = ["TestHeader1.h", "TestHeader2.h"]; const testInjector = createTestInjector(projectPath, projectName); const fs: IFileSystem = testInjector.resolve("fs"); const staticLibraryPath = join( - join(temp.mkdirSync("pluginDirectory"), "platforms", "ios") + join( + mkdtempSync(path.join(tmpdir(), "pluginDirectory-")), + "platforms", + "ios", + ), ); const staticLibraryHeadersPath = join( staticLibraryPath, "include", - libraryName + libraryName, ); it("checks validation of header files", async () => { @@ -1010,7 +1015,7 @@ describe("Static libraries support", () => { let error: any; try { await iOSProjectService.validateStaticLibrary( - join(staticLibraryPath, libraryName + ".a") + join(staticLibraryPath, libraryName + ".a"), ); } catch (err) { error = err; @@ -1019,7 +1024,7 @@ describe("Static libraries support", () => { assert.instanceOf( error, Error, - "Expect to fail, the .a file is not a static library." + "Expect to fail, the .a file is not a static library.", ); }); @@ -1033,11 +1038,11 @@ describe("Static libraries support", () => { iOSProjectService.generateModulemap(staticLibraryHeadersPath, libraryName); // Read the generated modulemap and verify it. let modulemap = fs.readFile( - join(staticLibraryHeadersPath, "module.modulemap") + join(staticLibraryHeadersPath, "module.modulemap"), ); const headerCommands = _.map(headers, (value) => `header "${value}"`); const modulemapExpectation = `module ${libraryName} { explicit module ${libraryName} { ${headerCommands.join( - " " + " ", )} } }`; assert.equal(modulemap, modulemapExpectation); @@ -1051,7 +1056,7 @@ describe("Static libraries support", () => { let error: any; try { modulemap = fs.readFile( - join(staticLibraryHeadersPath, "module.modulemap") + join(staticLibraryHeadersPath, "module.modulemap"), ); } catch (err) { error = err; @@ -1060,7 +1065,7 @@ describe("Static libraries support", () => { assert.instanceOf( error, Error, - "Expect to fail, there shouldn't be a module.modulemap file." + "Expect to fail, there shouldn't be a module.modulemap file.", ); }); }); @@ -1068,7 +1073,7 @@ describe("Static libraries support", () => { describe("Relative paths", () => { it("checks for correct calculation of relative paths", () => { const projectName = "projectDirectory"; - const projectPath = temp.mkdirSync(projectName); + const projectPath = mkdtempSync(path.join(tmpdir(), `${projectName}-`)); const subpath = join(projectPath, "sub", "path"); const testInjector = createTestInjector(projectPath, projectName); @@ -1078,7 +1083,7 @@ describe("Relative paths", () => { const result = iOSProjectService.getLibSubpathRelativeToProjectPath( subpath, - projectData + projectData, ); assert.equal(result, join("..", "..", "sub", "path")); }); @@ -1087,14 +1092,14 @@ describe("Relative paths", () => { describe("Merge Project XCConfig files", () => { if (require("os").platform() !== "darwin") { console.log( - "Skipping 'Merge Project XCConfig files' tests. They can work only on macOS" + "Skipping 'Merge Project XCConfig files' tests. They can work only on macOS", ); return; } const assertPropertyValues = ( expected: any, xcconfigPath: string, - injector: IInjector + injector: IInjector, ) => { const service = injector.resolve("xcconfigService"); _.forOwn(expected, (value, key) => { @@ -1117,7 +1122,7 @@ describe("Merge Project XCConfig files", () => { beforeEach(() => { projectName = "projectDirectory"; - projectPath = temp.mkdirSync(projectName); + projectPath = mkdtempSync(path.join(tmpdir(), `${projectName}-`)); testInjector = createTestInjector(projectPath, projectName); iOSProjectService = testInjector.resolve("iOSProjectService"); @@ -1126,7 +1131,7 @@ describe("Merge Project XCConfig files", () => { projectData.appResourcesDirectoryPath = join( projectData.projectDir, "app", - "App_Resources" + "App_Resources", ); iOSEntitlementsService = testInjector.resolve("iOSEntitlementsService"); @@ -1134,7 +1139,7 @@ describe("Merge Project XCConfig files", () => { appResourcesXcconfigPath = join( projectData.appResourcesDirectoryPath, "iOS", - BUILD_XCCONFIG_FILE_NAME + BUILD_XCCONFIG_FILE_NAME, ); appResourceXCConfigContent = `CODE_SIGN_IDENTITY = iPhone Distribution // To build for device with XCode you need to specify your development team. More info: https://developer.apple.com/library/prerelease/content/releasenotes/DeveloperTools/RN-Xcode/Introduction.html @@ -1166,7 +1171,7 @@ describe("Merge Project XCConfig files", () => { _.each(destinationFilePaths, (destinationFilePath) => { assert.isTrue( fs.exists(destinationFilePath), - "Target build xcconfig is missing for release: " + release + "Target build xcconfig is missing for release: " + release, ); const expected = { ASSETCATALOG_COMPILER_APPICON_NAME: "AppIcon", @@ -1203,12 +1208,12 @@ describe("Merge Project XCConfig files", () => { _.each(destinationFilePaths, (destinationFilePath) => { assert.isTrue( fs.exists(destinationFilePath), - "Target build xcconfig is missing for release: " + release + "Target build xcconfig is missing for release: " + release, ); const expected = { CODE_SIGN_ENTITLEMENTS: iOSEntitlementsService.getPlatformsEntitlementsRelativePath( - projectData + projectData, ), }; assertPropertyValues(expected, destinationFilePath, testInjector); @@ -1232,7 +1237,7 @@ describe("Merge Project XCConfig files", () => { _.each(destinationFilePaths, (destinationFilePath) => { assert.isTrue( fs.exists(destinationFilePath), - `Target build xcconfig ${destinationFilePath} is missing.` + `Target build xcconfig ${destinationFilePath} is missing.`, ); const expected = { ASSETCATALOG_COMPILER_APPICON_NAME: "AppIcon", @@ -1253,7 +1258,7 @@ describe("Merge Project XCConfig files", () => { _.each(destinationFilePaths, (destinationFilePath) => { assert.isTrue( fs.exists(destinationFilePath), - `Target build xcconfig ${destinationFilePath} is missing.` + `Target build xcconfig ${destinationFilePath} is missing.`, ); const content = fs.readFile(destinationFilePath).toString(); assert.equal(content, ""); @@ -1265,7 +1270,7 @@ describe("handleNativeDependenciesChange", () => { it("ensure the correct order of pod install and merging pod's xcconfig file", async () => { const executedCocoapodsMethods: string[] = []; const projectPodfilePath = "my/test/project/platforms/ios/Podfile"; - const dir = temp.mkdirSync("myTestProjectPath"); + const dir = mkdtempSync(path.join(tmpdir(), "myTestProjectPath-")); const testInjector = createTestInjector(dir, "myTestProjectName"); const iOSProjectService = testInjector.resolve("iOSProjectService"); diff --git a/test/plugin-create.ts b/test/plugin-create.ts index af0f36a028..fdb9e68a93 100644 --- a/test/plugin-create.ts +++ b/test/plugin-create.ts @@ -4,13 +4,13 @@ import { CreatePluginCommand } from "../lib/commands/plugin/create-plugin"; import { assert } from "chai"; import * as helpers from "../lib/common/helpers"; import * as sinon from "sinon"; -import * as temp from "temp"; +import { mkdtempSync } from "fs"; +import { tmpdir } from "os"; import * as path from "path"; import * as util from "util"; import { IOptions } from "../lib/declarations"; import { IInjector } from "../lib/common/definitions/yok"; import { IDictionary } from "../lib/common/declarations"; -temp.track(); interface IPacoteOutput { packageName: string; @@ -123,12 +123,10 @@ describe("Plugin create command tests", () => { const confirmQuestions: IDictionary = {}; strings[createPluginCommand.userMessage] = dummyUser; strings[createPluginCommand.nameMessage] = dummyName; - confirmQuestions[ - createPluginCommand.includeTypeScriptDemoMessage - ] = createDemoProjectAnswer; - confirmQuestions[ - createPluginCommand.includeAngularDemoMessage - ] = createDemoProjectAnswer; + confirmQuestions[createPluginCommand.includeTypeScriptDemoMessage] = + createDemoProjectAnswer; + confirmQuestions[createPluginCommand.includeAngularDemoMessage] = + createDemoProjectAnswer; prompter.expect({ strings: strings, @@ -144,12 +142,10 @@ describe("Plugin create command tests", () => { const strings: IDictionary = {}; const confirmQuestions: IDictionary = {}; strings[createPluginCommand.nameMessage] = dummyName; - confirmQuestions[ - createPluginCommand.includeTypeScriptDemoMessage - ] = createDemoProjectAnswer; - confirmQuestions[ - createPluginCommand.includeAngularDemoMessage - ] = createDemoProjectAnswer; + confirmQuestions[createPluginCommand.includeTypeScriptDemoMessage] = + createDemoProjectAnswer; + confirmQuestions[createPluginCommand.includeAngularDemoMessage] = + createDemoProjectAnswer; prompter.expect({ strings: strings, @@ -166,12 +162,10 @@ describe("Plugin create command tests", () => { const confirmQuestions: IDictionary = {}; strings[createPluginCommand.userMessage] = dummyUser; - confirmQuestions[ - createPluginCommand.includeTypeScriptDemoMessage - ] = createDemoProjectAnswer; - confirmQuestions[ - createPluginCommand.includeAngularDemoMessage - ] = createDemoProjectAnswer; + confirmQuestions[createPluginCommand.includeTypeScriptDemoMessage] = + createDemoProjectAnswer; + confirmQuestions[createPluginCommand.includeAngularDemoMessage] = + createDemoProjectAnswer; prompter.expect({ strings, @@ -188,9 +182,8 @@ describe("Plugin create command tests", () => { const confirmQuestions: IDictionary = {}; strings[createPluginCommand.userMessage] = dummyUser; strings[createPluginCommand.nameMessage] = dummyName; - confirmQuestions[ - createPluginCommand.includeAngularDemoMessage - ] = createDemoProjectAnswer; + confirmQuestions[createPluginCommand.includeAngularDemoMessage] = + createDemoProjectAnswer; prompter.expect({ strings: strings, @@ -208,9 +201,8 @@ describe("Plugin create command tests", () => { strings[createPluginCommand.userMessage] = dummyUser; strings[createPluginCommand.nameMessage] = dummyName; - confirmQuestions[ - createPluginCommand.includeTypeScriptDemoMessage - ] = createDemoProjectAnswer; + confirmQuestions[createPluginCommand.includeTypeScriptDemoMessage] = + createDemoProjectAnswer; prompter.expect({ strings: strings, @@ -236,7 +228,7 @@ describe("Plugin create command tests", () => { beforeEach(() => { sandbox = sinon.createSandbox(); - const workingPath = temp.mkdirSync("test_plugin"); + const workingPath = mkdtempSync(path.join(tmpdir(), "test_plugin-")); options.path = workingPath; projectPath = path.join(workingPath, dummyProjectName); const fsService = testInjector.resolve("fs"); @@ -285,8 +277,8 @@ describe("Plugin create command tests", () => { executePromise, util.format( createPluginCommand.pathAlreadyExistsMessageTemplate, - projectPath - ) + projectPath, + ), ); assert(fsSpy.notCalled); }); diff --git a/test/plugins-service.ts b/test/plugins-service.ts index 99d3aede71..85bc40641d 100644 --- a/test/plugins-service.ts +++ b/test/plugins-service.ts @@ -31,8 +31,9 @@ import { ProjectFilesProvider } from "../lib/providers/project-files-provider"; import { DevicePlatformsConstants } from "../lib/common/mobile/device-platforms-constants"; import { SettingsService } from "../lib/common/test/unit-tests/stubs"; import * as StaticConfigLib from "../lib/config"; +import { mkdtempSync } from "fs"; +import { tmpdir } from "os"; import * as path from "path"; -import * as temp from "temp"; import * as _ from "lodash"; import { PLUGINS_BUILD_DATA_FILENAME, PlatformTypes } from "../lib/constants"; // PACKAGE_JSON_FILE_NAME, CONFIG_FILE_NAME_JS, CONFIG_FILE_NAME_TS import { GradleCommandService } from "../lib/services/android/gradle-command-service"; @@ -51,7 +52,6 @@ import { import { FileSystem } from "../lib/common/file-system"; import { ProjectHelper } from "../lib/common/project-helper"; // import { basename } from 'path'; -temp.track(); let isErrorThrown = false; @@ -71,7 +71,7 @@ function createTestInjector() { testInjector.register("packageManager", PackageManager); testInjector.register( "projectConfigService", - stubs.PackageInstallationManagerStub + stubs.PackageInstallationManagerStub, ); testInjector.register("npm", NodePackageManager); testInjector.register("yarn", YarnPackageManager); @@ -149,17 +149,17 @@ function createTestInjector() { Promise.resolve(), interpolatePluginVariables: ( pluginData: IPluginData, - pluginConfigurationFileContent: string + pluginConfigurationFileContent: string, ) => Promise.resolve(pluginConfigurationFileContent), }); testInjector.register( "packageInstallationManager", - PackageInstallationManager + PackageInstallationManager, ); testInjector.register( "localToDevicePathDataFactory", - LocalToDevicePathDataFactory + LocalToDevicePathDataFactory, ); testInjector.register("mobileHelper", MobileHelper); testInjector.register("projectFilesProvider", ProjectFilesProvider); @@ -176,19 +176,19 @@ function createTestInjector() { testInjector.register("extensibilityService", {}); testInjector.register( "androidPluginBuildService", - stubs.AndroidPluginBuildServiceStub + stubs.AndroidPluginBuildServiceStub, ); testInjector.register("analyticsSettingsService", {}); testInjector.register( "androidResourcesMigrationService", - stubs.AndroidResourcesMigrationServiceStub + stubs.AndroidResourcesMigrationServiceStub, ); testInjector.register("platformEnvironmentRequirements", {}); testInjector.register("filesHashService", { hasChangesInShasums: ( oldPluginNativeHashes: IStringDictionary, - currentPluginNativeHashes: IStringDictionary + currentPluginNativeHashes: IStringDictionary, ) => true, generateHashes: async (files: string[]): Promise => ({}), }); @@ -208,7 +208,7 @@ function createTestInjector() { projectData.projectDir, "node_modules", packageToInstall, - "package.json" + "package.json", ); } @@ -221,7 +221,7 @@ function createTestInjector() { extractPackage: async ( packageName: string, destinationDirectory: string, - options?: IPacoteExtractOptions + options?: IPacoteExtractOptions, ): Promise => undefined, }); testInjector.register("gradleCommandService", GradleCommandService); @@ -236,7 +236,7 @@ function createTestInjector() { "projectConfigService", stubs.ProjectConfigServiceStub.initWithConfig({ id: "org.nativescript.Test", - }) + }), ); return testInjector; @@ -244,7 +244,7 @@ function createTestInjector() { function createProjectFile(testInjector: IInjector): string { const fs = testInjector.resolve("fs") as FileSystem; - const tempFolder = temp.mkdirSync("pluginsService"); + const tempFolder = mkdtempSync(path.join(tmpdir(), "pluginsService-")); const options = testInjector.resolve("options"); options.path = tempFolder; @@ -274,11 +274,11 @@ function createProjectFile(testInjector: IInjector): string { function mockBeginCommand( testInjector: IInjector, - expectedErrorMessage: string + expectedErrorMessage: string, ) { const errors = testInjector.resolve("errors"); errors.beginCommand = async ( - action: () => Promise + action: () => Promise, ): Promise => { try { return await action(); @@ -294,7 +294,7 @@ async function addPluginWhenExpectingToFail( testInjector: IInjector, plugin: string, expectedErrorMessage: string, - command?: string + command?: string, ) { createProjectFile(testInjector); @@ -332,7 +332,7 @@ describe("Plugins service", () => { testInjector, null, "You must specify plugin name.", - command + command, ); }); it("fails when invalid nativescript plugin name is specified", async () => { @@ -340,7 +340,7 @@ describe("Plugins service", () => { testInjector, "lodash", "lodash is not a valid NativeScript plugin. Verify that the plugin package.json file contains a nativescript key and try again.", - command + command, ); }); it("fails when the plugin is already installed", async () => { @@ -358,14 +358,14 @@ describe("Plugins service", () => { const pluginsService: IPluginsService = testInjector.resolve("pluginsService"); pluginsService.getAllInstalledPlugins = async ( - projData: IProjectData + projData: IProjectData, ) => { return [{ name: "plugin1" }]; }; mockBeginCommand( testInjector, - "Exception: " + 'Plugin "plugin1" is already installed.' + "Exception: " + 'Plugin "plugin1" is already installed.', ); isErrorThrown = false; @@ -397,14 +397,14 @@ describe("Plugins service", () => { const fs = testInjector.resolve("fs"); fs.writeJson( path.join(pluginFolderPath, "package.json"), - pluginJsonData + pluginJsonData, ); // Adds android platform fs.createDirectory(path.join(projectFolder, "platforms")); fs.createDirectory(path.join(projectFolder, "platforms", "android")); fs.createDirectory( - path.join(projectFolder, "platforms", "android", "app") + path.join(projectFolder, "platforms", "android", "app"), ); // Mock logger.warn @@ -420,21 +420,21 @@ describe("Plugins service", () => { const projectData: IProjectData = testInjector.resolve("projectData"); projectData.initializeProjectData(); pluginsService.getAllInstalledPlugins = async ( - projData: IProjectData + projData: IProjectData, ) => { return [{ name: "" }]; }; // Mock platformsDataService const platformsDataService = testInjector.resolve( - "platformsDataService" + "platformsDataService", ); platformsDataService.getPlatformData = (platform: string) => { return { appDestinationDirectoryPath: path.join( projectFolder, "platforms", - "android" + "android", ), frameworkPackageName: "tns-android", normalizedPlatformName: "Android", @@ -443,7 +443,7 @@ describe("Plugins service", () => { const projectDataService = testInjector.resolve("projectDataService"); projectDataService.getRuntimePackage = ( projectDir: string, - platform: PlatformTypes + platform: PlatformTypes, ) => { return { name: "tns-android", @@ -462,7 +462,7 @@ describe("Plugins service", () => { const pluginsService: IPluginsService = testInjector.resolve("pluginsService"); pluginsService.getAllInstalledPlugins = async ( - projectData: IProjectData + projectData: IProjectData, ) => { return [{ name: "" }]; }; @@ -488,14 +488,14 @@ describe("Plugins service", () => { // Asserts that the plugin is added in package.json file const packageJsonContent = fs.readJson( - path.join(projectFolder, "package.json") + path.join(projectFolder, "package.json"), ); const actualDependencies = packageJsonContent.dependencies; const expectedDependencies = { plugin1: "^1.0.3" }; const expectedDependenciesExact = { plugin1: "1.0.3" }; assert.isTrue( _.isEqual(actualDependencies, expectedDependencies) || - _.isEqual(actualDependencies, expectedDependenciesExact) + _.isEqual(actualDependencies, expectedDependenciesExact), ); }); it("adds plugin by name and version", async () => { @@ -505,7 +505,7 @@ describe("Plugins service", () => { const pluginsService: IPluginsService = testInjector.resolve("pluginsService"); pluginsService.getAllInstalledPlugins = async ( - projectData: IProjectData + projectData: IProjectData, ) => { return [{ name: "" }]; }; @@ -531,14 +531,14 @@ describe("Plugins service", () => { // Assert that the plugin is added in package.json file const packageJsonContent = fs.readJson( - path.join(projectFolder, "package.json") + path.join(projectFolder, "package.json"), ); const actualDependencies = packageJsonContent.dependencies; const expectedDependencies = { plugin1: "^1.0.0" }; const expectedDependenciesExact = { plugin1: "1.0.0" }; assert.isTrue( _.isEqual(actualDependencies, expectedDependencies) || - _.isEqual(actualDependencies, expectedDependenciesExact) + _.isEqual(actualDependencies, expectedDependenciesExact), ); }); it("adds plugin by local path", async () => { @@ -556,13 +556,13 @@ describe("Plugins service", () => { const fs = testInjector.resolve("fs"); fs.writeJson( path.join(pluginFolderPath, "package.json"), - pluginJsonData + pluginJsonData, ); const pluginsService: IPluginsService = testInjector.resolve("pluginsService"); pluginsService.getAllInstalledPlugins = async ( - projectData: IProjectData + projectData: IProjectData, ) => { return [{ name: "" }]; }; @@ -580,7 +580,7 @@ describe("Plugins service", () => { const pluginFiles = ["package.json"]; _.each(pluginFiles, (pluginFile) => { assert.isTrue( - fs.exists(path.join(nodeModulesFolderPath, pluginName, pluginFile)) + fs.exists(path.join(nodeModulesFolderPath, pluginName, pluginFile)), ); }); }); @@ -605,13 +605,13 @@ describe("Plugins service", () => { const fs = testInjector.resolve("fs"); fs.writeJson( path.join(pluginFolderPath, "package.json"), - pluginJsonData + pluginJsonData, ); const pluginsService: IPluginsService = testInjector.resolve("pluginsService"); pluginsService.getAllInstalledPlugins = async ( - projectData: IProjectData + projectData: IProjectData, ) => { return [{ name: "" }]; }; @@ -632,9 +632,9 @@ describe("Plugins service", () => { nodeModulesFolderPath, pluginName, "node_modules", - "grunt" - ) - ) + "grunt", + ), + ), ); }); it("install dev dependencies when --production option is not specified", async () => { @@ -658,13 +658,13 @@ describe("Plugins service", () => { const fs = testInjector.resolve("fs"); fs.writeJson( path.join(pluginFolderPath, "package.json"), - pluginJsonData + pluginJsonData, ); const pluginsService: IPluginsService = testInjector.resolve("pluginsService"); pluginsService.getAllInstalledPlugins = async ( - projectData: IProjectData + projectData: IProjectData, ) => { return [{ name: "" }]; }; @@ -702,7 +702,7 @@ describe("Plugins service", () => { platformProjectService: { preparePluginNativeCode: async ( pluginData: IPluginData, - projData: IProjectData + projData: IProjectData, ) => { testData.isPreparePluginNativeCodeCalled = true; }, @@ -723,7 +723,7 @@ describe("Plugins service", () => { unitTestsInjector.register("filesHashService", { hasChangesInShasums: ( oldPluginNativeHashes: IStringDictionary, - currentPluginNativeHashes: IStringDictionary + currentPluginNativeHashes: IStringDictionary, ) => !!opts.hasChangesInShasums, generateHashes: async (files: string[]): Promise => testData.isPreparePluginNativeCodeCalled && @@ -761,7 +761,7 @@ describe("Plugins service", () => { unitTestsInjector.register("mobileHelper", MobileHelper); unitTestsInjector.register( "devicePlatformsConstants", - DevicePlatformsConstants + DevicePlatformsConstants, ); unitTestsInjector.register("nodeModulesDependenciesBuilder", {}); unitTestsInjector.register("tempService", stubs.TempServiceStub); @@ -854,7 +854,7 @@ describe("Plugins service", () => { unitTestsInjector.register("mobileHelper", MobileHelper); unitTestsInjector.register( "devicePlatformsConstants", - DevicePlatformsConstants + DevicePlatformsConstants, ); unitTestsInjector.register("nodeModulesDependenciesBuilder", {}); unitTestsInjector.register("tempService", stubs.TempServiceStub); @@ -881,7 +881,7 @@ describe("Plugins service", () => { unitTestsInjector.resolve(PluginsService); const pluginData = (pluginsService).convertToPluginData( dataFromPluginPackageJson, - "my project dir" + "my project dir", ); // Remove the comparison of a function delete pluginData["pluginPlatformsFolderPath"]; @@ -891,6 +891,7 @@ describe("Plugins service", () => { fullPath: pluginDir, isPlugin: true, platformsData: { android: "6.0.0", ios: "6.0.0" }, + nativescript: { platforms: { android: "6.0.0", ios: "6.0.0" } }, pluginVariables: undefined, }); }); @@ -901,35 +902,35 @@ describe("Plugins service", () => { unitTestsInjector.resolve(PluginsService); const pluginData = (pluginsService).convertToPluginData( dataFromPluginPackageJson, - "my project dir" + "my project dir", ); const expectediOSPath = path.join(pluginDir, "platforms", "ios"); const expectedAndroidPath = path.join(pluginDir, "platforms", "android"); assert.equal( pluginData.pluginPlatformsFolderPath("iOS"), - expectediOSPath + expectediOSPath, ); assert.equal( pluginData.pluginPlatformsFolderPath("ios"), - expectediOSPath + expectediOSPath, ); assert.equal( pluginData.pluginPlatformsFolderPath("IOS"), - expectediOSPath + expectediOSPath, ); assert.equal( pluginData.pluginPlatformsFolderPath("Android"), - expectedAndroidPath + expectedAndroidPath, ); assert.equal( pluginData.pluginPlatformsFolderPath("android"), - expectedAndroidPath + expectedAndroidPath, ); assert.equal( pluginData.pluginPlatformsFolderPath("ANDROID"), - expectedAndroidPath + expectedAndroidPath, ); }); }); @@ -1000,6 +1001,12 @@ describe("Plugins service", () => { android: "5.0.0", ios: "5.0.0", }, + nativescript: { + platforms: { + android: "5.0.0", + ios: "5.0.0", + }, + }, version: "6.3.2", }, { @@ -1011,6 +1018,12 @@ describe("Plugins service", () => { android: "6.2.0", ios: "6.2.0", }, + nativescript: { + platforms: { + android: "6.2.0", + ios: "6.2.0", + }, + }, version: "2.2.1", }, ], @@ -1072,6 +1085,12 @@ describe("Plugins service", () => { android: "6.0.0", ios: "6.0.0", }, + nativescript: { + platforms: { + android: "6.0.0", + ios: "6.0.0", + }, + }, version: "8.0.1", }, { @@ -1083,6 +1102,12 @@ describe("Plugins service", () => { android: "6.0.0", ios: "6.0.0", }, + nativescript: { + platforms: { + android: "6.0.0", + ios: "6.0.0", + }, + }, version: "4.0.0", }, ], @@ -1142,7 +1167,7 @@ describe("Plugins service", () => { This framework comes from nativescript-ui-core plugin, which is installed multiple times in node_modules:\n` + "* Path: /Users/username/projectDir/node_modules/nativescript-ui-core, version: 3.0.0\n" + "* Path: /Users/username/projectDir/node_modules/nativescript-ui-listview/node_modules/nativescript-ui-core, version: 4.0.0\n\n" + - `Probably you need to update your dependencies, remove node_modules and try again.` + `Probably you need to update your dependencies, remove node_modules and try again.`, ), }, { @@ -1182,13 +1207,13 @@ This framework comes from nativescript-ui-core plugin, which is installed multip `Detected the framework a.framework is installed from multiple plugins at locations:\n` + "/Users/username/projectDir/node_modules/nativescript-ui-core-forked/platforms/ios/a.framework\n".replace( /\//g, - path.sep + path.sep, ) + "/Users/username/projectDir/node_modules/nativescript-ui-core/platforms/ios/a.framework\n\n".replace( /\//g, - path.sep + path.sep, ) + - `Probably you need to update your dependencies, remove node_modules and try again.` + `Probably you need to update your dependencies, remove node_modules and try again.`, ), }, ]; @@ -1205,15 +1230,15 @@ This framework comes from nativescript-ui-core plugin, which is installed multip pluginsService.getAllProductionPlugins( { projectDir: "projectDir" }, "ios", - testCase.inputDependencies + testCase.inputDependencies, ), - testCase.expectedOutput.message + testCase.expectedOutput.message, ); } else { const plugins = pluginsService.getAllProductionPlugins( { projectDir: "projectDir" }, "ios", - testCase.inputDependencies + testCase.inputDependencies, ); if (testCase.expectedWarning) { @@ -1273,7 +1298,7 @@ This framework comes from nativescript-ui-core plugin, which is installed multip pluginsService.getAllProductionPlugins( { projectDir: "projectDir" }, "ios", - inputDependencies + inputDependencies, ); }); @@ -1284,20 +1309,20 @@ This framework comes from nativescript-ui-core plugin, which is installed multip assert.equal( logger.warnOutput, util.format(expectedWarnMessage, "6.3.0"), - "The warn message must be shown only once - the result of the private method must be cached as input dependencies have not changed" + "The warn message must be shown only once - the result of the private method must be cached as input dependencies have not changed", ); inputDependencies[0].version = "1.0.0"; inputDependencies[1].version = "1.0.0"; pluginsService.getAllProductionPlugins( { projectDir: "projectDir" }, "ios", - inputDependencies + inputDependencies, ); assert.equal( logger.warnOutput, util.format(expectedWarnMessage, "6.3.0") + util.format(expectedWarnMessage, "1.0.0"), - "When something in input dependencies change, the cached value shouldn't be taken into account" + "When something in input dependencies change, the cached value shouldn't be taken into account", ); }); }); diff --git a/test/project-changes-service.ts b/test/project-changes-service.ts index 97784fdd31..0085c763d4 100644 --- a/test/project-changes-service.ts +++ b/test/project-changes-service.ts @@ -1,6 +1,7 @@ -import * as path from "path"; import { BaseServiceTest } from "./base-service-test"; -import * as temp from "temp"; +import { mkdtempSync } from "fs"; +import { tmpdir } from "os"; +import * as path from "path"; import * as _ from "lodash"; import { assert } from "chai"; import { PlatformsDataService } from "../lib/services/platforms-data-service"; @@ -17,7 +18,6 @@ import { } from "../lib/definitions/project-changes"; // start tracking temporary folders/files -temp.track(); class ProjectChangesServiceTest extends BaseServiceTest { public projectDir: string; @@ -27,7 +27,7 @@ class ProjectChangesServiceTest extends BaseServiceTest { } initInjector(): void { - this.projectDir = temp.mkdirSync("projectDir"); + this.projectDir = mkdtempSync(path.join(tmpdir(), "projectDir-")); this.injector.register("projectData", { projectDir: this.projectDir, }); @@ -72,7 +72,7 @@ class ProjectChangesServiceTest extends BaseServiceTest { projectRoot: path.join( this.projectDir, "platforms", - platform.toLowerCase() + platform.toLowerCase(), ), platformProjectService: { checkForChanges: async (changesInfo: IProjectChangesInfo) => { @@ -90,11 +90,11 @@ describe("Project Changes Service Tests", () => { const platformsDir = path.join( serviceTest.projectDir, - Constants.PLATFORMS_DIR_NAME + Constants.PLATFORMS_DIR_NAME, ); serviceTest.getNativeProjectDataService.getPlatformData = ( - platform: string + platform: string, ) => { if (platform.toLowerCase() === "ios") { return { @@ -127,14 +127,14 @@ describe("Project Changes Service Tests", () => { for (const platform of ["ios", "android"]) { const actualPrepareInfoPath = serviceTest.projectChangesService.getPrepareInfoFilePath( - serviceTest.getPlatformData(platform) + serviceTest.getPlatformData(platform), ); const expectedPrepareInfoPath = path.join( serviceTest.projectDir, Constants.PLATFORMS_DIR_NAME, platform, - ".nsprepareinfo" + ".nsprepareinfo", ); assert.equal(actualPrepareInfoPath, expectedPrepareInfoPath); } @@ -145,7 +145,7 @@ describe("Project Changes Service Tests", () => { it("Returns empty if file path doesn't exists", () => { for (const platform of ["ios", "android"]) { const projectInfo = serviceTest.projectChangesService.getPrepareInfo( - serviceTest.getPlatformData(platform) + serviceTest.getPlatformData(platform), ); assert.isNull(projectInfo); @@ -160,7 +160,7 @@ describe("Project Changes Service Tests", () => { serviceTest.projectDir, Constants.PLATFORMS_DIR_NAME, platform, - ".nsprepareinfo" + ".nsprepareinfo", ); const expectedPrepareInfo: IPrepareInfo = { time: new Date().toString(), @@ -179,7 +179,7 @@ describe("Project Changes Service Tests", () => { // act const actualPrepareInfo = serviceTest.projectChangesService.getPrepareInfo( - serviceTest.getPlatformData(platform) + serviceTest.getPlatformData(platform), ); // assert @@ -197,11 +197,11 @@ describe("Project Changes Service Tests", () => { { provision: undefined, teamId: undefined, - } + }, ); assert.isTrue( !!iOSChanges.signingChanged, - "iOS signingChanged expected to be true" + "iOS signingChanged expected to be true", ); }); }); @@ -215,12 +215,12 @@ describe("Project Changes Service Tests", () => { { nativePlatformStatus: Constants.NativePlatformStatus.requiresPrepare, - } + }, ); const actualPrepareInfo = serviceTest.projectChangesService.getPrepareInfo( - serviceTest.getPlatformData(platform) + serviceTest.getPlatformData(platform), ); assert.deepStrictEqual(actualPrepareInfo, { @@ -234,15 +234,15 @@ describe("Project Changes Service Tests", () => { await serviceTest.projectChangesService.checkForChanges( serviceTest.getPlatformData(platform), serviceTest.projectData, - {} + {}, ); await serviceTest.projectChangesService.savePrepareInfo( serviceTest.getPlatformData(platform), serviceTest.projectData, - null + null, ); const prepareInfo = serviceTest.projectChangesService.getPrepareInfo( - serviceTest.getPlatformData(platform) + serviceTest.getPlatformData(platform), ); await serviceTest.projectChangesService.setNativePlatformStatus( @@ -251,12 +251,12 @@ describe("Project Changes Service Tests", () => { { nativePlatformStatus: Constants.NativePlatformStatus.alreadyPrepared, - } + }, ); const actualPrepareInfo = serviceTest.projectChangesService.getPrepareInfo( - serviceTest.getPlatformData(platform) + serviceTest.getPlatformData(platform), ); prepareInfo.nativePlatformStatus = Constants.NativePlatformStatus.alreadyPrepared; @@ -275,24 +275,24 @@ describe("Project Changes Service Tests", () => { await serviceTest.projectChangesService.checkForChanges( serviceTest.getPlatformData(platform), serviceTest.projectData, - {} + {}, ); await serviceTest.projectChangesService.setNativePlatformStatus( serviceTest.getPlatformData(platform), serviceTest.projectData, - { nativePlatformStatus: nativePlatformStatus } + { nativePlatformStatus: nativePlatformStatus }, ); const actualPrepareInfo = serviceTest.projectChangesService.getPrepareInfo( - serviceTest.getPlatformData(platform) + serviceTest.getPlatformData(platform), ); assert.deepStrictEqual(actualPrepareInfo, { nativePlatformStatus: nativePlatformStatus, }); } }); - } + }, ); }); }); diff --git a/test/project-data.ts b/test/project-data.ts index 7ce33a1320..5b8c747bd1 100644 --- a/test/project-data.ts +++ b/test/project-data.ts @@ -56,14 +56,16 @@ describe("projectData", () => { configData?: { shared?: boolean; webpackConfigPath?: string; + bundlerConfigPath?: string; projectName?: string; + bundler?: string; }; }): IProjectData => { const testInjector = createTestInjector(); const fs = testInjector.resolve("fs"); testInjector.register( "projectConfigService", - stubs.ProjectConfigServiceStub.initWithConfig(opts?.configData) + stubs.ProjectConfigServiceStub.initWithConfig(opts?.configData), ); fs.exists = (filePath: string) => { @@ -98,7 +100,7 @@ describe("projectData", () => { const assertProjectType = ( dependencies: any, devDependencies: any, - expectedProjecType: string + expectedProjecType: string, ) => { const projectData = prepareTest({ packageJsonData: { @@ -125,7 +127,7 @@ describe("projectData", () => { assertProjectType( { "nativescript-vue": "*" }, { typescript: "*" }, - "Vue.js" + "Vue.js", ); }); @@ -141,7 +143,7 @@ describe("projectData", () => { assertProjectType( null, { "nativescript-dev-typescript": "*" }, - "Pure TypeScript" + "Pure TypeScript", ); }); @@ -195,13 +197,13 @@ describe("projectData", () => { const projectData = prepareTest(); assert.equal( projectData.webpackConfigPath, - path.join(projectDir, "webpack.config.js") + path.join(projectDir, "webpack.config.js"), ); }); it("returns correct path when full path is set in nsconfig.json", () => { const pathToConfig = path.resolve( - path.join("/testDir", "innerDir", "mywebpack.config.js") + path.join("/testDir", "innerDir", "mywebpack.config.js"), ); const projectData = prepareTest({ configData: { webpackConfigPath: pathToConfig }, @@ -211,7 +213,7 @@ describe("projectData", () => { it("returns correct path when relative path is set in nsconfig.json", () => { const pathToConfig = path.resolve( - path.join("projectDir", "innerDir", "mywebpack.config.js") + path.join("projectDir", "innerDir", "mywebpack.config.js"), ); const projectData = prepareTest({ configData: { @@ -221,4 +223,81 @@ describe("projectData", () => { assert.equal(projectData.webpackConfigPath, pathToConfig); }); }); + + describe("bundlerConfigPath", () => { + it("default path to webpack.config.js is set when nsconfig.json does not set value", () => { + const projectData = prepareTest(); + assert.equal( + projectData.bundlerConfigPath, + path.join(projectDir, "webpack.config.js"), + ); + }); + + it("should use webpackConfigPath property when bundlerConfigPath is not defined", () => { + const pathToConfig = path.resolve( + path.join("/testDir", "innerDir", "mywebpack.config.js"), + ); + const projectData = prepareTest({ + configData: { webpackConfigPath: pathToConfig }, + }); + assert.equal(projectData.bundlerConfigPath, pathToConfig); + }); + + it("returns correct path when full path is set in nsconfig.json", () => { + const pathToConfig = path.resolve( + path.join("/testDir", "innerDir", "mywebpack.config.js"), + ); + const projectData = prepareTest({ + configData: { bundlerConfigPath: pathToConfig }, + }); + assert.equal(projectData.bundlerConfigPath, pathToConfig); + }); + + it("returns correct path when relative path is set in nsconfig.json", () => { + const pathToConfig = path.resolve( + path.join("projectDir", "innerDir", "mywebpack.config.js"), + ); + const projectData = prepareTest({ + configData: { + bundlerConfigPath: path.join("./innerDir", "mywebpack.config.js"), + }, + }); + assert.equal(projectData.bundlerConfigPath, pathToConfig); + }); + + it("should use bundlerConfigPath instead of webpackConfigPath if both are defined.", () => { + const pathToConfig = path.resolve( + path.join("projectDir", "innerDir", "myrspack.config.js"), + ); + const projectData = prepareTest({ + configData: { + webpackConfigPath: path.join("./innerDir", "mywebpack.config.js"), + bundlerConfigPath: path.join("./innerDir", "myrspack.config.js"), + }, + }); + assert.equal(projectData.bundlerConfigPath, pathToConfig); + }); + }); + + describe("bundler", () => { + it("sets bundler to 'webpack' by default when nsconfig.json does not specify a bundler", () => { + const projectData = prepareTest(); + assert.equal(projectData.bundler, "webpack"); + }); + + it("sets bundler to 'webpack' when explicitly defined in nsconfig.json", () => { + const projectData = prepareTest({ configData: { bundler: "webpack" } }); + assert.equal(projectData.bundler, "webpack"); + }); + + it("sets bundler to 'rspack' when explicitly defined in nsconfig.json", () => { + const projectData = prepareTest({ configData: { bundler: "rspack" } }); + assert.equal(projectData.bundler, "rspack"); + }); + + it("sets bundler to 'vite' when explicitly defined in nsconfig.json", () => { + const projectData = prepareTest({ configData: { bundler: "vite" } }); + assert.equal(projectData.bundler, "vite"); + }); + }); }); diff --git a/test/services/android-device-debug-service.ts b/test/services/android-device-debug-service.ts index 7f8698d8a4..1d336df4e4 100644 --- a/test/services/android-device-debug-service.ts +++ b/test/services/android-device-debug-service.ts @@ -72,7 +72,7 @@ describe("androidDeviceDebugService", () => { { scenarioName: "useBundledDevTools and useHttpUrl are not passed", debugOptions: {}, - expectedChromeUrl: `devtools://devtools/bundled/inspector.html?ws=localhost:${expectedPort}`, + expectedChromeUrl: `devtools://devtools/bundled/inspector.html?ws=127.0.0.1:${expectedPort}`, }, // When useBundledDevTools is true @@ -81,7 +81,7 @@ describe("androidDeviceDebugService", () => { debugOptions: { useBundledDevTools: true, }, - expectedChromeUrl: `devtools://devtools/bundled/inspector.html?ws=localhost:${expectedPort}`, + expectedChromeUrl: `devtools://devtools/bundled/inspector.html?ws=127.0.0.1:${expectedPort}`, }, { scenarioName: "useBundledDevTools is true and useHttpUrl is false", @@ -89,7 +89,7 @@ describe("androidDeviceDebugService", () => { useBundledDevTools: true, useHttpUrl: false, }, - expectedChromeUrl: `devtools://devtools/bundled/inspector.html?ws=localhost:${expectedPort}`, + expectedChromeUrl: `devtools://devtools/bundled/inspector.html?ws=127.0.0.1:${expectedPort}`, }, { scenarioName: "useBundledDevTools is true and useHttpUrl is true", @@ -97,7 +97,7 @@ describe("androidDeviceDebugService", () => { useBundledDevTools: true, useHttpUrl: true, }, - expectedChromeUrl: `https://chrome-devtools-frontend.appspot.com/serve_file/@${expectedDevToolsCommitSha}/inspector.html?ws=localhost:${expectedPort}`, + expectedChromeUrl: `https://chrome-devtools-frontend.appspot.com/serve_file/@${expectedDevToolsCommitSha}/inspector.html?ws=127.0.0.1:${expectedPort}`, }, // When useBundledDevTools is false @@ -107,7 +107,7 @@ describe("androidDeviceDebugService", () => { debugOptions: { useBundledDevTools: false, }, - expectedChromeUrl: `devtools://devtools/remote/serve_file/@${expectedDevToolsCommitSha}/inspector.html?ws=localhost:${expectedPort}`, + expectedChromeUrl: `devtools://devtools/remote/serve_file/@${expectedDevToolsCommitSha}/inspector.html?ws=127.0.0.1:${expectedPort}`, }, { scenarioName: "useBundledDevTools is false and useHttpUrl is false", @@ -115,7 +115,7 @@ describe("androidDeviceDebugService", () => { useBundledDevTools: false, useHttpUrl: false, }, - expectedChromeUrl: `devtools://devtools/remote/serve_file/@${expectedDevToolsCommitSha}/inspector.html?ws=localhost:${expectedPort}`, + expectedChromeUrl: `devtools://devtools/remote/serve_file/@${expectedDevToolsCommitSha}/inspector.html?ws=127.0.0.1:${expectedPort}`, }, { scenarioName: "useBundledDevTools is false and useHttpUrl is true", @@ -123,7 +123,7 @@ describe("androidDeviceDebugService", () => { useBundledDevTools: false, useHttpUrl: true, }, - expectedChromeUrl: `https://chrome-devtools-frontend.appspot.com/serve_file/@${expectedDevToolsCommitSha}/inspector.html?ws=localhost:${expectedPort}`, + expectedChromeUrl: `https://chrome-devtools-frontend.appspot.com/serve_file/@${expectedDevToolsCommitSha}/inspector.html?ws=127.0.0.1:${expectedPort}`, }, // When useBundledDevTools is not passed @@ -133,14 +133,14 @@ describe("androidDeviceDebugService", () => { debugOptions: { useHttpUrl: false, }, - expectedChromeUrl: `devtools://devtools/bundled/inspector.html?ws=localhost:${expectedPort}`, + expectedChromeUrl: `devtools://devtools/bundled/inspector.html?ws=127.0.0.1:${expectedPort}`, }, { scenarioName: "useBundledDevTools is not passed and useHttpUrl is true", debugOptions: { useHttpUrl: true, }, - expectedChromeUrl: `https://chrome-devtools-frontend.appspot.com/serve_file/@${expectedDevToolsCommitSha}/inspector.html?ws=localhost:${expectedPort}`, + expectedChromeUrl: `https://chrome-devtools-frontend.appspot.com/serve_file/@${expectedDevToolsCommitSha}/inspector.html?ws=127.0.0.1:${expectedPort}`, }, // devToolsCommit tests @@ -150,13 +150,13 @@ describe("androidDeviceDebugService", () => { debugOptions: { useBundledDevTools: false, }, - expectedChromeUrl: `devtools://devtools/remote/serve_file/@${expectedDevToolsCommitSha}/inspector.html?ws=localhost:${expectedPort}`, + expectedChromeUrl: `devtools://devtools/remote/serve_file/@${expectedDevToolsCommitSha}/inspector.html?ws=127.0.0.1:${expectedPort}`, }, { scenarioName: "devToolsCommit is disregarded when useBundledDevTools is not passed", debugOptions: {}, - expectedChromeUrl: `devtools://devtools/bundled/inspector.html?ws=localhost:${expectedPort}`, + expectedChromeUrl: `devtools://devtools/bundled/inspector.html?ws=127.0.0.1:${expectedPort}`, }, { scenarioName: @@ -165,7 +165,7 @@ describe("androidDeviceDebugService", () => { useBundledDevTools: false, devToolsCommit: customDevToolsCommit, }, - expectedChromeUrl: `devtools://devtools/remote/serve_file/@${customDevToolsCommit}/inspector.html?ws=localhost:${expectedPort}`, + expectedChromeUrl: `devtools://devtools/remote/serve_file/@${customDevToolsCommit}/inspector.html?ws=127.0.0.1:${expectedPort}`, }, { scenarioName: @@ -174,7 +174,7 @@ describe("androidDeviceDebugService", () => { useHttpUrl: true, devToolsCommit: customDevToolsCommit, }, - expectedChromeUrl: `https://chrome-devtools-frontend.appspot.com/serve_file/@${customDevToolsCommit}/inspector.html?ws=localhost:${expectedPort}`, + expectedChromeUrl: `https://chrome-devtools-frontend.appspot.com/serve_file/@${customDevToolsCommit}/inspector.html?ws=127.0.0.1:${expectedPort}`, }, ]; diff --git a/test/services/android-plugin-build-service.ts b/test/services/android-plugin-build-service.ts index 8c67eebf3d..c2107cf4c1 100644 --- a/test/services/android-plugin-build-service.ts +++ b/test/services/android-plugin-build-service.ts @@ -9,7 +9,8 @@ import { getShortPluginName } from "../../lib/common/helpers"; import * as FsLib from "../../lib/common/file-system"; import * as path from "path"; import * as stubs from "../stubs"; -import * as temp from "temp"; +import { mkdtempSync } from "fs"; +import { tmpdir } from "os"; import { IFileSystem, ISpawnResult, @@ -19,8 +20,6 @@ import { IPluginBuildOptions } from "../../lib/definitions/android-plugin-migrat import { IInjector } from "../../lib/common/definitions/yok"; import { IFilesHashService } from "../../lib/definitions/files-hash-service"; -temp.track(); - describe("androidPluginBuildService", () => { const pluginName = "my-plugin"; const shortPluginName = getShortPluginName(pluginName); @@ -47,8 +46,12 @@ describe("androidPluginBuildService", () => { }): IPluginBuildOptions { options = options || {}; spawnFromEventCalled = false; - tempFolder = temp.mkdirSync("androidPluginBuildService-temp"); - pluginFolder = temp.mkdirSync("androidPluginBuildService-plugin"); + tempFolder = mkdtempSync( + path.join(tmpdir(), "androidPluginBuildService-temp-"), + ); + pluginFolder = mkdtempSync( + path.join(tmpdir(), "androidPluginBuildService-plugin-"), + ); createTestInjector(options); setupPluginFolders(options); @@ -80,7 +83,7 @@ describe("androidPluginBuildService", () => { "build", "outputs", "aar", - finalAarName + finalAarName, ); fs.writeFile(aar, ""); spawnFromEventCalled = command.indexOf("gradlew") !== -1; @@ -91,15 +94,15 @@ describe("androidPluginBuildService", () => { testInjector.register("projectData", stubs.ProjectDataStub); testInjector.register("filesHashService", { generateHashes: async ( - files: string[] + files: string[], ): Promise => ({}), getChanges: async ( files: string[], - oldHashes: IStringDictionary + oldHashes: IStringDictionary, ): Promise => ({}), hasChangesInShasums: ( oldHashes: IStringDictionary, - newHashes: IStringDictionary + newHashes: IStringDictionary, ): boolean => !!options.hasChangesInShasums, }); @@ -109,7 +112,7 @@ describe("androidPluginBuildService", () => { fs = testInjector.resolve("fs"); androidBuildPluginService = testInjector.resolve( - AndroidPluginBuildService + AndroidPluginBuildService, ); // initialize dummy projectData @@ -219,7 +222,7 @@ dependencies { if (options.addManifest) { fs.writeFile( path.join(pluginFolder, "AndroidManifest.xml"), - validAndroidManifestContent + validAndroidManifestContent, ); } @@ -228,7 +231,7 @@ dependencies { fs.createDirectory(valuesFolder); fs.writeFile( path.join(valuesFolder, "strings.xml"), - validStringsXmlContent + validStringsXmlContent, ); } @@ -241,7 +244,7 @@ dependencies { if (options.addLegacyIncludeGradle || options.addIncludeGradle) { fs.writeFile( path.join(pluginFolder, INCLUDE_GRADLE_NAME), - validIncludeGradleContent + validIncludeGradleContent, ); } @@ -329,7 +332,7 @@ dependencies { await androidBuildPluginService.buildAar(config); const actualAndroidVersion = getGradleAndroidPluginVersion( - expectedAndroidVersion + expectedAndroidVersion, ); const actualGradleVersion = getGradleVersion(); @@ -353,7 +356,7 @@ dependencies { await androidBuildPluginService.buildAar(config); const actualAndroidVersion = getGradleAndroidPluginVersion( - expectedAndroidVersion + expectedAndroidVersion, ); const actualGradleVersion = getGradleVersion(); @@ -377,7 +380,7 @@ dependencies { await androidBuildPluginService.buildAar(config); const actualAndroidVersion = getGradleAndroidPluginVersion( - expectedAndroidVersion + expectedAndroidVersion, ); const actualGradleVersion = getGradleVersion(); @@ -399,14 +402,14 @@ dependencies { await androidBuildPluginService.buildAar(config); const actualAndroidVersion = getGradleAndroidPluginVersion( - AndroidBuildDefaults.GradleAndroidPluginVersion + AndroidBuildDefaults.GradleAndroidPluginVersion, ); const actualGradleVersion = getGradleVersion(); assert.equal(actualGradleVersion, AndroidBuildDefaults.GradleVersion); assert.equal( actualAndroidVersion, - AndroidBuildDefaults.GradleAndroidPluginVersion + AndroidBuildDefaults.GradleAndroidPluginVersion, ); assert.isTrue(spawnFromEventCalled); }); @@ -418,11 +421,10 @@ dependencies { addLegacyIncludeGradle: true, }); - const isMigrated = await androidBuildPluginService.migrateIncludeGradle( - config - ); + const isMigrated = + await androidBuildPluginService.migrateIncludeGradle(config); const includeGradleContent = fs.readText( - path.join(pluginFolder, INCLUDE_GRADLE_NAME).toString() + path.join(pluginFolder, INCLUDE_GRADLE_NAME).toString(), ); const areProductFlavorsRemoved = includeGradleContent.indexOf("productFlavors") === -1; @@ -436,9 +438,8 @@ dependencies { addIncludeGradle: true, }); - const isMigrated = await androidBuildPluginService.migrateIncludeGradle( - config - ); + const isMigrated = + await androidBuildPluginService.migrateIncludeGradle(config); assert.isFalse(isMigrated); }); @@ -446,7 +447,7 @@ dependencies { function getGradleAndroidPluginVersion(expected?: string) { const gradleWrappersContent = fs.readText( - path.join(tempFolder, shortPluginName, "build.gradle") + path.join(tempFolder, shortPluginName, "build.gradle"), ); const androidVersionRegex = /com\.android\.tools\.build\:gradle\:(.*)['"]/g; const androidVersion = androidVersionRegex.exec(gradleWrappersContent)[1]; @@ -466,8 +467,8 @@ dependencies { shortPluginName, "gradle", "wrapper", - "gradle-wrapper.properties" - ) + "gradle-wrapper.properties", + ), ); const gradleVersionRegex = /gradle\-(.*)\-bin\.zip\r?\n/g; const gradleVersion = gradleVersionRegex.exec(buildGradleContent)[1]; diff --git a/test/services/android/gradle-build-args-service.ts b/test/services/android/gradle-build-args-service.ts index a0e2ff5cd6..3f2a25f0af 100644 --- a/test/services/android/gradle-build-args-service.ts +++ b/test/services/android/gradle-build-args-service.ts @@ -2,12 +2,12 @@ import { Yok } from "../../../lib/common/yok"; import { GradleBuildArgsService } from "../../../lib/services/android/gradle-build-args-service"; import * as stubs from "../../stubs"; import { assert } from "chai"; -import * as temp from "temp"; +import { mkdtempSync } from "fs"; +import { tmpdir } from "os"; import { IGradleBuildArgsService } from "../../../lib/definitions/gradle"; import { IAndroidBuildData } from "../../../lib/definitions/build"; import { IInjector } from "../../../lib/common/definitions/yok"; import * as path from "path"; -temp.track(); function createTestInjector(): IInjector { const injector = new Yok(); @@ -37,8 +37,8 @@ async function executeTests( testCases: any[], testFunction: ( gradleBuildArgsService: IGradleBuildArgsService, - buildData: IAndroidBuildData - ) => Promise + buildData: IAndroidBuildData, + ) => Promise, ) { for (const testCase of testCases) { it(testCase.name, async () => { @@ -51,21 +51,22 @@ async function executeTests( const gradleBuildArgsService = injector.resolve("gradleBuildArgsService"); const args = await testFunction( gradleBuildArgsService, - testCase.buildConfig + testCase.buildConfig, ); assert.deepStrictEqual(args, testCase.expectedResult); }); } } -const ksPath = temp.path({ prefix: "ksPath" }); +const ksDir = mkdtempSync(path.join(tmpdir(), "ksPath-")); +const ksPath = path.join(ksDir, "keystore.jks"); const expectedInfoLoggingArgs = ["--quiet"]; const expectedTraceLoggingArgs = ["--stacktrace", "--debug"]; const expectedDebugBuildArgs = [ "-PappPath=/path/to/projectDir/app".replace(/\//g, path.sep), "-PappResourcesPath=/path/to/projectDir/app/App_Resources".replace( /\//g, - path.sep + path.sep, ), ]; const expectedReleaseBuildArgs = expectedDebugBuildArgs.concat([ @@ -157,8 +158,8 @@ describe("GradleBuildArgsService", () => { testCases, ( gradleBuildArgsService: IGradleBuildArgsService, - buildData: IAndroidBuildData - ) => gradleBuildArgsService.getBuildTaskArgs(buildData) + buildData: IAndroidBuildData, + ) => gradleBuildArgsService.getBuildTaskArgs(buildData), ); }); @@ -234,8 +235,8 @@ describe("GradleBuildArgsService", () => { testCases, ( gradleBuildArgsService: IGradleBuildArgsService, - buildData: IAndroidBuildData - ) => Promise.resolve(gradleBuildArgsService.getCleanTaskArgs(buildData)) + buildData: IAndroidBuildData, + ) => Promise.resolve(gradleBuildArgsService.getCleanTaskArgs(buildData)), ); }); }); diff --git a/test/services/webpack/webpack-compiler-service.ts b/test/services/bundler/bundler-compiler-service.ts similarity index 62% rename from test/services/webpack/webpack-compiler-service.ts rename to test/services/bundler/bundler-compiler-service.ts index d15cccc430..49d69a55f4 100644 --- a/test/services/webpack/webpack-compiler-service.ts +++ b/test/services/bundler/bundler-compiler-service.ts @@ -1,5 +1,5 @@ import { Yok } from "../../../lib/common/yok"; -import { WebpackCompilerService } from "../../../lib/services/webpack/webpack-compiler-service"; +import { BundlerCompilerService } from "../../../lib/services/bundler/bundler-compiler-service"; import { assert } from "chai"; import { ErrorsStub } from "../../stubs"; import { IInjector } from "../../../lib/common/definitions/yok"; @@ -23,7 +23,7 @@ function createTestInjector(): IInjector { testInjector.register("packageManager", { getPackageManagerName: async () => "npm", }); - testInjector.register("webpackCompilerService", WebpackCompilerService); + testInjector.register("bundlerCompilerService", BundlerCompilerService); testInjector.register("childProcess", {}); testInjector.register("hooksService", {}); testInjector.register("hostInfo", {}); @@ -33,6 +33,9 @@ function createTestInjector(): IInjector { testInjector.register("packageInstallationManager", {}); testInjector.register("mobileHelper", {}); testInjector.register("cleanupService", {}); + testInjector.register("projectConfigService", { + getValue: (key: string, defaultValue?: string) => defaultValue, + }); testInjector.register("fs", { exists: (filePath: string) => true, }); @@ -40,23 +43,23 @@ function createTestInjector(): IInjector { return testInjector; } -describe("WebpackCompilerService", () => { +describe("BundlerCompilerService", () => { let testInjector: IInjector = null; - let webpackCompilerService: WebpackCompilerService = null; + let bundlerCompilerService: BundlerCompilerService = null; beforeEach(() => { testInjector = createTestInjector(); - webpackCompilerService = testInjector.resolve(WebpackCompilerService); + bundlerCompilerService = testInjector.resolve(BundlerCompilerService); }); describe("getUpdatedEmittedFiles", () => { // backwards compatibility with old versions of nativescript-dev-webpack it("should return only hot updates when nextHash is not provided", async () => { - const result = webpackCompilerService.getUpdatedEmittedFiles( + const result = bundlerCompilerService.getUpdatedEmittedFiles( getAllEmittedFiles("hash1"), chunkFiles, null, - iOSPlatformName + iOSPlatformName, ); const expectedEmittedFiles = [ "bundle.hash1.hot-update.js", @@ -65,19 +68,19 @@ describe("WebpackCompilerService", () => { assert.deepStrictEqual(result.emittedFiles, expectedEmittedFiles); }); - // 2 successful webpack compilations + // 2 successful bundler compilations it("should return only hot updates when nextHash is provided", async () => { - webpackCompilerService.getUpdatedEmittedFiles( + bundlerCompilerService.getUpdatedEmittedFiles( getAllEmittedFiles("hash1"), chunkFiles, "hash2", - iOSPlatformName + iOSPlatformName, ); - const result = webpackCompilerService.getUpdatedEmittedFiles( + const result = bundlerCompilerService.getUpdatedEmittedFiles( getAllEmittedFiles("hash2"), chunkFiles, "hash3", - iOSPlatformName + iOSPlatformName, ); assert.deepStrictEqual(result.emittedFiles, [ @@ -85,19 +88,19 @@ describe("WebpackCompilerService", () => { "hash2.hot-update.json", ]); }); - // 1 successful webpack compilation, n compilations with no emitted files - it("should return all files when there is a webpack compilation with no emitted files", () => { - webpackCompilerService.getUpdatedEmittedFiles( + // 1 successful bundler compilation, n compilations with no emitted files + it("should return all files when there is a bundler compilation with no emitted files", () => { + bundlerCompilerService.getUpdatedEmittedFiles( getAllEmittedFiles("hash1"), chunkFiles, "hash2", - iOSPlatformName + iOSPlatformName, ); - const result = webpackCompilerService.getUpdatedEmittedFiles( + const result = bundlerCompilerService.getUpdatedEmittedFiles( getAllEmittedFiles("hash4"), chunkFiles, "hash5", - iOSPlatformName + iOSPlatformName, ); assert.deepStrictEqual(result.emittedFiles, [ @@ -107,25 +110,25 @@ describe("WebpackCompilerService", () => { "hash4.hot-update.json", ]); }); - // 1 successful webpack compilation, n compilations with no emitted files, 1 successful webpack compilation + // 1 successful bundler compilation, n compilations with no emitted files, 1 successful bundler compilation it("should return only hot updates after fixing the compilation error", () => { - webpackCompilerService.getUpdatedEmittedFiles( + bundlerCompilerService.getUpdatedEmittedFiles( getAllEmittedFiles("hash1"), chunkFiles, "hash2", - iOSPlatformName + iOSPlatformName, ); - webpackCompilerService.getUpdatedEmittedFiles( + bundlerCompilerService.getUpdatedEmittedFiles( getAllEmittedFiles("hash5"), chunkFiles, "hash6", - iOSPlatformName + iOSPlatformName, ); - const result = webpackCompilerService.getUpdatedEmittedFiles( + const result = bundlerCompilerService.getUpdatedEmittedFiles( getAllEmittedFiles("hash6"), chunkFiles, "hash7", - iOSPlatformName + iOSPlatformName, ); assert.deepStrictEqual(result.emittedFiles, [ @@ -133,16 +136,16 @@ describe("WebpackCompilerService", () => { "hash6.hot-update.json", ]); }); - // 1 webpack compilation with no emitted files + // 1 bundler compilation with no emitted files it("should return all files when first compilation on livesync change is not successful", () => { - (webpackCompilerService).expectedHashes = { + (bundlerCompilerService).expectedHashes = { ios: "hash1", }; - const result = webpackCompilerService.getUpdatedEmittedFiles( + const result = bundlerCompilerService.getUpdatedEmittedFiles( getAllEmittedFiles("hash1"), chunkFiles, "hash2", - iOSPlatformName + iOSPlatformName, ); assert.deepStrictEqual(result.emittedFiles, [ @@ -151,48 +154,48 @@ describe("WebpackCompilerService", () => { ]); }); it("should return correct hashes when there are more than one platform", () => { - webpackCompilerService.getUpdatedEmittedFiles( + bundlerCompilerService.getUpdatedEmittedFiles( getAllEmittedFiles("hash1"), chunkFiles, "hash2", - iOSPlatformName + iOSPlatformName, ); - webpackCompilerService.getUpdatedEmittedFiles( + bundlerCompilerService.getUpdatedEmittedFiles( getAllEmittedFiles("hash3"), chunkFiles, "hash4", - androidPlatformName + androidPlatformName, ); - webpackCompilerService.getUpdatedEmittedFiles( + bundlerCompilerService.getUpdatedEmittedFiles( getAllEmittedFiles("hash2"), chunkFiles, "hash5", - iOSPlatformName + iOSPlatformName, ); - webpackCompilerService.getUpdatedEmittedFiles( + bundlerCompilerService.getUpdatedEmittedFiles( getAllEmittedFiles("hash4"), chunkFiles, "hash6", - androidPlatformName + androidPlatformName, ); - const iOSResult = webpackCompilerService.getUpdatedEmittedFiles( + const iOSResult = bundlerCompilerService.getUpdatedEmittedFiles( getAllEmittedFiles("hash5"), chunkFiles, "hash7", - iOSPlatformName + iOSPlatformName, ); assert.deepStrictEqual(iOSResult.emittedFiles, [ "bundle.hash5.hot-update.js", "hash5.hot-update.json", ]); - const androidResult = webpackCompilerService.getUpdatedEmittedFiles( + const androidResult = bundlerCompilerService.getUpdatedEmittedFiles( getAllEmittedFiles("hash6"), chunkFiles, "hash8", - androidPlatformName + androidPlatformName, ); assert.deepStrictEqual(androidResult.emittedFiles, [ "bundle.hash6.hot-update.js", @@ -202,33 +205,33 @@ describe("WebpackCompilerService", () => { }); describe("compileWithWatch", () => { - it("fails when the value set for webpackConfigPath is not existant file", async () => { - const webpackConfigPath = "some path.js"; + it("fails when the value set for bundlerConfigPath is not existant file", async () => { + const bundlerConfigPath = "some path.js"; testInjector.resolve("fs").exists = (filePath: string) => - filePath !== webpackConfigPath; + filePath !== bundlerConfigPath; await assert.isRejected( - webpackCompilerService.compileWithWatch( + bundlerCompilerService.compileWithWatch( { platformNameLowerCase: "android" }, - { webpackConfigPath }, - {} + { bundlerConfigPath: bundlerConfigPath }, + {}, ), - `The webpack configuration file ${webpackConfigPath} does not exist. Ensure the file exists, or update the path in ${CONFIG_FILE_NAME_DISPLAY}` + `The bundler configuration file ${bundlerConfigPath} does not exist. Ensure the file exists, or update the path in ${CONFIG_FILE_NAME_DISPLAY}`, ); }); }); describe("compileWithoutWatch", () => { - it("fails when the value set for webpackConfigPath is not existant file", async () => { - const webpackConfigPath = "some path.js"; + it("fails when the value set for bundlerConfigPath is not existant file", async () => { + const bundlerConfigPath = "some path.js"; testInjector.resolve("fs").exists = (filePath: string) => - filePath !== webpackConfigPath; + filePath !== bundlerConfigPath; await assert.isRejected( - webpackCompilerService.compileWithoutWatch( + bundlerCompilerService.compileWithoutWatch( { platformNameLowerCase: "android" }, - { webpackConfigPath }, - {} + { bundlerConfigPath: bundlerConfigPath }, + {}, ), - `The webpack configuration file ${webpackConfigPath} does not exist. Ensure the file exists, or update the path in ${CONFIG_FILE_NAME_DISPLAY}` + `The bundler configuration file ${bundlerConfigPath} does not exist. Ensure the file exists, or update the path in ${CONFIG_FILE_NAME_DISPLAY}`, ); }); }); diff --git a/test/services/extensibility-service.ts b/test/services/extensibility-service.ts index e538d7dd5e..a23e267988 100644 --- a/test/services/extensibility-service.ts +++ b/test/services/extensibility-service.ts @@ -966,7 +966,7 @@ describe("extensibilityService", () => { .replace( /\|/g, " ", - )} is registered in extension ${extensionName}. You can install it by executing 'tns extension install ${extensionName}'`; + )} is registered in extension ${extensionName}. You can install it by executing 'ns extension install ${extensionName}'`; }; const testData: ITestData[] = [ diff --git a/test/services/ios-device-debug-service.ts b/test/services/ios-device-debug-service.ts index 1635123537..ccbfbec5a4 100644 --- a/test/services/ios-device-debug-service.ts +++ b/test/services/ios-device-debug-service.ts @@ -97,7 +97,7 @@ describe("iOSDeviceDebugService", () => { { scenarioName: "useBundledDevTools and useHttpUrl are not passed", debugOptions: {}, - expectedChromeUrl: `devtools://devtools/bundled/inspector.html?ws=localhost:${expectedPort}`, + expectedChromeUrl: `devtools://devtools/bundled/inspector.html?ws=127.0.0.1:${expectedPort}`, }, // When useBundledDevTools is true @@ -106,7 +106,7 @@ describe("iOSDeviceDebugService", () => { debugOptions: { useBundledDevTools: true, }, - expectedChromeUrl: `devtools://devtools/bundled/inspector.html?ws=localhost:${expectedPort}`, + expectedChromeUrl: `devtools://devtools/bundled/inspector.html?ws=127.0.0.1:${expectedPort}`, }, { scenarioName: "useBundledDevTools is true and useHttpUrl is false", @@ -114,7 +114,7 @@ describe("iOSDeviceDebugService", () => { useBundledDevTools: true, useHttpUrl: false, }, - expectedChromeUrl: `devtools://devtools/bundled/inspector.html?ws=localhost:${expectedPort}`, + expectedChromeUrl: `devtools://devtools/bundled/inspector.html?ws=127.0.0.1:${expectedPort}`, }, { scenarioName: "useBundledDevTools is true and useHttpUrl is true", @@ -122,7 +122,7 @@ describe("iOSDeviceDebugService", () => { useBundledDevTools: true, useHttpUrl: true, }, - expectedChromeUrl: `https://chrome-devtools-frontend.appspot.com/serve_file/@${expectedDevToolsCommitSha}/inspector.html?ws=localhost:${expectedPort}`, + expectedChromeUrl: `https://chrome-devtools-frontend.appspot.com/serve_file/@${expectedDevToolsCommitSha}/inspector.html?ws=127.0.0.1:${expectedPort}`, }, // When useBundledDevTools is false @@ -132,7 +132,7 @@ describe("iOSDeviceDebugService", () => { debugOptions: { useBundledDevTools: false, }, - expectedChromeUrl: `devtools://devtools/remote/serve_file/@${expectedDevToolsCommitSha}/inspector.html?ws=localhost:${expectedPort}`, + expectedChromeUrl: `devtools://devtools/remote/serve_file/@${expectedDevToolsCommitSha}/inspector.html?ws=127.0.0.1:${expectedPort}`, }, { scenarioName: "useBundledDevTools is false and useHttpUrl is false", @@ -140,7 +140,7 @@ describe("iOSDeviceDebugService", () => { useBundledDevTools: false, useHttpUrl: false, }, - expectedChromeUrl: `devtools://devtools/remote/serve_file/@${expectedDevToolsCommitSha}/inspector.html?ws=localhost:${expectedPort}`, + expectedChromeUrl: `devtools://devtools/remote/serve_file/@${expectedDevToolsCommitSha}/inspector.html?ws=127.0.0.1:${expectedPort}`, }, { scenarioName: "useBundledDevTools is false and useHttpUrl is true", @@ -148,7 +148,7 @@ describe("iOSDeviceDebugService", () => { useBundledDevTools: false, useHttpUrl: true, }, - expectedChromeUrl: `https://chrome-devtools-frontend.appspot.com/serve_file/@${expectedDevToolsCommitSha}/inspector.html?ws=localhost:${expectedPort}`, + expectedChromeUrl: `https://chrome-devtools-frontend.appspot.com/serve_file/@${expectedDevToolsCommitSha}/inspector.html?ws=127.0.0.1:${expectedPort}`, }, // When useBundledDevTools is not passed @@ -158,14 +158,14 @@ describe("iOSDeviceDebugService", () => { debugOptions: { useHttpUrl: false, }, - expectedChromeUrl: `devtools://devtools/bundled/inspector.html?ws=localhost:${expectedPort}`, + expectedChromeUrl: `devtools://devtools/bundled/inspector.html?ws=127.0.0.1:${expectedPort}`, }, { scenarioName: "useBundledDevTools is not passed and useHttpUrl is true", debugOptions: { useHttpUrl: true, }, - expectedChromeUrl: `https://chrome-devtools-frontend.appspot.com/serve_file/@${expectedDevToolsCommitSha}/inspector.html?ws=localhost:${expectedPort}`, + expectedChromeUrl: `https://chrome-devtools-frontend.appspot.com/serve_file/@${expectedDevToolsCommitSha}/inspector.html?ws=127.0.0.1:${expectedPort}`, }, // devToolsCommit tests @@ -174,7 +174,7 @@ describe("iOSDeviceDebugService", () => { debugOptions: { useBundledDevTools: false, }, - expectedChromeUrl: `devtools://devtools/remote/serve_file/@${expectedDevToolsCommitSha}/inspector.html?ws=localhost:${expectedPort}`, + expectedChromeUrl: `devtools://devtools/remote/serve_file/@${expectedDevToolsCommitSha}/inspector.html?ws=127.0.0.1:${expectedPort}`, }, { scenarioName: @@ -182,7 +182,7 @@ describe("iOSDeviceDebugService", () => { debugOptions: { devToolsCommit: customDevToolsCommit, }, - expectedChromeUrl: `devtools://devtools/bundled/inspector.html?ws=localhost:${expectedPort}`, + expectedChromeUrl: `devtools://devtools/bundled/inspector.html?ws=127.0.0.1:${expectedPort}`, }, { scenarioName: @@ -191,7 +191,7 @@ describe("iOSDeviceDebugService", () => { useBundledDevTools: false, devToolsCommit: customDevToolsCommit, }, - expectedChromeUrl: `devtools://devtools/remote/serve_file/@${customDevToolsCommit}/inspector.html?ws=localhost:${expectedPort}`, + expectedChromeUrl: `devtools://devtools/remote/serve_file/@${customDevToolsCommit}/inspector.html?ws=127.0.0.1:${expectedPort}`, }, { scenarioName: @@ -200,7 +200,7 @@ describe("iOSDeviceDebugService", () => { useHttpUrl: true, devToolsCommit: customDevToolsCommit, }, - expectedChromeUrl: `https://chrome-devtools-frontend.appspot.com/serve_file/@${customDevToolsCommit}/inspector.html?ws=localhost:${expectedPort}`, + expectedChromeUrl: `https://chrome-devtools-frontend.appspot.com/serve_file/@${customDevToolsCommit}/inspector.html?ws=127.0.0.1:${expectedPort}`, }, { scenarioName: @@ -209,7 +209,7 @@ describe("iOSDeviceDebugService", () => { useBundledDevTools: true, devToolsCommit: customDevToolsCommit, }, - expectedChromeUrl: `devtools://devtools/bundled/inspector.html?ws=localhost:${expectedPort}`, + expectedChromeUrl: `devtools://devtools/bundled/inspector.html?ws=127.0.0.1:${expectedPort}`, }, ]; diff --git a/test/services/ios/ios-signing-service.ts b/test/services/ios/ios-signing-service.ts index a3b1f33265..12dfc904a6 100644 --- a/test/services/ios/ios-signing-service.ts +++ b/test/services/ios/ios-signing-service.ts @@ -94,7 +94,7 @@ class XcodeMock implements IXcodeMock { public setManualSigningStyle( projectName: string, - configuration: ManualSigning + configuration: ManualSigning, ) { this.isSetManualSigningStyleCalled = true; this.manualSigningStyles[projectName] = configuration; @@ -204,6 +204,9 @@ function setup(data: SetupData): { injector: IInjector; xcodeMock: any } { injector.register("xcprojService", { getXcodeprojPath: () => "some/path", }); + injector.register("options", { + platformOverride: null, + }); injector.register("iOSSigningService", IOSSigningService); return { injector, xcodeMock }; @@ -258,7 +261,7 @@ describe("IOSSigningService", () => { assert: (xcodeMock: IXcodeMock) => { assert.isTrue(xcodeMock.isSetAutomaticSigningStyleCalled); assert.isTrue( - xcodeMock.isSetAutomaticSigningStyleByTargetProductTypesListCalled + xcodeMock.isSetAutomaticSigningStyleByTargetProductTypesListCalled, ); assert.isTrue(xcodeMock.isSaveCalled); }, @@ -273,7 +276,7 @@ describe("IOSSigningService", () => { assert: (xcodeMock: IXcodeMock) => { assert.isTrue(xcodeMock.isSetAutomaticSigningStyleCalled); assert.isTrue( - xcodeMock.isSetAutomaticSigningStyleByTargetProductTypesListCalled + xcodeMock.isSetAutomaticSigningStyleByTargetProductTypesListCalled, ); assert.isTrue(xcodeMock.isSaveCalled); }, @@ -288,7 +291,7 @@ describe("IOSSigningService", () => { assert: (xcodeMock: IXcodeMock) => { assert.isFalse(xcodeMock.isSetAutomaticSigningStyleCalled); assert.isFalse( - xcodeMock.isSetAutomaticSigningStyleByTargetProductTypesListCalled + xcodeMock.isSetAutomaticSigningStyleByTargetProductTypesListCalled, ); assert.isFalse(xcodeMock.isSetManualSigningStyleCalled); assert.isFalse(xcodeMock.isSaveCalled); @@ -303,7 +306,7 @@ describe("IOSSigningService", () => { }, assert: (xcodeMock: IXcodeMock) => { assert.isTrue( - xcodeMock.isSetManualSigningStyleCalledFor("testExtension") + xcodeMock.isSetManualSigningStyleCalledFor("testExtension"), ); assert.isTrue(xcodeMock.isSaveCalled); }, @@ -318,7 +321,7 @@ describe("IOSSigningService", () => { await iOSSigningService.setupSigningForDevice( projectRoot, projectData, - (testCase).buildConfig || {} + (testCase).buildConfig || {}, ); testCase.assert(xcodeMock); @@ -333,7 +336,7 @@ describe("IOSSigningService", () => { assert: (xcodeMock: IXcodeMock) => { assert.isTrue(xcodeMock.isSetAutomaticSigningStyleCalled); assert.isTrue( - xcodeMock.isSetAutomaticSigningStyleByTargetProductTypesListCalled + xcodeMock.isSetAutomaticSigningStyleByTargetProductTypesListCalled, ); assert.isTrue(xcodeMock.isSaveCalled); assert.isFalse(xcodeMock.isSetManualSigningStyleCalled); @@ -345,7 +348,7 @@ describe("IOSSigningService", () => { assert: (xcodeMock: IXcodeMock) => { assert.isTrue(xcodeMock.isSetAutomaticSigningStyleCalled); assert.isTrue( - xcodeMock.isSetAutomaticSigningStyleByTargetProductTypesListCalled + xcodeMock.isSetAutomaticSigningStyleByTargetProductTypesListCalled, ); assert.isTrue(xcodeMock.isSaveCalled); assert.isFalse(xcodeMock.isSetManualSigningStyleCalled); @@ -357,7 +360,7 @@ describe("IOSSigningService", () => { assert: (xcodeMock: IXcodeMock) => { assert.isFalse(xcodeMock.isSetAutomaticSigningStyleCalled); assert.isFalse( - xcodeMock.isSetAutomaticSigningStyleByTargetProductTypesListCalled + xcodeMock.isSetAutomaticSigningStyleByTargetProductTypesListCalled, ); assert.isFalse(xcodeMock.isSaveCalled); assert.isFalse(xcodeMock.isSetManualSigningStyleCalled); @@ -372,7 +375,7 @@ describe("IOSSigningService", () => { assert: (xcodeMock: IXcodeMock) => { assert.isFalse(xcodeMock.isSetAutomaticSigningStyleCalled); assert.isFalse( - xcodeMock.isSetAutomaticSigningStyleByTargetProductTypesListCalled + xcodeMock.isSetAutomaticSigningStyleByTargetProductTypesListCalled, ); assert.isFalse(xcodeMock.isSaveCalled); assert.isFalse(xcodeMock.isSetManualSigningStyleCalled); @@ -384,7 +387,7 @@ describe("IOSSigningService", () => { assert: (xcodeMock: IXcodeMock) => { assert.isTrue(xcodeMock.isSetAutomaticSigningStyleCalled); assert.isTrue( - xcodeMock.isSetAutomaticSigningStyleByTargetProductTypesListCalled + xcodeMock.isSetAutomaticSigningStyleByTargetProductTypesListCalled, ); assert.isTrue(xcodeMock.isSaveCalled); assert.isFalse(xcodeMock.isSetManualSigningStyleCalled); @@ -398,7 +401,7 @@ describe("IOSSigningService", () => { }, assert: (xcodeMock: IXcodeMock) => { assert.isTrue( - xcodeMock.isSetAutomaticSigningStyleCalledFor("testExtension") + xcodeMock.isSetAutomaticSigningStyleCalledFor("testExtension"), ); assert.isTrue(xcodeMock.isSaveCalled); }, @@ -414,7 +417,7 @@ describe("IOSSigningService", () => { await iOSSigningService.setupSigningFromTeam( projectRoot, projectData, - teamId + teamId, ); testCase.assert(xcodeMock); @@ -429,7 +432,7 @@ describe("IOSSigningService", () => { assert: (xcodeMock: IXcodeMock) => { assert.isTrue(xcodeMock.isSetManualSigningStyleCalled); assert.isTrue( - xcodeMock.isSetManualSigningStyleByTargetProductTypesListCalled + xcodeMock.isSetManualSigningStyleByTargetProductTypesListCalled, ); assert.isTrue(xcodeMock.isSaveCalled); }, @@ -440,7 +443,7 @@ describe("IOSSigningService", () => { assert: (xcodeMock: IXcodeMock) => { assert.isTrue(xcodeMock.isSetManualSigningStyleCalled); assert.isTrue( - xcodeMock.isSetManualSigningStyleByTargetProductTypesListCalled + xcodeMock.isSetManualSigningStyleByTargetProductTypesListCalled, ); assert.isTrue(xcodeMock.isSaveCalled); }, @@ -451,7 +454,7 @@ describe("IOSSigningService", () => { assert: (xcodeMock: IXcodeMock) => { assert.isFalse(xcodeMock.isSetManualSigningStyleCalled); assert.isFalse( - xcodeMock.isSetManualSigningStyleByTargetProductTypesListCalled + xcodeMock.isSetManualSigningStyleByTargetProductTypesListCalled, ); assert.isFalse(xcodeMock.isSaveCalled); }, @@ -467,7 +470,7 @@ describe("IOSSigningService", () => { }, assert: (xcodeMock: IXcodeMock) => { assert.isTrue( - xcodeMock.isSetManualSigningStyleCalledFor("testExtension") + xcodeMock.isSetManualSigningStyleCalledFor("testExtension"), ); assert.isTrue(xcodeMock.isSaveCalled); }, @@ -486,7 +489,7 @@ describe("IOSSigningService", () => { if (provision_ === "") { testCase.arrangeData.provisioningJSON[id] = provision; } - } + }, ); } const { injector, xcodeMock } = setup(testCase.arrangeData); @@ -496,12 +499,12 @@ describe("IOSSigningService", () => { await iOSSigningService.setupSigningFromProvision( projectRoot, projectData, - provision + provision, ); testCase.assert(xcodeMock); }); - } + }, ); }); @@ -515,9 +518,9 @@ describe("IOSSigningService", () => { iOSSigningService.setupSigningFromProvision( projectRoot, projectData, - provision + provision, ), - `Failed to find mobile provision with UUID or Name: ${provision}` + `Failed to find mobile provision with UUID or Name: ${provision}`, ); }); }); diff --git a/test/services/ios/xcodebuild-args-service.ts b/test/services/ios/xcodebuild-args-service.ts index 1dea63bb8b..66fc46f482 100644 --- a/test/services/ios/xcodebuild-args-service.ts +++ b/test/services/ios/xcodebuild-args-service.ts @@ -55,12 +55,12 @@ function getXcodeProjectArgs(data?: { hasProjectWorkspace: boolean }) { "-workspace", path.join(projectRoot, `${projectName}.xcworkspace`), ...extraArgs, - ] + ] : [ "-project", path.join(projectRoot, `${projectName}.xcodeproj`), ...extraArgs, - ]; + ]; } function getBuildLoggingArgs(logLevel: string): string[] { @@ -89,21 +89,22 @@ describe("xcodebuildArgsService", () => { platform, }; const xcodebuildArgsService = injector.resolve( - "xcodebuildArgsService" + "xcodebuildArgsService", ); const actualArgs = await xcodebuildArgsService.getBuildForSimulatorArgs( { projectRoot, normalizedPlatformName }, { projectName, appResourcesDirectoryPath }, - buildConfig + buildConfig, ); const expectedArgs = [ `ONLY_ACTIVE_ARCH=${platform === "visionOS" ? "YES" : "NO"}`, + ...(platform === "visionOS" ? ["EXCLUDED_ARCHS=x86_64"] : []), "CODE_SIGN_IDENTITY=", "-destination", platform === "visionOS" - ? "platform=visionOS Simulator" + ? "generic/platform=visionOS Simulator" : "generic/platform=iOS Simulator", "build", "-configuration", @@ -131,7 +132,7 @@ describe("xcodebuildArgsService", () => { { deviceInfo: { activeArchitecture: "armv7" } }, ], expectedArgs: ["ONLY_ACTIVE_ARCH=NO", "-sdk", "iphoneos"].concat( - getCommonArgs() + getCommonArgs(), ), }, { @@ -177,7 +178,7 @@ describe("xcodebuildArgsService", () => { await xcodebuildArgsService.getBuildForDeviceArgs( platformData, projectData, - buildConfig + buildConfig, ); const expectedArgs = [ diff --git a/test/services/livesync/android-livesync-tool.ts b/test/services/livesync/android-livesync-tool.ts index e81384d317..712cecd59f 100644 --- a/test/services/livesync/android-livesync-tool.ts +++ b/test/services/livesync/android-livesync-tool.ts @@ -9,12 +9,12 @@ import { MobileHelper } from "../../../lib/common/mobile/mobile-helper"; import { FileSystem } from "../../../lib/common/file-system"; import { DevicePlatformsConstants } from "../../../lib/common/mobile/device-platforms-constants"; import * as path from "path"; -import * as temp from "temp"; +import { mkdtempSync } from "fs"; +import { tmpdir } from "os"; import * as crypto from "crypto"; import { IInjector } from "../../../lib/common/definitions/yok"; import { IDictionary } from "../../../lib/common/declarations"; -temp.track(); const protocolVersion = "0.2.0"; class TestSocket extends LiveSyncSocket { @@ -58,7 +58,7 @@ const fileContents = { }; const projectCreated = false; -const testAppPath = temp.mkdirSync("testsyncapp"); +const testAppPath = mkdtempSync(path.join(tmpdir(), "testsyncapp-")); const testAppPlatformPath = path.join( testAppPath, "platforms", diff --git a/test/spm-service.ts b/test/spm-service.ts new file mode 100644 index 0000000000..b0ccfeff19 --- /dev/null +++ b/test/spm-service.ts @@ -0,0 +1,161 @@ +import { assert } from "chai"; + +/** + * Helper function to merge app and plugin SPM packages. + * App packages take precedence over plugin packages with the same name. + */ +function mergeSPMPackages(appPackages: any[], pluginPackages: any[]): any[] { + const spmPackages = [...appPackages]; + const appPackageNames = new Set(spmPackages.map(pkg => pkg.name)); + + for (const pluginPkg of pluginPackages) { + if (!appPackageNames.has(pluginPkg.name)) { + spmPackages.push(pluginPkg); + } + } + + return spmPackages; +} + +describe("SPM Service - Package Override Logic", () => { + describe("merging app and plugin SPM packages", () => { + it("should allow app packages to override plugin packages with the same name", () => { + // This test validates the merge logic without requiring MobileProject + const appPackages = [ + { + name: "FirebaseCore", + repositoryURL: "https://github.com/firebase/firebase-ios-sdk", + version: "10.0.0", + libs: ["FirebaseCore"], + }, + ]; + + const pluginPackages = [ + { + name: "FirebaseCore", + repositoryURL: "https://github.com/firebase/firebase-ios-sdk", + version: "9.0.0", + libs: ["FirebaseCore"], + }, + { + name: "Alamofire", + repositoryURL: "https://github.com/Alamofire/Alamofire", + version: "5.0.0", + libs: ["Alamofire"], + }, + ]; + + const spmPackages = mergeSPMPackages(appPackages, pluginPackages); + + // Verify the result + assert.equal(spmPackages.length, 2, "Should have 2 packages total"); + + const firebasePackage = spmPackages.find((pkg) => pkg.name === "FirebaseCore"); + assert.isDefined(firebasePackage, "Should include FirebaseCore package"); + assert.equal( + firebasePackage.version, + "10.0.0", + "Should use app's FirebaseCore version (10.0.0), not plugin's (9.0.0)", + ); + + const alamofirePackage = spmPackages.find((pkg) => pkg.name === "Alamofire"); + assert.isDefined(alamofirePackage, "Should include Alamofire package from plugin"); + assert.equal(alamofirePackage.version, "5.0.0", "Should use plugin's Alamofire version"); + }); + + it("should include all plugin packages when no app packages exist", () => { + const appPackages: any[] = []; + + const pluginPackages = [ + { + name: "FirebaseCore", + repositoryURL: "https://github.com/firebase/firebase-ios-sdk", + version: "9.0.0", + libs: ["FirebaseCore"], + }, + { + name: "Alamofire", + repositoryURL: "https://github.com/Alamofire/Alamofire", + version: "5.0.0", + libs: ["Alamofire"], + }, + ]; + + const spmPackages = mergeSPMPackages(appPackages, pluginPackages); + + // Verify the result + assert.equal(spmPackages.length, 2, "Should include both plugin packages"); + + const packageNames = spmPackages.map((pkg) => pkg.name); + assert.include(packageNames, "FirebaseCore", "Should include FirebaseCore"); + assert.include(packageNames, "Alamofire", "Should include Alamofire"); + }); + + it("should handle local packages override correctly", () => { + const appPackages = [ + { + name: "LocalSDK", + path: "./custom-sdk", + libs: ["LocalSDK"], + }, + ]; + + const pluginPackages = [ + { + name: "LocalSDK", + path: "./plugin-sdk", + libs: ["LocalSDK"], + }, + ]; + + const spmPackages = mergeSPMPackages(appPackages, pluginPackages); + + // Verify the result + assert.equal(spmPackages.length, 1, "Should have exactly 1 package"); + + const localPackage = spmPackages.find((pkg) => pkg.name === "LocalSDK"); + assert.isDefined(localPackage, "Should include LocalSDK package"); + assert.equal( + (localPackage as any).path, + "./custom-sdk", + "Should use app's LocalSDK path, not plugin's", + ); + }); + + it("should keep all packages when there are no name conflicts", () => { + const appPackages = [ + { + name: "FirebaseCore", + repositoryURL: "https://github.com/firebase/firebase-ios-sdk", + version: "10.0.0", + libs: ["FirebaseCore"], + }, + ]; + + const pluginPackages = [ + { + name: "Alamofire", + repositoryURL: "https://github.com/Alamofire/Alamofire", + version: "5.0.0", + libs: ["Alamofire"], + }, + { + name: "Kingfisher", + repositoryURL: "https://github.com/onevcat/Kingfisher", + version: "7.0.0", + libs: ["Kingfisher"], + }, + ]; + + const spmPackages = mergeSPMPackages(appPackages, pluginPackages); + + // Verify the result + assert.equal(spmPackages.length, 3, "Should have all 3 packages"); + + const packageNames = spmPackages.map((pkg) => pkg.name); + assert.include(packageNames, "FirebaseCore"); + assert.include(packageNames, "Alamofire"); + assert.include(packageNames, "Kingfisher"); + }); + }); +}); diff --git a/test/stubs.ts b/test/stubs.ts index fc4d687c15..29545654d8 100644 --- a/test/stubs.ts +++ b/test/stubs.ts @@ -9,7 +9,9 @@ import { Yok } from "./../lib/common/yok"; import { HostInfo } from "./../lib/common/host-info"; import { DevicePlatformsConstants } from "./../lib/common/mobile/device-platforms-constants"; import { PrepareData } from "../lib/data/prepare-data"; -import * as temp from "temp"; +import { mkdtempSync } from "fs"; +import { tmpdir } from "os"; +import * as path from "path"; import { IPackageInstallationManager, INpmInstallOptions, @@ -38,6 +40,7 @@ import { IProjectConfigInformation, IProjectBackupService, IBackup, + BundlerType, } from "../lib/definitions/project"; import { IPlatformData, @@ -86,16 +89,13 @@ import { } from "../lib/common/definitions/google-analytics"; import * as _ from "lodash"; import { SupportedConfigValues } from "../lib/tools/config-manipulation/config-transformer"; -import { AffixOptions } from "temp"; -import { ITempService } from "../lib/definitions/temp-service"; +import { AffixOptions, ITempService } from "../lib/definitions/temp-service"; import { ITerminalSpinner, ITerminalSpinnerOptions, ITerminalSpinnerService, } from "../lib/definitions/terminal-spinner-service"; -temp.track(); - export class LoggerStub implements ILogger { initialize(opts?: ILoggerOptions): void {} @@ -658,6 +658,8 @@ export class ProjectDataStub implements IProjectData { projectDir: string; projectName: string; webpackConfigPath: string; + bundlerConfigPath: string; + bundler: BundlerType; get platformsDir(): string { return ( @@ -1515,10 +1517,17 @@ export class InjectorStub extends Yok implements IInjector { export class TempServiceStub implements ITempService { public async mkdirSync(affixes: string): Promise { - return temp.mkdirSync(affixes); + const prefix = typeof affixes === "string" ? affixes : "tmp"; + return mkdtempSync(path.join(tmpdir(), `${prefix}-`)); } public async path(options: string | AffixOptions): Promise { - return temp.path(options); + const opts: AffixOptions = + typeof options === "string" ? { prefix: options } : options || {}; + const dir = opts.dir || tmpdir(); + const prefix = opts.prefix || "tmp"; + const suffix = opts.suffix || ""; + const name = `${prefix}-${Date.now()}-${Math.random().toString(16).slice(2)}${suffix}`; + return path.join(dir, name); } } diff --git a/test/tns-appstore-upload.ts b/test/tns-appstore-upload.ts index 57f216f424..2fac17b6ab 100644 --- a/test/tns-appstore-upload.ts +++ b/test/tns-appstore-upload.ts @@ -55,26 +55,26 @@ class AppStore { errors: {}, fs: {}, hostInfo: {}, - itmsTransporterService: this.itmsTransporterService = {}, - logger: this.loggerService = new LoggerStub(), - options: this.options = {}, - prompter: this.prompter = new PrompterStub(), - projectData: this.projectData = new ProjectDataStub(), + itmsTransporterService: (this.itmsTransporterService = {}), + logger: (this.loggerService = new LoggerStub()), + options: (this.options = {}), + prompter: (this.prompter = new PrompterStub()), + projectData: (this.projectData = new ProjectDataStub()), stringParameterBuilder: {}, devicePlatformsConstants: { iOS: "iOS", }, - prepareNativePlatformService: this.prepareNativePlatformService = < + prepareNativePlatformService: (this.prepareNativePlatformService = < any - >{}, - platformCommandHelper: this.platformCommandHelper = {}, - platformValidationService: this.platformValidationService = {}, - buildController: this.buildController = { + >{}), + platformCommandHelper: (this.platformCommandHelper = {}), + platformValidationService: (this.platformValidationService = {}), + buildController: (this.buildController = { buildPlatform: async () => { this.archiveCalls++; return "/Users/person/git/MyProject/platforms/ios/archive/MyProject.ipa"; }, - }, + }), platformsDataService: { getPlatformData: (platform: string) => { chai.assert.equal(platform, "iOS"); @@ -117,12 +117,12 @@ class AppStore { chai.assert.equal( this.archiveCalls, this.expectedArchiveCalls, - "Mismatched number of iOSProjectService.archive calls." + "Mismatched number of iOSProjectService.archive calls.", ); chai.assert.equal( this.itmsTransporterServiceUploadCalls, this.expectedItmsTransporterServiceUploadCalls, - "Mismatched number of itmsTransporterService.upload calls." + "Mismatched number of itmsTransporterService.upload calls.", ); } @@ -140,7 +140,7 @@ class AppStore { chai.assert.equal(iOSBuildData.projectDir, "/Users/person/git/MyProject"); chai.assert.isTrue(iOSBuildData.buildForAppStore); return Promise.resolve( - "/Users/person/git/MyProject/platforms/ios/archive/MyProject.ipa" + "/Users/person/git/MyProject/platforms/ios/archive/MyProject.ipa", ); }; } @@ -152,15 +152,15 @@ class AppStore { this.itmsTransporterServiceUploadCalls++; chai.assert.equal( options.ipaFilePath, - "/Users/person/git/MyProject/platforms/ios/archive/MyProject.ipa" + "/Users/person/git/MyProject/platforms/ios/archive/MyProject.ipa", ); chai.assert.equal( options.credentials.username, - AppStore.itunesconnect.user + AppStore.itunesconnect.user, ); chai.assert.equal( options.credentials.password, - AppStore.itunesconnect.pass + AppStore.itunesconnect.pass, ); chai.assert.equal(options.verboseLogging, false); return Promise.resolve(); @@ -202,7 +202,7 @@ class AppStore { } } -describe("tns appstore", () => { +describe("ns appstore", () => { it("without args, prompts for itunesconnect credentionals, prepares, archives and uploads", async () => { const instance = new AppStore(); instance.before(); diff --git a/test/tools/config-manipulation/config-transformer.ts b/test/tools/config-manipulation/config-transformer.ts new file mode 100644 index 0000000000..3ecc6bd5d0 --- /dev/null +++ b/test/tools/config-manipulation/config-transformer.ts @@ -0,0 +1,62 @@ +import { assert } from "chai"; +import { ConfigTransformer } from "../../../lib/tools/config-manipulation/config-transformer"; + +describe("ConfigTransformer", () => { + it("updates existing boolean literals", () => { + const content = `export default { + id: 'org.nativescript.myapp', + discardUncaughtJsExceptions: true, +} as any;`; + + const transformer = new ConfigTransformer(content); + const updated = transformer.setValue("discardUncaughtJsExceptions", false); + const updatedTransformer = new ConfigTransformer(updated); + + assert.strictEqual( + updatedTransformer.getValue("discardUncaughtJsExceptions"), + false, + ); + }); + + it("updates existing ios.SPMPackages array literals", () => { + const content = `import { NativeScriptConfig } from '@nativescript/core' + +export default { + id: 'org.nativescript.myapp', + ios: { + SPMPackages: [ + { + name: 'RiveRuntime', + libs: ['RiveRuntime'], + repositoryURL: 'https://github.com/rive-app/rive-ios.git', + version: '6.11.0', + }, + ], + }, +} as NativeScriptConfig`; + + const spmPackages = [ + { + name: "RiveRuntime", + libs: ["RiveRuntime"], + repositoryURL: "https://github.com/rive-app/rive-ios.git", + version: "6.11.0", + }, + { + name: "SharedWidget", + libs: ["SharedWidget"], + path: "./Shared_Resources/iOS/SharedWidget", + targets: ["widget"], + }, + ]; + + const transformer = new ConfigTransformer(content); + const updated = transformer.setValue("ios.SPMPackages", spmPackages); + const updatedTransformer = new ConfigTransformer(updated); + + assert.deepStrictEqual( + updatedTransformer.getValue("ios.SPMPackages"), + spmPackages, + ); + }); +}); diff --git a/test/tools/node-modules/node-modules-dependencies-builder.ts b/test/tools/node-modules/node-modules-dependencies-builder.ts index 5494b159bb..8ea64163ef 100644 --- a/test/tools/node-modules/node-modules-dependencies-builder.ts +++ b/test/tools/node-modules/node-modules-dependencies-builder.ts @@ -7,794 +7,813 @@ import * as constants from "../../../lib/constants"; import { IDependencyData } from "../../../lib/declarations"; import { INodeModulesDependenciesBuilder } from "../../../lib/definitions/platform"; import { IInjector } from "../../../lib/common/definitions/yok"; -import { IFileSystem, IStringDictionary, } from "../../../lib/common/declarations"; -import * as temp from 'temp' -import * as fs from 'fs'; +import { + IFileSystem, + IStringDictionary, +} from "../../../lib/common/declarations"; +import * as os from "os"; +import * as fs from "fs"; import { FileSystem } from "../../../lib/common/file-system"; interface IDependencyInfo { - name: string; - version: string; - depth: number; - dependencies?: IDependencyInfo[]; - nativescript?: any; - isDevDependency?: boolean; + name: string; + version: string; + depth: number; + dependencies?: IDependencyInfo[]; + nativescript?: any; + isDevDependency?: boolean; } // TODO: Add integration tests. // The tests assumes npm 3 or later is used, so all dependencies (and their dependencies) will be installed at the root node_modules describe("nodeModulesDependenciesBuilder", () => { - let pathToProject: string = 'test-project'; - - beforeEach(() => { - // we use realpath because os.tmpdir points to a symlink on macos - // and require.resolve resolves the symlink causing test failures - pathToProject = fs.realpathSync( - temp.mkdirSync("test-project") - ); - }) - - const getTestInjector = (): IInjector => { - const testInjector = new Yok(); - testInjector.register("fs", FileSystem); - - return testInjector; - }; - - describe("getProductionDependencies", () => { - describe("returns empty array", () => { - const validateResultIsEmpty = async (resultOfReadJson: any) => { - const testInjector = getTestInjector(); - const fs = testInjector.resolve("fs"); - fs.readJson = (filename: string, encoding?: string): any => { - return resultOfReadJson; - }; - - const nodeModulesDependenciesBuilder = testInjector.resolve(NodeModulesDependenciesBuilder); - const result = await nodeModulesDependenciesBuilder.getProductionDependencies( - pathToProject - ); - - assert.deepStrictEqual(result, []); - }; - - it("when package.json does not have any data", async () => { - await validateResultIsEmpty(null); - }); - - it("when package.json does not have dependencies section", async () => { - await validateResultIsEmpty({ - name: "some name", - devDependencies: { a: "1.0.0" }, - }); - }); - }); - - describe("returns correct dependencies", () => { - /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Helper functions for easier writing of consecutive tests in the suite. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - const getPathToDependencyInNodeModules = ( - dependencyName: string, - parentDir?: string - ): string => { - return path.join( - parentDir ?? pathToProject, - constants.NODE_MODULES_FOLDER_NAME, - dependencyName - ); - }; - - const getNodeModuleInfoForExpectedDependency = ( - dir: string, - depth: number, - nativescript?: any, - dependencies?: string[], - name?: string, - version?: string - ): IDependencyData => { - const packageName = name ?? path.basename(dir); - const result: IDependencyData = { - name: packageName, - directory: getPathToDependencyInNodeModules(dir), - depth, - dependencies: dependencies || [], - version: version, - }; - - if (nativescript) { - result.nativescript = nativescript; - } - - return result; - }; - - const getPathToPackageJsonOfDependency = ( - dependencyName: string, - parentDir?: string - ): string => { - return path.join( - getPathToDependencyInNodeModules(dependencyName, parentDir), - constants.PACKAGE_JSON_FILE_NAME - ); - }; - - const getDependenciesObjectFromDependencyInfo = ( - depInfos: IDependencyInfo[], - nativescript: any, - version: string - ): { - dependencies: IStringDictionary; - nativescript?: any; - devDependencies: IStringDictionary; - version: string; - } => { - const dependencies: any = {}; - const devDependencies: any = {}; - _.each(depInfos, (innerDependency) => { - if (innerDependency.isDevDependency) { - devDependencies[innerDependency.name] = innerDependency.version; - } else { - dependencies[innerDependency.name] = innerDependency.version; - } - }); - - const result: any = { - dependencies, - devDependencies, - }; - - if (nativescript) { - result.nativescript = nativescript; - } - - if (version) { - result.version = version; - } - - return result; - }; - - const getDependenciesObject = ( - filename: string, - deps: IDependencyInfo[], - parentDir: string - ): { - dependencies: IStringDictionary; - nativescript?: any; - devDependencies: IStringDictionary; - } => { - let result: { - dependencies: IStringDictionary; - nativescript?: any; - devDependencies: IStringDictionary; - } = null; - for (const dependencyInfo of deps) { - const pathToPackageJson = getPathToPackageJsonOfDependency( - dependencyInfo.name, - parentDir - ); - if (filename === pathToPackageJson) { - return getDependenciesObjectFromDependencyInfo( - dependencyInfo.dependencies, - dependencyInfo.nativescript, - dependencyInfo.version - ); - } - - if (dependencyInfo.dependencies) { - result = getDependenciesObject( - filename, - dependencyInfo.dependencies, - path.join( - parentDir, - constants.NODE_MODULES_FOLDER_NAME, - dependencyInfo.name - ) - ); - if (result) { - break; - } - } - } - - return result; - }; - - const generatePackageJsonData = ( - dep: IDependencyInfo - ) => { - const data: any = { - name: dep.name, - version: dep.version, - dependencies: dep.dependencies?.reduce((deps, dep) => { - if (!dep.isDevDependency) { - deps[dep.name] = dep.version - } - return deps; - }, {} as { [name: string]: string }), - devDependencies: dep.dependencies?.reduce((deps, dep) => { - if (dep.isDevDependency) { - deps[dep.name] = dep.version - } - return deps; - }, {} as { [name: string]: string }) - } - - if(dep.nativescript) { - data.nativescript = dep.nativescript; - } - - return data; - } - - const generateNodeModules = ( - dep: IDependencyInfo, - rootPath: string) => { - // ensure dep directory - fs.mkdirSync(rootPath, { recursive: true }); - - // generate package.json contents - const packageJsonData = generatePackageJsonData(dep); - - // write package.json - fs.writeFileSync( - path.join(rootPath, 'package.json'), - JSON.stringify(packageJsonData) - ) - - // recurse into sub-dependencies if any - if (dep.dependencies) { - for (const subDep of dep.dependencies) { - generateNodeModules( - subDep, - path.join(rootPath, 'node_modules', subDep.name) - ); - } - } - } - - const generateTest = ( - rootDeps: IDependencyInfo[] - ): INodeModulesDependenciesBuilder => { - const testInjector = getTestInjector(); - const nodeModulesDependenciesBuilder = testInjector.resolve(NodeModulesDependenciesBuilder); - - generateNodeModules( - { - name: 'test-project', - version: '1.0.0', - depth: 0, - dependencies: rootDeps - }, - pathToProject - ); - - return nodeModulesDependenciesBuilder; - }; - - const generateDependency = ( - name: string, - version: string, - depth: number, - dependencies: IDependencyInfo[], - nativescript?: any, - opts?: { isDevDependency: boolean } - ): IDependencyInfo => { - return { - name, - version, - depth, - dependencies, - nativescript, - isDevDependency: !!(opts && opts.isDevDependency), - }; - }; - - /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * END of helper functions for easier writing of consecutive tests in the suite. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - const firstPackage = "firstPackage"; - const secondPackage = "secondPackage"; - const thirdPackage = "thirdPackage"; - - it("when there are both dependencies and devDependencies installed", async () => { - // The test validates the following dependency tree, when npm 3+ is used. - // - // ├── firstPackage@1.0.0 - // ├── secondPackage@1.1.0 - // └── thirdPackage@1.2.0 // this is devDependency - - const rootDeps: IDependencyInfo[] = [ - generateDependency(firstPackage, "1.0.0", 0, null), - generateDependency(secondPackage, "1.1.0", 0, null), - generateDependency(thirdPackage, "1.2.0", 0, null, null, { - isDevDependency: true, - }), - ]; - - const nodeModulesDependenciesBuilder = generateTest(rootDeps); - const actualResult = await nodeModulesDependenciesBuilder.getProductionDependencies( - pathToProject - ); - - const expectedResult: IDependencyData[] = [ - getNodeModuleInfoForExpectedDependency( - firstPackage, - 0, - null, - null, - null, - "1.0.0" - ), - getNodeModuleInfoForExpectedDependency( - secondPackage, - 0, - null, - null, - null, - "1.1.0" - ), - ]; - - assert.deepStrictEqual(actualResult, expectedResult); - }); - - it("when there are both dependencies and devDependencies installed, does not handle dependencies of devDependencies", async () => { - // The test validates the following dependency tree, when npm 3+ is used. - // - // ├─â”Ŧ firstPackage@1.0.0 // this is devDependency - // │ └── secondPackage@1.2.0 - // └── secondPackage@1.1.0 - - const rootDeps: IDependencyInfo[] = [ - generateDependency( - firstPackage, - "1.0.0", - 0, - [generateDependency(secondPackage, "1.2.0", 1, null)], - null, - { isDevDependency: true } - ), - generateDependency(secondPackage, "1.1.0", 0, null), - ]; - - const expectedResult: IDependencyData[] = [ - getNodeModuleInfoForExpectedDependency( - secondPackage, - 0, - null, - null, - null, - "1.1.0" - ), - ]; - - const nodeModulesDependenciesBuilder = generateTest(rootDeps); - const actualResult = await nodeModulesDependenciesBuilder.getProductionDependencies( - pathToProject - ); - assert.deepStrictEqual(actualResult, expectedResult); - }); - - it("when there are scoped dependencies", async () => { - // The test validates the following dependency tree, when npm 3+ is used. - // - // ├─â”Ŧ @scope/firstPackage@1.0.0 - // │ └── secondPackage@1.2.0 - // └── secondPackage@1.1.0 - - const scopedPackageName = `@scope/${firstPackage}`; - const rootDeps: IDependencyInfo[] = [ - generateDependency(scopedPackageName, "1.0.0", 0, [ - generateDependency(secondPackage, "1.2.0", 1, null), - ]), - generateDependency(secondPackage, "1.1.0", 0, null), - ]; - - const expectedResult: IDependencyData[] = [ - getNodeModuleInfoForExpectedDependency( - scopedPackageName, - 0, - null, - [secondPackage], - scopedPackageName, - "1.0.0" - ), - getNodeModuleInfoForExpectedDependency( - secondPackage, - 0, - null, - null, - null, - "1.1.0" - ), - getNodeModuleInfoForExpectedDependency( - path.join( - scopedPackageName, - constants.NODE_MODULES_FOLDER_NAME, - secondPackage - ), - 1, - null, - null, - null, - "1.2.0" - ), - ]; - - const nodeModulesDependenciesBuilder = generateTest(rootDeps); - const actualResult = await nodeModulesDependenciesBuilder.getProductionDependencies( - pathToProject - ); - assert.deepStrictEqual(actualResult, expectedResult); - }); - - it("when there are scoped dependencies as dependency of other non-scoped dependency", async () => { - // The test validates the following dependency tree, when npm 3+ is used. - // - // ├─â”Ŧ firstPackage@1.0.0 - // │ └── @scope/secondPackage@1.2.0 - // └── thirdPackage@1.1.0 - - const scopedPackageName = `@scope/${secondPackage}`; - const rootDeps: IDependencyInfo[] = [ - generateDependency(firstPackage, "1.0.0", 0, [ - generateDependency(scopedPackageName, "1.2.0", 1, null), - ]), - generateDependency(thirdPackage, "1.1.0", 0, null), - ]; - - const expectedResult: IDependencyData[] = [ - getNodeModuleInfoForExpectedDependency( - firstPackage, - 0, - null, - [scopedPackageName], - null, - "1.0.0" - ), - getNodeModuleInfoForExpectedDependency( - thirdPackage, - 0, - null, - null, - null, - "1.1.0" - ), - getNodeModuleInfoForExpectedDependency( - path.join( - firstPackage, - constants.NODE_MODULES_FOLDER_NAME, - scopedPackageName - ), - 1, - null, - null, - scopedPackageName, - "1.2.0" - ), - ]; - - const nodeModulesDependenciesBuilder = generateTest(rootDeps); - const actualResult = await nodeModulesDependenciesBuilder.getProductionDependencies( - pathToProject - ); - assert.deepStrictEqual(actualResult, expectedResult); - }); - - it("when all dependencies are installed at the root level of the project", async () => { - // The test validates the following dependency tree, when npm 3+ is used. - // - // ├── firstPackage@1.0.0 - // ├── secondPackage@1.1.0 - // └── thirdPackage@1.2.0 - - const rootDeps: IDependencyInfo[] = [ - generateDependency(firstPackage, "1.0.0", 0, null), - generateDependency(secondPackage, "1.1.0", 0, null), - generateDependency(thirdPackage, "1.2.0", 0, null), - ]; - - const nodeModulesDependenciesBuilder = generateTest(rootDeps); - const actualResult = await nodeModulesDependenciesBuilder.getProductionDependencies( - pathToProject - ); - - const expectedResult: IDependencyData[] = [ - getNodeModuleInfoForExpectedDependency( - firstPackage, - 0, - null, - null, - null, - "1.0.0" - ), - getNodeModuleInfoForExpectedDependency( - secondPackage, - 0, - null, - null, - null, - "1.1.0" - ), - getNodeModuleInfoForExpectedDependency( - thirdPackage, - 0, - null, - null, - null, - "1.2.0" - ), - ]; - - assert.deepStrictEqual(actualResult, expectedResult); - }); - - it("when the project has a dependency to a package and one of the other packages has dependency to other version of this package", async () => { - // The test validates the following dependency tree, when npm 3+ is used. - // - // ├─â”Ŧ firstPackage@1.0.0 - // │ └── secondPackage@1.2.0 - // └── secondPackage@1.1.0 - - const rootDeps: IDependencyInfo[] = [ - generateDependency(firstPackage, "1.0.0", 0, [ - generateDependency(secondPackage, "1.2.0", 1, null), - ]), - generateDependency(secondPackage, "1.1.0", 0, null), - ]; - - const expectedResult: IDependencyData[] = [ - getNodeModuleInfoForExpectedDependency( - firstPackage, - 0, - null, - [secondPackage], - null, - "1.0.0" - ), - getNodeModuleInfoForExpectedDependency( - secondPackage, - 0, - null, - null, - null, - "1.1.0" - ), - getNodeModuleInfoForExpectedDependency( - path.join( - firstPackage, - constants.NODE_MODULES_FOLDER_NAME, - secondPackage - ), - 1, - null, - null, - null, - "1.2.0" - ), - ]; - - const nodeModulesDependenciesBuilder = generateTest(rootDeps); - const actualResult = await nodeModulesDependenciesBuilder.getProductionDependencies( - pathToProject - ); - assert.deepStrictEqual(actualResult, expectedResult); - }); - - it("when several package depend on different versions of other packages", async () => { - // The test validates the following dependency tree, when npm 3+ is used. - // - // ├─â”Ŧ firstPackage@1.0.0 - // │ ├─â”Ŧ secondPackage@1.1.0 - // │ │ └── thirdPackage@1.2.0 - // │ └── thirdPackage@1.1.0 - // ├── secondPackage@1.0.0 - // └── thirdPackage@1.0.0 - - const rootDeps: IDependencyInfo[] = [ - generateDependency(firstPackage, "1.0.0", 0, [ - generateDependency(secondPackage, "1.1.0", 1, [ - generateDependency(thirdPackage, "1.2.0", 2, null), - ]), - generateDependency(thirdPackage, "1.1.0", 1, null), - ]), - generateDependency(secondPackage, "1.0.0", 0, null), - generateDependency(thirdPackage, "1.0.0", 0, null), - ]; - - const pathToSecondPackageInsideFirstPackage = path.join( - firstPackage, - constants.NODE_MODULES_FOLDER_NAME, - secondPackage - ); - const expectedResult: IDependencyData[] = [ - getNodeModuleInfoForExpectedDependency( - firstPackage, - 0, - null, - [secondPackage, thirdPackage], - null, - "1.0.0" - ), - getNodeModuleInfoForExpectedDependency( - secondPackage, - 0, - null, - null, - null, - "1.0.0" - ), - getNodeModuleInfoForExpectedDependency( - thirdPackage, - 0, - null, - null, - null, - "1.0.0" - ), - getNodeModuleInfoForExpectedDependency( - pathToSecondPackageInsideFirstPackage, - 1, - null, - [thirdPackage], - null, - "1.1.0" - ), - getNodeModuleInfoForExpectedDependency( - path.join( - firstPackage, - constants.NODE_MODULES_FOLDER_NAME, - thirdPackage - ), - 1, - null, - null, - null, - "1.1.0" - ), - getNodeModuleInfoForExpectedDependency( - path.join( - pathToSecondPackageInsideFirstPackage, - constants.NODE_MODULES_FOLDER_NAME, - thirdPackage - ), - 2, - null, - null, - null, - "1.2.0" - ), - ]; - - const nodeModulesDependenciesBuilder = generateTest(rootDeps); - const actualResult = await nodeModulesDependenciesBuilder.getProductionDependencies( - pathToProject - ); - assert.deepStrictEqual(actualResult, expectedResult); - }); - - it("when the installed packages have nativescript data in their package.json", async () => { - // The test validates the following dependency tree, when npm 3+ is used. - // - // ├── firstPackage@1.0.0 - // ├── secondPackage@1.1.0 - // └── thirdPackage@1.2.0 - - const getNativeScriptDataForPlugin = (pluginName: string): any => { - return { - platforms: { - "tns-android": "x.x.x", - "tns-ios": "x.x.x", - }, - - customPropertyUsedForThisTestOnly: pluginName, - }; - }; - - const rootDeps: IDependencyInfo[] = [ - generateDependency( - firstPackage, - "1.0.0", - 0, - null, - getNativeScriptDataForPlugin(firstPackage) - ), - generateDependency( - secondPackage, - "1.1.0", - 0, - null, - getNativeScriptDataForPlugin(secondPackage) - ), - generateDependency( - thirdPackage, - "1.2.0", - 0, - null, - getNativeScriptDataForPlugin(thirdPackage) - ), - ]; - - const nodeModulesDependenciesBuilder = generateTest(rootDeps); - const actualResult = await nodeModulesDependenciesBuilder.getProductionDependencies( - pathToProject - ); - - const expectedResult: IDependencyData[] = [ - getNodeModuleInfoForExpectedDependency( - firstPackage, - 0, - getNativeScriptDataForPlugin(firstPackage), - null, - null, - "1.0.0" - ), - getNodeModuleInfoForExpectedDependency( - secondPackage, - 0, - getNativeScriptDataForPlugin(secondPackage), - null, - null, - "1.1.0" - ), - getNodeModuleInfoForExpectedDependency( - thirdPackage, - 0, - getNativeScriptDataForPlugin(thirdPackage), - null, - null, - "1.2.0" - ), - ]; - - assert.deepStrictEqual(actualResult, expectedResult); - }); - - it("ignoring dependencies", async () => { - // The test validates the following dependency tree, when npm 3+ is used. - // - // ├── firstPackage@1.0.0 - // ├── secondPackage@1.1.0 - // └── thirdPackage@1.2.0 - - const rootDeps: IDependencyInfo[] = [ - generateDependency(firstPackage, "1.0.0", 0, null), - generateDependency(secondPackage, "1.1.0", 0, null), - generateDependency(thirdPackage, "1.2.0", 0, null), - ]; - - const nodeModulesDependenciesBuilder = generateTest(rootDeps); - const actualResult = await nodeModulesDependenciesBuilder.getProductionDependencies( - pathToProject, [firstPackage] - ); - - const expectedResult: IDependencyData[] = [ - getNodeModuleInfoForExpectedDependency( - secondPackage, - 0, - null, - null, - null, - "1.1.0" - ), - getNodeModuleInfoForExpectedDependency( - thirdPackage, - 0, - null, - null, - null, - "1.2.0" - ), - ]; - - assert.deepStrictEqual(actualResult, expectedResult); - }); - }); - }) - ; -}) -; + let pathToProject: string = "test-project"; + + beforeEach(() => { + // we use realpath because os.tmpdir points to a symlink on macos + // and require.resolve resolves the symlink causing test failures + const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "test-project-")); + pathToProject = fs.realpathSync(tmpDir); + }); + + const getTestInjector = (): IInjector => { + const testInjector = new Yok(); + testInjector.register("fs", FileSystem); + + return testInjector; + }; + + describe("getProductionDependencies", () => { + describe("returns empty array", () => { + const validateResultIsEmpty = async (resultOfReadJson: any) => { + const testInjector = getTestInjector(); + const fs = testInjector.resolve("fs"); + fs.readJson = (filename: string, encoding?: string): any => { + return resultOfReadJson; + }; + + const nodeModulesDependenciesBuilder = + testInjector.resolve( + NodeModulesDependenciesBuilder, + ); + const result = + await nodeModulesDependenciesBuilder.getProductionDependencies( + pathToProject, + ); + + assert.deepStrictEqual(result, []); + }; + + it("when package.json does not have any data", async () => { + await validateResultIsEmpty(null); + }); + + it("when package.json does not have dependencies section", async () => { + await validateResultIsEmpty({ + name: "some name", + devDependencies: { a: "1.0.0" }, + }); + }); + }); + + describe("returns correct dependencies", () => { + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Helper functions for easier writing of consecutive tests in the suite. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + const getPathToDependencyInNodeModules = ( + dependencyName: string, + parentDir?: string, + ): string => { + return path.join( + parentDir ?? pathToProject, + constants.NODE_MODULES_FOLDER_NAME, + dependencyName, + ); + }; + + const getNodeModuleInfoForExpectedDependency = ( + dir: string, + depth: number, + nativescript?: any, + dependencies?: string[], + name?: string, + version?: string, + ): IDependencyData => { + const packageName = name ?? path.basename(dir); + const result: IDependencyData = { + name: packageName, + directory: getPathToDependencyInNodeModules(dir), + depth, + dependencies: dependencies || [], + version: version, + }; + + if (nativescript) { + result.nativescript = nativescript; + } + + return result; + }; + + const getPathToPackageJsonOfDependency = ( + dependencyName: string, + parentDir?: string, + ): string => { + return path.join( + getPathToDependencyInNodeModules(dependencyName, parentDir), + constants.PACKAGE_JSON_FILE_NAME, + ); + }; + + const getDependenciesObjectFromDependencyInfo = ( + depInfos: IDependencyInfo[], + nativescript: any, + version: string, + ): { + dependencies: IStringDictionary; + nativescript?: any; + devDependencies: IStringDictionary; + version: string; + } => { + const dependencies: any = {}; + const devDependencies: any = {}; + _.each(depInfos, (innerDependency) => { + if (innerDependency.isDevDependency) { + devDependencies[innerDependency.name] = innerDependency.version; + } else { + dependencies[innerDependency.name] = innerDependency.version; + } + }); + + const result: any = { + dependencies, + devDependencies, + }; + + if (nativescript) { + result.nativescript = nativescript; + } + + if (version) { + result.version = version; + } + + return result; + }; + + const getDependenciesObject = ( + filename: string, + deps: IDependencyInfo[], + parentDir: string, + ): { + dependencies: IStringDictionary; + nativescript?: any; + devDependencies: IStringDictionary; + } => { + let result: { + dependencies: IStringDictionary; + nativescript?: any; + devDependencies: IStringDictionary; + } = null; + for (const dependencyInfo of deps) { + const pathToPackageJson = getPathToPackageJsonOfDependency( + dependencyInfo.name, + parentDir, + ); + if (filename === pathToPackageJson) { + return getDependenciesObjectFromDependencyInfo( + dependencyInfo.dependencies, + dependencyInfo.nativescript, + dependencyInfo.version, + ); + } + + if (dependencyInfo.dependencies) { + result = getDependenciesObject( + filename, + dependencyInfo.dependencies, + path.join( + parentDir, + constants.NODE_MODULES_FOLDER_NAME, + dependencyInfo.name, + ), + ); + if (result) { + break; + } + } + } + + return result; + }; + + const generatePackageJsonData = (dep: IDependencyInfo) => { + const data: any = { + name: dep.name, + version: dep.version, + dependencies: dep.dependencies?.reduce( + (deps, dep) => { + if (!dep.isDevDependency) { + deps[dep.name] = dep.version; + } + return deps; + }, + {} as { [name: string]: string }, + ), + devDependencies: dep.dependencies?.reduce( + (deps, dep) => { + if (dep.isDevDependency) { + deps[dep.name] = dep.version; + } + return deps; + }, + {} as { [name: string]: string }, + ), + }; + + if (dep.nativescript) { + data.nativescript = dep.nativescript; + } + + return data; + }; + + const generateNodeModules = (dep: IDependencyInfo, rootPath: string) => { + // ensure dep directory + fs.mkdirSync(rootPath, { recursive: true }); + + // generate package.json contents + const packageJsonData = generatePackageJsonData(dep); + + // write package.json + fs.writeFileSync( + path.join(rootPath, "package.json"), + JSON.stringify(packageJsonData), + ); + + // recurse into sub-dependencies if any + if (dep.dependencies) { + for (const subDep of dep.dependencies) { + generateNodeModules( + subDep, + path.join(rootPath, "node_modules", subDep.name), + ); + } + } + }; + + const generateTest = ( + rootDeps: IDependencyInfo[], + ): INodeModulesDependenciesBuilder => { + const testInjector = getTestInjector(); + const nodeModulesDependenciesBuilder = + testInjector.resolve( + NodeModulesDependenciesBuilder, + ); + + generateNodeModules( + { + name: "test-project", + version: "1.0.0", + depth: 0, + dependencies: rootDeps, + }, + pathToProject, + ); + + return nodeModulesDependenciesBuilder; + }; + + const generateDependency = ( + name: string, + version: string, + depth: number, + dependencies: IDependencyInfo[], + nativescript?: any, + opts?: { isDevDependency: boolean }, + ): IDependencyInfo => { + return { + name, + version, + depth, + dependencies, + nativescript, + isDevDependency: !!(opts && opts.isDevDependency), + }; + }; + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * END of helper functions for easier writing of consecutive tests in the suite. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + const firstPackage = "firstPackage"; + const secondPackage = "secondPackage"; + const thirdPackage = "thirdPackage"; + + it("when there are both dependencies and devDependencies installed", async () => { + // The test validates the following dependency tree, when npm 3+ is used. + // + // ├── firstPackage@1.0.0 + // ├── secondPackage@1.1.0 + // └── thirdPackage@1.2.0 // this is devDependency + + const rootDeps: IDependencyInfo[] = [ + generateDependency(firstPackage, "1.0.0", 0, null), + generateDependency(secondPackage, "1.1.0", 0, null), + generateDependency(thirdPackage, "1.2.0", 0, null, null, { + isDevDependency: true, + }), + ]; + + const nodeModulesDependenciesBuilder = generateTest(rootDeps); + const actualResult = + await nodeModulesDependenciesBuilder.getProductionDependencies( + pathToProject, + ); + + const expectedResult: IDependencyData[] = [ + getNodeModuleInfoForExpectedDependency( + firstPackage, + 0, + null, + null, + null, + "1.0.0", + ), + getNodeModuleInfoForExpectedDependency( + secondPackage, + 0, + null, + null, + null, + "1.1.0", + ), + ]; + + assert.deepStrictEqual(actualResult, expectedResult); + }); + + it("when there are both dependencies and devDependencies installed, does not handle dependencies of devDependencies", async () => { + // The test validates the following dependency tree, when npm 3+ is used. + // + // ├─â”Ŧ firstPackage@1.0.0 // this is devDependency + // │ └── secondPackage@1.2.0 + // └── secondPackage@1.1.0 + + const rootDeps: IDependencyInfo[] = [ + generateDependency( + firstPackage, + "1.0.0", + 0, + [generateDependency(secondPackage, "1.2.0", 1, null)], + null, + { isDevDependency: true }, + ), + generateDependency(secondPackage, "1.1.0", 0, null), + ]; + + const expectedResult: IDependencyData[] = [ + getNodeModuleInfoForExpectedDependency( + secondPackage, + 0, + null, + null, + null, + "1.1.0", + ), + ]; + + const nodeModulesDependenciesBuilder = generateTest(rootDeps); + const actualResult = + await nodeModulesDependenciesBuilder.getProductionDependencies( + pathToProject, + ); + assert.deepStrictEqual(actualResult, expectedResult); + }); + + it("when there are scoped dependencies", async () => { + // The test validates the following dependency tree, when npm 3+ is used. + // + // ├─â”Ŧ @scope/firstPackage@1.0.0 + // │ └── secondPackage@1.2.0 + // └── secondPackage@1.1.0 + + const scopedPackageName = `@scope/${firstPackage}`; + const rootDeps: IDependencyInfo[] = [ + generateDependency(scopedPackageName, "1.0.0", 0, [ + generateDependency(secondPackage, "1.2.0", 1, null), + ]), + generateDependency(secondPackage, "1.1.0", 0, null), + ]; + + const expectedResult: IDependencyData[] = [ + getNodeModuleInfoForExpectedDependency( + scopedPackageName, + 0, + null, + [secondPackage], + scopedPackageName, + "1.0.0", + ), + getNodeModuleInfoForExpectedDependency( + secondPackage, + 0, + null, + null, + null, + "1.1.0", + ), + getNodeModuleInfoForExpectedDependency( + path.join( + scopedPackageName, + constants.NODE_MODULES_FOLDER_NAME, + secondPackage, + ), + 1, + null, + null, + null, + "1.2.0", + ), + ]; + + const nodeModulesDependenciesBuilder = generateTest(rootDeps); + const actualResult = + await nodeModulesDependenciesBuilder.getProductionDependencies( + pathToProject, + ); + assert.deepStrictEqual(actualResult, expectedResult); + }); + + it("when there are scoped dependencies as dependency of other non-scoped dependency", async () => { + // The test validates the following dependency tree, when npm 3+ is used. + // + // ├─â”Ŧ firstPackage@1.0.0 + // │ └── @scope/secondPackage@1.2.0 + // └── thirdPackage@1.1.0 + + const scopedPackageName = `@scope/${secondPackage}`; + const rootDeps: IDependencyInfo[] = [ + generateDependency(firstPackage, "1.0.0", 0, [ + generateDependency(scopedPackageName, "1.2.0", 1, null), + ]), + generateDependency(thirdPackage, "1.1.0", 0, null), + ]; + + const expectedResult: IDependencyData[] = [ + getNodeModuleInfoForExpectedDependency( + firstPackage, + 0, + null, + [scopedPackageName], + null, + "1.0.0", + ), + getNodeModuleInfoForExpectedDependency( + thirdPackage, + 0, + null, + null, + null, + "1.1.0", + ), + getNodeModuleInfoForExpectedDependency( + path.join( + firstPackage, + constants.NODE_MODULES_FOLDER_NAME, + scopedPackageName, + ), + 1, + null, + null, + scopedPackageName, + "1.2.0", + ), + ]; + + const nodeModulesDependenciesBuilder = generateTest(rootDeps); + const actualResult = + await nodeModulesDependenciesBuilder.getProductionDependencies( + pathToProject, + ); + assert.deepStrictEqual(actualResult, expectedResult); + }); + + it("when all dependencies are installed at the root level of the project", async () => { + // The test validates the following dependency tree, when npm 3+ is used. + // + // ├── firstPackage@1.0.0 + // ├── secondPackage@1.1.0 + // └── thirdPackage@1.2.0 + + const rootDeps: IDependencyInfo[] = [ + generateDependency(firstPackage, "1.0.0", 0, null), + generateDependency(secondPackage, "1.1.0", 0, null), + generateDependency(thirdPackage, "1.2.0", 0, null), + ]; + + const nodeModulesDependenciesBuilder = generateTest(rootDeps); + const actualResult = + await nodeModulesDependenciesBuilder.getProductionDependencies( + pathToProject, + ); + + const expectedResult: IDependencyData[] = [ + getNodeModuleInfoForExpectedDependency( + firstPackage, + 0, + null, + null, + null, + "1.0.0", + ), + getNodeModuleInfoForExpectedDependency( + secondPackage, + 0, + null, + null, + null, + "1.1.0", + ), + getNodeModuleInfoForExpectedDependency( + thirdPackage, + 0, + null, + null, + null, + "1.2.0", + ), + ]; + + assert.deepStrictEqual(actualResult, expectedResult); + }); + + it("when the project has a dependency to a package and one of the other packages has dependency to other version of this package", async () => { + // The test validates the following dependency tree, when npm 3+ is used. + // + // ├─â”Ŧ firstPackage@1.0.0 + // │ └── secondPackage@1.2.0 + // └── secondPackage@1.1.0 + + const rootDeps: IDependencyInfo[] = [ + generateDependency(firstPackage, "1.0.0", 0, [ + generateDependency(secondPackage, "1.2.0", 1, null), + ]), + generateDependency(secondPackage, "1.1.0", 0, null), + ]; + + const expectedResult: IDependencyData[] = [ + getNodeModuleInfoForExpectedDependency( + firstPackage, + 0, + null, + [secondPackage], + null, + "1.0.0", + ), + getNodeModuleInfoForExpectedDependency( + secondPackage, + 0, + null, + null, + null, + "1.1.0", + ), + getNodeModuleInfoForExpectedDependency( + path.join( + firstPackage, + constants.NODE_MODULES_FOLDER_NAME, + secondPackage, + ), + 1, + null, + null, + null, + "1.2.0", + ), + ]; + + const nodeModulesDependenciesBuilder = generateTest(rootDeps); + const actualResult = + await nodeModulesDependenciesBuilder.getProductionDependencies( + pathToProject, + ); + assert.deepStrictEqual(actualResult, expectedResult); + }); + + it("when several package depend on different versions of other packages", async () => { + // The test validates the following dependency tree, when npm 3+ is used. + // + // ├─â”Ŧ firstPackage@1.0.0 + // │ ├─â”Ŧ secondPackage@1.1.0 + // │ │ └── thirdPackage@1.2.0 + // │ └── thirdPackage@1.1.0 + // ├── secondPackage@1.0.0 + // └── thirdPackage@1.0.0 + + const rootDeps: IDependencyInfo[] = [ + generateDependency(firstPackage, "1.0.0", 0, [ + generateDependency(secondPackage, "1.1.0", 1, [ + generateDependency(thirdPackage, "1.2.0", 2, null), + ]), + generateDependency(thirdPackage, "1.1.0", 1, null), + ]), + generateDependency(secondPackage, "1.0.0", 0, null), + generateDependency(thirdPackage, "1.0.0", 0, null), + ]; + + const pathToSecondPackageInsideFirstPackage = path.join( + firstPackage, + constants.NODE_MODULES_FOLDER_NAME, + secondPackage, + ); + const expectedResult: IDependencyData[] = [ + getNodeModuleInfoForExpectedDependency( + firstPackage, + 0, + null, + [secondPackage, thirdPackage], + null, + "1.0.0", + ), + getNodeModuleInfoForExpectedDependency( + secondPackage, + 0, + null, + null, + null, + "1.0.0", + ), + getNodeModuleInfoForExpectedDependency( + thirdPackage, + 0, + null, + null, + null, + "1.0.0", + ), + getNodeModuleInfoForExpectedDependency( + pathToSecondPackageInsideFirstPackage, + 1, + null, + [thirdPackage], + null, + "1.1.0", + ), + getNodeModuleInfoForExpectedDependency( + path.join( + firstPackage, + constants.NODE_MODULES_FOLDER_NAME, + thirdPackage, + ), + 1, + null, + null, + null, + "1.1.0", + ), + getNodeModuleInfoForExpectedDependency( + path.join( + pathToSecondPackageInsideFirstPackage, + constants.NODE_MODULES_FOLDER_NAME, + thirdPackage, + ), + 2, + null, + null, + null, + "1.2.0", + ), + ]; + + const nodeModulesDependenciesBuilder = generateTest(rootDeps); + const actualResult = + await nodeModulesDependenciesBuilder.getProductionDependencies( + pathToProject, + ); + assert.deepStrictEqual(actualResult, expectedResult); + }); + + it("when the installed packages have nativescript data in their package.json", async () => { + // The test validates the following dependency tree, when npm 3+ is used. + // + // ├── firstPackage@1.0.0 + // ├── secondPackage@1.1.0 + // └── thirdPackage@1.2.0 + + const getNativeScriptDataForPlugin = (pluginName: string): any => { + return { + platforms: { + "tns-android": "x.x.x", + "tns-ios": "x.x.x", + }, + + customPropertyUsedForThisTestOnly: pluginName, + }; + }; + + const rootDeps: IDependencyInfo[] = [ + generateDependency( + firstPackage, + "1.0.0", + 0, + null, + getNativeScriptDataForPlugin(firstPackage), + ), + generateDependency( + secondPackage, + "1.1.0", + 0, + null, + getNativeScriptDataForPlugin(secondPackage), + ), + generateDependency( + thirdPackage, + "1.2.0", + 0, + null, + getNativeScriptDataForPlugin(thirdPackage), + ), + ]; + + const nodeModulesDependenciesBuilder = generateTest(rootDeps); + const actualResult = + await nodeModulesDependenciesBuilder.getProductionDependencies( + pathToProject, + ); + + const expectedResult: IDependencyData[] = [ + getNodeModuleInfoForExpectedDependency( + firstPackage, + 0, + getNativeScriptDataForPlugin(firstPackage), + null, + null, + "1.0.0", + ), + getNodeModuleInfoForExpectedDependency( + secondPackage, + 0, + getNativeScriptDataForPlugin(secondPackage), + null, + null, + "1.1.0", + ), + getNodeModuleInfoForExpectedDependency( + thirdPackage, + 0, + getNativeScriptDataForPlugin(thirdPackage), + null, + null, + "1.2.0", + ), + ]; + + assert.deepStrictEqual(actualResult, expectedResult); + }); + + it("ignoring dependencies", async () => { + // The test validates the following dependency tree, when npm 3+ is used. + // + // ├── firstPackage@1.0.0 + // ├── secondPackage@1.1.0 + // └── thirdPackage@1.2.0 + + const rootDeps: IDependencyInfo[] = [ + generateDependency(firstPackage, "1.0.0", 0, null), + generateDependency(secondPackage, "1.1.0", 0, null), + generateDependency(thirdPackage, "1.2.0", 0, null), + ]; + + const nodeModulesDependenciesBuilder = generateTest(rootDeps); + const actualResult = + await nodeModulesDependenciesBuilder.getProductionDependencies( + pathToProject, + [firstPackage], + ); + + const expectedResult: IDependencyData[] = [ + getNodeModuleInfoForExpectedDependency( + secondPackage, + 0, + null, + null, + null, + "1.1.0", + ), + getNodeModuleInfoForExpectedDependency( + thirdPackage, + 0, + null, + null, + null, + "1.2.0", + ), + ]; + + assert.deepStrictEqual(actualResult, expectedResult); + }); + }); + }); +}); diff --git a/test/xcconfig-service.ts b/test/xcconfig-service.ts index cb81c045f3..a43291f73d 100644 --- a/test/xcconfig-service.ts +++ b/test/xcconfig-service.ts @@ -1,4 +1,3 @@ -import * as temp from "temp"; import { assert } from "chai"; import * as _ from "lodash"; import { XcconfigService } from "../lib/services/xcconfig-service"; @@ -8,7 +7,6 @@ import { IInjector } from "../lib/common/definitions/yok"; import { IReadFileOptions } from "../lib/common/declarations"; // start tracking temporary folders/files -temp.track(); describe("XCConfig Service Tests", () => { const createTestInjector = (): IInjector => { @@ -62,7 +60,7 @@ describe("XCConfig Service Tests", () => { const fs = getFileSystemMock(injector); fs.readText = ( filename: string, - options?: IReadFileOptions | string + options?: IReadFileOptions | string, ): string => { return `// You can add custom settings here // for example you can uncomment the following line to force distribution code signing @@ -87,7 +85,7 @@ describe("XCConfig Service Tests", () => { const fs = getFileSystemMock(injector); fs.readText = ( filename: string, - options?: IReadFileOptions | string + options?: IReadFileOptions | string, ): string => { return `// You can add custom settings here // for example you can uncomment the following line to force distribution code signing @@ -112,7 +110,7 @@ describe("XCConfig Service Tests", () => { const fs = getFileSystemMock(injector); fs.readText = ( filename: string, - options?: IReadFileOptions | string + options?: IReadFileOptions | string, ): string => { return `// DEVELOPMENT_TEAM = YOUR_TEAM_ID; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;`; @@ -131,7 +129,7 @@ describe("XCConfig Service Tests", () => { const fs = getFileSystemMock(injector); fs.readText = ( filename: string, - options?: IReadFileOptions | string + options?: IReadFileOptions | string, ): string => { return ` ASSETCATALOG_COMPILER_APPICON_NAME = ; @@ -152,7 +150,7 @@ describe("XCConfig Service Tests", () => { const fs = getFileSystemMock(injector); fs.readText = ( filename: string, - options?: IReadFileOptions | string + options?: IReadFileOptions | string, ): string => { return `ASSETCATALOG_COMPILER_APPICON_NAME`; }; @@ -169,7 +167,7 @@ describe("XCConfig Service Tests", () => { const fs = getFileSystemMock(injector); fs.readText = ( filename: string, - options?: IReadFileOptions | string + options?: IReadFileOptions | string, ): string => { return `ASSETCATALOG_COMPILER_APPICON_NAME=`; }; @@ -186,7 +184,7 @@ describe("XCConfig Service Tests", () => { const fs = getFileSystemMock(injector); fs.readText = ( filename: string, - options?: IReadFileOptions | string + options?: IReadFileOptions | string, ): string => { return `ASSETCATALOG_COMPILER_APPICON_NAME= `; }; @@ -203,7 +201,7 @@ describe("XCConfig Service Tests", () => { const fs = getFileSystemMock(injector); fs.readText = ( filename: string, - options?: IReadFileOptions | string + options?: IReadFileOptions | string, ): string => { return `ASSETCATALOG_COMPILER_APPICON_NAME= ;`; }; diff --git a/vendor/aab-tool/README.txt b/vendor/aab-tool/README.txt index 347e8774d3..c57c515602 100644 --- a/vendor/aab-tool/README.txt +++ b/vendor/aab-tool/README.txt @@ -1 +1 @@ -Downloaded from https://github.com/google/bundletool/releases/tag/1.15.6 \ No newline at end of file +Downloaded from https://github.com/google/bundletool/releases/tag/1.18.2 \ No newline at end of file diff --git a/vendor/aab-tool/bundletool.jar b/vendor/aab-tool/bundletool.jar index 6d7f4a2d2e..b95c3beb9b 100644 Binary files a/vendor/aab-tool/bundletool.jar and b/vendor/aab-tool/bundletool.jar differ diff --git a/vendor/gradle-plugin/build.gradle b/vendor/gradle-plugin/build.gradle index 1bd9c57cf4..ee6de65efd 100644 --- a/vendor/gradle-plugin/build.gradle +++ b/vendor/gradle-plugin/build.gradle @@ -30,7 +30,7 @@ buildscript { def getDepPlatformDir = { dep -> file("${project.ext.USER_PROJECT_PLATFORMS_ANDROID}/${dep.directory}/$PLATFORMS_ANDROID") } - def computeKotlinVersion = { -> project.hasProperty("kotlinVersion") ? kotlinVersion : "2.0.0" } + def computeKotlinVersion = { -> project.hasProperty("kotlinVersion") ? kotlinVersion : "2.2.20" } def kotlinVersion = computeKotlinVersion() repositories { google() @@ -159,10 +159,10 @@ allprojects { } -def computeCompileSdkVersion = { -> project.hasProperty("compileSdk") ? compileSdk : 34 } -def computeTargetSdkVersion = { -> project.hasProperty("targetSdk") ? targetSdk : 34 as int } +def computeCompileSdkVersion = { -> project.hasProperty("compileSdk") ? compileSdk : 35 } +def computeTargetSdkVersion = { -> project.hasProperty("targetSdk") ? targetSdk : 35 as int } def computeBuildToolsVersion = { -> - project.hasProperty("buildToolsVersion") ? buildToolsVersion : "34.0.0" + project.hasProperty("buildToolsVersion") ? buildToolsVersion : "35.0.1" } android {