diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index acfdb2c6..00000000 --- a/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -locales/ -tests/resources/ diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 7bd46e54..00000000 --- a/.eslintrc +++ /dev/null @@ -1,20 +0,0 @@ -{ - "extends": [ "axway/env-node", "axway/+mocha"], - "parserOptions": { - "ecmaVersion": 2015, - "sourceType": "script" - }, - "rules": { - "no-empty": ["error", { "allowEmptyCatch": true }], - "no-implicit-globals": "off" - }, - "overrides": [ - { - "files": [ "dangerfile.js" ], - "parserOptions": { - "ecmaVersion": 2017, - "sourceType": "module" - }, - }, - ] -} diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..b30cb73b --- /dev/null +++ b/.gitattributes @@ -0,0 +1,44 @@ +# .gitattributes snippet to force users to use same line endings for project. +# +# Handle line endings automatically for files detected as text +# and leave all files detected as binary untouched. +* text=auto + + +# These files are text and should be normalized (Convert crlf => lf) +*.php text +*.css text +*.js text eol=lf +*.json text +*.htm text +*.html text +*.xml text +*.txt text +*.ini text +*.inc text +*.pl text +*.rb text +*.py text +*.scm text +*.sql text +.htaccess text +*.sh text + +# These files are binary and should be left untouched +# (binary is a macro for -text -diff) +*.png binary +*.jpg binary +*.jpeg binary +*.gif binary +*.ico binary +*.mov binary +*.mp4 binary +*.mp3 binary +*.flv binary +*.fla binary +*.swf binary +*.gz binary +*.zip binary +*.7z binary +*.ttf binary +*.pyc binary diff --git a/.github/dependabot.yml b/.github/dependabot.yml index e483caeb..997eb165 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,7 +1,37 @@ version: 2 updates: -- package-ecosystem: npm - directory: "/" - schedule: - interval: weekly - open-pull-requests-limit: 10 + - package-ecosystem: 'npm' + directory: '/' + labels: + - 'dependencies' + schedule: + interval: 'weekly' + day: 'thursday' + time: '02:34' + groups: + production: + dependency-type: 'production' + patterns: + - '*' + update-types: + - 'major' + - 'minor' + - 'patch' + development: + dependency-type: 'development' + patterns: + - '*' + update-types: + - 'major' + - 'minor' + - 'patch' + commit-message: + include: 'scope' + prefix: 'chore(deps): ' + allow: + - dependency-type: 'all' + cooldown: + default-days: 5 + semver-major-days: 30 + semver-minor-days: 7 + semver-patch-days: 3 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index 5c3f022a..00000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,59 +0,0 @@ -name: Build -on: - push: - branches: - - master - - "[0-9]+_[0-9]+_X" - pull_request: -env: - ANDROID_EMULATOR_WAIT_TIME_BEFORE_KILL: 2000 # Default is 20 -jobs: - build: - runs-on: macos-13 - strategy: - matrix: - node: [ '22' ] - name: Node ${{ matrix.node }} - steps: - - uses: actions/checkout@v4 - - - name: Setup node - uses: actions/setup-node@v4 - with: - node-version: ${{ matrix.node }} - - - name: Cache Node.js modules - id: node-cache - uses: actions/cache@v4 - with: - path: node_modules - key: ${{ runner.OS }}-node-modules-${{ hashFiles('package-lock.json') }} - restore-keys: | - ${{ runner.OS }}-node-modules- - ${{ runner.OS }}- - - - run: npm ci - name: Install dependencies - if: steps.node-cache.outputs.cache-hit != 'true' - - - run: npm run lint - name: Lint - - # - name: Build and Test - # uses: reactivecircus/android-emulator-runner@v2 - # with: - # api-level: 29 - # target: playstore - # script: npm run unit-test - # emulator-options: -no-window -noaudio -no-boot-anim - # disable-animations: true # defaulting to true, the commands sent to emulator to do this sometimes run too quickly after boot and cause "adb: device offline" failures - - - run: npm pack - name: Package - if: matrix.node == '22' - - - uses: actions/upload-artifact@v4 - if: matrix.node == '22' - with: - name: node-titanium-sdk - path: node-titanium-sdk-*.tgz diff --git a/.github/workflows/cla.yaml b/.github/workflows/cla.yaml index bbfcc73f..d660e1da 100644 --- a/.github/workflows/cla.yaml +++ b/.github/workflows/cla.yaml @@ -8,6 +8,6 @@ jobs: name: Verify contributor steps: - - uses: tidev/tidev-cla-action@v2 - with: - repo-token: ${{ secrets.GITHUB_TOKEN }} + - uses: tidev/tidev-cla-action@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index d399722d..0ff9b256 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,7 +1,8 @@ name: Publish + on: release: - types: [ created ] + types: [created] jobs: publish: @@ -9,54 +10,54 @@ jobs: name: Publish steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Setup node - uses: actions/setup-node@v4 - with: - node-version: 22 - registry-url: 'https://registry.npmjs.org' - - - name: Install dependencies - run: npm ci - if: steps.node-cache.outputs.cache-hit != 'true' - - - name: Publish to npm - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - run: npm publish --tag ${{ github.event.release.prerelease && 'next' || 'latest' }} - - - name: Get package.json info - id: get-package-info - run: | - echo "name=$(node -p "require('./package.json').name")" >> $GITHUB_OUTPUT - echo "homepage=$(node -p "require('./package.json').homepage")" >> $GITHUB_OUTPUT - echo "version=$(node -p "require('./package.json').version")" >> $GITHUB_OUTPUT - - - name: Send Slack notification - uses: slackapi/slack-github-action@v2.1.1 - with: - method: chat.postMessage - token: ${{ secrets.SLACK_BOT_TOKEN }} - payload: | - { - "channel": "${{ secrets.SLACK_CHANNEL_ID }}", - "text": "Published ${{ steps.get-package-info.outputs.name }}@${{ steps.get-package-info.outputs.version }}", - "blocks": [ - { - "type": "header", - "text": { - "type": "plain_text", - "text": "Published ${{ steps.get-package-info.outputs.name }}@${{ steps.get-package-info.outputs.version }}" - } - }, - { - "type": "section", - "text": { - "type": "mrkdwn", - "text": "${{ steps.get-package-info.outputs.homepage }}/releases/tag/v${{ steps.get-package-info.outputs.version }}" + - name: Checkout repository + uses: actions/checkout@v6 + + - name: Setup node + uses: actions/setup-node@v6 + with: + node-version: 24 + registry-url: 'https://registry.npmjs.org' + + - name: Install dependencies + run: npm ci + if: steps.node-cache.outputs.cache-hit != 'true' + + - name: Publish to npm + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + run: npm publish --tag ${{ github.event.release.prerelease && 'next' || 'latest' }} + + - name: Get package.json info + id: get-package-info + run: | + echo "name=$(node -p "require('./package.json').name")" >> $GITHUB_OUTPUT + echo "homepage=$(node -p "require('./package.json').homepage")" >> $GITHUB_OUTPUT + echo "version=$(node -p "require('./package.json').version")" >> $GITHUB_OUTPUT + + - name: Send Slack notification + uses: slackapi/slack-github-action@v2.1.1 + with: + method: chat.postMessage + token: ${{ secrets.SLACK_BOT_TOKEN }} + payload: | + { + "channel": "${{ secrets.SLACK_CHANNEL_ID }}", + "text": "Published ${{ steps.get-package-info.outputs.name }}@${{ steps.get-package-info.outputs.version }}", + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Published ${{ steps.get-package-info.outputs.name }}@${{ steps.get-package-info.outputs.version }}" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "${{ steps.get-package-info.outputs.homepage }}/releases/tag/v${{ steps.get-package-info.outputs.version }}" + } } - } - ] - } + ] + } diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000..f7484381 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,149 @@ +name: Tests + +on: + pull_request: + push: + branches: + - main + - '[0-9]+_[0-9]+_X' + +concurrency: + cancel-in-progress: true + group: ${{ github.workflow }}-${{ github.ref }} + +jobs: + checks: + name: Check + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v6 + + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + version: latest + + - name: Use Node.js 24 + uses: actions/setup-node@v6 + with: + node-version: 24 + + - name: Install dependencies + shell: bash + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + run: pnpm install --frozen-lockfile --ignore-scripts + + - name: Check + run: pnpm check + + node-test: + name: Test on Node.js ${{ matrix.node }} and ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + node: [20, 22, 24] + os: [ubuntu-latest, windows-latest, macos-latest] + + steps: + - name: Checkout repository + uses: actions/checkout@v6 + + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + version: latest + + - name: Use Node.js ${{ matrix.node }} + uses: actions/setup-node@v6 + with: + node-version: ${{ matrix.node }} + + - name: Install dependencies + shell: bash + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + run: pnpm install --frozen-lockfile --ignore-scripts + + - name: Build + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + run: pnpm build + + - name: Run tests + run: pnpm coverage + + bun-test: + name: Test on Bun + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + + steps: + - name: Checkout repository + uses: actions/checkout@v6 + + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + version: latest + + - name: Install Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Install dependencies + shell: bash + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + run: pnpm install --frozen-lockfile --ignore-scripts + + - name: Build + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + run: pnpm build + + - name: Run tests on Bun + run: pnpm test:bun + + deno-test: + name: Test on Deno + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + + steps: + - name: Checkout repository + uses: actions/checkout@v6 + + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + version: latest + + - name: Install Deno + uses: denoland/setup-deno@v2 + with: + deno-version: latest + + - name: Install dependencies + shell: bash + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + run: pnpm install --frozen-lockfile --ignore-scripts + + - name: Build + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + run: pnpm build + + - name: Run tests on Deno + run: pnpm test:deno + diff --git a/.gitignore b/.gitignore index 2a735a05..1744cbd5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,9 @@ -junit_report.xml -node_modules/ -.DS_Store -coverage/ -.nyc_output/ \ No newline at end of file +._* +.DS_Store* +coverage +dist +node_modules +tmp +.pnpm-debug.log +*.tsbuildinfo +*.tgz diff --git a/.husky/.gitignore b/.husky/.gitignore deleted file mode 100644 index 31354ec1..00000000 --- a/.husky/.gitignore +++ /dev/null @@ -1 +0,0 @@ -_ diff --git a/.husky/commit-msg b/.husky/commit-msg deleted file mode 100755 index 49ef33e4..00000000 --- a/.husky/commit-msg +++ /dev/null @@ -1,5 +0,0 @@ - -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - -npx --no-install commitlint --edit $1 diff --git a/.husky/pre-commit b/.husky/pre-commit deleted file mode 100755 index d37daa07..00000000 --- a/.husky/pre-commit +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - -npx --no-install lint-staged diff --git a/.npmignore b/.npmignore deleted file mode 100644 index ca599ebc..00000000 --- a/.npmignore +++ /dev/null @@ -1,13 +0,0 @@ -tests/ -Jenkinsfile -yarn.lock -junit_report.xml -coverage/ -.nyc_output/ -dangerfile.js -Jenkinsfile -.eslintrc -.eslintignore -.gitignore -.github/ -.husky/ diff --git a/.oxlintrc.json b/.oxlintrc.json new file mode 100644 index 00000000..d0d568c5 --- /dev/null +++ b/.oxlintrc.json @@ -0,0 +1,12 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "env": { + "node": true, + "es2024": true + }, + "ignorePatterns": [ + "coverage/**", + "dist/**", + "test/resources/**" + ] +} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..2b53020f --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,9 @@ +# 7.0.0 + +- BREAKING CHANGE: Drop Node.js 18 and older +- BREAKING CHNAGE: Refactor to ESM +- BREAKING CHANGE: Several APIs removed or now async + - `validatePlatformOptions()` now async +- Refactored to TypeScript +- Consolidated `androidlib`, `ioslib`, `jdklib`, `node-appc`, `titaniumlib` +- Updated NPM dependencies diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..ad68abac --- /dev/null +++ b/LICENSE @@ -0,0 +1,222 @@ +====================================== +Titanium CLI +Copyright TiDev, Inc. 04/07/2022-Present +====================================== + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + (or the full text of the license is below) + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/README.md b/README.md index 8580b069..2c726568 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,4 @@ -## Titanium-SDK - -[![Greenkeeper badge](https://badges.greenkeeper.io/appcelerator/node-titanium-sdk.svg)](https://greenkeeper.io/) +## node-titanium-sdk This is the Titanium SDK common library used for all SDK specific CLI commands. diff --git a/bunfig.toml b/bunfig.toml new file mode 100644 index 00000000..fe199858 --- /dev/null +++ b/bunfig.toml @@ -0,0 +1,2 @@ +[test] +root = "test" diff --git a/dangerfile.js b/dangerfile.js deleted file mode 100644 index de93c78d..00000000 --- a/dangerfile.js +++ /dev/null @@ -1,20 +0,0 @@ -/* global fail */ - -// requires -const eslint = require('@seadub/danger-plugin-eslint').default; -const junit = require('@seadub/danger-plugin-junit').default; -const dependencies = require('@seadub/danger-plugin-dependencies').default; - -async function main() { - await Promise.all([ - eslint(), - junit({ pathToReport: './junit_report.xml' }), - dependencies({ type: 'npm' }), - ]); -} -main() - .then(() => process.exit(0)) - .catch(err => { - fail(err.toString()); - process.exit(1); - }); diff --git a/dprint.json b/dprint.json new file mode 100644 index 00000000..62a86d46 --- /dev/null +++ b/dprint.json @@ -0,0 +1,37 @@ +{ + "typescript": { + "arguments.trailingCommas": "never", + "lineWidth": 90, + "parameters.trailingCommas": "never", + "quoteStyle": "preferSingle", + "trailingCommas": "onlyMultiLine", + "useTabs": true + }, + "json": { + }, + "markdown": { + }, + "toml": { + }, + "malva": { + }, + "markup": { + }, + "yaml": { + "quotes": "preferSingle" + }, + "excludes": [ + "lib", + "**/node_modules", + "**/*-lock.json" + ], + "plugins": [ + "https://plugins.dprint.dev/typescript-0.95.12.wasm", + "https://plugins.dprint.dev/json-0.21.0.wasm", + "https://plugins.dprint.dev/markdown-0.20.0.wasm", + "https://plugins.dprint.dev/toml-0.7.0.wasm", + "https://plugins.dprint.dev/g-plane/malva-v0.15.0.wasm", + "https://plugins.dprint.dev/g-plane/markup_fmt-v0.24.0.wasm", + "https://plugins.dprint.dev/g-plane/pretty_yaml-v0.5.1.wasm" + ] +} diff --git a/lefthook.yml b/lefthook.yml new file mode 100644 index 00000000..e95557c2 --- /dev/null +++ b/lefthook.yml @@ -0,0 +1,6 @@ +pre-commit: + parallel: true + commands: + check: + glob: '*.{js,ts,jsx,tsx}' + run: pnpm format && pnpm check && git update-index --again diff --git a/lib/adb.js b/lib/adb.js index 8168114f..7c16b0e4 100644 --- a/lib/adb.js +++ b/lib/adb.js @@ -1,40 +1,18 @@ -/** - * A library for interacting with the Android Debug Bridge (adb). - * - * This library directly communicates over TCP/IP with the adb server using the - * service commands found here: - * {@link https://android.googlesource.com/platform/system/core/+/master/adb/SERVICES.TXT} - * - * @module adb - * - * @copyright - * Copyright (c) 2009-2017 by Appcelerator, Inc. All Rights Reserved. - * - * @license - * Licensed under the terms of the Apache Public License - * Please see the LICENSE included with this distribution for details. - */ -'use strict'; - -const appc = require('node-appc'); -const __ = appc.i18n(__dirname).__; -const async = require('async'); -const fs = require('fs-extra'); -const net = require('net'); -const path = require('path'); -const spawn = require('child_process').spawn; // eslint-disable-line security/detect-child-process -const StreamSplitter = require('stream-splitter'); - -require('colors'); +import fs from 'node:fs'; +import net from 'node:net'; +import path from 'node:path'; +import StreamSplitter from 'stream-splitter'; +import { expand } from './util/expand.js'; +import { detect as detectAndroid } from './android.js'; +import { spawn } from 'node:child_process'; +import { EmulatorManager } from './emulator.js'; let connCounter = 0; -module.exports = ADB; - /** * Debug flag that is enabled via the android.debugadb setting. */ -var DEBUG = false; +let DEBUG = false; /** * @constant @@ -70,848 +48,769 @@ const BUFFER_UNTIL_CLOSE = 3; */ const WAIT_FOR_RESPONSE = 4; -/** - * @typedef {Function} ConfigGetFunction - * @param {string} key key of the value to retrieve - * @param {*} [defaultValue=undefined] default value to return if not in config - * @returns {*} - */ +export class Connection { + /** + * Creates an Connection object. + * @param {ADB} adb - The ADB instance + */ + constructor(adb) { + this.adb = adb; + this.port = adb.config && adb.config.get('android.adb.port') || 5037; + this.socket = null; + this.state = DO_NOTHING; + this.connNum = ++connCounter; + } -/** - * CLI Config - * @typedef {Object} Config - * @property {ConfigGetFunction} get method to retrieve config values - */ + /** + * Executes a command. If there is no connection to the ADB server, it will + * connect to it, then run the command. + * @param {String} cmd - The command to run + * @param {Object} [opts] - Execute options + * @param {Boolean} [opts.bufferUntilClose=false] - Buffers all received data until ADB closes the connection + */ + exec(cmd, opts) { + return new Promise((resolve, reject) => { + let socket = this.socket; + const doSend = !!socket; + let buffer = null; + let len = null; + + const send = () => { + if (DEBUG) { + console.log(`[${this.connNum}] SENDING ${cmd}`); + } + conn.state = WAIT_FOR_COMMAND_RESULT; + buffer = null; + socket.write(('0000' + cmd.length.toString(16)).substr(-4).toUpperCase() + cmd); + }; -/** - * Creates an Connection object. - * @class - * @classdesc Manages the connection and communcations with the ADB server. - * @constructor - * @param {ADB} adb - The ADB instance - */ -function Connection(adb) { - this.adb = adb; - this.port = adb.config && adb.config.get('android.adb.port') || 5037; - this.socket = null; - this.state = DO_NOTHING; - this.connNum = ++connCounter; -} + this.opts = opts || {}; -/** - * Executes a command. If there is no connection to the ADB server, it will - * connect to it, then run the command. - * @param {String} cmd - The command to run - * @param {Connection~execCallback} callback - A function to call when the command is finished executing - * @param {Object} [opts] - Execute options - * @param {Boolean} [opts.bufferUntilClose=false] - Buffers all received data until ADB closes the connection - */ -Connection.prototype.exec = function exec(cmd, callback, opts) { - var conn = this, - socket = this.socket, - doSend = !!socket, - buffer = null, - len = null; - function send () { - DEBUG && console.log('[' + conn.connNum + '] SENDING ' + cmd); - conn.state = WAIT_FOR_COMMAND_RESULT; - buffer = null; - socket.write(('0000' + cmd.length.toString(16)).substr(-4).toUpperCase() + cmd); - } - - this.opts = opts || {}; + if (!socket) { + socket = this.socket = net.connect({ + port: this.port, + family: 4 + }, () => { + if (DEBUG) { + console.log(`[${this.connNum}] CONNECTED`); + } - if (!socket) { - socket = this.socket = net.connect({ - port: this.port, - family: 4 - }, function () { - DEBUG && console.log('[' + this.connNum + '] CONNECTED'); + // TIMOB-24906: in some circumstances sending a command to adb right away + // can yield no response. So we allow 200ms before sending the initial command + setTimeout(() => send(), 200); + }); - // TIMOB-24906: in some circumstances sending a command to adb right away - // can yield no response. So we allow 200ms before sending the initial command - setTimeout(function () { - send(); - }, 200); - }.bind(this)); - - socket.setKeepAlive(true); - socket.setNoDelay(true); - } else { - DEBUG && console.log('[' + this.connNum + '] SOCKET ALREADY OPEN, RE-LISTENING AND SENDING NEW COMMAND "' + cmd + '"'); - socket.removeAllListeners('data'); - socket.removeAllListeners('end'); - socket.removeAllListeners('error'); - } + socket.setKeepAlive(true); + socket.setNoDelay(true); + } else { + if (DEBUG) { + console.log(`[${this.connNum}] SOCKET ALREADY OPEN, RE-LISTENING AND SENDING NEW COMMAND "${cmd}"`); + } + socket.removeAllListeners('data'); + socket.removeAllListeners('end'); + socket.removeAllListeners('error'); + } - socket.on('data', function (data) { - DEBUG && console.log('[' + this.connNum + '] RECEIVED ' + data.length + ' BYTES (state=' + this.state + ') (cmd=' + cmd + ')'); + socket.on('data', (data) => { + if (DEBUG) { + console.log(`[${this.connNum}] RECEIVED ${data.length} BYTES (state=${this.state}) (cmd=${cmd})`); + } - if (this.state === DO_NOTHING) { - return; - } + if (this.state === DO_NOTHING) { + return; + } - if (!buffer || buffer.length === 0) { - buffer = data; - } else { - buffer += data; - } + if (!buffer || buffer.length === 0) { + buffer = data; + } else { + buffer += data; + } - DEBUG && console.log('[' + this.connNum + '] BUFFER LENGTH = ' + buffer.length); + if (DEBUG) { + console.log(`[${this.connNum}] BUFFER LENGTH = ${buffer.length}`); + } - while (1) { - switch (this.state) { - case WAIT_FOR_COMMAND_RESULT: - const result = buffer.slice(0, 4).toString(); - DEBUG && console.log('[' + this.connNum + '] RESULT ' + result); - if (!/^OKAY|FAIL$/.test(result)) { - callback(new Error(__('Unknown adb result "%s"', result))); - return; - } - buffer = buffer.slice(4); - - // did we fail? - if (result === 'FAIL') { - len = 0; - if (buffer.length >= 4) { - len = parseInt(buffer.slice(0, 4), 16); - isNaN(len) && (len = 0); + while (true) { + switch (this.state) { + case WAIT_FOR_COMMAND_RESULT: + const result = buffer.slice(0, 4).toString(); + if (DEBUG) { + console.log(`[${this.connNum}] RESULT "${result}"`); + } + if (!/^OKAY|FAIL$/.test(result)) { + reject(new Error(`Unknown adb result "${result}"`)); + return; + } buffer = buffer.slice(4); - } - len && (buffer = buffer.slice(0, len)); - DEBUG && console.log('[' + this.connNum + '] ERROR! ' + buffer.toString()); - this.state = DO_NOTHING; - - // copy the buffer into an error so we can free up the buffer - var err = new Error(buffer.toString()); - buffer = null; - callback(err); - conn.end(); - return; - } - // if there's no more data, then we're done - if (buffer.length === 0) { - if (this.opts.bufferUntilClose) { - DEBUG && console.log('[' + this.connNum + '] DONE, SETTING STATE TO BUFFER_UNTIL_CLOSE'); - this.state = BUFFER_UNTIL_CLOSE; - } else if (this.opts.waitForResponse) { - DEBUG && console.log('[' + this.connNum + '] DONE, SETTING STATE TO WAIT_FOR_NEW_DATA'); - this.state = WAIT_FOR_NEW_DATA; - } else { - DEBUG && console.log('[' + this.connNum + '] DONE, SETTING STATE TO DO_NOTHING'); - this.state = DO_NOTHING; - callback(); - } - return; - } + // did we fail? + if (result === 'FAIL') { + len = 0; + if (buffer.length >= 4) { + len = Number.parseInt(buffer.slice(0, 4), 16); + if (Number.isNaN(len)) { + len = 0; + } + buffer = buffer.slice(4); + } + if (len) { + buffer = buffer.slice(0, len); + } + if (DEBUG) { + console.log(`[${this.connNum}] ERROR! "${buffer.toString()}"`); + } + this.state = DO_NOTHING; + + // copy the buffer into an error so we can free up the buffer + const err = new Error(buffer.toString()); + buffer = null; + reject(err); + conn.end(); + return; + } - // if we aren't expecting the data to have a length (i.e. the shell command), - // then buffer immediately - if (this.opts.noLength) { - DEBUG && console.log('[' + this.connNum + '] PUSHING REMAINING DATA INTO BUFFER AND SETTING STATE TO BUFFER_UNTIL_CLOSE'); - this.state = BUFFER_UNTIL_CLOSE; - return; - } + // if there's no more data, then we're done + if (buffer.length === 0) { + if (this.opts.bufferUntilClose) { + if (DEBUG) { + console.log(`[${this.connNum}] DONE, SETTING STATE TO BUFFER_UNTIL_CLOSE`); + } + this.state = BUFFER_UNTIL_CLOSE; + } else if (this.opts.waitForResponse) { + if (DEBUG) { + console.log(`[${this.connNum}] DONE, SETTING STATE TO WAIT_FOR_NEW_DATA`); + } + this.state = WAIT_FOR_NEW_DATA; + } else { + if (DEBUG) { + console.log(`[${this.connNum}] DONE, SETTING STATE TO DO_NOTHING`); + } + this.state = DO_NOTHING; + resolve(); + } + return; + } - this.state = WAIT_FOR_NEW_DATA; - len = null; // we don't know the length yet - // purposely fall through - - case WAIT_FOR_NEW_DATA: - // find how many bytes we are waiting for - if (len === null && buffer.length >= 4) { - len = parseInt(buffer.slice(0, 4), 16); - DEBUG && console.log('[' + this.connNum + '] DETERMINING EXPECTED LENGTH...'); - isNaN(len) && (len = null); - buffer = buffer.slice(4); - } + // if we aren't expecting the data to have a length (i.e. the shell command), + // then buffer immediately + if (this.opts.noLength) { + if (DEBUG) { + console.log(`[${this.connNum}] PUSHING REMAINING DATA INTO BUFFER AND SETTING STATE TO BUFFER_UNTIL_CLOSE`); + } + this.state = BUFFER_UNTIL_CLOSE; + return; + } - // if there's no length, then let's fire the callback or wait until the socket closes - if (len === 0) { - DEBUG && console.log('[' + this.connNum + '] NO EXPECTED LENGTH, FIRING CALLBACK'); - callback(); - buffer = null; - len = null; - return; - } else if (len === null) { - DEBUG && console.log('[' + this.connNum + '] NO EXPECTED LENGTH'); - if (this.opts.bufferUntilClose) { - DEBUG && console.log('[' + this.connNum + '] BUFFERING DATA UNTIL SOCKET CLOSE'); - this.state = BUFFER_UNTIL_CLOSE; - } else { - buffer = null; - len = null; this.state = WAIT_FOR_NEW_DATA; - callback(); - } - return; - } + len = null; // we don't know the length yet + // purposely fall through + + case WAIT_FOR_NEW_DATA: + // find how many bytes we are waiting for + if (len === null && buffer.length >= 4) { + len = Number.parseInt(buffer.slice(0, 4), 16); + if (DEBUG) { + console.log(`[${this.connNum}] DETERMINING EXPECTED LENGTH...`); + } + if (Number.isNaN(len)) { + len = null; + } + buffer = buffer.slice(4); + } - DEBUG && console.log('[' + this.connNum + '] EXPECTED LENGTH = ' + len); - DEBUG && console.log('[' + this.connNum + '] BUFFER LENGTH = ' + buffer.length); - - // do we have enough bytes? - if (buffer.length >= len) { - // yup - const result = buffer.slice(0, len); - buffer = buffer.slice(len); - DEBUG && console.log('[' + this.connNum + '] SUCCESS AND JUST THE RIGHT AMOUNT OF BYTES (' + len + ') WITH ' + buffer.length + ' BYTES LEFT'); - if (this.opts.bufferUntilClose) { - this.state = BUFFER_UNTIL_CLOSE; - } else { - this.state = WAIT_FOR_NEW_DATA; - len = null; - buffer = null; - callback(null, result); - } - } else { - // we need more data! - DEBUG && console.log('[' + this.connNum + '] WAITING FOR MORE DATA'); - } - return; + // if there's no length, then let's fire the callback or wait until the socket closes + if (len === 0) { + if (DEBUG) { + console.log(`[${this.connNum}] NO EXPECTED LENGTH, FIRING CALLBACK`); + } + resolve(); + buffer = null; + len = null; + return; + } else if (len === null) { + if (DEBUG) { + console.log(`[${this.connNum}] NO EXPECTED LENGTH`); + } + if (this.opts.bufferUntilClose) { + if (DEBUG) { + console.log(`[${this.connNum}] BUFFERING DATA UNTIL SOCKET CLOSE`); + } + this.state = BUFFER_UNTIL_CLOSE; + } else { + buffer = null; + len = null; + this.state = WAIT_FOR_NEW_DATA; + resolve(); + } + return; + } - case BUFFER_UNTIL_CLOSE: - // we've already added data to the buffer - return; - case WAIT_FOR_RESPONSE: - DEBUG && console.log('[' + this.connNum + '] DONE, RECEIVED RESPONSE'); - this.state = DO_NOTHING; - callback(null, buffer); - return; - } - } - }.bind(this)); + if (DEBUG) { + console.log(`[${this.connNum}] EXPECTED LENGTH = ${len}`); + console.log(`[${this.connNum}] BUFFER LENGTH = ${buffer.length}`); + } - socket.on('end', function () { - DEBUG && console.log('[' + this.connNum + '] SOCKET CLOSED BY SERVER', (buffer && buffer.length)); - if (buffer) { - if (!this.opts.waitForResponse) { - callback(null, buffer); - } - buffer = null; - } - this.end(); - }.bind(this)); + // do we have enough bytes? + if (buffer.length >= len) { + // yup + const result = buffer.slice(0, len); + buffer = buffer.slice(len); + if (DEBUG) { + console.log(`[${this.connNum}] SUCCESS AND JUST THE RIGHT AMOUNT OF BYTES (${len}) WITH ${buffer.length} BYTES LEFT`); + } + if (this.opts.bufferUntilClose) { + this.state = BUFFER_UNTIL_CLOSE; + } else { + this.state = WAIT_FOR_NEW_DATA; + len = null; + buffer = null; + resolve(result); + } + } else { + // we need more data! + if (DEBUG) { + console.log(`[${this.connNum}] WAITING FOR MORE DATA`); + } + } + return; - socket.on('error', function (err) { - this.end(); + case BUFFER_UNTIL_CLOSE: + // we've already added data to the buffer + return; - if (!err.code || err.code !== 'ECONNREFUSED') { - return callback(err); - } + case WAIT_FOR_RESPONSE: + if (DEBUG) { + console.log(`[${this.connNum}] DONE, RECEIVED RESPONSE`); + } + this.state = DO_NOTHING; + resolve(buffer); + return; + } + } + }); - this.adb.startServer(function (code) { - if (code) { - callback(new Error(__('Unable to start Android Debug Bridge server (exit code %s)', code))); - } else { - this.exec(cmd, callback, this.opts); - } - }.bind(this)); - }.bind(this)); + socket.on('end', () => { + if (DEBUG) { + console.log(`[${this.connNum}] SOCKET CLOSED BY SERVER ${buffer && buffer.length}`); + } + if (buffer) { + if (!this.opts.waitForResponse) { + resolve(buffer); + } + buffer = null; + } + this.end(); + }); - doSend && send(); -}; + socket.on('error', (err) => { + this.end(); -/** - * Closes the connection and resets the socket and state. - */ -Connection.prototype.end = function end() { - if (this.socket) { - try { - this.socket.end(); - } catch (ex) { - // ignore - } - this.socket = null; + if (!err.code || err.code !== 'ECONNREFUSED') { + return reject(err); + } + + this.adb.startServer() + .then(() => this.exec(cmd, this.opts)) + .then(resolve) + .catch(reject); + }); + + if (doSend) { + send(); + } + }); } - this.state = DO_NOTHING; -}; -/** - * Creates an ADB object. - * @class - * @classdesc Provides methods to interact with the Android Debug Bridge (ADB). - * @constructor - * @param {Config} [config] cli config - */ -function ADB(config) { - this.config = config; - if (config && config.get('android.debugadb', false)) { - DEBUG = true; + /** + * Closes the connection and resets the socket and state. + */ + end() { + if (this.socket) { + try { + this.socket.end(); + } catch { + // ignore + } + this.socket = null; + } + this.state = DO_NOTHING; } } -/** - * Returns the version of the ADB server. - * @param {ADB~versionCallback} callback - A function to call when the version has been retreived - */ -ADB.prototype.version = function version(callback) { - const conn = new Connection(this); - conn.exec('host:version', function (err, data) { - if (err) { - return callback(err); +export class ADB { + /** + * Creates an ADB object. + * @class + * @classdesc Provides methods to interact with the Android Debug Bridge (ADB). + * @constructor + * @param {Config} [config] cli config + */ + constructor(config) { + this.config = config; + if (config?.get('android.debugadb', false)) { + DEBUG = true; } + } + + /** + * Returns the version of the ADB server. + */ + async version() { + const conn = new Connection(this); + const data = await conn.exec('host:version'); if (data === null || data === undefined) { - return callback(new Error(`Unable to get adb version, received value ${data}`)); + throw new Error(`Unable to get adb version, received value ${data}`); + } + const version = Number.parseInt(data, 16); + if (Number.isNaN(version)) { + throw new Error(`Unable to get adb version, received value ${data}`); } - // Check if parseInt result is NaN? - callback(null, '1.0.' + parseInt(data, 16)); - }); -}; + return `1.0.${version}`; + } -/** - * Parses the device list, then fetches additional device info. - * @param {ADB} adb - The ADB instance - * @param {Function} callback - A function to call when the devices have been parsed - * @param {Error} err - An error if the list devices call failed - * @param {Buffer|String} data - The buffer containing the list of devices - */ -function parseDevices(adb, callback, err, data) { - if (err) { - callback(err); - return; + async devices() { + const data = await new Connection(this).exec('host:devices', { waitForResponse: true }); + return this.parseDevices(data); } - var EmulatorManager = require('./emulator'), - emuMgr = new EmulatorManager(adb.config); + /** + * Parses the device list, then fetches additional device info. + * @param {Buffer|String} data - The buffer containing the list of devices + */ + async parseDevices(data) { + const emuMgr = new EmulatorManager(this.config); - async.series((data || '').toString().split('\n').map(function (line) { - return function (done) { - var p = line.split(/\s+/); + const results = await Promise.all(data.toString().split('\n').map(async line => { + const p = line.split(/\s+/); if (p.length <= 1) { - return done(); + return; } - var info = { + const info = { id: p.shift(), state: p.shift() }; if (info.state !== 'device') { - emuMgr.isEmulator(info.id, function (err, emu) { + emuMgr.isEmulator(info.id, (_err, emu) => { info.emulator = emu || false; done(null, info); }); return; } - adb.shell(info.id, 'getprop', function (err, data) { - if (!err && data) { - const re = /^\[([^\]]*)\]: \[(.*)\]\s*$/; - data.toString().split('\n').forEach(function (line) { - const m = line.match(re); - if (m) { - const key = m[1]; - const value = m[2]; - - switch (key) { - case 'ro.product.model.internal': - info.modelnumber = value; - break; - case 'ro.build.version.release': - case 'ro.build.version.sdk': - case 'ro.product.brand': - case 'ro.product.device': - case 'ro.product.manufacturer': - case 'ro.product.model': - case 'ro.product.name': - info[key.split('.').pop()] = value; - break; - default: - if (key.indexOf('ro.product.cpu.abi') === 0) { - Array.isArray(info.abi) || (info.abi = []); - value.split(',').forEach(function (abi) { - abi = abi.trim(); - if (abi && info.abi.indexOf(abi) === -1) { - info.abi.push(abi); + return new Promise((resolve) => { + this.shell(info.id, 'getprop', (err, data) => { + if (!err && data) { + const re = /^\[([^\]]*)\]: \[(.*)\]\s*$/; + data.toString().split('\n').forEach(line => { + const m = line.match(re); + if (m) { + const key = m[1]; + const value = m[2]; + + switch (key) { + case 'ro.product.model.internal': + info.modelnumber = value; + break; + case 'ro.build.version.release': + case 'ro.build.version.sdk': + case 'ro.product.brand': + case 'ro.product.device': + case 'ro.product.manufacturer': + case 'ro.product.model': + case 'ro.product.name': + info[key.split('.').pop()] = value; + break; + default: + if (key.startsWith('ro.product.cpu.abi')) { + if (!Array.isArray(info.abi)) { + info.abi = []; } - }); - } - break; + for (const abi of value.split(',').map(abi => abi.trim())) { + if (abi && !info.abi.includes(abi)) { + info.abi.push(abi); + } + } + } + break; + } } - } - }); - } + }); + } - emuMgr.isEmulator(info.id, function (err, emu) { - info.emulator = emu || false; - done(null, info); + emuMgr.isEmulator(info.id, (_err, emu) => { + info.emulator = emu || false; + resolve(info); + }); }); }); - }; - }), function (err, results) { - callback(null, results.filter(device => !!device)); - }); -} + })); -/** - * Retrieves a list of all devices and emulators. - * @param {ADB~devicesCallback} callback - A function that is called with the list of devices - */ -ADB.prototype.devices = function devices(callback) { - new Connection(this).exec('host:devices', function (err, data) { - parseDevices(this, callback, err, data); - }.bind(this), { waitForResponse: true }); -}; + return results.filter(Boolean); + } -/** - * Retrieves a list of all devices and emulators, then listens for changes to devices. - * @param {ADB~trackDevicesCallback} callback - A function that is continually called with the list of devices - * @returns {Connection} The connection so you can end() it. - */ -ADB.prototype.trackDevices = function trackDevices(callback) { - var conn = new Connection(this), - _t = this, - queue = async.queue(function (task, next) { - parseDevices(_t, function (err, results) { + /** + * Retrieves a list of all devices and emulators, then listens for changes to devices. + * @param {ADB~trackDevicesCallback} callback - A function that is continually called with the list of devices + * @returns {Connection} The connection so you can end() it. + */ + trackDevices(callback) { + const conn = new Connection(this); + + let isProcessing = false; + const taskQueue = []; + + const processNext = () => { + if (isProcessing || taskQueue.length === 0) { + return; + } + + isProcessing = true; + const task = taskQueue.shift(); + + this.parseDevices((err, results) => { callback(err, results); - next(); + isProcessing = false; + processNext(); }, task.err, task.data); - }, 1); + }; - conn.exec('host:track-devices', function (err, data) { - queue.push({ err: err, data: data }); - }, { waitForResponse: true }); + conn.exec('host:track-devices', (err, data) => { + taskQueue.push({ err, data }); + processNext(); + }, { waitForResponse: true }); - return conn; -}; + return conn; + } -/** - * Helper function that loads the Android detection library and detects the adb settings. - * @param {Config} config CLI config - * @param {Function} callback async callback - */ -function androidDetect(config, callback) { - (require('./android')).detect(config, null, function (results) { - if (results.sdk && results.sdk.executables.adb) { - callback(null, results); - } else { - callback(new Error(__('Android SDK not found'))); + /** + * Attempts to find the adb executable, then start the adb server. + */ + async startServer() { + const androidEnv = await detectAndroid(this.config); + if (!androidEnv.sdk?.executables?.adb) { + throw new Error('Android SDK not found'); } - }); -} + const child = spawn(androidEnv.sdk.executables.adb, 'start-server', { stdio: ['ignore', 'ignore', 'pipe'] }); + let stderr = ''; + child.stderr.on('data', (data) => { + stderr += data.toString(); + }); + return new Promise((resolve, reject) => { + child.on('close', (code) => { + if (code) { + reject(new Error(`Failed to start ADB (code ${code}): ${stderr}`)); + } else { + resolve(); + } + }); + }); + } -/** - * Attempts to find the adb executable, then start the adb server. - * @param {ADB~startServerCallback} callback - A function that is called when the server has started - */ -ADB.prototype.startServer = function startServer(callback) { - androidDetect(this.config, function (err, results) { - if (err) { - return callback(err); + /** + * Attempts to find the adb executable, then stop the adb server. + */ + async stopServer() { + const androidEnv = await detectAndroid(this.config); + if (!androidEnv.sdk?.executables?.adb) { + throw new Error('Android SDK not found'); } - appc.subprocess.run(results.sdk.executables.adb, 'start-server', function (code, out, err) { - callback(code ? new Error(__('Failed to start ADB (code %s): %s', code, err)) : null); + const child = spawn(androidEnv.sdk.executables.adb, 'kill-server', { stdio: 'ignore' }); + return new Promise((resolve, reject) => { + child.on('close', (code) => { + if (code) { + reject(new Error(`Failed to stop ADB (code ${code})`)); + } else { + resolve(); + } + }); }); - }); -}; + } -/** - * Attempts to find the adb executable, then stop the adb server. - * @param {ADB~stopServerCallback} callback - A callback that is fired when the server has stopped - */ -ADB.prototype.stopServer = function stopServer(callback) { - androidDetect(this.config, function (err, results) { - if (err) { - return callback(err); - } - appc.subprocess.run(results.sdk.executables.adb, 'kill-server', function (code, _out, _err) { - callback(code); + /** + * Runs the specified command on the Android emulator/device. Note that ADB + * converts all \n to \r\n. So data will probably be larger than the original + * output on the device. + * @param {String} deviceId - android emulator id (of form 'android-5554', gotten from emulator.id after starting it (not to be confused with ids from emulator.detect listing)) + * @param {String} cmd - The command to run + */ + async shell(deviceId, cmd) { + const conn = new Connection(this); + return new Promise((resolve, reject) => { + conn.exec(`host:transport:${deviceId}`, (err, _data) => { + if (err) { + reject(err); + } else { + conn.exec(`shell:${cmd.replace(/^shell:/, '')}`, (err, result) => { + if (err) { + reject(err); + } else { + resolve(result); + } + }, { bufferUntilClose: true, noLength: true }); + } + }); }); - }); -}; + } -/** - * Runs the specified command on the Android emulator/device. Note that ADB - * converts all \n to \r\n. So data will probably be larger than the original - * output on the device. - * @param {String} deviceId - android emulator id (of form 'android-5554', gotten from emulator.id after starting it (not to be confused with ids from emulator.detect listing)) - * @param {String} cmd - The command to run - * @param {ADB~shellCallback} callback - A callback that is fired when the command has completed - */ -ADB.prototype.shell = function shell(deviceId, cmd, callback) { - var conn = new Connection(this); - conn.exec('host:transport:' + deviceId, function (err, _data) { - if (err) { - callback(err); - } else { - conn.exec('shell:' + cmd.replace(/^shell:/, ''), function (err, result) { - callback(err, result); - }, { bufferUntilClose: true, noLength: true }); + /** + * Installs an app to the specified device/emulator. + * @param {String} deviceId - The id of the device or emulator + * @param {String} apkFile - The application apk file to install + * @param {Object} [opts] - Install options + * @param {Object} [opts.logger] - A logger instance + */ + async installApp(deviceId, apkFile, opts) { + apkFile = expand(apkFile); + if (!fs.existsSync(apkFile)) { + throw new Error(`APK file "${apkFile}" does not exist`); } - }); -}; -/** - * Installs an app to the specified device/emulator. - * @param {String} deviceId - The id of the device or emulator - * @param {String} apkFile - The application apk file to install - * @param {Object} [opts] - Install options - * @param {Object} [opts.logger] - A logger instance - * @param {ADB~installAppCallback} callback - A callback that is fired when the application has been installed - */ -ADB.prototype.installApp = function installApp(deviceId, apkFile, opts, callback) { - if (typeof opts === 'function') { - callback = opts; - opts = {}; - } - apkFile = appc.fs.resolvePath(apkFile); - if (!fs.existsSync(apkFile)) { - callback(new Error(__('APK file "%s" does not exist', apkFile))); - return; - } + const devices = await this.devices(); - this.devices(function (err, devices) { - if (err) { - return callback(err); + // Fetch info about the device we're installing to. + const device = devices.find(d => d.id === deviceId); + if (!device) { + throw new Error('device not found'); } - // Fetch info about the device we're installing to. - devices = devices.filter(d => d.id === deviceId); - if (devices.length < 1) { - return callback(new Error(__('device not found'))); + const androidEnv = await detectAndroid(this.config); + if (!androidEnv.sdk?.executables?.adb) { + throw new Error('Android SDK not found'); } - const deviceInfo = devices[0]; - androidDetect(this.config, function (err, results) { - if (err) { - return callback(err); + // Fetch the device's API Level. + let deviceApiLevel = null; + if (device.sdk) { + const value = Number.parseInt(device.sdk); + if (!Number.isNaN(value)) { + deviceApiLevel = value; } + } - // Fetch the device's API Level. - let deviceApiLevel = 1; - if (deviceInfo.sdk) { - const value = parseInt(deviceInfo.sdk); - if (!isNaN(value)) { - deviceApiLevel = value; - } - } + // Set up the 'adb' arguments array. + const args = [ + '-s', deviceId, + 'install', + '-r', + ]; + if (deviceApiLevel >= 17) { + // Allow installation of an older APK version over a newer one. + // Note: Only supported on Android 4.2 (API Level 17) and higher. + args.push('-d'); + } + args.push(apkFile); - // Set up the 'adb' arguments array. - const args = []; - args.push('-s', deviceId); - args.push('install'); - args.push('-r'); - if (deviceApiLevel >= 17) { - // Allow installation of an older APK version over a newer one. - // Note: Only supported on Android 4.2 (API Level 17) and higher. - args.push('-d'); - } - args.push(apkFile); - - // Run the adb install command. - opts.logger && opts.logger.trace(__('Executing: %s', [ results.sdk.executables.adb ].concat(args).join(' ').cyan)); - appc.subprocess.run(results.sdk.executables.adb, args, function (code, out, err) { - var m = out.match(/^Failure \[(.+)\]$/m); - if ((code && err.indexOf('No space left on device') !== -1) || (!code && m && m[1] === 'INSTALL_FAILED_INSUFFICIENT_STORAGE')) { - callback(new Error(__('Not enough free space on device'))); + // Run the adb install command. + opts.logger?.trace(`Executing: ${[ androidEnv.sdk.executables.adb ].concat(args).join(' ')}`); + + await new Promise((resolve, reject) => { + const child = spawn(androidEnv.sdk.executables.adb, args, { stdio: ['ignore', 'pipe', 'pipe'] }); + let stdout = ''; + let stderr = ''; + child.stdout.on('data', (data) => { + stdout += data.toString(); + }); + child.stderr.on('data', (data) => { + stderr += data.toString(); + }); + child.on('close', (code) => { + const m = stdout.match(/^Failure \[(.+)\]$/m); + if ((code && stderr.includes('No space left on device')) || (!code && m?.[1] === 'INSTALL_FAILED_INSUFFICIENT_STORAGE')) { + reject(new Error('Not enough free space on device')); } else if (m && m[1] === 'INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES') { - callback(__('The app is already installed, but signed with a different certificate') + '\n' - + __('You need to either manually uninstall the app or rebuild using the same certificate that was used to sign the installed app')); + reject(new Error(`The app is already installed, but signed with a different certificate\nYou need to either manually uninstall the app or rebuild using the same certificate that was used to sign the installed app`)); } else if (m) { - callback(new Error(m[1])); + reject(new Error(m[1])); } else if (code) { - callback(new Error(out.trim() + '\n' + err.trim())); + reject(new Error(`${stdout.trim()}\n${stderr.trim()}`)); } else { // no obvious errors, now we need to check stdout - m = out.match(/^Error: (.+)$/m); + const m = stdout.match(/^Error: (.+)$/m); if (m) { - callback(new Error(m[1])); + reject(new Error(m[1])); } else { - callback(); + resolve(); } } }); }); - }.bind(this)); -}; + } -/** - * Returns the ps output of the specified app and device/emulator, if running. - * @param {String} deviceId - The id of the device or emulator - * @param {ADB~psCallback} callback - A callback that is fired once ps is executed - */ -ADB.prototype.ps = function ps(deviceId, callback) { - var outputCallback = function (err, data) { - if (err) { - callback(err); - } else { - // old ps, does not support '-A' parameter - var dataStr = data.toString().trim(); - if (dataStr.startsWith('bad pid \'-A\'') || dataStr.endsWith('NAME')) { - this.shell(deviceId, 'ps', outputCallback); - } else { - callback(null, data); - } + /** + * Returns the ps output of the specified app and device/emulator, if running. + * @param {String} deviceId - The id of the device or emulator + */ + async ps(deviceId) { + let data = await this.shell(deviceId, 'ps -A'); + const dataStr = data.toString().trim(); + // old ps, does not support '-A' parameter + if (dataStr.startsWith('bad pid \'-A\'') || dataStr.endsWith('NAME')) { + data = await this.shell(deviceId, 'ps'); } - }.bind(this); - this.shell(deviceId, 'ps -A', outputCallback); -}; + return data; + } -/** - * Returns the pid of the specified app and device/emulator, if running. - * @param {String} deviceId - The id of the device or emulator - * @param {String} appid - The application's id - * @param {ADB~getPidCallback} callback - A callback that is fired once the pid has been determined - */ -ADB.prototype.getPid = function getPid(deviceId, appid, callback) { - this.ps(deviceId, function (err, data) { - if (err) { - callback(err); - } else { - var lines = data.toString().split('\n'), - i = 0, - len = lines.length, - columns; - for (; i < len; i++) { - columns = lines[i].trim().split(/\s+/); - if (columns.pop() == appid) { // eslint-disable-line eqeqeq - callback(null, parseInt(columns[1])); - return; - } + /** + * Returns the pid of the specified app and device/emulator, if running. + * @param {String} deviceId - The id of the device or emulator + * @param {String} appid - The application's id + */ + async getPid(deviceId, appid) { + const data = await this.ps(deviceId); + const lines = data.toString().split('\n'); + let columns; + for (let i = 0, len = lines.length; i < len; i++) { + columns = lines[i].trim().split(/\s+/); + if (columns.pop() == appid) { + return Number.parseInt(columns[1]); } - callback(null, 0); } - }); -}; + throw new Error(`Application "${appid}" is not running`); + } -/** - * Starts an application on the specified device/emulator. - * @param {String} deviceId - The id of the device or emulator - * @param {String} appid - The application's id - * @param {String} activity - The name of the activity to run - * @param {ADB~startAppCallback} callback - A function that is called once the application has been started - */ -ADB.prototype.startApp = function startApp(deviceId, appid, activity, callback) { - // This launches the app via an intent just like how the Android OS would do it when tapping on the app. - // Notes: - // - The "-n" sets the intent's component name. Needed by explicit intents. - // - The "-a" sets the intent's action. - // - The "-c" sets the intent's category. - // - The "-f 0x10200000" sets intent flags: FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED - this.shell(deviceId, 'am start -n ' + appid + '/.' + activity.replace(/^\./, '') + ' -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -f 0x10200000', callback); -}; + /** + * Starts an application on the specified device/emulator. + * @param {String} deviceId - The id of the device or emulator + * @param {String} appid - The application's id + * @param {String} activity - The name of the activity to run + */ + async startApp(deviceId, appid, activity) { + // This launches the app via an intent just like how the Android OS would do it when tapping on the app. + // Notes: + // - The "-n" sets the intent's component name. Needed by explicit intents. + // - The "-a" sets the intent's action. + // - The "-c" sets the intent's category. + // - The "-f 0x10200000" sets intent flags: FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED + await this.shell(deviceId, `am start -n ${appid}/.${activity.replace(/^\./, '')} -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -f 0x10200000`); + } -/** - * Stops an application on the specified device/emulator. - * @param {String} deviceId - The id of the device or emulator - * @param {String} appid - The application's id - * @param {ADB~stopAppCallback} callback - A function that is called once the application has been stopped - */ -ADB.prototype.stopApp = function stopApp(deviceId, appid, callback) { - this.getPid(deviceId, appid, function (err, pid) { - if (!err && pid) { - this.shell(deviceId, 'am force-stop ' + appid, function (err, data) { - if (data.toString().indexOf('Unknown command: force-stop') !== -1) { - this.shell(deviceId, 'kill ' + pid, callback); - } else { - callback(err, data); - } - }.bind(this)); - return; + /** + * Stops an application on the specified device/emulator. + * @param {String} deviceId - The id of the device or emulator + * @param {String} appid - The application's id + */ + async stopApp(deviceId, appid) { + const pid = await this.getPid(deviceId, appid); + if (!pid) { + throw new Error(`Application "${appid}" is not running`); } - callback(new Error(__('Application "%s" is not running', appid))); - }.bind(this)); -}; - -/** - * Forwards the specified device/emulator's socket connections to the destination. - * @param {String} deviceId - The id of the device or emulator - * @param {String} src - The source port in the format "tcp:" - * @param {String} dest - The destination port in the format "tcp:" or "jdwp:" - * @param {ADB~forwardCallback} callback - A function that is called once the sockets have been forwarded - */ -ADB.prototype.forward = function forward(deviceId, src, dest, callback) { - androidDetect(this.config, function (err, results) { - if (err) { - return callback(err); + const data = await this.shell(deviceId, `am force-stop ${appid}`); + if (data.toString().includes('Unknown command: force-stop')) { + await this.shell(deviceId, `kill ${pid}`); + } else { + return data; } - appc.subprocess.run(results.sdk.executables.adb, [ '-s', deviceId, 'forward', src, dest ], function (code, _out, _err) { - callback(code); - }); - }); -}; + } -/** - * Pushes a single file to a device or emulator. - * @param {String} deviceId - The id of the device or emulator - * @param {String} src - The source file to copy to the device - * @param {String} dest - The destination to write the file - * @param {ADB~pushCallback} callback - A function that is called once the file has been copied - */ -ADB.prototype.push = function push(deviceId, src, dest, callback) { - src = appc.fs.resolvePath(src); - if (!fs.existsSync(src)) { - callback(new Error(__('Source file "%s" does not exist', src))); - } else { - androidDetect(this.config, function (err, results) { - if (err) { - return callback(err); - } - appc.subprocess.run(results.sdk.executables.adb, [ '-s', deviceId, 'push', src, dest ], function (code, _out, _err) { - callback(code); + /** + * Forwards the specified device/emulator's socket connections to the destination. + * @param {String} deviceId - The id of the device or emulator + * @param {String} src - The source port in the format "tcp:" + * @param {String} dest - The destination port in the format "tcp:" or "jdwp:" + */ + async forward(deviceId, src, dest) { + const androidEnv = await detectAndroid(this.config); + if (!androidEnv.sdk?.executables?.adb) { + throw new Error('Android SDK not found'); + } + await new Promise((resolve, reject) => { + const child = spawn(androidEnv.sdk.executables.adb, [ '-s', deviceId, 'forward', src, dest ], { stdio: 'ignore' }); + child.on('close', (code) => { + if (code) { + reject(new Error(`Failed to forward sockets (code ${code})`)); + } else { + resolve(); + } }); }); } -}; -/** - * Pulls a single file from a device or emulator. - * @param {String} deviceId - The id of the device or emulator - * @param {String} src - The source file to copy from the device - * @param {String} dest - The destination to write the file - * @param {ADB~pullCallback} callback - A function that is called once the file has been copied - */ -ADB.prototype.pull = function pull(deviceId, src, dest, callback) { - dest = appc.fs.resolvePath(dest); - var destDir = path.dirname(dest); + /** + * Pushes a single file to a device or emulator. + * @param {String} deviceId - The id of the device or emulator + * @param {String} src - The source file to copy to the device + * @param {String} dest - The destination to write the file + */ + async push(deviceId, src, dest) { + src = expand(src); + if (!fs.existsSync(src)) { + throw new Error(`Source file "${src}" does not exist`); + } - try { - fs.ensureDirSync(destDir); + const androidEnv = await detectAndroid(this.config); + if (!androidEnv.sdk?.executables?.adb) { + throw new Error('Android SDK not found'); + } - androidDetect(this.config, function (err, results) { - if (err) { - return callback(err); - } - appc.subprocess.run(results.sdk.executables.adb, [ '-s', deviceId, 'pull', src, dest ], function (code, _out, _err) { - callback(code); + await new Promise((resolve, reject) => { + const child = spawn(androidEnv.sdk.executables.adb, [ '-s', deviceId, 'push', src, dest ], { stdio: 'ignore' }); + child.on('close', (code) => { + if (code) { + reject(new Error(`Failed to push file (code ${code})`)); + } else { + resolve(); + } }); }); - } catch (ex) { - callback(new Error(__('Failed to create destination directory "%s"', destDir))); } -}; -/** - * Streams output from logcat into the specified handler until the adb logcat - * process ends. - * @param {String} deviceId - The id of the device or emulator - * @param {Function} handler - A function to call whenever data becomes available - * @param {Function} callback - A function that is called once 'adb logcat' exits - */ -ADB.prototype.logcat = function logcat(deviceId, handler, callback) { - androidDetect(this.config, function (err, results) { - if (err) { - return callback(err); + /** + * Pulls a single file from a device or emulator. + * @param {String} deviceId - The id of the device or emulator + * @param {String} src - The source file to copy from the device + * @param {String} dest - The destination to write the file + */ + async pull(deviceId, src, dest) { + dest = expand(dest); + const destDir = path.dirname(dest); + fs.mkdirSync(destDir, { recursive: true }); + + const androidEnv = await detectAndroid(this.config); + if (!androidEnv.sdk?.executables?.adb) { + throw new Error('Android SDK not found'); } - var child = spawn(results.sdk.executables.adb, [ '-s', deviceId, 'logcat', '-v', 'brief', '-b', 'main' ]), // , '-s', '*:d,*,TiAPI:V']); - splitter = child.stdout.pipe(StreamSplitter('\n')); - - // Set encoding on the splitter Stream, so tokens come back as a String. - splitter.encoding = 'utf8'; - splitter.on('token', function (data) { - handler(data); - }); - - child.on('close', function () { - callback(); + await new Promise((resolve, reject) => { + const child = spawn(androidEnv.sdk.executables.adb, [ '-s', deviceId, 'pull', src, dest ], { stdio: 'ignore' }); + child.on('close', (code) => { + if (code) { + reject(new Error(`Failed to pull file (code ${code})`)); + } else { + resolve(); + } + }); }); - }); -}; - -/** - * A function to call when the version has been retreived. - * @callback ADB~versionCallback - * @param {Error} err - In the event of an error, an exception, otherwise falsey - * @param {String} version - The version of the adb server - */ - -/** - * A function to call when the command is finished executing. - * @callback Connection~execCallback - * @param {Error} err - In the event of an error, an exception, otherwise falsey - * @param {Buffer} data - The output from the executed command - */ - -/** - * A function that is called with the list of devices. - * @callback ADB~devicesCallback - * @param {Error} err - In the event of an error, an exception, otherwise falsey - * @param {Array} devices - An array of devices and emulators found - */ - -/** - * A function that is continually called with the list of devices when the state - * of any devices or emulators. - * @callback ADB~trackDevicesCallback - * @param {Error} err - In the event of an error, an exception, otherwise falsey - * @param {Array} devices - An array of devices and emulators found - */ - -/** - * A function that is called when the adb start-server has completed. - * @callback ADB~startServerCallback - * @param {Number|Error} err - The exit code from adb start-server command or an exception - */ - -/** - * A function that is called when the adb kill-server has completed. - * @callback ADB~stopServerCallback - * @param {Number|Error} err - The exit code from adb kill-server command or an exception - */ - -/** - * A function that is called when the shell command has completed. - * Called after the shell command completes. - * @callback ADB~shellCallback - * @param {Error} err - In the event of an error, an exception, otherwise falsey - * @param {Buffer} data - The output from the executed command - */ - -/** - * A function that is called when the application has been installed. - * @callback ADB~installAppCallback - * @param {Number|Error} err - The exit code from adb install command or an exception - */ - -/** - * A callback that is fired once the pid has been determined. - * @callback ADB~getPidCallback - * @param {Error} err - In the event of an error, an exception, otherwise falsey - * @param {Number} pid - The pid or zero if the process is not found - */ - -/** - * A function that is called when the application has been started. - * @callback ADB~startAppCallback - * @param {Error} err - In the event of an error, an exception, otherwise falsey - * @param {Buffer} data - The output from the executed command - */ - -/** - * A function that is called when the application has been stopped. - * @callback ADB~stopAppCallback - * @param {Error} err - In the event of an error, an exception, otherwise falsey - * @param {Buffer} data - The output from the executed command - */ - -/** - * A function that is called once the sockets have been forwarded. - * @callback ADB~forwardCallback - * @param {Number|Error} err - The exit code from adb forward command or an exception - */ + } -/** - * A function that is called once the file has been copied. - * @callback ADB~pushCallback - * @param {Number|Error} err - The exit code from adb forward command or an exception - */ + /** + * Streams output from logcat into the specified handler until the adb logcat + * process ends. + * @param {String} deviceId - The id of the device or emulator + * @param {Function} handler - A function to call whenever data becomes available + */ + async logcat(deviceId, handler) { + const androidEnv = await detectAndroid(this.config); + if (!androidEnv.sdk?.executables?.adb) { + throw new Error('Android SDK not found'); + } -/** - * A function that is called once the file has been copied. - * @callback ADB~pullCallback - * @param {Number|Error} err - The exit code from adb forward command or an exception - */ + await new Promise((resolve, reject) => { + const child = spawn(androidEnv.sdk.executables.adb, [ '-s', deviceId, 'logcat', '-v', 'brief', '-b', 'main' ]); // , '-s', '*:d,*,TiAPI:V']); + const splitter = child.stdout.pipe(StreamSplitter('\n')); -/** - * A function to call whenever data becomes available. - * @callback ADB~logcatHandler - * @param {String} data - One or more lines of logcat output - */ + // Set encoding on the splitter Stream, so tokens come back as a String. + splitter.encoding = 'utf8'; + splitter.on('token', (data) => handler(data)); -/** - * A function that is called once 'adb logcat' exits - * @callback ADB~logcatCallback - */ + child.on('close', (code) => { + if (code) { + reject(new Error(`Failed to logcat (code ${code})`)); + } else { + resolve(); + } + }); + }); + } +} diff --git a/lib/android.js b/lib/android.js index eea14dac..e87b13ff 100644 --- a/lib/android.js +++ b/lib/android.js @@ -1,36 +1,20 @@ -/** - * Detects the Android development environment and its dependencies. - * - * @module lib/android - * - * @copyright - * Copyright (c) 2009-2017 by Appcelerator, Inc. All Rights Reserved. - * - * @license - * Licensed under the terms of the Apache Public License - * Please see the LICENSE included with this distribution for details. - */ -'use strict'; - -const fs = require('fs'), - path = require('path'), - async = require('async'), - appc = require('node-appc'), - manifestJson = appc.pkginfo.manifest(module), - i18n = appc.i18n(__dirname), - __ = i18n.__, - __n = i18n.__n, - afs = appc.fs, - run = appc.subprocess.run, - findExecutable = appc.subprocess.findExecutable, - exe = process.platform === 'win32' ? '.exe' : '', - cmd = process.platform === 'win32' ? '.cmd' : '', - commandPrefix = process.env.APPC_ENV ? 'appc ' : '', - requiredSdkTools = { - adb: exe, - emulator: exe - }, - pkgPropRegExp = /^([^=]*)=\s*(.+)$/; +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { detect as detectJDK } from './jdk.js'; +import { expand } from './util/expand.js'; +import { loadManifestJson } from './util/load-manifest-json.js'; +import which from 'which'; +import * as version from './util/version.js'; + +const exe = process.platform === 'win32' ? '.exe' : ''; +const cmd = process.platform === 'win32' ? '.cmd' : ''; +const commandPrefix = process.env.APPC_ENV ? 'appc ' : ''; +const requiredSdkTools = { + adb: exe, + emulator: exe +}; +const pkgPropRegExp = /^([^=]*)=\s*(.+)$/; let envCache; @@ -47,673 +31,543 @@ const dirs = process.platform === 'win32' '~/Library/Android' // Android Studio installs the NDK to ~/Library/Android/Sdk/ndk-bundle ]; +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +// find the SDK's manifest.json file +let manifestJson = loadManifestJson(__dirname); + // need to find the android module and its package.json let androidPackageJson = {}; -const { root } = path.parse(__dirname); -(function findPackageJson(dir) { - if (dir !== root) { - const file = path.join(dir, 'android', 'package.json'); +{ + const { root } = path.parse(__dirname); + let currentDir = path.join(__dirname, '..', '..', '..'); + + while (currentDir !== root) { + const file = path.join(currentDir, 'android', 'package.json'); if (fs.existsSync(file)) { - androidPackageJson = require(file); - } else { - findPackageJson(path.dirname(dir)); + androidPackageJson = JSON.parse(fs.readFileSync(file, 'utf8')); + break; } + currentDir = path.dirname(currentDir); } -}(path.join(__dirname, '..', '..', '..'))); +} + // allow overridding for tests -exports.androidPackageJson = function (json) { +export function setAndroidPackageJson(json) { androidPackageJson = json; -}; - -/** - * Detects current Android environment. - * @param {Object} config - The CLI config object - * @param {Object} opts - Detect options - * @param {Boolean} [opts.bypassCache=false] - Bypasses the Android environment detection cache and re-queries the system - * @param {Function} finished - Callback when detection is finished - * @returns {void} - */ -exports.detect = function detect(config, opts, finished) { - opts || (opts = {}); +} - if (envCache && !opts.bypassCache) { - return finished(envCache); +async function detectSDK(config) { + // first let's check the config's value + let sdk = await findSDK(config.get('android.sdkPath'), config, androidPackageJson); + if (sdk) { + return sdk; } - async.parallel({ - jdk: function (next) { - appc.jdk.detect(config, opts, function (results) { - next(null, results); - }); - }, + sdk = await findSDK(process.env.ANDROID_SDK_ROOT, config, androidPackageJson); + if (sdk) { + return sdk; + } - sdk: function (next) { - var queue = async.queue(function (task, callback) { - task(function (err, result) { - if (err) { - callback(); // go to next item in the queue - } else { - next(null, result); - } - }); - }, 1); + sdk = await findSDK(process.env.ANDROID_SDK, config, androidPackageJson); + if (sdk) { + return sdk; + } - queue.drain(function () { - // we have completely exhausted all search paths - next(null, null); - }); + let adb = config.get('android.executables.adb'); + if (adb) { + adb = await which(adb, { nothrow: true }); + } + if (!adb) { + adb = await which('adb', { nothrow: true }); + } + console.log('adb', adb); + if (adb) { + sdk = await findSDK(expand(adb, '..', '..'), config, androidPackageJson); + if (sdk) { + return sdk; + } + } - queue.push([ - // first let's check the config's value - function (cb) { - findSDK(config.get('android.sdkPath'), config, androidPackageJson, cb); - }, - // try the environment variables - function (cb) { - findSDK(process.env.ANDROID_SDK_ROOT, config, androidPackageJson, cb); - }, - function (cb) { - findSDK(process.env.ANDROID_SDK, config, androidPackageJson, cb); - }, - // try finding the 'adb' executable - function (cb) { - findExecutable([ config.get('android.executables.adb'), 'adb' + exe ], function (err, result) { - if (err) { - cb(err); - } else { - findSDK(path.resolve(result, '..', '..'), config, androidPackageJson, cb); + for (let dir of dirs) { + dir = expand(dir); + try { + if (fs.existsSync(dir)) { + for (const name of fs.readdirSync(dir)) { + const subdir = path.join(dir, name); + if (/android|sdk/i.test(name) && fs.existsSync(subdir) && fs.statSync(subdir).isDirectory()) { + sdk = await findSDK(subdir, config, androidPackageJson); + if (sdk) { + return sdk; } - }); - } - ]); - - dirs.forEach(function (dir) { - dir = afs.resolvePath(dir); - try { - fs.existsSync(dir) && fs.readdirSync(dir).forEach(function (name) { - var subdir = path.join(dir, name); - if (/android|sdk/i.test(name) && fs.existsSync(subdir) && fs.statSync(subdir).isDirectory()) { - queue.push(function (cb) { - findSDK(subdir, config, androidPackageJson, cb); - }); - - // this dir may be the Android SDK, but just in case, - // let's see if there's an Android folder in this one - fs.statSync(subdir).isDirectory() && fs.readdirSync(subdir).forEach(function (name) { + + // this dir may be the Android SDK, but just in case, + // let's see if there's an Android folder in this one + if (fs.statSync(subdir).isDirectory()) { + for (const name of fs.readdirSync(subdir)) { if (/android/i.test(name)) { - queue.push(function (cb) { - findSDK(path.join(subdir, name), config, androidPackageJson, cb); - }); + sdk = await findSDK(path.join(subdir, name), config, androidPackageJson); + if (sdk) { + return sdk; + } } - }); + } } - }); - } catch (e) { - // Ignore + } } - }); - }, + } + } catch { + // Ignore + } + } - ndk: function (next) { - var queue = async.queue(function (task, callback) { - task(function (err, result) { - if (err) { - callback(); // go to next item in the queue - } else { - next(null, result); - } - }); - }, 1); + return null; +} - queue.drain(function () { - // we have completely exhausted all search paths - next(null, null); - }); - queue.push([ - // first let's check the config's value - function (cb) { - findNDK(config.get('android.ndkPath'), config, cb); - }, - // try the environment variable - function (cb) { - findNDK(process.env.ANDROID_NDK, config, cb); - }, - // try finding the 'ndk-build' executable - function (cb) { - findExecutable([ config.get('android.executables.ndkbuild'), 'ndk-build' + cmd ], function (err, result) { - if (err) { - cb(err); - } else { - findNDK(path.dirname(result), config, cb); - } - }); - } - ]); - - dirs.forEach(function (dir) { - dir = afs.resolvePath(dir); - try { - fs.existsSync(dir) && fs.readdirSync(dir).forEach(function (name) { - var subdir = path.join(dir, name); - if (/android|sdk/i.test(name)) { - queue.push(function (cb) { - findNDK(subdir, config, cb); - }); - - // Check under NDK side-by-side directory which contains multiple NDK installations. - // Each subfolder is named after the version of NDK installed under it. Favor newest version. - const ndkSideBySidePath = path.join(subdir, 'ndk'); - if (fs.existsSync(ndkSideBySidePath) && fs.statSync(ndkSideBySidePath).isDirectory()) { - const fileNames = fs.readdirSync(ndkSideBySidePath); - fileNames.sort((text1, text2) => { - // Flip result to sort in descending order. (ie: Highest version is first.) - return versionStringComparer(text1, text2) * (-1); - }); - for (const nextFileName of fileNames) { - const nextFilePath = path.join(ndkSideBySidePath, nextFileName); - queue.push(function (cb) { - findNDK(nextFilePath, config, cb); - }); - } - } +/** + * Detects current Android environment. + * @param {Object} config - The CLI config object + * @param {Object} opts - Detect options + * @param {Boolean} [opts.bypassCache=false] - Bypasses the Android environment detection cache and re-queries the system + */ +export async function detect(config, opts = {}) { + if (envCache && !opts.bypassCache) { + return envCache; + } - // Android Studio used to install under Android SDK subfolder "ndk-bundle". (Deprecated in 2019.) - const ndkBundlePath = path.join(subdir, 'ndk-bundle'); - if (fs.existsSync(ndkBundlePath) && fs.statSync(ndkBundlePath).isDirectory()) { - queue.push(function (cb) { - findNDK(ndkBundlePath, config, cb); - }); - } - } - }); - } catch (e) { - // Ignore - } - }); - }, + const results = {}; - linux64bit: function (next) { - // detect if we're using a 64-bit Linux OS that's missing 32-bit libraries - if (process.platform === 'linux' && process.arch === 'x64') { - var result = { - libGL: fs.existsSync('/usr/lib/libGL.so'), - i386arch: null, - 'libc6:i386': null, - 'libncurses5:i386': null, - 'libstdc++6:i386': null, - 'zlib1g:i386': null, - }; - async.parallel([ - function (cb) { - findExecutable([ config.get('linux.dpkg'), 'dpkg' ], function (err, dpkg) { - if (err || !dpkg) { - return cb(); - } + await Promise.all([ + detectJDK(config, opts).then(jdk => results.jdk = jdk), + detectSDK(config).then(sdk => results.sdk = sdk), + detectNDK(config).then(ndk => results.ndk = ndk), + ]); - var archs = {}; - run(dpkg, '--print-architecture', function (code, stdout, _stderr) { - stdout.split('\n').forEach(function (line) { - (line = line.trim()) && (archs[line] = 1); - }); - run(dpkg, '--print-foreign-architectures', function (code, stdout, _stderr) { - stdout.split('\n').forEach(function (line) { - (line = line.trim()) && (archs[line] = 1); - }); - - // now that we have the architectures, make sure we have the i386 architecture - result.i386arch = !!archs.i386; - cb(); - }); - }); - }); - }, - function (cb) { - findExecutable([ config.get('linux.dpkgquery'), 'dpkg-query' ], function (err, dpkgquery) { - if (err || !dpkgquery) { - return cb(); - } + const sdkHome = process.env.ANDROID_SDK_HOME && expand(process.env.ANDROID_SDK_HOME); + const jdkInfo = results.jdk; - async.each( - [ 'libc6:i386', 'libncurses5:i386', 'libstdc++6:i386', 'zlib1g:i386' ], - function (pkg, next) { - run(dpkgquery, [ '-l', pkg ], function (code, out, _err) { - result[pkg] = false; - if (!code) { - var lines = out.split('\n'), - i = 0, - l = lines.length; - for (; i < l; i++) { - if (lines[i].indexOf(pkg) !== -1) { - // we look for "ii" which means we want the "desired action" - // to be "installed" and the "status" to be "installed" - if (lines[i].indexOf('ii') === 0) { - result[pkg] = true; - } - break; - } - } - } - next(); - }); - }, - function () { - cb(); - } - ); - }); - } - ], function () { - next(null, result); - }); - } else { - next(null, null); - } - } + delete results.jdk; - }, function (err, results) { - var sdkHome = process.env.ANDROID_SDK_HOME && afs.resolvePath(process.env.ANDROID_SDK_HOME), - jdkInfo = results.jdk; + results.home = sdkHome && fs.existsSync(sdkHome) && fs.statSync(sdkHome).isDirectory() ? sdkHome : expand('~/.android'); + results.detectVersion = '2.0'; + results.vendorDependencies = androidPackageJson.vendorDependencies; + results.targets = {}; + results.avds = []; + results.issues = []; - delete results.jdk; + envCache = results; - results.home = sdkHome && fs.existsSync(sdkHome) && fs.statSync(sdkHome).isDirectory() ? sdkHome : afs.resolvePath('~/.android'); - results.detectVersion = '2.0'; - results.vendorDependencies = androidPackageJson.vendorDependencies; - results.targets = {}; - results.avds = []; - results.issues = []; + if (!jdkInfo.home) { + results.issues.push({ + id: 'ANDROID_JDK_NOT_FOUND', + type: 'error', + message: `JDK (Java Development Kit) not found. +If you already have installed the JDK, verify your __JAVA_HOME__ environment variable is correctly set. +The JDK can be downloaded and installed from __https://www.oracle.com/java/technologies/downloads/__ +or __https://jdk.java.net/archive/__.` + }); + results.sdk = null; + return results; + } - function finalize() { - finished(envCache = results); - } + if (process.platform !== 'win32' && jdkInfo.home.includes('&')) { + results.issues.push({ + id: 'ANDROID_JDK_PATH_CONTAINS_AMPERSANDS', + type: 'error', + message: `The JDK (Java Development Kit) path must not contain ampersands (&) on Windows. +Please move the JDK into a path without an ampersand and update the __JAVA_HOME__ environment variable.` + }); + results.sdk = null; + return results; + } - if (!jdkInfo.home) { - results.issues.push({ - id: 'ANDROID_JDK_NOT_FOUND', - type: 'error', - message: __('JDK (Java Development Kit) not found.') + '\n' - + __('If you already have installed the JDK, verify your __JAVA_HOME__ environment variable is correctly set.') + '\n' - + __('The JDK can be downloaded and installed from %s', '__https://www.oracle.com/java/technologies/downloads/__') + '\n' - + __('or %s.', '__https://jdk.java.net/archive/__') - }); - results.sdk = null; - return finalize(); - } + // if we don't have an android sdk, then nothing else to do + if (!results.sdk) { + results.issues.push({ + id: 'ANDROID_SDK_NOT_FOUND', + type: 'error', + message: `Unable to locate an Android SDK. +If you have already downloaded and installed the Android SDK, you can tell Titanium where the Android SDK is located by running '__${ +commandPrefix +}ti config android.sdkPath /path/to/android-sdk__', otherwise you can install it by running '__${ +commandPrefix +}ti setup android__' or manually downloading from ${ +`__https://developer.android.com/studio__` +}.` + }); + return results; + } - if (process.platform === 'win32' && jdkInfo.home.indexOf('&') !== -1) { - results.issues.push({ - id: 'ANDROID_JDK_PATH_CONTAINS_AMPERSANDS', - type: 'error', - message: __('The JDK (Java Development Kit) path must not contain ampersands (&) on Windows.') + '\n' - + __('Please move the JDK into a path without an ampersand and update the __JAVA_HOME__ environment variable.') - }); - results.sdk = null; - return finalize(); - } + if (results.sdk.buildTools.tooNew === 'maybe') { + results.issues.push({ + id: 'ANDROID_BUILD_TOOLS_TOO_NEW', + type: 'warning', + message: ` +Android Build Tools ${results.sdk.buildTools.version} are too new and may or may not work with Titanium. +If you encounter problems, select a supported version with: +__${commandPrefix} ti config android.buildTools.selectedVersion ##.##.##__ +where ##.##.## is a version in ${results.sdk.buildTools.path.split('/').slice(0, -1).join('/')} that is ${results.sdk.buildTools.maxSupported}` + }); + } - // if we don't have an android sdk, then nothing else to do - if (!results.sdk) { - results.issues.push({ - id: 'ANDROID_SDK_NOT_FOUND', - type: 'error', - message: __('Unable to locate an Android SDK.') + '\n' - + __('If you have already downloaded and installed the Android SDK, you can tell Titanium where the Android SDK is located by running \'%s\', otherwise you can install it by running \'%s\' or manually downloading from %s.', - '__' + commandPrefix + 'titanium config android.sdkPath /path/to/android-sdk__', - '__' + commandPrefix + 'titanium setup android__', - '__https://developer.android.com/studio__') - }); - return finalize(); + const createAndroidSdkInstallationErrorMessage = (message) => { + if (!message) { + message = ''; + } else if (message.length > 0) { + message += '\n'; } + message += `Current installed Android SDK tools: +Android SDK Tools: ${results.sdk.tools.version || 'not installed'} (Supported: ${androidPackageJson.vendorDependencies['android tools']}) +Android SDK Platform Tools: ${results.sdk.platformTools.version || 'not installed'} (Supported: ${androidPackageJson.vendorDependencies['android platform tools']} +Android SDK Build Tools: ${results.sdk.buildTools.version || 'not installed'} (Supported: ${androidPackageJson.vendorDependencies['android build tools']} + +Make sure you have the latest Android SDK Tools, Platform Tools, and Build Tools installed. +`; + return message; + }; - if (results.sdk.buildTools.tooNew === 'maybe') { - results.issues.push({ - id: 'ANDROID_BUILD_TOOLS_TOO_NEW', - type: 'warning', - message: '\n' + __('Android Build Tools %s are too new and may or may not work with Titanium.', results.sdk.buildTools.version) + '\n' - + __('If you encounter problems, select a supported version with:') + '\n' - + ' __' + commandPrefix + 'ti config android.buildTools.selectedVersion ##.##.##__' - + __('\n where ##.##.## is a version in ') + results.sdk.buildTools.path.split('/').slice(0, -1).join('/') + __(' that is ') + results.sdk.buildTools.maxSupported - }); - } + if (!results.sdk.buildTools.supported) { + results.issues.push({ + id: 'ANDROID_BUILD_TOOLS_NOT_SUPPORTED', + type: 'error', + message: createAndroidSdkInstallationErrorMessage(`Android Build Tools ${results.sdk.buildTools.version} are not supported by Titanium`) + }); + } - if (!results.sdk.buildTools.supported) { - results.issues.push({ - id: 'ANDROID_BUILD_TOOLS_NOT_SUPPORTED', - type: 'error', - message: createAndroidSdkInstallationErrorMessage(__('Android Build Tools %s are not supported by Titanium', results.sdk.buildTools.version)) + if (results.sdk.buildTools.notInstalled) { + results.issues.push({ + id: 'ANDROID_BUILD_TOOLS_CONFIG_SETTING_NOT_INSTALLED', + type: 'error', + message: createAndroidSdkInstallationErrorMessage(`The selected version of Android SDK Build Tools (${ + results.sdk.buildTools.version + }) are not installed. Please either remove the setting using ${ + commandPrefix + } ti config --remove android.buildTools.selectedVersion or install it`) + }); + } - }); - } + // check if we're running Windows and if the sdk path contains ampersands + if (process.platform === 'win32' && results.sdk.path.includes('&')) { + results.issues.push({ + id: 'ANDROID_SDK_PATH_CONTAINS_AMPERSANDS', + type: 'error', + message: `The Android SDK path must not contain ampersands (&) on Windows. +Please move the Android SDK into a path without an ampersand and re-run __${commandPrefix} ti setup android__.` + }); + results.sdk = null; + return results; + } - if (results.sdk.buildTools.notInstalled) { - results.issues.push({ - id: 'ANDROID_BUILD_TOOLS_CONFIG_SETTING_NOT_INSTALLED', - type: 'error', - message: createAndroidSdkInstallationErrorMessage(__('The selected version of Android SDK Build Tools (%s) are not installed. Please either remove the setting using %s or install it', results.sdk.buildTools.version, `${commandPrefix} ti config --remove android.buildTools.selectedVersion`)) - }); - } + // check if the sdk is missing any commands + const missing = Object.keys(requiredSdkTools).filter(cmd => !results.sdk.executables[cmd]); + if (missing.length && results.sdk.buildTools.supported) { + const dummyPath = path.join(expand('/'), 'path', 'to', 'android-sdk'); + let msg = ''; - // check if we're running Windows and if the sdk path contains ampersands - if (process.platform === 'win32' && results.sdk.path.indexOf('&') !== -1) { - results.issues.push({ - id: 'ANDROID_SDK_PATH_CONTAINS_AMPERSANDS', - type: 'error', - message: __('The Android SDK path must not contain ampersands (&) on Windows.') + '\n' - + __('Please move the Android SDK into a path without an ampersand and re-run __' + commandPrefix + 'titanium setup android__.') - }); - results.sdk = null; - return finalize(); + if (missing.length) { + msg += `Missing required Android SDK tool${missing.length !== 1 ? 's' : ''}: __${missing.join(', ')}__\n\n`; } - // check if the sdk is missing any commands - var missing = Object.keys(requiredSdkTools).filter(cmd => !results.sdk.executables[cmd]); - if (missing.length && results.sdk.buildTools.supported) { - var dummyPath = path.join(path.resolve('/'), 'path', 'to', 'android-sdk'), - msg = ''; + msg = createAndroidSdkInstallationErrorMessage(msg); - if (missing.length) { - msg += __n('Missing required Android SDK tool: %%s', 'Missing required Android SDK tools: %%s', missing.length, '__' + missing.join(', ') + '__') + '\n\n'; + if (missing.length) { + msg += '\nYou can also specify the exact location of these required tools by running:\n'; + for (const m of missing) { + msg += ` ${commandPrefix} ti config android.executables.${m} "${path.join(dummyPath, m + requiredSdkTools[m])}"\n`; } + } - msg = createAndroidSdkInstallationErrorMessage(msg); + msg += `\nIf you need to, run "${commandPrefix} ti setup android" to reconfigure the Titanium Android settings.`; + + results.issues.push({ + id: 'ANDROID_SDK_MISSING_PROGRAMS', + type: 'error', + message: msg + }); + } - if (missing.length) { - msg += '\n' + __('You can also specify the exact location of these required tools by running:') + '\n'; - missing.forEach(function (m) { - msg += ' ' + commandPrefix + 'ti config android.executables.' + m + ' "' + path.join(dummyPath, m + requiredSdkTools[m]) + '"\n'; - }); + /** + * Detect system images + */ + const systemImages = {}; + const systemImagesByPath = {}; + const systemImagesDir = path.join(results.sdk.path, 'system-images'); + if (isDir(systemImagesDir)) { + for (const platform of fs.readdirSync(systemImagesDir)) { + const platformDir = path.join(systemImagesDir, platform); + if (!isDir(platformDir)) { + continue; } - msg += '\n' + __('If you need to, run "%s" to reconfigure the Titanium Android settings.', commandPrefix + 'titanium setup android'); + for (const tag of fs.readdirSync(platformDir)) { + const tagDir = path.join(platformDir, tag); + if (!isDir(tagDir)) { + continue; + } - results.issues.push({ - id: 'ANDROID_SDK_MISSING_PROGRAMS', - type: 'error', - message: msg - }); - } + for (const abi of fs.readdirSync(tagDir)) { + const abiDir = path.join(tagDir, abi); + const props = readPropertiesFile(path.join(abiDir, 'source.properties')); + if (props && props['AndroidVersion.ApiLevel'] && props['SystemImage.TagId'] && props['SystemImage.Abi']) { + const id = `android-${props['AndroidVersion.CodeName'] || props['AndroidVersion.ApiLevel']}`; + const tag = props['SystemImage.TagId']; + const skinsDir = path.join(abiDir, 'skins'); - /** - * Detect system images - */ - var systemImages = {}; - var systemImagesByPath = {}; - var systemImagesDir = path.join(results.sdk.path, 'system-images'); - if (isDir(systemImagesDir)) { - fs.readdirSync(systemImagesDir).forEach(function (platform) { - var platformDir = path.join(systemImagesDir, platform); - if (isDir(platformDir)) { - fs.readdirSync(platformDir).forEach(function (tag) { - var tagDir = path.join(platformDir, tag); - if (isDir(tagDir)) { - fs.readdirSync(tagDir).forEach(function (abi) { - var abiDir = path.join(tagDir, abi); - var props = readProps(path.join(abiDir, 'source.properties')); - if (props && props['AndroidVersion.ApiLevel'] && props['SystemImage.TagId'] && props['SystemImage.Abi']) { - var id = 'android-' + (props['AndroidVersion.CodeName'] || props['AndroidVersion.ApiLevel']); - var tag = props['SystemImage.TagId']; - var skinsDir = path.join(abiDir, 'skins'); - - systemImages[id] || (systemImages[id] = {}); - systemImages[id][tag] || (systemImages[id][tag] = []); - systemImages[id][tag].push({ - abi: props['SystemImage.Abi'], - skins: isDir(skinsDir) ? fs.readdirSync(skinsDir).map(name => { - return isFile(path.join(skinsDir, name, 'hardware.ini')) ? name : null; - }).filter(x => x) : [] - }); - - systemImagesByPath[path.relative(results.sdk.path, abiDir)] = { - id: id, - tag: tag, - abi: abi - }; + if (!systemImages[id]) { + systemImages[id] = {}; + } + if (!systemImages[id][tag]) { + systemImages[id][tag] = []; + } + + const skins = []; + if (isDir(skinsDir)) { + for (const name of fs.readdirSync(skinsDir)) { + if (isFile(path.join(skinsDir, name, 'hardware.ini'))) { + skins.push(name); } - }); + } } - }); - } - }); - } - /** - * Detect targets - */ - var platformsDir = path.join(results.sdk.path, 'platforms'); - var platforms = []; - var platformsById = {}; - if (isDir(platformsDir)) { - fs.readdirSync(platformsDir).forEach(function (name) { - var info = loadPlatform(path.join(platformsDir, name), systemImages); - if (info) { - platforms.push(info); - platformsById[info.id] = info; + systemImages[id][tag].push({ + abi: props['SystemImage.Abi'], + skins + }); + + systemImagesByPath[path.relative(results.sdk.path, abiDir)] = { + id: id, + tag: tag, + abi: abi + }; + } } - }); + } } + } - var addonsDir = path.join(results.sdk.path, 'add-ons'); - var addons = []; - if (isDir(addonsDir)) { - fs.readdirSync(addonsDir).forEach(function (name) { - var info = loadAddon(path.join(addonsDir, name), platforms, systemImages); - info && addons.push(info); - }); + /** + * Detect targets + */ + const platformsDir = path.join(results.sdk.path, 'platforms'); + const platforms = []; + const platformsById = {}; + if (isDir(platformsDir)) { + for (const name of fs.readdirSync(platformsDir)) { + const info = loadPlatform(path.join(platformsDir, name), systemImages); + if (info) { + platforms.push(info); + platformsById[info.id] = info; + } } + } - function sortFn(a, b) { - if (a.codename === null) { - if (b.codename !== null && a.apiLevel === b.apiLevel) { - // sort GA releases before preview releases - return -1; - } - } else if (a.apiLevel === b.apiLevel) { - return b.codename === null ? 1 : a.codename.localeCompare(b.codename); + const addonsDir = path.join(results.sdk.path, 'add-ons'); + const addons = []; + if (isDir(addonsDir)) { + for (const name of fs.readdirSync(addonsDir)) { + const info = loadAddon(path.join(addonsDir, name), platforms, systemImages); + if (info) { + addons.push(info); } - - return a.apiLevel - b.apiLevel; } + } - var index = 1; - platforms.sort(sortFn).concat(addons.sort(sortFn)).forEach(function (platform) { - var abis = []; - if (platform.abis) { - Object.keys(platform.abis).forEach(function (type) { - platform.abis[type].forEach(function (abi) { - if (abis.indexOf(abi) === -1) { - abis.push(abi); - } - }); - }); + const sortFn = (a, b) => { + if (a.codename === null) { + if (b.codename !== null && a.apiLevel === b.apiLevel) { + // sort GA releases before preview releases + return -1; } + } else if (a.apiLevel === b.apiLevel) { + return b.codename === null ? 1 : a.codename.localeCompare(b.codename); + } - var info = { - id: platform.id, - abis: abis, - skins: platform.skins, - name: platform.name, - type: platform.type, - path: platform.path, - revision: platform.revision, - androidJar: platform.androidJar, - aidl: platform.aidl - }; + return a.apiLevel - b.apiLevel; + }; - if (platform.type === 'platform') { - info['api-level'] = platform.apiLevel; - info.sdk = platform.apiLevel; - info.version = platform.version; - info.supported = !~~platform.apiLevel || appc.version.satisfies(platform.apiLevel, androidPackageJson.vendorDependencies['android sdk'], true); - } else if (platform.type === 'add-on' && platform.basedOn) { - info.vendor = platform.vendor; - info.description = platform.description; - info.version = platform.basedOn.version || parseInt(String(platform.basedOn).replace(/^android-/, '')) || null; - info['based-on'] = { - 'android-version': platform.basedOn.version, - 'api-level': platform.basedOn.apiLevel - }; - info.supported = !~~platform.basedOn.apiLevel || appc.version.satisfies(platform.basedOn.apiLevel, androidPackageJson.vendorDependencies['android sdk'], true); - info.libraries = {}; // not supported any more + let index = 1; + const sortedPlatforms = platforms.sort(sortFn).concat(addons.sort(sortFn)); + for (const platform of sortedPlatforms) { + const abis = []; + if (platform.abis) { + for (const type of Object.keys(platform.abis)) { + for (const abi of platform.abis[type]) { + if (!abis.includes(abi)) { + abis.push(abi); + } + } } + } - results.targets[index++] = info; - - if (!info.supported) { - results.issues.push({ - id: 'ANDROID_API_TOO_OLD', - type: 'warning', - message: __('Android API %s is too old and is no longer supported by Titanium SDK %s.', '__' + info.name + ' (' + info.id + ')__', manifestJson.version) + '\n' - + __('The minimum supported Android API level by Titanium SDK %s is API level %s.', manifestJson.version, appc.version.parseMin(androidPackageJson.vendorDependencies['android sdk'])) - }); - } else if (info.supported === 'maybe') { - results.issues.push({ - id: 'ANDROID_API_TOO_NEW', - type: 'warning', - message: __('Android API %s is too new and may or may not work with Titanium SDK %s.', '__' + info.name + ' (' + info.id + ')__', manifestJson.version) + '\n' - + __('The maximum supported Android API level by Titanium SDK %s is API level %s.', manifestJson.version, appc.version.parseMax(androidPackageJson.vendorDependencies['android sdk'])) - }); - } - }); + const info = { + id: platform.id, + abis: abis, + skins: platform.skins, + name: platform.name, + type: platform.type, + path: platform.path, + revision: platform.revision, + androidJar: platform.androidJar, + aidl: platform.aidl + }; - // check that we found at least one target - if (!Object.keys(results.targets).length) { - results.issues.push({ - id: 'ANDROID_NO_APIS', - type: 'error', - message: __('No Android APIs found.') + '\n' - + __('Run \'%s\' to install the latest Android APIs.', 'Android Studio') - }); + if (platform.type === 'platform') { + info['api-level'] = platform.apiLevel; + info.sdk = platform.apiLevel; + info.version = platform.version; + info.supported = !~~platform.apiLevel || version.satisfies(platform.apiLevel, androidPackageJson.vendorDependencies['android sdk'], true); + } else if (platform.type === 'add-on' && platform.basedOn) { + info.vendor = platform.vendor; + info.description = platform.description; + info.version = platform.basedOn.version || Number.parseInt(String(platform.basedOn).replace(/^android-/, '')) || null; + info['based-on'] = { + 'android-version': platform.basedOn.version, + 'api-level': platform.basedOn.apiLevel + }; + info.supported = !Number.parseInt(platform.basedOn.apiLevel) || version.satisfies(platform.basedOn.apiLevel, androidPackageJson.vendorDependencies['android sdk'], true); + info.libraries = {}; // not supported any more } - // check that we found at least one valid target - if (!Object.keys(results.targets).some(t => !!results.targets[t].supported)) { + results.targets[index++] = info; + + if (!info.supported) { results.issues.push({ - id: 'ANDROID_NO_VALID_APIS', + id: 'ANDROID_API_TOO_OLD', type: 'warning', - message: __('No valid Android APIs found that are supported by Titanium SDK %s.', manifestJson.version) + '\n' - + __('Run \'%s\' to install the latest Android APIs.', 'Android Studio') + message: `Android API __${info.name} (${info.id})__ is too old and is no longer supported by Titanium SDK ${manifestJson.version} +The minimum supported Android API level by Titanium SDK ${manifestJson.version} is API level ${version.parseMin(androidPackageJson.vendorDependencies['android sdk'])}` + }); + } else if (info.supported === 'maybe') { + results.issues.push({ + id: 'ANDROID_API_TOO_NEW', + type: 'warning', + message: `Android API __${info.name} (${info.id})__ is too new and may or may not work with Titanium SDK ${manifestJson.version} +The maximum supported Android API level by Titanium SDK ${manifestJson.version} is API level ${version.parseMax(androidPackageJson.vendorDependencies['android sdk'])}` }); } + } - // parse the avds - var avdDir = afs.resolvePath('~/.android/avd'); - var iniRegExp = /^(.+)\.ini$/; - if (isDir(avdDir)) { - fs.readdirSync(avdDir).forEach(function (name) { - var m = name.match(iniRegExp); - if (!m) { - return; - } - - var ini = readProps(path.join(avdDir, name)); - if (!ini) { - return; - } + // check that we found at least one target + if (!Object.keys(results.targets).length) { + results.issues.push({ + id: 'ANDROID_NO_APIS', + type: 'error', + message: `No Android APIs found. +Run 'Android Studio' to install the latest Android APIs.` + }); + } - var q; - var p = isDir(ini.path) ? ini.path : (ini['path.rel'] && isDir(q = path.join(avdDir, ini['path.rel'])) ? q : null); - if (!p) { - return; - } + // check that we found at least one valid target + if (!Object.keys(results.targets).some(t => !!results.targets[t].supported)) { + results.issues.push({ + id: 'ANDROID_NO_VALID_APIS', + type: 'warning', + message: `No valid Android APIs found that are supported by Titanium SDK ${manifestJson.version}. +Run 'Android Studio' to install the latest Android APIs.` + }); + } - var config = readProps(path.join(p, 'config.ini')); - if (!config) { - return; - } + // parse the avds + const avdDir = expand('~/.android/avd'); + const iniRegExp = /^(.+)\.ini$/; + if (isDir(avdDir)) { + for (const name of fs.readdirSync(avdDir)) { + const m = name.match(iniRegExp); + if (!m) { + return; + } - var sdcard = path.join(p, 'sdcard.img'); - var target = null; - var sdk = null; - var apiLevel = null; - - var info = config['image.sysdir.1'] && systemImagesByPath[config['image.sysdir.1'].replace(/\/$/, '')]; - if (info) { - var platform = platformsById[info.id]; - if (platform) { - target = platform.name + ' (API level ' + platform.apiLevel + ')'; - sdk = platform.version; - apiLevel = platform.apiLevel; - } - } + const ini = readPropertiesFile(path.join(avdDir, name)); + if (!ini) { + return; + } - results.avds.push({ - type: 'avd', - id: config['AvdId'] || m[1], - name: config['avd.ini.displayname'] || m[1], - device: config['hw.device.name'] + ' (' + config['hw.device.manufacturer'] + ')', - path: p, - target: target, - abi: config['abi.type'], - skin: config['skin.name'], - sdcard: config['hw.sdCard'] === 'yes' && isFile(sdcard) ? sdcard : null, - googleApis: config['tag.id'] === 'google_apis', - 'sdk-version': sdk, - 'api-level': apiLevel - }); - }); - } + let q; + const p = isDir(ini.path) ? ini.path : (ini['path.rel'] && isDir(q = path.join(avdDir, ini['path.rel'])) ? q : null); + if (!p) { + return; + } - finalize(); + const config = readPropertiesFile(path.join(p, 'config.ini')); + if (!config) { + return; + } - function createAndroidSdkInstallationErrorMessage(message) { - if (!message) { - message = ''; - } else if (message.length > 0) { - message += '\n'; + const sdcard = path.join(p, 'sdcard.img'); + let target = null; + let sdk = null; + let apiLevel = null; + + const info = config['image.sysdir.1'] && systemImagesByPath[config['image.sysdir.1'].replace(/\/$/, '')]; + if (info) { + const platform = platformsById[info.id]; + if (platform) { + target = `${platform.name} (API level ${platform.apiLevel})`; + sdk = platform.version; + apiLevel = platform.apiLevel; + } } - message += __('Current installed Android SDK tools:') + '\n' - + ' Android SDK Tools: ' + (results.sdk.tools.version || 'not installed') + ' (Supported: ' + androidPackageJson.vendorDependencies['android tools'] + ')\n' - + ' Android SDK Platform Tools: ' + (results.sdk.platformTools.version || 'not installed') + ' (Supported: ' + androidPackageJson.vendorDependencies['android platform tools'] + ')\n' - + ' Android SDK Build Tools: ' + (results.sdk.buildTools.version || 'not installed') + ' (Supported: ' + androidPackageJson.vendorDependencies['android build tools'] + ')\n\n' - + __('Make sure you have the latest Android SDK Tools, Platform Tools, and Build Tools installed.') + '\n'; - return message; + + results.avds.push({ + type: 'avd', + id: config['AvdId'] || m[1], + name: config['avd.ini.displayname'] || m[1], + device: `${config['hw.device.name']} (${config['hw.device.manufacturer']})`, + path: p, + target: target, + abi: config['abi.type'], + skin: config['skin.name'], + sdcard: config['hw.sdCard'] === 'yes' && isFile(sdcard) ? sdcard : null, + googleApis: config['tag.id'] === 'google_apis', + 'sdk-version': sdk, + 'api-level': apiLevel + }); } - }); -}; + } -exports.findSDK = findSDK; + return results; +} -function findSDK(dir, config, androidPackageJson, callback) { +export async function findSDK(dir, config, androidPackageJson) { if (!dir) { - return callback(true); + return null; } - dir = afs.resolvePath(dir); + dir = expand(dir); // check if the supplied directory exists and is actually a directory if (!fs.existsSync(dir) || !fs.statSync(dir).isDirectory()) { - return callback(true); - } - - const emulatorPath = path.join(dir, 'emulator', `emulator${exe}`), - result = { - path: dir, - executables: { - adb: path.join(dir, 'platform-tools', 'adb' + exe), - emulator: fs.existsSync(emulatorPath) ? emulatorPath : path.join(dir, 'emulator', 'emulator' + exe) - }, - proguard: null, - tools: { - path: null, - supported: null, - version: null - }, - platformTools: { - path: null, - supported: null, - version: null - }, - buildTools: { - path: null, - supported: null, - version: null, - tooNew: null, - maxSupported: null - } + return null; + } + + const emulatorPath = path.join(dir, 'emulator', `emulator${exe}`); + const result = { + path: dir, + executables: { + adb: path.join(dir, 'platform-tools', 'adb' + exe), + emulator: fs.existsSync(emulatorPath) ? emulatorPath : path.join(dir, 'emulator', 'emulator' + exe) + }, + proguard: null, + tools: { + path: null, + supported: null, + version: null }, - tasks = {}, - buildToolsDir = path.join(dir, 'build-tools'); + platformTools: { + path: null, + supported: null, + version: null + }, + buildTools: { + path: null, + supported: null, + version: null, + tooNew: null, + maxSupported: null + } + }; + const buildToolsDir = path.join(dir, 'build-tools'); /* Determine build tools version to use based on either config setting @@ -730,7 +584,7 @@ function findSDK(dir, config, androidPackageJson, callback) { const len = files.length; let i = 0; for (; i < len; i++) { - var isSupported = appc.version.satisfies(files[i], androidPackageJson.vendorDependencies['android build tools'], true); + const isSupported = version.satisfies(files[i], androidPackageJson.vendorDependencies['android build tools'], true); if (isSupported) { buildToolsSupported = isSupported; ver = files[i]; @@ -752,14 +606,14 @@ function findSDK(dir, config, androidPackageJson, callback) { // A selectedVersion specified or supported version has been found let file = path.join(buildToolsDir, ver, 'source.properties'); if (fs.existsSync(file) && fs.statSync(path.join(buildToolsDir, ver)).isDirectory()) { - var m = fs.readFileSync(file).toString().match(/Pkg\.Revision\s*?=\s*?([^\s]+)/); + const m = fs.readFileSync(file, 'utf8').match(/Pkg\.Revision\s*?=\s*?([^\s]+)/); if (m) { result.buildTools = { path: path.join(buildToolsDir, ver), - supported: appc.version.satisfies(m[1], androidPackageJson.vendorDependencies['android build tools'], true), + supported: version.satisfies(m[1], androidPackageJson.vendorDependencies['android build tools'], true), version: m[1], tooNew: buildToolsSupported, - maxSupported: appc.version.parseMax(androidPackageJson.vendorDependencies['android build tools'], true) + maxSupported: version.parseMax(androidPackageJson.vendorDependencies['android build tools'], true) }; } } else { @@ -774,157 +628,80 @@ function findSDK(dir, config, androidPackageJson, callback) { } // see if this sdk has all the executables we need - Object.keys(requiredSdkTools).forEach(function (cmd) { - tasks[cmd] = function (next) { - findExecutable([ - config.get('android.executables.' + cmd), - result.executables[cmd] - ], function (err, r) { - next(null, !err && r ? r : null); - }); - }; - }); - - async.parallel(tasks, function (err, executables) { - appc.util.mix(result.executables, executables); - - // check that we have all required sdk programs - if (Object.keys(requiredSdkTools).every(cmd => !executables[cmd])) { - return callback(true); - } - - var file = path.join(dir, 'platform-tools', 'source.properties'); - - // check if this directory contains an android sdk - if (!fs.existsSync(executables.adb) || !fs.existsSync(file)) { - return callback(true); - } - - if (fs.existsSync(file)) { - const m = fs.readFileSync(file).toString().match(/Pkg\.Revision\s*?=\s*?([^\s]+)/); - if (m) { - result.platformTools = { - path: path.join(dir, 'platform-tools'), - supported: appc.version.satisfies(m[1], androidPackageJson.vendorDependencies['android platform tools'], true), - version: m[1] - }; + const tasks = {}; + for (const cmd of Object.keys(requiredSdkTools)) { + tasks[cmd] = (async () => { + let bin = config.get(`android.executables.${cmd}`); + if (bin) { + bin = await which(bin, { nothrow: true }); } - } - - callback(null, result); - }); -} - -function findNDK(dir, config, callback) { - if (!dir) { - return callback(true); - } - - // check if the supplied directory exists and is actually a directory - dir = afs.resolvePath(dir); - - if (!fs.existsSync(dir) || !fs.statSync(dir).isDirectory()) { - return callback(true); - } - - // check that the ndk files/folders exist - const things = [ 'ndk-build' + cmd, 'build', 'prebuilt', 'platforms' ]; - if (!things.every(thing => fs.existsSync(path.join(dir, thing)))) { - return callback(true); - } - - // try to determine the version - let version; - const sourceProps = path.join(dir, 'source.properties'); - if (fs.existsSync(sourceProps)) { - const m = fs.readFileSync(sourceProps).toString().match(/Pkg\.Revision\s*=\s*(.+)/m); - if (m && m[1]) { - version = m[1].trim(); - } - } - - if (!version) { - // try the release.txt - let releasetxt; - fs.readdirSync(dir).some(function (file) { - if (file.toLowerCase() === 'release.txt') { - releasetxt = path.join(dir, file); - return true; + if (!bin) { + bin = await which(result.executables[cmd], { nothrow: true }); } - return false; - }); - - if (releasetxt && fs.existsSync(releasetxt)) { - version = fs.readFileSync(releasetxt).toString().split(/\r?\n/).shift().trim(); - } - } - - if (!version) { - // no version, not an ndk - return callback(true); + if (!bin) { + throw new Error(`Unable to find "${cmd}" executable`); + } + return { [cmd]: bin }; + })(); } - callback(null, { - path: dir, - executables: { - ndkbuild: path.join(dir, 'ndk-build' + cmd) - }, - version: version - }); -} + const executables = await Promise.all(Object.values(tasks)); + Object.assign(result.executables, executables); -function isDir(dir) { - try { - return fs.statSync(dir).isDirectory(); - } catch (e) { - // squeltch + // check that we have all required sdk programs + if (Object.keys(requiredSdkTools).every(cmd => !executables[cmd])) { + return null; } - return false; -} -function isFile(file) { - try { - return fs.statSync(file).isFile(); - } catch (e) { - // squeltch - } - return false; -} + const file = path.join(dir, 'platform-tools', 'source.properties'); -function readProps(file) { - if (!isFile(file)) { + // check if this directory contains an android sdk + if (!fs.existsSync(executables.adb) || !fs.existsSync(file)) { return null; } - const props = {}; - fs.readFileSync(file).toString().split(/\r?\n/).forEach(function (line) { - const m = line.match(pkgPropRegExp); + if (fs.existsSync(file)) { + const m = fs.readFileSync(file, 'utf8').match(/Pkg\.Revision\s*?=\s*?([^\s]+)/); if (m) { - props[m[1].trim()] = m[2].trim(); + result.platformTools = { + path: path.join(dir, 'platform-tools'), + supported: version.satisfies(m[1], androidPackageJson.vendorDependencies['android platform tools'], true), + version: m[1] + }; } - }); + } - return props; + return result; } + function loadPlatform(dir, systemImages) { // read in the properties - const sourceProps = readProps(path.join(dir, 'source.properties')); - const apiLevel = sourceProps ? ~~sourceProps['AndroidVersion.ApiLevel'] : null; + const sourceProps = readPropertiesFile(path.join(dir, 'source.properties')); + const apiLevel = sourceProps ? Number.parseInt(sourceProps['AndroidVersion.ApiLevel']) : null; if (!sourceProps || !apiLevel || !isFile(path.join(dir, 'build.prop'))) { return null; } // read in the sdk properties, if exists - const sdkProps = readProps(path.join(dir, 'sdk.properties')); + const sdkProps = readPropertiesFile(path.join(dir, 'sdk.properties')); // detect the available skins const skinsDir = path.join(dir, 'skins'); - const skins = isDir(skinsDir) ? fs.readdirSync(skinsDir).map(name => { - return isFile(path.join(skinsDir, name, 'hardware.ini')) ? name : null; - }).filter(x => x) : []; - let defaultSkin = sdkProps && sdkProps['sdk.skin.default']; - if (skins.indexOf(defaultSkin) === -1 && skins.indexOf(defaultSkin = 'WVGA800') === -1) { + const skins = []; + if (isDir(skinsDir)) { + for (const name of fs.readdirSync(skinsDir)) { + if (isFile(path.join(skinsDir, name, 'hardware.ini'))) { + skins.push(name); + } + } + } + + let defaultSkin = sdkProps?.['sdk.skin.default']; + if (defaultSkin && !skins.includes(defaultSkin)) { + defaultSkin = 'WVGA800'; + } + if (defaultSkin && !skins.includes(defaultSkin)) { defaultSkin = skins[skins.length - 1] || null; } @@ -933,34 +710,35 @@ function loadPlatform(dir, systemImages) { const abis = {}; if (systemImages[id]) { - Object.keys(systemImages[id]).forEach(function (type) { - systemImages[id][type].forEach(function (info) { - abis[type] || (abis[type] = []); + for (const type of Object.keys(systemImages[id])) { + for (const info of systemImages[id][type]) { + if (!abis[type]) { + abis[type] = []; + } abis[type].push(info.abi); - - info.skins.forEach(function (skin) { - if (skins.indexOf(skin) === -1) { + for (const skin of info.skins) { + if (!skins.includes(skin)) { skins.push(skin); } - }); - }); - }); + } + } + } } let tmp; return { id: id, - name: 'Android ' + sourceProps['Platform.Version'] + (sourceProps['AndroidVersion.CodeName'] ? ' (Preview)' : ''), + name: `Android ${sourceProps['Platform.Version']} ${sourceProps['AndroidVersion.CodeName'] ? ' (Preview)' : ''}`, type: 'platform', apiLevel: apiLevel, codename: sourceProps['AndroidVersion.CodeName'] || null, - revision: +sourceProps['Layoutlib.Revision'] || null, + revision: Number.parseInt(sourceProps['Layoutlib.Revision']) || null, path: dir, version: sourceProps['Platform.Version'], abis: abis, skins: skins, defaultSkin: defaultSkin, - minToolsRev: +sourceProps['Platform.MinToolsRev'] || null, + minToolsRev: Number.parseInt(sourceProps['Platform.MinToolsRev']) || null, androidJar: isFile(tmp = path.join(dir, 'android.jar')) ? tmp : null, aidl: isFile(tmp = path.join(dir, 'framework.aidl')) ? tmp : null }; @@ -968,8 +746,8 @@ function loadPlatform(dir, systemImages) { function loadAddon(dir, platforms, _systemImages) { // read in the properties - const sourceProps = readProps(path.join(dir, 'source.properties')); - const apiLevel = sourceProps ? ~~sourceProps['AndroidVersion.ApiLevel'] : null; + const sourceProps = readPropertiesFile(path.join(dir, 'source.properties')); + const apiLevel = sourceProps ? Number.parseInt(sourceProps['AndroidVersion.ApiLevel']) : null; if (!sourceProps || !apiLevel || !sourceProps['Addon.VendorDisplay'] || !sourceProps['Addon.NameDisplay']) { return null; } @@ -977,13 +755,13 @@ function loadAddon(dir, platforms, _systemImages) { const basedOn = platforms.find(p => p.codename === null && p.apiLevel === apiLevel); return { - id: sourceProps['Addon.VendorDisplay'] + ':' + sourceProps['Addon.NameDisplay'] + ':' + apiLevel, + id: `${sourceProps['Addon.VendorDisplay']}:${sourceProps['Addon.NameDisplay']}:${apiLevel}`, name: sourceProps['Addon.NameDisplay'], type: 'add-on', vendor: sourceProps['Addon.VendorDisplay'], description: sourceProps['Pkg.Desc'], apiLevel: apiLevel, - revision: +sourceProps['Pkg.Revision'] || null, + revision: Number.parseInt(sourceProps['Pkg.Revision']) || null, codename: sourceProps['AndroidVersion.CodeName'] || null, path: dir, basedOn: basedOn ? { @@ -998,22 +776,3 @@ function loadAddon(dir, platforms, _systemImages) { aidl: basedOn && basedOn.aidl || null }; } - -function versionStringComparer(text1, text2) { - // Split strings into version component arrays. Example: '1.2.3' -> ['1', '2', '3'] - const array1 = text1.split('.'); - const array2 = text2.split('.'); - - // Compare the 2 given strings by their numeric components. - // If they match numerically, then do a string comparison. - const maxLength = Math.max(array1.length, array2.length); - for (let index = 0; index < maxLength; index++) { - const value1 = (index < array1.length) ? (Number.parseInt(array1[index], 10) || 0) : 0; - const value2 = (index < array2.length) ? (Number.parseInt(array2[index], 10) || 0) : 0; - const delta = value1 - value2; - if (delta !== 0) { - return delta; - } - } - return text1.localeCompare(text2); -} diff --git a/lib/babel-plugins/global-this.js b/lib/babel-plugins/global-this.js index 2040039d..42ccb735 100644 --- a/lib/babel-plugins/global-this.js +++ b/lib/babel-plugins/global-this.js @@ -1,11 +1,9 @@ -'use strict'; - const THIS_BREAK_KEYS = [ 'FunctionExpression', 'FunctionDeclaration', 'ClassProperty', 'ClassMethod', 'ObjectMethod' ]; // Walk the AST looking for 'this' references intended to be references to global // Replace them with an explicit 'global' reference -module.exports = function (_ref) { +export function plugin(_ref) { const t = _ref.types; return { visitor: { @@ -21,4 +19,6 @@ module.exports = function (_ref) { } } }; -}; +} + +export default plugin; diff --git a/lib/babel-plugins/ti-api.js b/lib/babel-plugins/ti-api.js index ead0f386..635c3b68 100644 --- a/lib/babel-plugins/ti-api.js +++ b/lib/babel-plugins/ti-api.js @@ -1,5 +1,3 @@ -'use strict'; - /** * Keeps track of the Titanium APIs used globally (across the whoel build, so implicitly "per-project"). */ @@ -18,7 +16,7 @@ const symbols = new Set(); * @param {object} _ref.types instance of @babel/types * @returns {object} the instance of the plugin used by Babel during transforms */ -function plugin(_ref) { +export function plugin(_ref) { const types = _ref.types; /** * Returns the name of identifiers, value of string literals, or `'obj.value'` of member expressions. @@ -61,7 +59,6 @@ function plugin(_ref) { * @returns {string|null} */ function getTitaniumExpression(member) { - if (types.isStringLiteral(member.object)) { // Prevent picking up strings in evaluation. // e.g: "Ti.Test".toUpperCase(); @@ -84,6 +81,7 @@ function plugin(_ref) { } return null; } + return { pre() { symbols.clear(); // wipe symbols before each AST, gather these "per-file" @@ -105,7 +103,8 @@ function plugin(_ref) { } }; } + plugin.apiUsage = apiUsage; // expose the apiUsage plugin.symbols = symbols; // expose the symbol usage -module.exports = plugin; +export default plugin; diff --git a/lib/builder.js b/lib/builder.js index 141df10f..aff63652 100644 --- a/lib/builder.js +++ b/lib/builder.js @@ -1,30 +1,11 @@ -/** - * @overview - * The base class for platform specific build commands. This ensures some - * commonality between build commands so that hooks can consistently - * access build properties. - * - * @copyright - * Copyright (c) 2009-2015 by Appcelerator, Inc. All Rights Reserved. - * - * @license - * Licensed under the terms of the Apache Public License - * Please see the LICENSE included with this distribution for details. - */ -'use strict'; - -const - appc = require('node-appc'), - crypto = require('crypto'), - fs = require('fs-extra'), - path = require('path'), - ti = require('./titanium'), - i18n = appc.i18n(__dirname), - __ = i18n.__, - __n = i18n.__n; - -// shim String.prototype.normalize() -require('unorm'); +import fs from 'node:fs'; +import path from 'node:path'; +import crypto from 'node:crypto'; +import ti from './titanium.js'; +import { fileURLToPath } from 'node:url'; +import { find as findTiModules } from './timodule.js'; +import { pngInfo } from './png-info.js'; +import { rename } from 'node:fs/promises'; /** * The base class for platform specific build commands. This ensures some @@ -34,491 +15,482 @@ require('unorm'); * General usage is to extend the Builder class and override the config(), * validate(), and run() methods: * - * var Builder = require('node-titanium-sdk/lib/builder'); - * var util = require('util'); - * - * function SomePlatformBuilder() { - * Builder.apply(this, arguments); - * } - * - * util.inherits(SomePlatformBuilder, Builder); - * - * SomePlatformBuilder.prototype.config = function config(logger, config, cli) { - * Builder.prototype.config.apply(this, arguments); - * // TODO - * }; + * @example + * import { Builder } from 'node-titanium-sdk'; * - * SomePlatformBuilder.prototype.validate = function validate(logger, config, cli) { - * // TODO - * }; + * class SomePlatformBuilder extends Builder { + * config(logger, config, cli) { + * super.config(logger, config, cli); + * // TODO: platform specific config code goes here + * } * - * SomePlatformBuilder.prototype.run = function run(logger, config, cli, finished) { - * Builder.prototype.run.apply(this, arguments); - * // TODO - * finished(); - * }; + * validate(logger, config, cli) { + * super.validate(logger, config, cli); + * // TODO: platform specific validate code goes here + * } * - * @module lib/builder + * run(logger, config, cli, finished) { + * super.run(); + * // TODO: platform specific run code goes here + * finished(); + * } + * } */ +export class Builder { + conf = {}; + buildDirFiles = {}; + titaniumSdkVersion = ti.manifest.version; + + /** + * Constructs the build state. This needs to be explicitly called from the + * derived builder's constructor. + * + * @param {Module} buildModule The "module" variable from the build command file + */ + constructor(buildModule) { + this.titaniumSdkName = this.locateSDKPath(); + this.platformPath = this.locatePlatformPath(buildModule); + this.platformName = path.basename(this.platformPath); + this.globalModulesPath = path.join(this.titaniumSdkPath, '..', '..', '..', 'modules'); + this.packageJson = JSON.parse(fs.readFileSync(path.join(this.platformPath, 'package.json'), 'utf8')); + } -module.exports = Builder; - -/** - * Constructs the build state. This needs to be explicitly called from the - * derived builder's constructor. - * - * @class - * @classdesc Base class for all build states. - * @constructor - * - * @param {Module} buildModule The "module" variable from the build command file - */ -function Builder(buildModule) { - this.titaniumSdkPath = (function scan(dir) { - const file = path.join(dir, 'manifest.json'); - if (fs.existsSync(file)) { - return dir; + locateSDKPath() { + let dir = path.dirname(fileURLToPath(import.meta.url)); + const { root } = path.parse(dir); + while (dir !== root) { + if (fs.existsSync(path.join(dir, 'manifest.json'))) { + return dir; + } } - dir = path.dirname(dir); - return dir !== '/' && scan(dir); - }(__dirname)); - - this.titaniumSdkName = path.basename(this.titaniumSdkPath); - - this.titaniumSdkVersion = ti.manifest.version; + return null; + } - this.platformPath = (function scan(dir) { - const file = path.join(dir, 'package.json'); - if (fs.existsSync(file)) { - return dir; + locatePlatformPath(buildModule) { + let dir = path.dirname(buildModule.filename); + const { root } = path.parse(dir); + while (dir !== root) { + if (fs.existsSync(path.join(dir, 'package.json'))) { + return dir; + } } - dir = path.dirname(dir); - return dir !== '/' && scan(dir); - }(path.dirname(buildModule.filename))); - - this.platformName = path.basename(this.platformPath); - - this.globalModulesPath = path.join(this.titaniumSdkPath, '..', '..', '..', 'modules'); - - this.packageJson = require(path.join(this.platformPath, 'package.json')); - - this.conf = {}; - - this.buildDirFiles = {}; -} - -/** - * Defines common variables prior to running the build's config(). This super - * function should be called prior to the platform-specific build command's config(). - * - * @param {Object} logger - The logger instance - * @param {Object} config - The CLI config - * @param {Object} cli - The CLI instance - */ -Builder.prototype.config = function config(logger, config, cli) { - // note: this function must be sync! - this.logger = logger; - this.config = config; - this.cli = cli; - this.symlinkFilesOnCopy = false; - this.ignoreDirs = new RegExp(config.get('cli.ignoreDirs')); - this.ignoreFiles = new RegExp(config.get('cli.ignoreFiles')); -}; - -/** - * Validation stub function. Meant to be overwritten. - * - * @param {Object} logger - The logger instance - * @param {Object} config - The CLI config - * @param {Object} cli - The CLI instance - */ -Builder.prototype.validate = function validate(logger, config, cli) { - // note: this function must be sync! + return null; + } - this.tiapp = cli.tiapp; - this.timodule = cli.timodule; - this.projectDir = cli.argv['project-dir']; - this.buildDir = path.join(this.projectDir, 'build', this.platformName); + /** + * Defines common variables prior to running the build's config(). This super + * function should be called prior to the platform-specific build command's config(). + * + * @param {Object} logger - The logger instance + * @param {Object} config - The CLI config + * @param {Object} cli - The CLI instance + */ + config(logger, config, cli) { + // note: this function must be sync! + this.logger = logger; + this.config = config; + this.cli = cli; + this.symlinkFilesOnCopy = false; + this.ignoreDirs = new RegExp(config.get('cli.ignoreDirs')); + this.ignoreFiles = new RegExp(config.get('cli.ignoreFiles')); + } - this.defaultIcons = [ - path.join(this.projectDir, 'DefaultIcon-' + this.platformName + '.png'), - path.join(this.projectDir, 'DefaultIcon.png') - ]; -}; + /** + * Validation stub function. Meant to be overwritten. + * + * @param {Object} logger - The logger instance + * @param {Object} config - The CLI config + * @param {Object} cli - The CLI instance + */ + validate(_logger, _config, cli) { + // note: this function must be sync? + + this.tiapp = cli.tiapp; + this.timodule = cli.timodule; + this.projectDir = cli.argv['project-dir']; + this.buildDir = path.join(this.projectDir, 'build', this.platformName); + + this.defaultIcons = [ + path.join(this.projectDir, `DefaultIcon-${this.platformName}.png`), + path.join(this.projectDir, 'DefaultIcon.png') + ]; + } -/** - * Defines common variables prior to running the build. This super function - * should be called prior to the platform-specific build command's run(). - * - * @param {Object} _logger - The logger instance - * @param {Object} _config - The CLI config - * @param {Object} _cli - The CLI instance - * @param {Function} _finished - A function to call after the function finishes - */ -Builder.prototype.run = function run(_logger, _config, _cli, _finished) { - // note: this function must be sync! - - var buildDirFiles = this.buildDirFiles = {}; - - // walk the entire build dir and build a map of all files - if (fs.existsSync(this.buildDir)) { - this.logger.trace(__('Snapshotting build directory')); - (function walk(dir) { - fs.readdirSync(dir).forEach(function (name) { - var file = path.join(dir, name).normalize(); - try { - var stat = fs.lstatSync(file); - if (stat.isDirectory()) { - walk(file); - } else { - buildDirFiles[file] = stat; + /** + * Defines common variables prior to running the build. This super function + * should be called prior to the platform-specific build command's run(). + * + * @param {Object} _logger - The logger instance + * @param {Object} _config - The CLI config + * @param {Object} _cli - The CLI instance + * @param {Function} _finished - A function to call after the function finishes + */ + run(_logger, _config, _cli, _finished) { + // note: this function must be sync! + + const buildDirFiles = {}; + this.buildDirFiles = buildDirFiles; + + // walk the entire build dir and build a map of all files + if (fs.existsSync(this.buildDir)) { + this.logger.trace('Snapshotting build directory'); + + // use iterative approach with a stack to avoid deep recursion + const dirsToProcess = [this.buildDir]; + + while (dirsToProcess.length > 0) { + const currentDir = dirsToProcess.pop(); + for (const name of fs.readdirSync(currentDir)) { + const file = path.join(currentDir, name).normalize(); + try { + const stat = fs.lstatSync(file); + if (stat.isDirectory()) { + dirsToProcess.push(file); + } else { + buildDirFiles[file] = stat; + } + } catch { + buildDirFiles[file] = true; } - } catch (ex) { - buildDirFiles[file] = true; } - }); - }(this.buildDir)); + } + } } -}; -/** - * Removes a file from the buildDirFiles map. - * - * @param {String} file - The file to unmark. - */ -Builder.prototype.unmarkBuildDirFile = function unmarkBuildDirFile(file) { - delete this.buildDirFiles[file.normalize()]; -}; - -/** - * Removes all paths from the buildDirFiles map that start with the specified path. - * - * @param {String} dir - The path prefix to unmark files. - */ -Builder.prototype.unmarkBuildDirFiles = function unmarkBuildDirFiles(dir) { - if (/\*$/.test(dir)) { - dir = dir.substring(0, dir.length - 1); - } else if (!/\/$/.test(dir)) { - dir += '/'; + /** + * Removes a file from the buildDirFiles map. + * + * @param {String} file - The file to unmark. + */ + unmarkBuildDirFile(file) { + delete this.buildDirFiles[file.normalize()]; } - dir = dir.normalize(); - Object.keys(this.buildDirFiles).forEach(function (file) { - if (file.indexOf(dir) === 0) { - delete this.buildDirFiles[file]; - } - }, this); -}; -/** - * Copies or symlinks a file to the specified destination. - * - * @param {String} src - The file to copy. - * @param {String} dest - The destination of the file. - * @param {Object} [opts] - An object containing various options. - * @param {Boolean} [opts.forceCopy] - When true, forces the file to be copied and not symlinked. - * @param {Boolean} [opts.forceSymlink] - When true, ignores `opts.contents` and `opts.forceCopy` and symlinks the `src` to the `dest`. - * @param {Buffer|String} [opts.contents] - The contents to write to the file instead of reading the specified source file. - */ -Builder.prototype.copyFileSync = function copyFileSync(src, dest, opts) { - var parent = path.dirname(dest), - exists = fs.existsSync(dest); - - opts && typeof opts === 'object' || (opts = {}); + /** + * Removes all paths from the buildDirFiles map that start with the specified path. + * + * @param {String} dir - The path prefix to unmark files. + */ + unmarkBuildDirFiles(dir) { + if (dir.endsWith('*')) { + dir = dir.substring(0, dir.length - 1); + } else if (!dir.endsWith('/')) { + dir += '/'; + } + dir = dir.normalize(); + for (const file of Object.keys(this.buildDirFiles)) { + if (file.startsWith(dir)) { + delete this.buildDirFiles[file]; + } + } + } - fs.ensureDirSync(parent); + /** + * Copies or symlinks a file to the specified destination. + * + * @param {String} src - The file to copy. + * @param {String} dest - The destination of the file. + * @param {Object} [opts] - An object containing various options. + * @param {Boolean} [opts.forceCopy] - When true, forces the file to be copied and not symlinked. + * @param {Boolean} [opts.forceSymlink] - When true, ignores `opts.contents` and `opts.forceCopy` and symlinks the `src` to the `dest`. + * @param {Buffer|String} [opts.contents] - The contents to write to the file instead of reading the specified source file. + */ + copyFileSync(src, dest, opts = {}) { + const parent = path.dirname(dest); + const exists = fs.existsSync(dest); + + fs.mkdirSync(parent, { recursive: true }); + + if (!opts.forceSymlink && (opts.forceCopy || !this.symlinkFilesOnCopy || opts.contents)) { + if (exists) { + this.logger.debug(`Overwriting ${src} => ${dest}`); + fs.unlinkSync(dest); + } else { + this.logger.debug(`Copying ${src} => ${dest}`); + } + fs.writeFileSync(dest, opts.contents || fs.readFileSync(src)); + return true; - if (!opts.forceSymlink && (opts.forceCopy || !this.symlinkFilesOnCopy || opts.contents)) { - if (exists) { - this.logger.debug(__('Overwriting %s => %s', src.cyan, dest.cyan)); - fs.unlinkSync(dest); - } else { - this.logger.debug(__('Copying %s => %s', src.cyan, dest.cyan)); + } else if (!exists || (fs.lstatSync(dest).isSymbolicLink() && fs.realpathSync(dest) !== src)) { + if (exists) { + fs.unlinkSync(dest); + } + this.logger.debug(`Symlinking ${src} => ${dest}`); + fs.symlinkSync(src, dest); + return true; } - fs.writeFileSync(dest, opts.contents || fs.readFileSync(src)); - return true; - - } else if (!exists || (fs.lstatSync(dest).isSymbolicLink() && fs.realpathSync(dest) !== src)) { - exists && fs.unlinkSync(dest); - this.logger.debug(__('Symlinking %s => %s', src.cyan, dest.cyan)); - fs.symlinkSync(src, dest); - return true; } -}; -/** - * Copies or symlinks a file to the specified destination. - * - * @param {String} src - The directory to copy. - * @param {String} dest - The destination of the files. - * @param {Object} [opts] - An object containing various options. - * @param {RegExp} [opts.rootIgnoreDirs] - A regular expression of directories to ignore only in the root directory. - * @param {RegExp} [opts.ignoreDirs] - A regular expression of directories to ignore. - * @param {RegExp} [opts.ignoreFiles] - A regular expression of files to ignore. - * @param {Function} [opts.beforeCopy] - A function called before copying the file. This function can abort the copy or modify the contents being copied. - * @param {Boolean} [opts.forceCopy] - When true, forces the file to be copied and not symlinked. - * @param {Function} [opts.afterCopy] - A function called with the result of the file being copied. - */ -Builder.prototype.copyDirSync = function copyDirSync(src, dest, opts) { - if (!fs.existsSync(src)) { - return; - } + /** + * Copies or symlinks a file to the specified destination. + * + * @param {String} src - The directory to copy. + * @param {String} dest - The destination of the files. + * @param {Object} [opts] - An object containing various options. + * @param {RegExp} [opts.rootIgnoreDirs] - A regular expression of directories to ignore only in the root directory. + * @param {RegExp} [opts.ignoreDirs] - A regular expression of directories to ignore. + * @param {RegExp} [opts.ignoreFiles] - A regular expression of files to ignore. + * @param {Function} [opts.beforeCopy] - A function called before copying the file. This function can abort the copy or modify the contents being copied. + * @param {Boolean} [opts.forceCopy] - When true, forces the file to be copied and not symlinked. + * @param {Function} [opts.afterCopy] - A function called with the result of the file being copied. + */ + copyDirSync(src, dest, opts = {}) { + if (!fs.existsSync(src)) { + return; + } - opts && typeof opts === 'object' || (opts = {}); + const copy = (src, dest, isRootDir) => { + fs.mkdirSync(dest, { recursive: true }); - (function copy(src, dest, isRootDir) { - fs.ensureDirSync(dest); + for (const name of fs.readdirSync(src)) { + const srcFile = path.join(src, name); + const destFile = path.join(dest, name); - fs.readdirSync(src).forEach(function (name) { - const srcFile = path.join(src, name); - const destFile = path.join(dest, name); + // skip broken symlinks + if (!fs.existsSync(srcFile)) { + return; + } - // skip broken symlinks - if (!fs.existsSync(srcFile)) { - return; - } + const srcStat = fs.statSync(srcFile); + if (srcStat.isDirectory()) { + // we are copying a subdirectory + if ((isRootDir && opts.rootIgnoreDirs && opts.rootIgnoreDirs.test(name)) || (opts.ignoreDirs && opts.ignoreDirs.test(name))) { + // ignoring directory + } else { + copy(srcFile, destFile); + } + return; + } - const srcStat = fs.statSync(srcFile); - if (srcStat.isDirectory()) { - // we are copying a subdirectory - if ((isRootDir && opts.rootIgnoreDirs && opts.rootIgnoreDirs.test(name)) || (opts.ignoreDirs && opts.ignoreDirs.test(name))) { - // ignoring directory - } else { - copy.call(this, srcFile, destFile); + // we're copying a file, check if we should ignore it + if (opts.ignoreFiles && opts.ignoreFiles.test(name)) { + return; } - return; - } - // we're copying a file, check if we should ignore it - if (opts.ignoreFiles && opts.ignoreFiles.test(name)) { - return; - } + if (typeof opts.beforeCopy === 'function') { + const result = opts.beforeCopy(srcFile, destFile, srcStat); + if (result === null) { + return; // skip + } else if (result !== undefined) { + this.logger.debug(`Writing ${srcFile} => ${destFile}`); + fs.writeFileSync(destFile, result); + return; + } + // fall through and copy the file normally + } - if (typeof opts.beforeCopy === 'function') { - const result = opts.beforeCopy(srcFile, destFile, srcStat); - if (result === null) { - return; // skip - } else if (result !== undefined) { - this.logger.debug(__('Writing %s => %s', srcFile.cyan, destFile.cyan)); - fs.writeFileSync(destFile, result); - return; + const result = this.copyFileSync(srcFile, destFile, opts); + if (typeof opts.afterCopy === 'function') { + opts.afterCopy(srcFile, destFile, srcStat, result); } - // fall through and copy the file normally } + }; + copy(src, dest, true); + } - const result = this.copyFileSync(srcFile, destFile, opts); - if (typeof opts.afterCopy === 'function') { - opts.afterCopy(srcFile, destFile, srcStat, result); + /** + * Validates that all required Titanium Modules defined in the tiapp.xml are + * installed. + * + * + * This function is intended to be called asynchronously from the validate() + * implementation. In other words, validate() should return a function that + * calls this function. + * + * Note: This function will forcefully exit the application on error! + * + * @param {String|Array} platformName - One or more platform names to use when finding Titanium modules + * @param {String} deployType - The deployment type (development, test, production) + */ + async validateTiModules(platformName, deployType) { + const moduleSearchPaths = [ this.projectDir ]; + const customSDKPaths = this.config.get('paths.sdks'); + const customModulePaths = this.config.get('paths.modules'); + + function addSearchPath(p) { + p = expand(p); + if (fs.existsSync(p) && !moduleSearchPaths.includes(p)) { + moduleSearchPaths.push(p); } - }, this); - }).call(this, src, dest, true); -}; + } -/** - * Validates that all required Titanium Modules defined in the tiapp.xml are - * installed. - * - * This function is intended to be called asynchronously from the validate() - * implementation. In other words, validate() should return a function that - * calls this function. - * - * Note: This function will forcefully exit the application on error! - * - * @example - * SomePlatformBuilder.prototype.validate = function validate(logger, config, cli) { - * Builder.prototype.validate.apply(this, arguments); - * - * // TODO: synchronous platform specific validation code goes here - * - * return function (callback) { - * // TODO: asynchronous platform specific validation code goes here - * - * this.validateTiModules(callback); - * }.bind(this); - * }; - * - * @param {String|Array} platformName - One or more platform names to use when finding Titanium modules - * @param {String} deployType - The deployment type (development, test, production) - * @param {Function} callback(err) - A function to call after the function finishes - */ -Builder.prototype.validateTiModules = function validateTiModules(platformName, deployType, callback) { - var moduleSearchPaths = [ this.projectDir ], - customSDKPaths = this.config.get('paths.sdks'), - customModulePaths = this.config.get('paths.modules'); - - function addSearchPath(p) { - p = appc.fs.resolvePath(p); - if (fs.existsSync(p) && moduleSearchPaths.indexOf(p) === -1) { - moduleSearchPaths.push(p); + for (const p of this.cli.env.os.sdkPaths) { + addSearchPath(p); + } + if (customSDKPaths) { + for (const p of customSDKPaths) { + addSearchPath(p); + } + } + if (customModulePaths) { + for (const p of customModulePaths) { + addSearchPath(p); + } } - } - this.cli.env.os.sdkPaths.forEach(addSearchPath); - Array.isArray(customSDKPaths) && customSDKPaths.forEach(addSearchPath); - Array.isArray(customModulePaths) && customModulePaths.forEach(addSearchPath); + const modules = await findTiModules(this.cli.tiapp.modules, platformName, deployType, ti.manifest, moduleSearchPaths, this.logger); - appc.timodule.find(this.cli.tiapp.modules, platformName, deployType, ti.manifest, moduleSearchPaths, this.logger, function (modules) { if (modules.missing.length) { - this.logger.error(__('Could not find all required Titanium Modules:')); - modules.missing.forEach(function (m) { - this.logger.error(' id: ' + m.id + '\t version: ' + (m.version || 'latest') + '\t platform: ' + m.platform + '\t deploy-type: ' + m.deployType); - }, this); + this.logger.error('Could not find all required Titanium Modules:'); + for (const m of modules.missing) { + this.logger.error(` id: ${m.id}\t version: ${m.version || 'latest'}\t platform: ${m.platform}\t deploy-type: ${m.deployType}`); + } this.logger.log(); process.exit(1); } if (modules.incompatible.length) { - this.logger.error(__('Found incompatible Titanium Modules:')); - modules.incompatible.forEach(function (m) { - this.logger.error(' id: ' + m.id + '\t version: ' + (m.version || 'latest') + '\t platform: ' + m.platform + '\t min sdk: ' + (m.manifest && m.manifest.minsdk || '?')); - }, this); + this.logger.error('Found incompatible Titanium Modules:'); + for (const m of modules.incompatible) { + this.logger.error(` id: ${m.id}\t version: ${m.version || 'latest'}\t platform: ${m.platform}\t min sdk: ${m.manifest && m.manifest.minsdk || '?'}`); + } this.logger.log(); process.exit(1); } if (modules.conflict.length) { - this.logger.error(__('Found conflicting Titanium modules:')); - modules.conflict.forEach(function (m) { - this.logger.error(' ' + __('Titanium module "%s" requested for both Android and CommonJS platforms, but only one may be used at a time.', m.id)); - }, this); + this.logger.error('Found conflicting Titanium modules:'); + for (const m of modules.conflict) { + this.logger.error(` Titanium module "${m.id}" requested for both Android and CommonJS platforms, but only one may be used at a time.`); + } this.logger.log(); process.exit(1); } - callback(null, modules); - }.bind(this)); // end timodule.find() -}; - -/** - * Returns the hexadecimal md5 hash of a string. - * - * @param {String} str - The string to hash - * - * @returns {String} - */ -Builder.prototype.hash = function hash(str) { - return crypto.createHash('md5').update(str || '').digest('hex'); -}; - -/** - * Generates missing app icons based on the DefaultIcon.png. - * - * @param {Array} icons - An array of objects describing the icon size to generate and the destination - * @param {Function} callback - A function to call after the icons have been generated - */ -Builder.prototype.generateAppIcons = function generateAppIcons(icons, callback) { - const requiredMissing = icons.filter(icon => icon.required).length; - let size = null; - var fail = function () { - this.logger.error(__('Unable to create missing icons:')); - printMissing(this.logger.error); - callback(true); - }.bind(this); - - function printMissing(logger, all) { - icons.forEach(function (icon) { - if (all || size === null || icon.width > size.width) { - logger(' ' - + __('%s - size: %sx%s', - icon.description, - icon.width, - icon.height - ) - ); - } - }); + return modules; } - let iconLabels; - if (this.defaultIcons.length > 2) { - const labels = this.defaultIcons.map(icon => '"' + path.basename(icon) + '"'); - const last = labels.pop(); - iconLabels = labels.join(', ') + ', or ' + last; - } else { - iconLabels = this.defaultIcons.map(icon => '"' + path.basename(icon) + '"').join(' or '); + /** + * Returns the hexadecimal md5 hash of a string. + * + * @param {String} str - The string to hash + * + * @returns {String} + */ + hash(str) { + return crypto.createHash('md5').update(str || '').digest('hex'); } - const defaultIcon = this.defaultIcons.find(icon => fs.existsSync(icon)); + /** + * Generates missing app icons based on the DefaultIcon.png. + * + * @param {Array} icons - An array of objects describing the icon size to generate and the destination + */ + async generateAppIcons(icons) { + const requiredMissing = icons.filter(icon => icon.required).length; + let size = null; + + const fail = () => { + this.logger.error('Unable to create missing icons:'); + printMissing(this.logger.error); + }; + + const printMissing = (logger, all) => { + for (const icon of icons) { + if (all || size === null || icon.width > size.width) { + logger(` ${icon.description} - size: ${icon.width}x${icon.height}`); + } + } + }; - if (!defaultIcon) { - if (requiredMissing === 0) { - this.logger.warn(__n('There is a missing app icon, but it is not required', 'There are missing app icons, but they are not required', icons.length)); - this.logger.warn(__('You can either create the missing icons below or create an image named %s in the root of your project', iconLabels)); - this.logger.warn(__('If the DefaultIcon.png image is present, the build will use it to generate all missing icons')); - this.logger.warn(__('It is highly recommended that the DefaultIcon.png be 1024x1024')); - printMissing(this.logger.warn); - return callback(); + let iconLabels; + if (this.defaultIcons.length > 2) { + const labels = this.defaultIcons.map(icon => `"${path.basename(icon)}"`); + const last = labels.pop(); + iconLabels = `${labels.join(', ')}, or ${last}`; + } else { + iconLabels = this.defaultIcons.map(icon => `"${path.basename(icon)}"`).join(' or '); } - this.logger.error(__n('There is a missing required app icon', 'There are missing required app icons', icons.length)); - this.logger.error(__('You must either create the missing icons below or create an image named %s in the root of your project', iconLabels)); - this.logger.error(__('If the DefaultIcon.png image is present, the build will use it to generate all missing icons')); - this.logger.error(__('It is highly recommended that the DefaultIcon.png be 1024x1024')); - return fail(); - } + const defaultIcon = this.defaultIcons.find(icon => fs.existsSync(icon)); - const contents = fs.readFileSync(defaultIcon); - size = appc.image.pngInfo(contents); - - if (size.width !== size.height) { - this.logger.error(__('The %s is %sx%s, however the width and height must be equal', defaultIcon, size.width, size.height)); - this.logger.error(__('It is highly recommended that the %s be 1024x1024', defaultIcon)); - return fail(); - } + if (!defaultIcon) { + if (requiredMissing === 0) { + if (icons.length) { + this.logger.warn('There are missing app icons, but they are not required'); + } else { + this.logger.warn('There is a missing app icon, but it is not required'); + } + this.logger.warn(`You can either create the missing icons below or create an image named ${iconLabels} in the root of your project`); + this.logger.warn('If the DefaultIcon.png image is present, the build will use it to generate all missing icons'); + this.logger.warn('It is highly recommended that the DefaultIcon.png be 1024x1024'); + printMissing(this.logger.warn); + return; + } - this.logger.debug(__('Found %s (%sx%s)', defaultIcon.cyan, size.width, size.height)); - this.logger.info(__n( - 'Missing %s app icon, generating missing icon', - 'Missing %s app icons, generating missing icons', - icons.length - )); - printMissing(this.logger.info, true); - - const rename = []; - let minRequiredSize = null; - let minSize = null; - for (let i = 0; i < icons.length; i++) { - const icon = icons[i]; - if (icon.required) { - if (minRequiredSize === null || icon.width > minRequiredSize) { - minRequiredSize = icon.width; + if (icons.length) { + this.logger.error('There are missing required app icons'); + } else { + this.logger.error('There is a missing required app icon'); } - } else if (icon.width > size.width) { - // default icon isn't big enough, so we just skip this image - this.logger.warn(__('%s (%sx%s) is not large enough to generate missing icon "%s" (%sx%s), skipping', defaultIcon, size.width, size.height, path.basename(icon.file), icon.width, icon.height)); - icons.splice(i--, 1); - continue; + this.logger.error(`You must either create the missing icons below or create an image named ${iconLabels} in the root of your project`); + this.logger.error('If the DefaultIcon.png image is present, the build will use it to generate all missing icons'); + this.logger.error('It is highly recommended that the DefaultIcon.png be 1024x1024'); + return fail(); } - if (minSize === null || icon.width > minSize) { - minSize = icon.width; + + const contents = fs.readFileSync(defaultIcon); + size = pngInfo(contents); + + if (size.width !== size.height) { + this.logger.error(`The ${defaultIcon} is ${size.width}x${size.height}, however the width and height must be equal`); + this.logger.error(`It is highly recommended that the ${defaultIcon} be 1024x1024`); + return fail(); } - if (!path.extname(icon.file)) { - // the file doesn't have an extension, so we need to temporarily set - // one so that the image resizer doesn't blow up - rename.push({ - from: icon.file + '.png', - to: icon.file - }); - icon.file += '.png'; + + this.logger.debug(`Found ${defaultIcon} (${size.width}x${size.height})`); + if (icons.length) { + this.logger.info(`Missing ${icons.length} app icons, generating missing icons`); + } else { + this.logger.info('Missing 1 app icon, generating missing icon'); + } + printMissing(this.logger.info, true); + + const filesToRename = []; + let minRequiredSize = null; + let minSize = null; + for (let i = 0; i < icons.length; i++) { + const icon = icons[i]; + if (icon.required) { + if (minRequiredSize === null || icon.width > minRequiredSize) { + minRequiredSize = icon.width; + } + } else if (icon.width > size.width) { + // default icon isn't big enough, so we just skip this image + this.logger.warn(`${defaultIcon} (${size.width}x${size.height}) is not large enough to generate missing icon "${path.basename(icon.file)}" (${icon.width}x${icon.height}), skipping`); + icons.splice(i--, 1); + continue; + } + if (minSize === null || icon.width > minSize) { + minSize = icon.width; + } + if (!path.extname(icon.file)) { + // the file doesn't have an extension, so we need to temporarily set + // one so that the image resizer doesn't blow up + filesToRename.push({ + from: icon.file + '.png', + to: icon.file + }); + icon.file += '.png'; + } } - } - if (minRequiredSize !== null && size.width < minRequiredSize) { - this.logger.error(__('The %s must be at least %sx%s', defaultIcon, minRequiredSize, minRequiredSize)); - this.logger.error(__('It is highly recommended that the %s be 1024x1024', defaultIcon)); - return fail(); - } + if (minRequiredSize !== null && size.width < minRequiredSize) { + this.logger.error(`The ${defaultIcon} must be at least ${minRequiredSize}x${minRequiredSize}`); + this.logger.error(`It is highly recommended that the ${defaultIcon} be 1024x1024`); + return fail(); + } - appc.image.resize(defaultIcon, icons, function (error, _stdout, _stderr) { - if (error) { + try { + await resizeImage(defaultIcon, icons, this.logger); + } catch (error) { this.logger.error(error); this.logger.log(); process.exit(1); } - rename.forEach(function (file) { - fs.renameSync(file.from, file.to); - }); - - callback(); - }.bind(this), this.logger); -}; + for (const file of filesToRename) { + await rename(file.from, file.to); + } + } +} diff --git a/lib/emulator.js b/lib/emulator.js index 5c803f70..35dec04c 100644 --- a/lib/emulator.js +++ b/lib/emulator.js @@ -1,454 +1,576 @@ -/** - * @overview - * Library for controlling an Android Emulator. - * - * @module lib/emulator - * - * @copyright - * Copyright (c) 2009-2014 by Appcelerator, Inc. All Rights Reserved. - * - * @license - * Licensed under the terms of the Apache Public License - * Please see the LICENSE included with this distribution for details. - */ -'use strict'; - -const android = require('./android'), - appc = require('node-appc'), - __ = appc.i18n(__dirname).__, - ADB = require('./adb'), - async = require('async'), - events = require('events'), - fs = require('fs'), - path = require('path'), - util = require('util'); -require('colors'); - -module.exports = EmulatorManager; - -/** - * Creates an Emulator instace. - * @class - * @extends EventEmitter - * @classdesc Simple object that contains the avd settings and exposes event - * methods. - * @constructor - */ -function Emulator() {} -util.inherits(EmulatorManager.Emulator = Emulator, events.EventEmitter); - -/** - * Creates an EmulatorManager instance. - * @class - * @classdesc Manages emulator implementations and responsible for launching and - * killing emulators. - * @constructor - * @param {Object} config - The CLI config object - */ -function EmulatorManager(config) { - this.config = config; -} +import { detect as detectAndroid } from './android.js'; +import { ADB } from './adb.js'; +import { EventEmitter } from 'node:events'; + +export class Emulator extends EventEmitter {} + +export class EmulatorManager { + Emulator = Emulator; -/** - * Loads emulator implementation modules and detects all available emulators. - * @param {Object} [opts] - Detection options - * @param {String} [opts.type] - The type of emulator to load (avd); defaults to all - * @param {Function} callback - A function to call when the detection has completed - */ -EmulatorManager.prototype.detect = function detect(opts, callback) { - if (opts && typeof opts === 'function') { - callback = opts; - opts = {}; + constructor(config) { + this.config = config; } - var files = opts && opts.type ? [ opts.type + '.js' ] : fs.readdirSync(path.join(__dirname, 'emulators')), - re = /\.js$/, - config = this.config; - - async.parallel(files.map(function (filename) { - return function (next) { - var file = path.join(__dirname, 'emulators', filename); - if (re.test(filename) && fs.existsSync(file)) { - var module = require(file); - if (typeof module.detect === 'function') { - module.detect(config, opts, next); - return; - } + /** + * Loads emulator implementation modules and detects all available emulators. + * @param {Object} [opts] - Detection options + * @param {String} [opts.type] - The type of emulator to load (avd); defaults to all + */ + async detect(opts = {}) { + const androidEnv = await detectAndroid(this.config, opts); + const ver2api = {}; + const emus = []; + + for (const id of Object.keys(androidEnv.targets)) { + if (androidEnv.targets[id].type === 'platform') { + ver2api[androidEnv.targets[id].version] = androidEnv.targets[id].sdk; } - next(); - }; - }), function (err, results) { - if (err) { - return callback(err); } - android.detect(this.config, opts, function (androidEnv) { - var ver2api = {}, - emus = []; - - Object.keys(androidEnv.targets).forEach(function (id) { - if (androidEnv.targets[id].type === 'platform') { - ver2api[androidEnv.targets[id].version] = androidEnv.targets[id].sdk; + if (Array.isArray(androidEnv.avds)) { + for (const avd of androidEnv.avds) { + if (!avd['api-level']) { + avd['api-level'] = ver2api[avd['sdk-version']] || null; } - }); - - results.forEach(function (r) { - if (r && Array.isArray(r.avds)) { - r.avds.forEach(function (avd) { - if (!avd['api-level']) { - avd['api-level'] = ver2api[avd['sdk-version']] || null; - } - if (!avd.id) { - avd.id = avd.name; - } - emus.push(avd); - }); + if (!avd.id) { + avd.id = avd.name; } - }); + emus.push(avd); + } + } - opts.logger && opts.logger.trace(__('Found %s emulators', String(emus.length).cyan)); - callback(null, emus); - }); - }.bind(this)); -}; - -/** - * Detects if a specific Android emulator is running. - * @param {String} id - The id of the emulator - * @param {Object} [opts] - Detection options - * @param {String} [opts.type] - The type of emulator to load (avd); defaults to all - * @param {Function} callback - A function to call when the detection has completed - */ -EmulatorManager.prototype.isRunning = function isRunning(id, opts, callback) { - if (opts && typeof opts === 'function') { - callback = opts; - opts = {}; + opts.logger?.trace(`Found ${emus.length} emulators`); + return emus; } - opts.logger && opts.logger.trace(__('Detecting if %s exists...', id.cyan)); + /** + * Detects if a specific Android emulator is running. + * @param {String} id - The id of the emulator + * @param {Object} [opts] - Detection options + * @param {String} [opts.type] - The type of emulator to load (avd); defaults to all + */ + async isRunning(id, opts) { + opts.logger?.trace(`Detecting if ${id} exists...`); + + const emus = await this.detect(opts); + const emu = emus.filter(e => e && e.id === id).shift(); + if (!emu) { + throw new Error(`Invalid emulator "${id}"`); + } - this.detect(opts, function (err, emus) { - if (err) { - return callback(err); + opts.logger?.trace('Emulator exists, detecting all running emulators and connected devices...'); + + // need to see if the emulator is running + const adb = new ADB(this.config); + const devices = await adb.devices(); + opts.logger?.trace(`Detected ${devices.length} running emulators and connected devices`); + + // if there are no devices, then it can't possibly be running + if (!devices.length) { + return false; } - const emu = emus.filter(e => e && e.id == id).shift(); // eslint-disable-line eqeqeq + opts.logger?.trace(`Checking ${devices.length} devices to see if it's the emulator we want`); - if (!emu) { - return callback(new Error(__('Invalid emulator "%s"', id)), null); + if (emu.type !== 'avd') { + return false; } - opts.logger && opts.logger.trace(__('Emulator exists, detecting all running emulators and connected devices...')); + const emuRegExp = /^emulator-(\d+)$/; + const device = devices.find(d => { + return d.id.match(emuRegExp) && d.emulator.id === emu.id; + }); - // need to see if the emulator is running - const adb = new ADB(this.config); - adb.devices(function (err, devices) { - if (err) { - return callback(err); - } + if (device) { + opts.logger?.trace('The emulator is running'); + } else { + opts.logger?.trace('The emulator is NOT running'); + } - opts.logger && opts.logger.trace(__('Detected %s running emulators and connected devices', String(devices.length).cyan)); + return device; + } - // if there are no devices, then it can't possibly be running - if (!devices.length) { - return callback(null, null); + /** + * Determines if the specified "device name" is an emulator or a device. + * @param {String} device - The name of the device returned from 'adb devices' + * @param {Object} [opts] - Detection options + * @param {String} [opts.type] - The type of emulator to load (avd); defaults to all + */ + async isEmulator(device, opts) { + try { + const port = device.match(/^emulator-(\d+)$/); + if (!port) { + return false; } - opts.logger && opts.logger.trace(__('Checking %s devices to see if it\'s the emulator we want', String(devices.length).cyan)); + const [avdName, androidInfo] = await Promise.all([ + this.getAvdName(port[1]), + detectAndroid(this.config, opts), + ]); - require(path.join(__dirname, 'emulators', emu.type + '.js')).isRunning(this.config, emu, devices, function (err, device) { - if (err) { - opts.logger && opts.logger.trace(__('Failed to check if the emulator was running: %s', err)); - } else if (device) { - opts.logger && opts.logger.trace(__('The emulator is running')); - } else { - opts.logger && opts.logger.trace(__('The emulator is NOT running')); + return androidInfo.avds.find(e => e.id === avdName); + } catch { + throw new Error(`Unable to find device "${device}"`); + } + } + + getAvdName(port) { + return new Promise((resolve, reject) => { + let state = 'connecting'; + let avdName = null; + let buffer = ''; + const responseRegExp = /(.*)\r\nOK\r\n/; + const socket = net.connect({ port: port }); + + socket.on('data', (data) => { + buffer += data.toString(); + const m = buffer.match(responseRegExp); + if (!m || state === 'done') { + // do nothing + } else if (state === 'connecting') { + state = 'sending command'; + buffer = ''; + socket.write('avd name\n'); + } else if (state === 'sending command') { + state = 'done'; + avdName = m[1].trim(); + socket.end('quit\n'); } - callback(err, device); }); - }.bind(this)); - }.bind(this)); -}; - -/** - * Determines if the specified "device name" is an emulator or a device. - * @param {String} device - The name of the device returned from 'adb devices' - * @param {Object} [opts] - Detection options - * @param {String} [opts.type] - The type of emulator to load (avd); defaults to all - * @param {Function} callback - A function to call when the detection has completed - */ -EmulatorManager.prototype.isEmulator = function isEmulator(device, opts, callback) { - if (opts && typeof opts === 'function') { - callback = opts; - opts = {}; + + socket.on('end', () => resolve(avdName)); + + socket.on('error', reject); + }); } - var files = opts && opts.type ? [ opts.type + '.js' ] : fs.readdirSync(path.join(__dirname, 'emulators')), - re = /\.js$/, - config = this.config; - - async.parallel(files.map(function (filename) { - return function (next) { - var file = path.join(__dirname, 'emulators', filename); - if (re.test(filename) && fs.existsSync(file)) { - var module = require(file); - if (typeof module.isEmulator === 'function') { - module.isEmulator(config, device, next); - return; - } - } - next(); - }; - }), function (err, results) { - if (err) { - callback(new Error(__('Unable to find device "%s"', device))); - } else { - callback(null, results.filter(n => n).shift()); - } - }); -}; - -function checkedBooted(config, opts, emulator) { - // we need to get the id of emulator - var adb = new ADB(config), - retryTimeout = 2000, // if an adb call fails, how long before we retry - bootTimeout = opts.bootTimeout || 240000, // 4 minutes to boot before timeout + checkedBooted(config, opts, emulator) { + // we need to get the id of emulator + const adb = new ADB(config); + const retryTimeout = 2000; // if an adb call fails, how long before we retry + const bootTimeout = opts.bootTimeout || 240000; // 4 minutes to boot before timeout + // if a timeout is set and the emulator doesn't boot quick enough, fire the timeout event, // however if the timeout is zero, still listen for the timeout to kill the whilst loop above - bootTimer = setTimeout(function () { - opts.logger && opts.logger.trace(__('Timed out while waiting for the emulator to boot; waited %s ms', bootTimeout)); - conn && conn.end(); - bootTimeout && emulator.emit('timeout', { type: 'emulator', waited: bootTimeout }); - }, bootTimeout), - sdcardTimeout = opts.sdcardTimeout || 60000, // 1 minute to boot before timeout - sdcardTimer, - conn, - deviceId, - emu = emulator.emulator, - emulib = require(path.join(__dirname, 'emulators', emu.type + '.js')); - - opts.logger && opts.logger.trace(__('Checking the boot state for the next %s ms', bootTimeout)); - opts.logger && opts.logger.trace(__('Waiting for emulator to register with ADB')); - - conn = adb.trackDevices(function (err, devices) { - if (err) { - opts.logger && opts.logger.trace(__('Error tracking devices: %s', err.message)); - return; - } else if (!devices.length) { - opts.logger && opts.logger.trace(__('No devices found, continuing to wait')); - return; - } + const bootTimer = setTimeout(() => { + opts.logger?.trace(`Timed out while waiting for the emulator to boot; waited ${bootTimeout} ms`); + conn?.end(); + if (bootTimeout) { + emulator.emit('timeout', { type: 'emulator', waited: bootTimeout }); + } + }, bootTimeout); - // just in case we get any extra events but we already have the deviceId, just return - if (deviceId) { - return; - } + const sdcardTimeout = opts.sdcardTimeout || 60000; // 1 minute to boot before timeout + let sdcardTimer = setTimeout(() => { + if (sdcardTimeout) { + emulator.emit('timeout', { type: 'sdcard', waited: sdcardTimeout }); + } + }, sdcardTimeout); - opts.logger && opts.logger.trace(__('Found %s devices, checking if any of them are the emulator...', devices.length)); + opts.logger?.trace(`Checking the boot state for the next ${bootTimeout} ms`); + opts.logger?.trace('Waiting for emulator to register with ADB'); - emulib.isRunning(config, emu, devices, function (err, running) { + conn = adb.trackDevices(async (err, devices) => { if (err) { + opts.logger?.trace(`Error tracking devices: ${err.message}`); + return; + } else if (!devices.length) { + opts.logger?.trace('No devices found, continuing to wait'); + return; + } + + // just in case we get any extra events but we already have the deviceId, just return + if (deviceId) { + return; + } + + opts.logger?.trace(`Found ${devices.length} devices, checking if any of them are the emulator...`); + + try { + const running = await emulib.isRunning(config, emu, devices); + if (!running) { + // try again + opts.logger?.trace('Emulator not running yet, continuing to wait'); + } else { + // running! + opts.logger?.trace('Emulator is running!'); + Object.assign(emulator, running); + deviceId = running.id; + conn.end(); // no need to track devices anymore + + // keep polling until the boot animation has finished + opts.logger?.trace('Checking if boot animation has finished...'); + + (function checkBootAnim() { + // emulator is running, now shell into it and check if it has booted + adb.shell(deviceId, 'getprop init.svc.bootanim', (err, output) => { + if (!err && output.toString().split('\n').shift().trim() === 'stopped') { + clearTimeout(bootTimer); + opts.logger?.trace('Emulator is booted, emitting booted event'); + emulator.emit('booted', emulator); + } else { + opts.logger?.trace(`Emulator is not booted yet; checking again in ${retryTimeout} ms`); + setTimeout(checkBootAnim, retryTimeout); + } + }); + }()); + } + } catch { // TODO: this could be bad... maybe we should emit an error event? - opts.logger && opts.logger.trace(__('Error checking if emulator is running: %s', err)); - } else if (!running) { - // try again - opts.logger && opts.logger.trace(__('Emulator not running yet, continuing to wait')); - } else { - // running! - opts.logger && opts.logger.trace(__('Emulator is running!')); - appc.util.mix(emulator, running); - deviceId = running.id; - conn.end(); // no need to track devices anymore - - // keep polling until the boot animation has finished - opts.logger && opts.logger.trace(__('Checking if boot animation has finished...')); - (function checkBootAnim() { - // emulator is running, now shell into it and check if it has booted - adb.shell(deviceId, 'getprop init.svc.bootanim', function (err, output) { - if (!err && output.toString().split('\n').shift().trim() === 'stopped') { - clearTimeout(bootTimer); - opts.logger && opts.logger.trace(__('Emulator is booted, emitting booted event')); - emulator.emit('booted', emulator); - } else { - opts.logger && opts.logger.trace(__('Emulator is not booted yet; checking again in %s ms', retryTimeout)); - setTimeout(checkBootAnim, retryTimeout); - } - }); - }()); + opts.logger?.trace(`Error checking if emulator is running: ${err}`); } }); - }); - emulator.on('booted', function () { - var done = false; + emulator.on('booted', async () => { + opts.logger?.info('Emulator is booted'); + + if (!opts.checkMounts || !emu.sdcard) { + // nothing to do, fire ready event + opts.logger?.info('SD card not required, skipping mount check'); + emulator.emit('ready', emulator); + return; + } + + opts.logger?.info('Checking if SD card is mounted'); + + // keep polling /sdcard until it's mounted + let retries = 32; + while (retries-- > 0) { + try { + const output = await adb.shell(deviceId, 'cd /sdcard && echo "SDCARD READY"'); + if (output.toString().split('\n').shift().trim() === 'SDCARD READY') { + break; + } + } catch { + await delay(retryTimeout); + } + } + + if (retries <= 0) { + opts.logger?.error('SD card timed out while waiting to be mounted'); + emulator.emit('timeout', { type: 'sdcard', waited: sdcardTimeout }); + return; + } + + let mounted = false; + const mountPoints = [ '/sdcard', '/mnt/sdcard' ]; + sdcardTimer = setTimeout(() => { + if (sdcardTimeout) { + emulator.emit('timeout', { type: 'sdcard', waited: sdcardTimeout }); + } + done = true; + }, sdcardTimeout || 30000); + + const output = await adb.shell(deviceId, 'ls -l /sdcard'); + const m = output.toString().trim().split('\n').shift().trim().match(/-> (\S+)/); + if (m && !mountPoints.includes(m[1])) { + mountPoints.unshift(m[1]); + } + + opts.logger?.debug(`Checking mount points: ${mountPoints.join(', ')}`); + + // wait for the sd card to be mounted + while (!mounted) { + const output = await adb.shell(deviceId, 'mount'); + const check = line => { + const parts = line.trim().split(' '); + return parts.length > 1 && mountPoints.includes(parts[1]); + }; + + if (!err && output.toString().trim().split('\n').some(check)) { + mounted = true; + clearTimeout(sdcardTimer); + opts.logger?.debug('SD card is mounted'); + break; + } else { + await delay(retryTimeout); + break; + } + } - opts.logger && opts.logger.info(__('Emulator is booted')); + // requery the devices since device state may have changed + const devices = await adb.devices(); + if (err) { + opts.logger?.trace(`Error checking if emulator is running: ${err}`); + return; + } - if (!opts.checkMounts || !emu.sdcard) { - // nothing to do, fire ready event - opts.logger && opts.logger.info(__('SD card not required, skipping mount check')); + try { + const running = await emulib.isRunning(config, emu, devices.filter(d => d.id = emulator.id)); + if (running) { + Object.assign(emulator, running); + } + } catch (err) { + opts.logger?.trace(`Error checking if emulator is running: ${err}`); + } emulator.emit('ready', emulator); - return; + }); + } + + /** + * Starts the specified emulator, if not already running. + * @param {String} id - The id of the emulator + * @param {Object} [opts] - Options for detection and launching the emulator + */ + async start(id, opts) { + opts.logger?.trace(`Checking if emulator ${id} is running...`); + + const running = await this.isRunning(id, opts); + if (running) { + // already running + const emulator = new Emulator(); + Object.assign(emulator, running); + opts.logger?.info('Emulator already running'); + this.checkedBooted(this.config, opts, emulator); + return emulator; } - opts.logger && opts.logger.info(__('Checking if SD card is mounted')); + opts.logger?.trace('Emulator not running, detecting emulator info'); - // keep polling /sdcard until it's mounted - async.whilst( - function () { return !done; }, + // not running, start the emulator + const emus = await this.detect(opts); + const emu = emus.find(e => e?.id === id); - function (cb) { - // emulator is running, now shell into it and check if it has booted - adb.shell(deviceId, 'cd /sdcard && echo "SDCARD READY"', function (err, output) { - if (!err && output.toString().split('\n').shift().trim() === 'SDCARD READY') { - done = true; - cb(); + // this should never happen because it would have happened already thanks to isRunning() + if (!emu) { + throw new Error(`Invalid emulator "${id}"`); + } + + const androidEnv = await detectAndroid(this.config, opts); + if (!androidEnv.sdk) { + throw new Error('No Android SDK found'); + } + + // check that 32-bit libs are good to go + if (androidEnv.linux64bit) { + if (androidEnv.linux64bit.ia32libs === false) { + throw new Error('32-bit libraries is not installed.\nTo install the required 32-bit libraries, run "sudo apt-get install ia32-libs".'); + } + } + + opts.logger?.trace('Starting the emulator...'); + + let { port } = opts; + let tryPort = 5554; // port must be between 5554 and 5584 + + opts.logger?.trace('Scanning ports to find a port for the emulator to listening on'); + + // we need to find a port to tell the emulator to listen on + while (!port) { + await new Promise((resolve, reject) => { + let socket = net.connect({ port: tryPort }, () => { + // port taken, try again + socket.end(); + tryPort++; + if (tryPort > 5584) { + reject(new Error('Unable to find a free port between 5554 and 5584')); } else { - setTimeout(cb, retryTimeout); + resolve(); } }); - }, - function () { - var mounted = false, - mountPoints = [ '/sdcard', '/mnt/sdcard' ]; - - adb.shell(deviceId, 'ls -l /sdcard', function (err, output) { - if (!err) { - var m = output.toString().trim().split('\n').shift().trim().match(/-> (\S+)/); - if (m && mountPoints.indexOf(m[1]) === -1) { - mountPoints.unshift(m[1]); - } + socket.on('end', (_err) => { + if (socket) { + socket.end(); + socket = null; } + }); - opts.logger && opts.logger.debug(__('Checking mount points: %s', mountPoints.join(', ').cyan)); - - // wait for the sd card to be mounted - async.whilst( - function () { return !mounted; }, - - function (cb) { - adb.shell(deviceId, 'mount', function (err, output) { - if (!err && output.toString().trim().split('\n').some(function (line) { - var parts = line.trim().split(' '); - return parts.length > 1 && mountPoints.indexOf(parts[1]) !== -1; - })) { - mounted = true; - clearTimeout(sdcardTimer); - opts.logger && opts.logger.debug(__('SD card is mounted')); - cb(); - } else { - setTimeout(cb, retryTimeout); - } - }); - }, - - function () { - // requery the devices since device state may have changed - adb.devices(function (err, devices) { - emulib.isRunning(config, emu, devices.filter(d => d.id = emulator.id), function (err, running) { - if (!err && running) { - appc.util.mix(emulator, running); - } - emulator.emit('ready', emulator); - }); - }); + socket.on('error', (err) => { + if (err.code === 'ECONNREFUSED') { + // port available! + if (socket) { + socket.end(); + socket = null; } - ); + port = tryPort; + resolve(); + } }); - } - ); + }); + } - sdcardTimer = setTimeout(function () { - sdcardTimeout && emulator.emit('timeout', { type: 'sdcard', waited: sdcardTimeout }); - done = true; - }, sdcardTimeout || 30000); - }); -} + opts.logger?.trace(`Emulator will listen on port ${port}`); -/** - * Starts the specified emulator, if not already running. - * @param {String} id - The id of the emulator - * @param {Object} [opts] - Options for detection and launching the emulator - * @param {Function} callback - A function to call when the emulator as launched - */ -EmulatorManager.prototype.start = function start(id, opts, callback) { - if (opts && typeof opts === 'function') { - callback = opts; - opts = {}; - } + // default args + const args = [ + '-avd', emu.id, // use a specific android virtual device + '-port', port, // TCP port that will be used for the console + ]; - opts.logger && opts.logger.trace(__('Checking if emulator %s is running...', id.cyan)); + const addArg = (prop, option) => { + if (opts[prop]) { + args.push(option, opts[prop]); + } + }; - this.isRunning(id, opts, function (err, running) { - if (err) { - // something went boom - return callback(err); + if (opts.partitionSize !== undefined) { + args.push('-partition-size', opts.partitionSize); // system/data partition size in MBs } - if (running) { - // already running - var emulator = new Emulator(); - appc.util.mix(emulator, running); - opts.logger && opts.logger.info(__('Emulator already running')); - checkedBooted(this.config, opts, emulator); - callback(null, emulator); - return; + addArg('sdcard', '-sdcard'); // SD card image (default /sdcard.img) + + // add any other args + addArg('logcat', '-logcat'); // enable logcat output with given tags + addArg('sysdir', '-sysdir'); // search for system disk images in + addArg('system', '-system'); // read initial system image from + addArg('datadir', '-datadir'); // write user data into + addArg('kernel', '-kernel'); // use specific emulated kernel + addArg('ramdisk', '-ramdisk'); // ramdisk image (default /ramdisk.img + addArg('initdata', '-init-data'); // same as '-init-data ' + addArg('data', '-data'); // data image (default /userdata-qemu.img + addArg('cache', '-cache'); // cache partition image (default is temporary file) + addArg('cacheSize', '-cache-size'); // cache partition size in MBs + addArg('noCache', '-no-cache'); // disable the cache partition + addArg('snapStorage', '-snapstorage'); // file that contains all state snapshots (default /snapshots.img) + addArg('noSnapStorage', '-no-snapstorage'); // do not mount a snapshot storage file (this disables all snapshot functionality) + addArg('snapshot', '-snapshot'); // name of snapshot within storage file for auto-start and auto-save (default 'default-boot') + addArg('noSnapshot', '-no-snapshot'); // perform a full boot and do not do not auto-save, but qemu vmload and vmsave operate on snapstorage + addArg('noSnapshotSave', '-no-snapshot-save'); // do not auto-save to snapshot on exit: abandon changed state + addArg('noSnapshotLoad', '-no-snapshot-load'); // do not auto-start from snapshot: perform a full boot + addArg('snapshotList', '-snapshot-list'); // show a list of available snapshots + addArg('noSnapshotUpdateTime', '-no-snapshot-update-time'); // do not do try to correct snapshot time on restore + addArg('wipeData', '-wipe-data'); // reset the user data image (copy it from initdata) + addArg('skindir', '-skindir'); // search skins in (default /skins) + addArg('skin', '-skin'); // select a given skin + addArg('noSkin', '-no-skin'); // don't use any emulator skin + addArg('dynamicSkin', '-dynamic-skin'); // dynamically construct a skin of given size, requires -skin WxH option + addArg('memory', '-memory'); // physical RAM size in MBs + addArg('netspeed', '-netspeed'); // maximum network download/upload speeds + addArg('netdelay', '-netdelay'); // network latency emulation + addArg('netfast', '-netfast'); // disable network shaping + addArg('trace', '-trace'); // enable code profiling (F9 to start) + addArg('showKernel', '-show-kernel'); // display kernel messages + addArg('shell', '-shell'); // enable root shell on current terminal + addArg('noJNI', '-no-jni'); // disable JNI checks in the Dalvik runtime + addArg('noAudio', '-no-audio'); // disable audio support + addArg('audio', '-audio'); // use specific audio backend + addArg('rawKeys', '-raw-keys'); // disable Unicode keyboard reverse-mapping + addArg('radio', '-radio'); // redirect radio modem interface to character device + addArg('onion', '-onion'); // use overlay PNG image over screen + addArg('onionAlpha', '-onion-alpha'); // specify onion-skin translucency + addArg('onionRotation', '-onion-rotation'); // specify onion-skin rotation 0|1|2|3 + addArg('scale', '-scale'); // scale emulator window + addArg('dpiDevice', '-dpi-device'); // specify device's resolution in dpi (default 165) + addArg('httpProxy', '-http-proxy'); // make TCP connections through a HTTP/HTTPS proxy + addArg('timezone', '-timezone'); // use this timezone instead of the host's default + addArg('dnsServer', '-dns-server'); // use this DNS server(s) in the emulated system + addArg('cpuDelay', '-cpu-delay'); // throttle CPU emulation + addArg('noWindow', '-no-window'); // disable graphical window display + addArg('reportConsole', '-report-console'); // report console port to remote socket + addArg('gps', '-gps'); // redirect NMEA GPS to character device + addArg('keyset', '-keyset'); // specify keyset file name + addArg('shellSerial', '-shell-serial'); // specific character device for root shell + addArg('tcpdump', '-tcpdump'); // capture network packets to file + addArg('bootchart', '-bootchart'); // enable bootcharting + addArg('charmap', '-charmap'); // use specific key character map + addArg('sharedNetId', '-shared-net-id'); // join the shared network, using IP address 10.1.2. + addArg('nandLimits', '-nand-limits'); // enforce NAND/Flash read/write thresholds + addArg('memcheck', '-memcheck'); // enable memory access checking + addArg('gpu', '-gpu'); // set hardware OpenGLES emulation mode + addArg('cameraBack', '-camera-back'); // set emulation mode for a camera facing back + addArg('cameraFront', '-camera-front'); // set emulation mode for a camera facing front + addArg('screen', '-screen'); // set emulated screen mode + addArg('force32bit', '-force-32bit'); // always use 32-bit emulator + + // set system property on boot + if (opts.props && typeof opts.props === 'object') { + for (const prop of Object.keys(opts.props)) { + args.push('-prop', `${prop}=${opts.props[prop]}`); + } } - opts.logger && opts.logger.trace(__('Emulator not running, detecting emulator info')); + // pass arguments to qemu + if (Array.isArray(opts.qemu)) { + args.push('-qemu'); + args.push(...opts.qemu); + } - // not running, start the emulator - this.detect(opts, function (err, emus) { - if (err) { - return callback(err); - } + const emuopts = { + detached: Object.prototype.hasOwnProperty.call(opts, 'detached') ? !!opts.detached : true, + stdio: opts.stdio // || 'ignore' + }; + if (opts.cwd) { + emuopts.cwd = opts.cwd; + } + if (opts.env) { + emuopts.env = opts.env; + } + if (opts.uid) { + emuopts.uid = opts.uid; + } + if (opts.gid) { + emuopts.gid = opts.gid; + } - var emu = emus.filter(e => e && e.id == id).shift(); // eslint-disable-line eqeqeq + opts.logger?.info(`Running: ${(`${androidEnv.sdk.executables.emulator} "${args.join('" "')}"`)}`); + const device = new EmulatorManager.Emulator(); - // this should never happen because it would have happened already thanks to isRunning() - if (!emu) { - return callback(new Error(__('Invalid emulator "%s"', id)), null); - } + const child = spawn(androidEnv.sdk.executables.emulator, args, emuopts); - opts.logger && opts.logger.trace(__('Starting the emulator...')); + device.emulator = { + pid: child.pid + }; + Object.assign(device.emulator, emu); - var emulib = require(path.join(__dirname, 'emulators', emu.type + '.js')); - emulib.start(this.config, emu, opts, function (err, emulator) { - if (err) { - callback(err); - } else { - // give the emulator a second to get started before we start beating up adb - opts.logger && opts.logger.trace(__('Emulator is starting, monitoring boot state...')); - checkedBooted(this.config, opts, emulator); - callback(null, emulator); - } - }.bind(this)); - }.bind(this)); - }.bind(this)); -}; - -/** - * Stops the specified emulator, if running. - * @param {String} id - The id of the emulator - * @param {Object} [opts] - Options for detection and killing the emulator - * @param {Function} callback - A function to call when the emulator as been killed - */ -EmulatorManager.prototype.stop = function stop(id, opts, callback) { - if (opts && typeof opts === 'function') { - callback = opts; - opts = {}; + child.stdout?.on('data', (data) => { + device.emit('stdout', data); + }); + child.stderr?.on('data', (data) => { + device.emit('stderr', data); + }); + + child.on('error', err => device.emit('error', err)); + child.on('close', (code, signal) => device.emit('exit', code, signal)); + + child.unref(); + + // give the emulator a second to get started before we start beating up adb + opts.logger?.trace('Emulator is starting, monitoring boot state...'); + this.checkedBooted(this.config, opts, device); + return device; } - this.isRunning(id, opts, function (err, running) { - if (err) { - // something went boom - callback(err); - } else if (!running) { + /** + * Stops the specified emulator, if running. + * @param {String} id - The id of the emulator + * @param {Object} [opts] - Options for detection and killing the emulator + */ + async stop(id, opts) { + const device = await this.isRunning(id, opts); + if (device) { + const androidEnv = await detectAndroid(this.config, opts); + if (!androidEnv.sdk) { + throw new Error('No Android SDK found'); + } + + // if they passed in the emulator name, get the emulator avd definition + const emu = androidEnv.avds.find(e => e && e.name === device.emulator.name); + if (!emu) { + throw new Error(`Invalid emulator "${device.emulator.name}"`); + } + + await new Promise((resolve, reject) => { + const child = spawn(results.sdk.executables.adb, [ '-s', device.id, 'emu', 'kill' ], { stdio: ['ignore', 'pipe', 'pipe']}); + let stdout = ''; + let stderr = ''; + child.stdout.on('data', (data) => { + stdout += data.toString(); + }); + child.stderr.on('data', (data) => { + stderr += data.toString(); + }); + child.on('close', (code) => { + if (code) { + reject(new Error(`Failed to stop emulator "${id}" (code ${code})`)); + } else { + resolve(); + } + }); + }); + } else { // already stopped - callback(new Error(__('Emulator "%s" not running', id))); - } else { - require(path.join(__dirname, 'emulators', running.emulator.type + '.js')).stop(this.config, running.emulator.name, running, opts, callback); + throw new Error(`Emulator "${id}" not running`); } - }.bind(this)); -}; + } +} diff --git a/lib/emulators/avd.js b/lib/emulators/avd.js deleted file mode 100644 index 03bab533..00000000 --- a/lib/emulators/avd.js +++ /dev/null @@ -1,386 +0,0 @@ -/** - * @overview - * Library for controlling an Android Emulator. - * - * @module lib/emulators/avd - * - * @copyright - * Copyright (c) 2009-2013 by Appcelerator, Inc. All Rights Reserved. - * - * @license - * Licensed under the terms of the Apache Public License - * Please see the LICENSE included with this distribution for details. - */ -'use strict'; - -const appc = require('node-appc'), - __ = appc.i18n(__dirname).__, - async = require('async'), - android = require('../android'), - net = require('net'), - spawn = require('child_process').spawn, - EmulatorManager = require('../emulator'); - -/** - * Detects all existing Android Virtual Devices. - * @param {Object} config - The CLI config object - * @param {Object} opts - Detect options - * @param {Function} callback - A function to call when the detection has completed - */ -exports.detect = function detect(config, opts, callback) { - opts = opts || {}; - android.detect(config, opts, function (results) { - callback(null, results); - }); -}; - -function getAvdName(port, callback) { - let state = 'connecting', - avdName = null, - buffer = ''; - const responseRegExp = /(.*)\r\nOK\r\n/; - const socket = net.connect({ port: port }); - - socket.on('data', function (data) { - buffer += data.toString(); - const m = buffer.match(responseRegExp); - if (!m || state === 'done') { - // do nothing - } else if (state === 'connecting') { - state = 'sending command'; - buffer = ''; - socket.write('avd name\n'); - } else if (state === 'sending command') { - state = 'done'; - avdName = m[1].trim(); - socket.end('quit\n'); - } - }); - - socket.on('end', function () { - callback(null, avdName); - }); - - socket.on('error', callback); -} - -/** - * Detects if a specific Android Virtual Device is running and if so, returns - * the emulator AVD definition object and the device definition object. - * @param {Object} config - The CLI config object - * @param {Object} emu - The Android emulator avd definition - * @param {Array} devices - An array of device definition objects - * @param {Function} callback - A function to call when the detection has completed - * @returns {void} - */ -exports.isRunning = function isRunning(config, emu, devices, callback) { - if (emu.type !== 'avd') { - return callback(null, false); - } - - const emuRegExp = /^emulator-(\d+)$/; - const matchingDevice = devices.find(d => { - const m = d.id.match(emuRegExp); - return m && d.emulator.id === emu.id; - }); - // Don't filter by state of 'device' (which means running), because sometimes - // adb host:track-devices reports "offline' for an emulator just launched with a super fast boot via snapshots - // and really once it's listed, it's considered "running" (just maybe not fully booted) - return callback(null, matchingDevice); -}; - -/** - * Detects if a specific device name is an Android emulator. - * @param {Object} config - The CLI config object - * @param {Object} device - The device name - * @param {Function} callback - A function to call when the detection has completed - * @returns {void} - */ -exports.isEmulator = function isEmulator(config, device, callback) { - const port = device.match(/^emulator-(\d+)$/); - - if (!port) { - return callback(); - } - - appc.async.parallel(this, { - avdName: function (next) { - getAvdName(port[1], next); - }, - androidInfo: function (next) { - this.detect(config, null, next); - } - }, function (err, results) { - if (err) { - callback(true); - } else { - callback(null, results.androidInfo.avds.filter(e => e.id === results.avdName).shift()); - } - }); -}; - -/** - * Launches the specified Android emulator. - * @param {Object} config - The CLI config object - * @param {Object|String} emu - The Android emulator avd definition or the name of the emulator - * @param {Object} [opts] - Emulator start options - * @param {Boolean} [opts.bypassCache=false] - Bypasses the Android environment detection cache and re-queries the system - * @param {Number} [opts.port=5560] - The TCP port the emulator will use for the console - * @param {String} [opts.sdcard] - A path to the virtual SD card to use with the emulator - * @param {String} [opts.logcatFilter="*:d,*,TiAPI:V"] - The filter for logcat to use - * @param {Number} [opts.partitionSize=128] - The emulator's system/data partition size in MBs - * @param {String} [opts.cwd] - The current working directory to pass into spawn() - * @param {Array|String} [opts.stdio] - The stdio configuration to pass into spawn() - * @param {Object} [opts.env] - The environment variables to pass into spawn() - * @param {Boolean} [opts.detached] - The detached flag to pass into spawn() - * @param {Number} [opts.uid] - The user id to pass into spawn() - * @param {Number} [opts.gid] - The group id to pass into spawn() - * @param {Function} callback - A function to call when the emulator is started - */ -exports.start = function start(config, emu, opts, callback) { - opts = opts || {}; - - android.detect(config, { bypassCache: opts.bypassCache }, function (results) { - if (!results.sdk) { - return callback(new Error(__('No Android SDK found'))); - } - - // if they passed in the emulator name, get the emulator avd definition - if (emu && typeof emu === 'string') { - const name = emu; - emu = results.avds.filter(e => e && e.name === name).shift(); - if (!emu) { - return callback(new Error(__('Invalid emulator "%s"', name)), null); - } - } - - // check that 32-bit libs are good to go - if (results.linux64bit) { - if (results.linux64bit.ia32libs === false) { - return callback(new appc.exception( - __('32-bit libraries is not installed.'), - __('To install the required 32-bit libraries, run "%s".', 'sudo apt-get install ia32-libs') - )); - } - } - - var port = opts.port, - tryPort = 5554; // port must be between 5554 and 5584 - - opts.logger && opts.logger.trace(__('Scanning ports to find a port for the emulator to listening on')); - - // we need to find a port to tell the emulator to listen on - async.whilst( - function (cb) { cb(null, !port); }, - function (cb) { - var socket = net.connect({ port: tryPort }, function () { - // port taken, try again - socket.end(); - tryPort++; - cb(tryPort > 5584 ? new Error(__('Unable to find a free port between 5554 and 5584')) : null); - }); - - socket.on('end', function (_err) { - if (socket) { - socket.end(); - socket = null; - } - }); - - socket.on('error', function (err) { - if (err.code === 'ECONNREFUSED') { - // port available! - if (socket) { - socket.end(); - socket = null; - } - port = tryPort; - cb(); - } - }); - }, - function (err) { - if (err) { - return callback(err); - } - - opts.logger && opts.logger.trace(__('Emulator will listen on port %s', String(port).cyan)); - - // default args - var args = [ - '-avd', emu.id, // use a specific android virtual device - '-port', port, // TCP port that will be used for the console - ]; - - if (opts.partitionSize !== undefined) { - args.push('-partition-size', opts.partitionSize); // system/data partition size in MBs - } - - if (opts.sdcard) { - args.push('-sdcard', opts.sdcard); // SD card image (default /sdcard.img) - } - - // add any other args - opts.logcat && args.push('-logcat', opts.logcat); // enable logcat output with given tags - opts.sysdir && args.push('-sysdir', opts.sysdir); // search for system disk images in - opts.system && args.push('-system', opts.system); // read initial system image from - opts.datadir && args.push('-datadir', opts.datadir); // write user data into - opts.kernel && args.push('-kernel', opts.kernel); // use specific emulated kernel - opts.ramdisk && args.push('-ramdisk', opts.ramdisk); // ramdisk image (default /ramdisk.img - opts.initdata && args.push('-init-data', opts.initdata); // same as '-init-data ' - opts.data && args.push('-data', opts.data); // data image (default /userdata-qemu.img - opts.cache && args.push('-cache', opts.cache); // cache partition image (default is temporary file) - opts.cacheSize && args.push('-cache-size', opts.cacheSize); // cache partition size in MBs - opts.noCache && args.push('-no-cache'); // disable the cache partition - opts.snapStorage && args.push('-snapstorage', opts.snapStorage); // file that contains all state snapshots (default /snapshots.img) - opts.noSnapStorage && args.push('-no-snapstorage'); // do not mount a snapshot storage file (this disables all snapshot functionality) - opts.snapshot && args.push('-snapshot', opts.snapshot); // name of snapshot within storage file for auto-start and auto-save (default 'default-boot') - opts.noSnapshot && args.push('-no-snapshot'); // perform a full boot and do not do not auto-save, but qemu vmload and vmsave operate on snapstorage - opts.noSnapshotSave && args.push('-no-snapshot-save'); // do not auto-save to snapshot on exit: abandon changed state - opts.noSnapshotLoad && args.push('-no-snapshot-load'); // do not auto-start from snapshot: perform a full boot - opts.snapshotList && args.push('-snapshot-list'); // show a list of available snapshots - opts.noSnapshotUpdateTime && args.push('-no-snapshot-update-time'); // do not do try to correct snapshot time on restore - opts.wipeData && args.push('-wipe-data'); // reset the user data image (copy it from initdata) - opts.skindir && args.push('-skindir', opts.skindir); // search skins in (default /skins) - opts.skin && args.push('-skin', opts.skin); // select a given skin - opts.noSkin && args.push('-no-skin'); // don't use any emulator skin - opts.dynamicSkin && args.push('-dynamic-skin'); // dynamically construct a skin of given size, requires -skin WxH option - opts.memory && args.push('-memory', opts.memory); // physical RAM size in MBs - opts.netspeed && args.push('-netspeed', opts.netspeed); // maximum network download/upload speeds - opts.netdelay && args.push('-netdelay', opts.netdelay); // network latency emulation - opts.netfast && args.push('-netfast'); // disable network shaping - opts.trace && args.push('-trace', opts.trace); // enable code profiling (F9 to start) - opts.showKernel && args.push('-show-kernel'); // display kernel messages - opts.shell && args.push('-shell'); // enable root shell on current terminal - opts.noJNI && args.push('-no-jni'); // disable JNI checks in the Dalvik runtime - opts.noAudio && args.push('-no-audio'); // disable audio support - opts.audio && args.push('-audio', opts.audio); // use specific audio backend - opts.rawKeys && args.push('-raw-keys'); // disable Unicode keyboard reverse-mapping - opts.radio && args.push('-radio', opts.radio); // redirect radio modem interface to character device - opts.onion && args.push('-onion', opts.onion); // use overlay PNG image over screen - opts.onionAlpha && args.push('-onion-alpha', opts.onionAlpha); // specify onion-skin translucency - opts.onionRotation && args.push('-onion-rotation', opts.onionRotation); // specify onion-skin rotation 0|1|2|3 - opts.scale && args.push('-scale', opts.scale); // scale emulator window - opts.dpiDevice && args.push('-dpi-device', opts.dpiDevice); // specify device's resolution in dpi (default 165) - opts.httpProxy && args.push('-http-proxy', opts.httpProxy); // make TCP connections through a HTTP/HTTPS proxy - opts.timezone && args.push('-timezone', opts.timezone); // use this timezone instead of the host's default - opts.dnsServer && args.push('-dns-server', opts.dnsServer); // use this DNS server(s) in the emulated system - opts.cpuDelay && args.push('-cpu-delay', opts.cpuDelay); // throttle CPU emulation - opts.noWindow && args.push('-no-window'); // disable graphical window display - opts.reportConsole && args.push('-report-console', opts.reportConsole); // report console port to remote socket - opts.gps && args.push('-gps', opts.gps); // redirect NMEA GPS to character device - opts.keyset && args.push('-keyset', opts.keyset); // specify keyset file name - opts.shellSerial && args.push('-shell-serial', opts.shellSerial); // specific character device for root shell - opts.tcpdump && args.push('-tcpdump', opts.tcpdump); // capture network packets to file - opts.bootchart && args.push('-bootchart', opts.bootchart); // enable bootcharting - opts.charmap && args.push('-charmap', opts.charmap); // use specific key character map - opts.sharedNetId && args.push('-shared-net-id', opts.sharedNetId); // join the shared network, using IP address 10.1.2. - opts.nandLimits && args.push('-nand-limits', opts.nandLimits); // enforce NAND/Flash read/write thresholds - opts.memcheck && args.push('-memcheck', opts.memcheck); // enable memory access checking - opts.gpu && args.push('-gpu', opts.gpu); // set hardware OpenGLES emulation mode - opts.cameraBack && args.push('-camera-back', opts.cameraBack); // set emulation mode for a camera facing back - opts.cameraFront && args.push('-camera-front', opts.cameraFront); // set emulation mode for a camera facing front - opts.screen && args.push('-screen', opts.screen); // set emulated screen mode - opts.force32bit && args.push('-force-32bit'); // always use 32-bit emulator - - // set system property on boot - if (opts.props && typeof opts.props === 'object') { - Object.keys(opts.props).forEach(function (prop) { - args.push('-prop', prop + '=' + opts.props[prop]); - }); - } - - // pass arguments to qemu - if (Array.isArray(opts.qemu)) { - args.push('-qemu'); - args = args.concat(opts.qemu); - } - - var emuopts = { - detached: Object.prototype.hasOwnProperty.call(opts, 'detached') ? !!opts.detached : true, - stdio: opts.stdio// || 'ignore' - }; - opts.cwd && (emuopts.cwd = opts.cwd); - opts.env && (emuopts.env = opts.env); - opts.uid && (emuopts.uid = opts.uid); - opts.gid && (emuopts.gid = opts.gid); - - opts.logger && opts.logger.info(__('Running: %s', (results.sdk.executables.emulator + ' "' + args.join('" "') + '"').cyan)); - - var child = spawn(results.sdk.executables.emulator, args, emuopts), - device = new EmulatorManager.Emulator(); - - device.emulator = { - pid: child.pid - }; - appc.util.mix(device.emulator, emu); - - child.stdout && child.stdout.on('data', function (data) { - device.emit('stdout', data); - }); - - child.stderr && child.stderr.on('data', function (data) { - device.emit('stderr', data); - }); - - child.on('error', function (err) { - device.emit('error', err); - }); - - child.on('close', function (code, signal) { - device.emit('exit', code, signal); - }); - - child.unref(); - - callback(null, device); - } - ); - }); -}; - -/** - * Kills the specified Android emulator. - * @param {Object} config - The CLI config object - * @param {String} name - The name of the emulator - * @param {Object} device - Android device definition object - * @param {Object} opts - Emulator options object - * @param {String} [opts.titaniumHomeDir="~/.titanium"] - The Titanium home directory - * @param {Boolean} [opts.bypassCache=false] - Bypasses environment detection cache and re-queries the system - * @param {String} [opts.cwd] - The current working directory to pass into spawn() - * @param {Array|String} [opts.stdio="ignore"] - The stdio configuration to pass into spawn() - * @param {Object} [opts.env] - The environment variables to pass into spawn() - * @param {Boolean} [opts.detached=true] - The detached flag to pass into spawn() - * @param {Number} [opts.uid] - The user id to pass into spawn() - * @param {Number} [opts.gid] - The group id to pass into spawn() - * @param {Function} callback - A function to call when the emulator is stopped - */ -exports.stop = function stop(config, name, device, opts, callback) { - if (opts && typeof opts === 'function') { - callback = opts; - opts = {}; - } else { - opts = opts || {}; - } - - android.detect(config, { bypassCache: opts.bypassCache }, function (results) { - if (!results.sdk) { - return callback(new Error(__('No Android SDK found'))); - } - - // if they passed in the emulator name, get the emulator avd definition - const emu = results.avds.filter(e => e && e.name === name).shift(); - if (!emu) { - return callback(new Error(__('Invalid emulator "%s"', name)), null); - } - - exports.isRunning(config, emu, [ device ], function (err, running) { - if (err || !running) { - return callback(err); - } - appc.subprocess.run(results.sdk.executables.adb, [ '-s', device.id, 'emu', 'kill' ], function (code, out, err) { - callback(code, code ? err : out); - }); - }); - }); -}; diff --git a/lib/environ.js b/lib/environ.js new file mode 100644 index 00000000..102d77eb --- /dev/null +++ b/lib/environ.js @@ -0,0 +1,281 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import { cpus, totalmem } from 'node:os'; +import { execSync } from 'node:child_process'; +import { expand } from './expand'; + +const OSs = { + darwin: { + name: 'osx', + sdkPaths: [ + '~/Library/Application Support/Titanium', // Lion + '/Library/Application Support/Titanium' // pre-Lion + ] + }, + win32: { + name: 'win32', + sdkPaths: [ + '%ProgramData%\\Titanium', // Windows Vista, Windows 7 + '%APPDATA%\\Titanium', // Windows XP, Windows Server 2003 + '%ALLUSERSPROFILE%\\Application Data\\Titanium' // Windows XP, Windows Server 2003 + ] + }, + linux: { + name: 'linux', + sdkPaths: [ + '~/.titanium' + ] + } +}; +const os = OSs[process.platform]; +let osInfo; + +const readme = /readme.*/i; +const jsfile = /\.js$/; +const ignore = /\.?_.*| |\.DS_Store/; + +const env = { + // list of all sdks found + sdks: {}, + + os: os, + + // deprecated + commands: {}, // map of commands to path of file to require + project: { + commands: {} // project-based commands + }, +}; + +// object to track paths that we've already scanned +const scannedSdkPaths = {}; +const scannedCommandPaths = {}; + +/** + * Scans a path for commands. This logic has been moved to the Titanium CLI, + * but must remain here for older Titanium CLI versions. + * @param {Object} dest - The destination of the results + * @param {String} commandsPath - The path to scan for commands + * @deprecated + */ +export function scanCommands(dest, commandsPath) { + if (!scannedCommandPaths[commandsPath] && fs.existsSync(commandsPath)) { + // if the path is a js file, then we allow it no matter what + if (fs.statSync(commandsPath).isFile() && jsfile.test(commandsPath)) { + const name = commandsPath.replace(jsfile, '').toLowerCase(); + if (!dest[name]) { + dest[name] = commandsPath; + } + } else { + for (const file of fs.readdirSync(commandsPath)) { + const fullPath = path.join(commandsPath, file); + // we don't allow commands that start with _ or have spaces + if (fs.existsSync(fullPath) && fs.statSync(fullPath).isFile() && jsfile.test(fullPath) && !ignore.test(path.basename(fullPath))) { + // we don't allow commands that start with _ or have spaces + const name = fullPath.replace(jsfile, ''); + if (!dest[name]) { + dest[name] = fullPath; + } + } + } + } + scannedCommandPaths[commandsPath] = 1; + } +} + +/** + * Returns the specified Titanium SDK info or null if not found. + * @param {String} version - A Titanium SDK version or 'latest' + * @returns {Object} The Titanium SDK info or null + */ +export function getSDK(version) { + if (!version || version === 'latest') { + version = Object.keys(env.sdks).sort().pop(); + } + return env.sdks[version] || null; +} + +/** + * Detects installed Titanium SDKs. + * @param {String|Array} paths - An array of paths to scan for Titanium SDKs + */ +export function detectTitaniumSDKs(paths) { + const sdkPaths = [...environ.os.sdkPaths]; + + if (Array.isArray(paths)) { + sdkPaths.push(...paths); + } + + for (let titaniumPath of sdkPaths) { + titaniumPath = expand(titaniumPath); + + if (!env.installPath && fs.existsSync(path.dirname(titaniumPath))) { + env.installPath = titaniumPath; + } + + if (fs.existsSync(titaniumPath)) { + // we can only call realpathSync if the file exists + titaniumPath = fs.realpathSync(titaniumPath); + + if (scannedSdkPaths[titaniumPath]) { + return; + } + scannedSdkPaths[titaniumPath] = 1; + + const mobilesdkPath = path.join(titaniumPath, 'mobilesdk', os.name); + if (fs.existsSync(mobilesdkPath)) { + fs.readdirSync(mobilesdkPath).filter((f) => { + const dir = path.join(mobilesdkPath, f); + return fs.existsSync(dir) && fs.statSync(dir).isDirectory() && fs.readdirSync(dir).some((f) => { + return fs.existsSync(path.join(dir, f)) && readme.test(f); + }); + }).filter((f) => { + for (const { version } of env.sdks) { + if (version === f) { + return false; + } + } + return true; + }).sort((a, b) => { + return a === b ? 0 : a < b ? 1 : -1; + }).map((v) => { + const sdkPath = path.join(mobilesdkPath, v); + const manifestFile = path.join(sdkPath, 'manifest.json'); + const packageJsonFile = path.join(sdkPath, 'package.json'); + const sdk = { + commands: {}, + name: v, + manifest: null, + packageJson: null, + path: sdkPath, + platforms: {} + }; + + env.sdks[v] = sdk; + + if (fs.existsSync(manifestFile)) { + // read in the manifest.json + try { + sdk.manifest = JSON.parse(fs.readFileSync(manifestFile, 'utf-8')); + } catch {} + } + + if (fs.existsSync(packageJsonFile)) { + // read in the package.json + try { + sdk.packageJson = JSON.parse(fs.readFileSync(packageJsonFile, 'utf-8')); + } catch {} + } + + if (!sdk.packageJson) { + sdk.packageJson = {}; + } + if (!sdk.packageJson.vendorDependencies) { + sdk.packageJson.vendorDependencies = {}; + } + if (!sdk.packageJson.vendorDependencies.node) { + sdk.packageJson.vendorDependencies.node = '>=0.8.0 <=0.10.x'; + } + + const platforms = sdk.manifest?.platforms || [ 'android', 'ios', 'mobileweb' ]; + for (const p of platforms) { + const pp = path.join(sdkPath, p); + if (fs.existsSync(pp)) { + sdk.platforms[p] = { + path: pp, + commands: {} + }; + } else if (p === 'ios') { + const dir = path.join(sdkPath, 'iphone'); + if (fs.existsSync(dir)) { + // maybe we have an old Titanium SDK + sdk.platforms[p] = { + path: dir, + commands: {} + }; + } + } + } + }); + } + } + } +} + +export { detectTitaniumSDKs as detect }; + +/** + * Fetches OS and Node.js info. + */ +export async function getOSInfo() { + if (osInfo) { + return osInfo; + } + + // do NOT change the names of these keys... they are specifically used by analytics + osInfo = { + os: '', + platform: process.platform.replace(/darwin/, 'osx'), + osver: '', + ostype: (/64/.test(process.arch) ? 64 : 32) + 'bit', + oscpu: cpus().length, + memory: totalmem(), + node: process.version.replace(/^v/, ''), + npm: '' + }; + + switch (process.platform) { + case 'darwin': + const swVersOutput = execSync('sw_vers'); + const m = swVersOutput.match(/ProductName:\s+(.+)/i); + const m2 = swVersOutput.match(/ProductVersion:\s+(.+)/i); + if (m) { + osInfo.os = m[1]; + } + if (m2) { + osInfo.osver = m2[1]; + } + break; + + case 'linux': + if (fs.existsSync('/etc/lsb-release')) { + const s = fs.readFileSync('/etc/lsb-release', 'utf-8'); + const m = s.match(/DISTRIB_DESCRIPTION=(.+)/i); + const m2 = s.match(/DISTRIB_RELEASE=(.+)/i); + if (m) { + osInfo.os = m[1].replace(/"/g, ''); + } + if (m2) { + osInfo.osver = m2[1].replace(/"/g, ''); + } + } else if (fs.existsSync('/etc/system-release')) { + const s = fs.readFileSync('/etc/system-release', 'utf-8').split(' '); + if (s.length) { + osInfo.os = s[0]; + } + if (s.length > 2) { + osInfo.osver = s[2]; + } + } + if (!osInfo.os) { + osInfo.os = 'GNU/Linux'; + } + break; + + case 'win32': + const wmicOutput = execSync('wmic os get Caption,Version'); + const s = wmicOutput.split('\n')[1].split(/ {2,}/); + if (s.length > 0) { + osInfo.os = s[0].trim(); + } + if (s.length > 1) { + osInfo.osver = s[1].trim(); + } + break; + } + + const npmVersion = execSync('npm --version').trim(); + osInfo.npm = npmVersion; + + return osInfo; +} diff --git a/lib/i18n.js b/lib/i18n.js deleted file mode 100644 index aa6d8909..00000000 --- a/lib/i18n.js +++ /dev/null @@ -1,93 +0,0 @@ -/** - * Titanium SDK Library for Node.js - * Copyright (c) 2012-2013 by Appcelerator, Inc. All Rights Reserved. - * Please see the LICENSE file for information about licensing. - */ -'use strict'; - -const fs = require('fs'); -const path = require('path'); -const DOMParser = require('xmldom').DOMParser; - -const appc = require('node-appc'); -const __ = appc.i18n(__dirname).__; -const xml = appc.xml; - -const launchScreensCache = {}; - -exports.load = load; -exports.findLaunchScreens = findLaunchScreens; - -function load(projectDir, logger, opts) { - if (process.argv.indexOf('--i18n-dir') !== -1) { - // Enable developers to specify i18n directory location with build flag - const customI18n = process.argv[process.argv.indexOf('--i18n-dir') + 1]; - if (customI18n && fs.existsSync(path.join(path.resolve(projectDir), customI18n))) { - projectDir = path.join(projectDir, customI18n); - } - } - const i18nDir = path.join(projectDir, 'i18n'), - data = {}, - ignoreDirs = opts && opts.ignoreDirs, - ignoreFiles = opts && opts.ignoreFiles; - - // TODO: Process languages in parallel! - if (fs.existsSync(i18nDir)) { - logger && logger.debug(__('Compiling localization files')); - fs.readdirSync(i18nDir).forEach(function (lang) { - const langDir = path.join(i18nDir, lang), - isDir = fs.statSync(langDir).isDirectory(); - - if (fs.existsSync(langDir) && isDir && (!ignoreDirs || !ignoreDirs.test(lang))) { - const s = data[lang] = {}; - - fs.readdirSync(langDir).forEach(function (name) { - const file = path.join(langDir, name); - if (/.+\.xml$/.test(name) && (!ignoreFiles || !ignoreFiles.test(name)) && fs.existsSync(file) && fs.statSync(file).isFile()) { - logger && logger.debug(__('Processing i18n file: %s', (lang + '/' + name).cyan)); - - const dest = name === 'app.xml' ? 'app' : 'strings', - obj = s[dest] = s[dest] || {}, - dom = new DOMParser().parseFromString(fs.readFileSync(file).toString(), 'text/xml'); - - xml.forEachElement(dom.documentElement, function (elem) { - if (elem.nodeType == 1 && elem.tagName == 'string') { // eslint-disable-line eqeqeq - const name = xml.getAttr(elem, 'name'); - name && (obj[name] = elem && elem.firstChild && elem.firstChild.data || ''); - } - }); - } - }); - } - }); - } - - return data; -} - -function findLaunchScreens(projectDir, logger, opts) { - if (launchScreensCache[projectDir]) { - return launchScreensCache[projectDir]; - } - - var i18nDir = path.join(projectDir, 'i18n'), - data = []; - - opts || (opts = {}); - - if (fs.existsSync(i18nDir)) { - logger.debug(__('Checking for Splash Screen localization')); - fs.readdirSync(i18nDir).forEach(function (lang) { - var langDir = path.join(i18nDir, lang); - if (fs.existsSync(langDir) && fs.statSync(langDir).isDirectory() && (!opts.ignoreDirs || !opts.ignoreDirs.test(lang))) { - fs.readdirSync(langDir).forEach(function (name) { - if (/^(Default(-(Landscape|Portrait))?(-[0-9]+h)?(@[2-9]x)?)\.png$/.test(name)) { - data.push(path.join(langDir, name)); - } - }); - } - }); - } - - return launchScreensCache[projectDir] = data; -} diff --git a/lib/jsanalyze.js b/lib/jsanalyze.js index f6b8ea80..2b869504 100644 --- a/lib/jsanalyze.js +++ b/lib/jsanalyze.js @@ -1,48 +1,32 @@ -/** - * @overview - * Analyzes Titanium JavaScript files for symbols and optionally minifies the code. - * - * @module lib/jsanalyze - * - * @copyright - * Copyright (c) 2009-Present by Appcelerator, Inc. All Rights Reserved. - * - * @license - * Licensed under the terms of the Apache Public License - * Please see the LICENSE included with this distribution for details. - */ -'use strict'; - -const appc = require('node-appc'); -const fs = require('fs-extra'); -const DOMParser = require('xmldom').DOMParser; -const babel = require('@babel/core'); -const babylon = require('@babel/parser'); -const minify = require('babel-preset-minify'); -const env = require('@babel/preset-env'); -const apiTracker = require('./babel-plugins/ti-api'); -const path = require('path'); +import fs from 'node:fs'; +import { DOMParser } from '@xmldom/xmldom'; +import babel from '@babel/core'; +import babylon from '@babel/parser'; +import minify from 'babel-preset-minify'; +import env from '@babel/preset-env'; +import apiTracker from './babel-plugins/ti-api.js'; +import path from 'node:path'; +import { createRequire } from 'node:module'; +import { expand } from './util/expand.js'; const SOURCE_MAPPING_URL_REGEXP = /\/\/#[ \t]+sourceMappingURL=([^\s'"`]+?)[ \t]*$/mg; -const __ = appc.i18n(__dirname).__; -function sortObject(o) { +export function sortObject(o) { const sorted = {}; for (const key of Object.keys(o).sort()) { sorted[key] = o[key]; } return sorted; } -exports.sortObject = sortObject; /** * Returns an object with the Titanium API usage statistics. * * @returns {Object} The API usage stats */ -exports.getAPIUsage = function getAPIUsage() { +export function getAPIUsage() { return apiTracker.apiUsage; -}; +} /** * Analyzes a Titanium JavaScript file for all Titanium API symbols. @@ -59,10 +43,10 @@ exports.getAPIUsage = function getAPIUsage() { * @returns {Object} An object containing symbols and minified JavaScript * @throws {Error} An error if unable to parse the JavaScript */ -exports.analyzeJsFile = function analyzeJsFile(file, opts = {}) { +export function analyzeJsFile(file, opts = {}) { opts.filename = file; - return exports.analyzeJs(fs.readFileSync(file).toString(), opts); -}; + return analyzeJs(fs.readFileSync(file, 'utf8'), opts); +} /** * Analyzes a string containing JavaScript for all Titanium API symbols. @@ -79,9 +63,13 @@ exports.analyzeJsFile = function analyzeJsFile(file, opts = {}) { * @returns {Object} An object containing symbols and minified JavaScript * @throws {Error} An error if unable to parse the JavaScript */ -exports.analyzeJs = function analyzeJs(contents, opts = {}) { - opts.plugins || (opts.plugins = []); - opts.transform || (opts.transform = {}); +export function analyzeJs(contents, opts = {}) { + if (!opts.plugins) { + opts.plugins = []; + } + if (!opts.transform) { + opts.transform = {}; + } // parse the js file let ast; @@ -92,15 +80,15 @@ exports.analyzeJs = function analyzeJs(contents, opts = {}) { try { try { ast = babylon.parse(contents, parserOpts); - } catch (err) { + } catch { // fall back to much looser parsing parserOpts.allowReturnOutsideFunction = true; ast = babylon.parse(contents, parserOpts); } } catch (ex) { - const errmsg = [ __('Failed to parse %s', opts.filename) ]; + const errmsg = [ `Failed to parse ${opts.filename}` ]; if (ex.line) { - errmsg.push(__('%s [line %s, column %s]', ex.message, ex.line, ex.col)); + errmsg.push(`${ex.message} [line ${ex.line}, column ${ex.col}]`); } else { errmsg.push(ex.message); } @@ -108,19 +96,13 @@ exports.analyzeJs = function analyzeJs(contents, opts = {}) { contents = contents.split('\n'); if (ex.line && ex.line <= contents.length) { errmsg.push(''); - errmsg.push(' ' + contents[ex.line - 1].replace(/\t/g, ' ')); + errmsg.push(` ${contents[ex.line - 1].replace(/\t/g, ' ')}`); if (ex.col) { - var i = 0, - len = ex.col, - buffer = ' '; - for (; i < len; i++) { - buffer += '-'; - } - errmsg.push(buffer + '^'); + errmsg.push(` ${' '.repeat(ex.col)}^`); } errmsg.push(''); } - } catch (ex2) {} // eslint-disable-line no-empty + } catch {} throw new Error(errmsg.join('\n')); } @@ -140,10 +122,12 @@ exports.analyzeJs = function analyzeJs(contents, opts = {}) { parserOpts }; + const req = createRequire(import.meta.url); + // transpile if (opts.transpile) { - options.plugins.push(require.resolve('./babel-plugins/global-this')); - options.plugins.push([ require.resolve('babel-plugin-transform-titanium'), opts.transform ]); + options.plugins.push(expand(__dirname, 'babel-plugins', 'global-this.js')); + options.plugins.push([req.resolve('babel-plugin-transform-titanium'), opts.transform ]); options.presets.push([ env, { targets: opts.targets } ]); } @@ -160,7 +144,7 @@ exports.analyzeJs = function analyzeJs(contents, opts = {}) { deadcode: false } ]); - options.plugins.push(require.resolve('@babel/plugin-transform-property-literals')); + options.plugins.push(req.resolve('@babel/plugin-transform-property-literals')); } if (opts.plugins.length) { @@ -195,10 +179,10 @@ exports.analyzeJs = function analyzeJs(contents, opts = {}) { if (existingMap.sourceRoot.startsWith('file://')) { existingMap.sourceRoot = existingMap.sourceRoot.slice(7); } - sourceFileName = path.resolve(existingMap.sourceRoot, sourceFileName); + sourceFileName = expand(existingMap.sourceRoot, sourceFileName); } // if sourceFilename is still not absolute, resolve relative to map file - sourceFileName = path.resolve(path.dirname(mapFile), sourceFileName); + sourceFileName = expand(path.dirname(mapFile), sourceFileName); // ok, we've mangled the source map enough for babel to consume it options.inputSourceMap = existingMap; @@ -253,7 +237,7 @@ exports.analyzeJs = function analyzeJs(contents, opts = {}) { results.symbols = Array.from(apiTracker.symbols.values()); // convert Set values to Array return results; -}; +} /** * @param {string} contents source code to check @@ -283,15 +267,15 @@ function findSourceMap(contents, filepath) { lastMatch = lastMatch.slice(7); } // resolve filepath relative to the original input JS file if we need to... - const mapFile = path.resolve(path.dirname(filepath), lastMatch); + const mapFile = expand(path.dirname(filepath), lastMatch); try { - const map = fs.readJSONSync(mapFile); + const map = JSON.parse(fs.readFileSync(mapFile, 'utf8')); return { map, filepath: mapFile }; - } catch (err) { + } catch { return null; } } @@ -303,9 +287,9 @@ function findSourceMap(contents, filepath) { * @param {String} [relPath] - A relative path to the HTML file with respect to the Resources directory * @returns {Array} An array of app:// JavaScript files */ -exports.analyzeHtmlFile = function analyzeHtmlFile(file, relPath) { - return exports.analyzeHtml(fs.readFileSync(file).toString(), relPath); -}; +export function analyzeHtmlFile(file, relPath) { + return analyzeHtml(fs.readFileSync(file, 'utf8'), relPath); +} /** * Analyzes a string containing JavaScript for all Titanium API symbols. @@ -314,7 +298,7 @@ exports.analyzeHtmlFile = function analyzeHtmlFile(file, relPath) { * @param {String} [relPath] - A relative path to the HTML file with respect to the Resources directory * @returns {Array} An array of app:// JavaScript files */ -exports.analyzeHtml = function analyzeHtml(contents, relPath) { +export function analyzeHtml(contents, relPath) { const files = []; function addFile(src) { @@ -330,7 +314,7 @@ exports.analyzeHtml = function analyzeHtml(contents, relPath) { const p = res.split(/\/|\\/); const r = []; let q; - while (q = p.shift()) { + while ((q = p.shift())) { if (q === '..') { r.pop(); } else { @@ -346,18 +330,20 @@ exports.analyzeHtml = function analyzeHtml(contents, relPath) { } try { - const dom = new DOMParser({ errorHandler: function () {} }).parseFromString('\n' + contents + '\n', 'text/html'), - doc = dom && dom.documentElement, - scripts = doc && doc.getElementsByTagName('script'), - len = scripts.length; + const dom = new DOMParser({ errorHandler: function () {} }).parseFromString('\n' + contents + '\n', 'text/html'); + const doc = dom && dom.documentElement; + const scripts = doc && doc.getElementsByTagName('script'); + const len = scripts.length; if (scripts) { for (let i = 0; i < len; i++) { const src = scripts[i].getAttribute('src'); - src && addFile(src); + if (src) { + addFile(src); + } } } - } catch (e) { + } catch { // bad html file, try to manually parse out the script tags contents.split(''); @@ -367,10 +353,12 @@ exports.analyzeHtml = function analyzeHtml(contents, relPath) { // try again without the quotes m = chunk.substring(0, p).match(/src\s*=\s*([^>\s]+)/); } - m && addFile(m[1]); + if (m) { + addFile(m[1]); + } } }); } return files; -}; +} diff --git a/lib/tiappxml.js b/lib/tiappxml.js deleted file mode 100644 index 9b281669..00000000 --- a/lib/tiappxml.js +++ /dev/null @@ -1,750 +0,0 @@ -/** - * Titanium SDK Library for Node.js - * Copyright (c) 2012-Present by Appcelerator, Inc. All Rights Reserved. - * Please see the LICENSE file for information about licensing. - */ -/* eslint no-loop-func: "off" */ -'use strict'; - -const appc = require('node-appc'); -const DOMParser = require('xmldom').DOMParser; -const fs = require('fs-extra'); -const path = require('path'); - -const plist = appc.plist; -const version = appc.version; -const xml = appc.xml; -const __ = appc.i18n(__dirname).__; - -const defaultDOMParserArgs = { errorHandler: function () {} }; -module.exports = tiapp; - -function toXml(dom, parent, name, value) { - // properties is a super special case - if (name === 'properties') { - Object.keys(value).forEach(function (v) { - dom.create('property', { - name: v, - type: value[v].type || 'string', - nodeValue: value[v].value - }, parent); - }); - return; - } - - var node = dom.create(name, null, parent); - - switch (name) { - case 'deployment-targets': - Object.keys(value).forEach(function (v) { - dom.create('target', { - device: v, - nodeValue: value[v] - }, node); - }); - break; - - case 'code-processor': - Object.keys(value).forEach(function (key) { - if (key === 'plugins') { - if (Array.isArray(value[key]) && value[key].length) { - dom.create('plugins', null, node, function (plugins) { - value[key].forEach(function (p) { - dom.create('plugin', { nodeValue: p }, plugins); - }); - }); - } - } else if (key === 'options') { - if (Object.prototype.toString.call(value[key]) === '[object Object]') { - dom.create('options', null, node, function (options) { - Object.keys(value[key]).forEach(function (opt) { - dom.create(opt, { nodeValue: value[key][opt] }, options); - }); - }); - } - } else { - dom.create(key, { nodeValue: value[key] }, node); - } - }); - break; - - case 'ios': - if (Object.prototype.hasOwnProperty.call(value, 'exclude-dir-from-asset-catalog')) { - dom.create('exclude-dir-from-asset-catalog', { nodeValue: !!value['exclude-dir-from-asset-catalog'] }, node); - } - - if (Object.prototype.hasOwnProperty.call(value, 'enable-launch-screen-storyboard')) { - dom.create('enable-launch-screen-storyboard', { nodeValue: !!value['enable-launch-screen-storyboard'] }, node); - } - - if (Object.prototype.hasOwnProperty.call(value, 'enablecoverage')) { - dom.create('enablecoverage', { nodeValue: !!value['enablecoverage'] }, node); - } - - if (Object.prototype.hasOwnProperty.call(value, 'enablemdfind')) { - dom.create('enablemdfind', { nodeValue: !!value['enablemdfind'] }, node); - } - - if (Object.prototype.hasOwnProperty.call(value, 'min-ios-ver')) { - dom.create('min-ios-ver', { nodeValue: version.format(value['min-ios-ver'], 2) }, node); - } - - if (Object.prototype.hasOwnProperty.call(value, 'default-background-color')) { - dom.create('default-background-color', { nodeValue: value['default-background-color'] }, node); - } - - if (Object.prototype.hasOwnProperty.call(value, 'team-id')) { - dom.create('team-id', { nodeValue: value['team-id'] }, node); - } - - if (Object.prototype.hasOwnProperty.call(value, 'use-jscore-framework')) { - dom.create('use-jscore-framework', { nodeValue: !!value['use-jscore-framework'] }, node); - } - - if (Object.prototype.hasOwnProperty.call(value, 'run-on-main-thread')) { - dom.create('run-on-main-thread', { nodeValue: !!value['run-on-main-thread'] }, node); - } - - if (Object.prototype.hasOwnProperty.call(value, 'use-autolayout')) { - dom.create('use-autolayout', { nodeValue: !!value['use-autolayout'] }, node); - } - - if (Object.prototype.hasOwnProperty.call(value, 'use-new-build-system')) { - dom.create('use-new-build-system', { nodeValue: !!value['use-new-build-system'] }, node); - } - - if (Object.prototype.hasOwnProperty.call(value, 'use-app-thinning')) { - dom.create('use-app-thinning', { nodeValue: !!value['use-app-thinning'] }, node); - } - - if (Object.prototype.hasOwnProperty.call(value, 'log-server-port')) { - dom.create('log-server-port', { nodeValue: value['log-server-port'] }, node); - } - - if (value.capabilities) { - var capNode = dom.create('capabilities', null, node); - Object.keys(value.capabilities).forEach(function (cap) { - if (cap === 'app-groups') { - var appGroupNode = dom.create(cap, null, capNode); - value.capabilities[cap].forEach(function (group) { - dom.create('group', { nodeValue: group }, appGroupNode); - }); - appGroupNode.appendChild(dom.createTextNode('\r\n\t\t\t')); - capNode.appendChild(dom.createTextNode('\r\n\t\t')); - } - }); - } - - if (value.entitlements) { - const enNode = dom.create('entitlements', null, node); - const pl = new plist(); - appc.util.mix(pl, value.entitlements); - const doc = pl.toXml(3); - enNode.appendChild(dom.createTextNode('\r\n\t\t\t')); - xml.forEachElement(doc, function (elem) { - enNode.appendChild(elem); - }); - enNode.appendChild(dom.createTextNode('\r\n\t\t')); - } - - if (value.plist) { - const plNode = dom.create('plist', null, node); - const pl = new plist(); - appc.util.mix(pl, value.plist); - const doc = pl.toXml(3); - plNode.appendChild(dom.createTextNode('\r\n\t\t\t')); - xml.forEachElement(doc, function (elem) { - plNode.appendChild(elem); - }); - plNode.appendChild(dom.createTextNode('\r\n\t\t')); - } - - if (Array.isArray(value.extensions)) { - var extsNode = dom.create('extentions', null, node); - value.extensions.forEach(function (ext) { - var extNode = dom.create('extention', { projectPath: ext.projectPath }, extsNode); - Array.isArray(ext.targets) && ext.targets.forEach(function (target) { - var targetNode = dom.create('target', { name: target.name }, extNode); - if (target.ppUUIDs && typeof target.ppUUIDs === 'object' && Object.keys(target.ppUUIDs).length) { - var ppUUIDsNode = dom.create('provisioning-profiles', null, targetNode); - Object.keys(target.ppUUIDs).forEach(function (type) { - dom.create(type, { nodeValue: target.ppUUIDs[type] }, ppUUIDsNode); - }); - ppUUIDsNode.appendChild(dom.createTextNode('\r\n\t\t\t\t\t')); - } - targetNode.appendChild(dom.createTextNode('\r\n\t\t\t\t')); - }); - extNode.appendChild(dom.createTextNode('\r\n\t\t\t')); - }); - extsNode.appendChild(dom.createTextNode('\r\n\t\t')); - } - break; - - case 'iphone': - value.orientations && Object.keys(value.orientations).forEach(function (o) { - dom.create('orientations', { device: o }, node, function (orientations) { - value.orientations[o].forEach(function (p) { - dom.create('orientation', { nodeValue: p }, orientations); - }); - }); - }); - - value.backgroundModes && dom.create('background', null, node, function (background) { - value.backgroundModes.forEach(function (mode) { - dom.create('mode', { nodeValue: mode }, background); - }); - }); - - value.requiredFeatures && dom.create('requires', null, node, function (requires) { - value.requiredFeatures.forEach(function (feature) { - dom.create('feature', { nodeValue: feature }, requires); - }); - }); - - value.types && dom.create('types', null, node, function (types) { - value.types.forEach(function (typeObj) { - dom.create('type', null, types, function (typeNode) { - dom.create('name', { nodeValue: typeObj.name }, typeNode); - dom.create('icon', { nodeValue: typeObj.icon }, typeNode); - dom.create('uti', { nodeValue: typeObj.uti.join(',') }, typeNode); - dom.create('owner', { nodeValue: !!typeObj.owner }, typeNode); - }); - }); - }); - break; - - case 'android': - node.setAttribute('xmlns:android', 'http://schemas.android.com/apk/res/android'); - - if (value.manifest) { - node.appendChild(dom.createTextNode('\r\n' + new Array(3).join('\t'))); - const opts = defaultDOMParserArgs; - opts.xmlns = { android: 'http://schemas.android.com/apk/res/android' }; - node.appendChild(new DOMParser(opts).parseFromString(value.manifest)); - } - - if (Object.prototype.hasOwnProperty.call(value, 'tool-api-level')) { - dom.create('tool-api-level', { nodeValue: value['tool-api-level'] }, node); - } - - if (Object.prototype.hasOwnProperty.call(value, 'abi')) { - dom.create('abi', { nodeValue: Array.isArray(value.abi) ? value.abi.join(',') : value.abi }, node); - } - - if (value.activities) { - dom.create('activities', null, node, function (node) { - Object.keys(value.activities).forEach(function (url) { - var attrs = {}; - Object.keys(value.activities[url]).forEach(function (attr) { - attr !== 'classname' && (attrs[attr] = value.activities[url][attr]); - }); - dom.create('activity', attrs, node); - }); - }); - } - - if (value.services) { - dom.create('services', null, node, function (node) { - Object.keys(value.services).forEach(function (url) { - var attrs = {}; - Object.keys(value.services[url]).forEach(function (attr) { - attr !== 'classname' && (attrs[attr] = value.services[url][attr]); - }); - dom.create('service', attrs, node); - }); - }); - } - break; - - case 'webpack': - if (value.type) { - dom.create('type', { nodeValue: value.type }, node); - } - if (Array.isArray(value.transpileDependencies)) { - dom.create('transpile-dependencies', null, node, depsNode => { - for (const dep of value.transpileDependencies) { - dom.create('dep', { nodeValue: dep }, depsNode); - } - }); - } - break; - - case 'modules': - value.forEach(function (mod) { - dom.create('module', { - platform: mod.platform, - version: mod.version ? version.format(mod.version, 2) : null, - 'deploy-type': mod.deployType || null, - nodeValue: mod.id - }, node); - }); - break; - - case 'plugins': - value.forEach(function (plugin) { - dom.create('plugin', { - version: version.format(plugin.version, 2), - nodeValue: plugin.id - }, node); - }); - break; - - default: - node.appendChild(dom.createTextNode(value)); - return; - } - - node.appendChild(dom.createTextNode('\r\n' + new Array(2).join('\t'))); -} - -function toJS(obj, doc, targetPlatform) { - var node = doc.firstChild; - while (node) { - if (node.nodeType === xml.ELEMENT_NODE) { - switch (node.tagName) { - case 'property': - var name = xml.getAttr(node, 'name'), - type = xml.getAttr(node, 'type') || 'string', - value = xml.getValue(node); - if (name) { - obj.properties || (obj.properties = {}); - obj.properties[name] = { - type: type, - value: type === 'bool' ? !!value - : type === 'int' ? (parseInt(value) || 0) - : type === 'double' ? (parseFloat(value) || 0) - : '' + value - }; - } - break; - - case 'deployment-targets': - var targets = obj['deployment-targets'] = {}; - xml.forEachElement(node, function (elem) { - var dev = xml.getAttr(elem, 'device'); - dev && (targets[dev] = xml.getValue(elem)); - }); - break; - - case 'code-processor': - var codeProcessor = obj['code-processor'] = {}; - xml.forEachElement(node, function (elem) { - switch (elem.tagName) { - case 'plugins': - codeProcessor.plugins = []; - xml.forEachElement(elem, function (elem) { - if (elem.tagName === 'plugin') { - codeProcessor.plugins.push(xml.getValue(elem)); - } - }); - break; - case 'options': - codeProcessor.options = {}; - xml.forEachElement(elem, function (elem) { - codeProcessor.options[elem.tagName] = xml.getValue(elem); - }); - break; - default: - codeProcessor[elem.tagName] = xml.getValue(elem); - } - }); - break; - - case 'ios': - var ios = obj.ios = {}; - xml.forEachElement(node, function (elem) { - switch (elem.tagName) { - case 'exclude-dir-from-asset-catalog': - case 'enable-launch-screen-storyboard': - case 'enablecoverage': - case 'enablemdfind': - case 'default-background-color': - case 'team-id': - case 'use-jscore-framework': - case 'run-on-main-thread': - case 'use-autolayout': - case 'use-app-thinning': - case 'use-new-build-system': - case 'log-server-port': - ios[elem.tagName] = xml.getValue(elem); - break; - - case 'min-ios-ver': - if (elem.firstChild) { - ios['min-ios-ver'] = parseFloat(elem.firstChild.data) || 0; - } - break; - - case 'capabilities': - ios.capabilities = {}; - xml.forEachElement(elem, function (elem) { - if (elem.tagName === 'app-groups') { - var appGroups = ios.capabilities[elem.tagName] = []; - xml.forEachElement(elem, function (elem) { - if (elem.tagName === 'group') { - var group = xml.getValue(elem); - group && appGroups.push(group); - } - }); - } - }); - break; - - case 'entitlements': - ios.entitlements = {}; - xml.forEachElement(elem, function (elem) { - if (elem.tagName === 'dict') { - const pl = new plist().parse('' + elem.toString() + ''); - Object.keys(pl).forEach(prop => ios.entitlements[prop] = pl[prop]); - } - }); - break; - - case 'plist': - ios.plist = {}; - xml.forEachElement(elem, function (elem) { - if (elem.tagName === 'dict') { - var pl = new plist().parse('' + elem.toString() + ''); - Object.keys(pl).forEach(function (prop) { - if (!/^CFBundle(DisplayName|Executable|IconFile|Identifier|InfoDictionaryVersion|Name|PackageType|Signature)|LSRequiresIPhoneOS$/.test(prop)) { - ios.plist[prop] = pl[prop]; - } - }); - } - }); - break; - - case 'extensions': - var extensions = ios.extensions = []; - xml.forEachElement(elem, function (elem) { - if (elem.tagName !== 'extension') { - return; - } - - var ext = { - projectPath: elem.getAttribute('projectPath') || null, - targets: [] - }; - extensions.push(ext); - - xml.forEachElement(elem, function (elem) { - if (elem.tagName !== 'target') { - return; - } - - var target = { - name: elem.getAttribute('name'), - ppUUIDs: {} - }; - ext.targets.push(target); - - xml.forEachElement(elem, function (elem) { - if (elem.tagName === 'provisioning-profiles') { - xml.forEachElement(elem, function (elem) { - target.ppUUIDs[elem.tagName] = xml.getValue(elem); - }); - } - }); - }); - }); - break; - } - }); - break; - - case 'iphone': - var iphone = obj.iphone = {}, - dev; - xml.forEachElement(node, function (elem) { - switch (elem.tagName) { - case 'orientations': - iphone.orientations || (iphone.orientations = {}); - if (dev = xml.getAttr(elem, 'device')) { - iphone.orientations[dev] || (iphone.orientations[dev] = []); - xml.forEachElement(elem, function (elem) { - iphone.orientations[dev].push(xml.getValue(elem)); - }); - } - break; - - case 'background': - xml.forEachElement(elem, function (elem) { - if (elem.tagName === 'mode') { - iphone.backgroundModes || (iphone.backgroundModes = []); - iphone.backgroundModes.push(xml.getValue(elem)); - } - }); - break; - - case 'requires': - xml.forEachElement(elem, function (elem) { - if (elem.tagName === 'feature') { - iphone.requiredFeatures || (iphone.requiredFeatures = []); - iphone.requiredFeatures.push(xml.getValue(elem)); - } - }); - break; - - case 'types': - xml.forEachElement(elem, function (elem) { - if (elem.tagName === 'type') { - iphone.types || (iphone.types = []); - var type = { - name: '', - icon: '', - uti: [], - owner: false - }; - xml.forEachElement(elem, function (elem) { - var v = xml.getValue(elem); - type[elem.tagName] = elem.tagName === 'uti' ? v.split(',').map(s => s.trim()) : v; - }); - iphone.types.push(type); - } - }); - break; - } - }); - break; - - case 'android': - var android = obj.android = {}, - formatUrl = (url) => { - return appc.string.capitalize(url.replace(/^app:\/\//, '').replace(/\.js$/, '').replace(/\//g, '_')).replace(/[/ .$&@]/g, '_'); - }; - - xml.forEachElement(node, function (elem) { - switch (elem.tagName) { - case 'manifest': - // the tag is an XML document and we're just gonna - // defer the parsing to whoever wants its data - // Strip the 'android' XML namespace on the uses-sdk tag! It's already defined at tag level! - android.manifest = elem.toString().replace(/ xmlns:android="http:\/\/schemas\.android\.com\/apk\/res\/android"/, ''); - break; - - case 'abi': - android[elem.tagName] = xml.getValue(elem).split(',').map(s => s.trim()); - break; - - case 'tool-api-level': - android[elem.tagName] = xml.getValue(elem); - break; - - case 'activities': - case 'services': - var type = elem.tagName, - dest = android[type] = {}; - - xml.forEachElement(elem, function (elem) { - if ((type === 'activities' && elem.tagName === 'activity') || (type === 'services' && elem.tagName === 'service')) { - var url = xml.getAttr(elem, 'url') || xml.getValue(elem) || ''; - if (url) { - var a = dest[url] = {}; - xml.forEachAttr(elem, function (attr) { - a[attr.name] = xml.parse(attr.value); - }); - a['classname'] = formatUrl(url) + (type === 'activities' ? 'Activity' : 'Service'); - if (type === 'services') { - a['type'] = xml.getAttr(elem, 'type') || 'standard'; - } - a['url'] = url; - xml.forEachElement(elem, function (elem) { - if (elem.tagName === 'intent-filter') { - var intentFilter = null; - xml.forEachElement(elem, function (elem) { - if (elem.tagName === 'action' || elem.tagName === 'category' || elem.tagName === 'data') { - intentFilter || (intentFilter = {}); - intentFilter[elem.tagName] || (intentFilter[elem.tagName] = []); - if (elem.tagName === 'data') { - var a = {}; - xml.forEachAttr(elem, function (attr) { - a[attr.name.replace(/^android:/, '')] = xml.parse(attr.value); - }); - intentFilter[elem.tagName].push(a); - } else { - intentFilter[elem.tagName].push(xml.getAttr(elem, 'android:name')); - } - } - }); - if (intentFilter) { - a['intent-filter'] || (a['intent-filter'] = []); - a['intent-filter'].push(intentFilter); - } - } else if (elem.tagName === 'meta-data') { - var obj = {}; - xml.forEachAttr(elem, function (attr) { - obj[attr.name.replace(/^android:/, '')] = xml.parse(attr.value); - }); - if (obj.name) { - a['meta-data'] || (a['meta-data'] = {}); - a['meta-data'][obj.name] = obj; - } - } - }); - } - } - }); - break; - } - }); - break; - - case 'modules': - var modules = obj.modules = []; - xml.forEachElement(node, function (elem) { - var opts = { - id: xml.getValue(elem), - platform: xml.getAttr(elem, 'platform') - }, - version = elem.getAttribute('version'), - deployType = xml.getAttr(elem, 'deploy-type'); - version && (opts.version = version); - deployType && (opts.deployType = deployType); - modules.push(opts); - }); - break; - - case 'plugins': - var plugins = obj.plugins = []; - xml.forEachElement(node, function (elem) { - var opts = { - id: xml.getValue(elem) - }, - version = elem.getAttribute('version'); - version && (opts.version = version); - plugins.push(opts); - }); - break; - - case 'version': - obj[node.tagName] = node.firstChild && node.firstChild.data.replace(/\n/g, '').trim() || ''; - break; - - case 'id': - if ((targetPlatform && xml.getAttr(node, 'platform') === targetPlatform) || obj[node.tagName] === undefined) { - obj[node.tagName] = '' + xml.getValue(node); - if (typeof obj[node.tagName] === 'string') { - obj[node.tagName] = obj[node.tagName].replace(/\n/g, ''); - } - } - break; - - case 'name': - case 'guid': - case 'icon': - // need to strip out line returns which shouldn't be there in the first place - obj[node.tagName] = '' + xml.getValue(node); - if (typeof obj[node.tagName] === 'string') { - obj[node.tagName] = obj[node.tagName].replace(/\n/g, ''); - } - break; - - case 'webpack': - const webpack = obj.webpack = {}; - xml.forEachElement(node, elem => { - switch (elem.tagName) { - case 'type': { - webpack[elem.tagName] = xml.getValue(elem); - break; - } - case 'transpile-dependencies': { - const transpileDependencies = webpack.transpileDependencies = []; - xml.forEachElement(elem, dep => { - transpileDependencies.push(xml.getValue(dep)); - }); - break; - } - } - }); - break; - - default: - obj[node.tagName] = xml.getValue(node); - } - } - node = node.nextSibling; - } -} - -function tiapp(filename, platform) { - - Object.defineProperty(this, 'load', { - value: function (file) { - if (!fs.existsSync(file)) { - throw new Error(__('tiapp.xml file does not exist')); - } - toJS(this, (new DOMParser(defaultDOMParserArgs).parseFromString(fs.readFileSync(file).toString(), 'text/xml')).documentElement, platform); - return this; - } - }); - - Object.defineProperty(this, 'parse', { - value: function (str) { - toJS(this, (new DOMParser(defaultDOMParserArgs).parseFromString(str, 'text/xml')).documentElement, platform); - return this; - } - }); - - Object.defineProperty(this, 'toString', { - value: function (fmt) { - if (fmt === 'xml') { - var dom = new DOMParser(defaultDOMParserArgs).parseFromString('', 'text/xml'); - - dom.create = function (tag, attrs, parent, callback) { - var node = dom.createElement(tag), - i = 0, - p = parent; - - attrs && Object.keys(attrs).forEach(function (attr) { - if (attr === 'nodeValue') { - node.appendChild(dom.createTextNode('' + attrs[attr])); - } else { - attrs[attr] != undefined && node.setAttribute(attr, '' + attrs[attr]); // eslint-disable-line eqeqeq - } - }); - - if (p) { - while (p.parentNode) { - i++; - p = p.parentNode; - } - parent.appendChild(dom.createTextNode('\r\n' + new Array(i + 1).join('\t'))); - } - - parent && parent.appendChild(node); - if (callback) { - callback(node); - node.appendChild(dom.createTextNode('\r\n' + new Array(i + 1).join('\t'))); - } - return node; - }; - - Object.keys(this).forEach(function (key) { - toXml(dom, dom.documentElement, key, this[key]); - }, this); - - dom.documentElement.appendChild(dom.createTextNode('\r\n')); - - var xml = dom.documentElement.toString(); - return '\n' + xml.replace(/uses-sdk xmlns:android="http:\/\/schemas\.android\.com\/apk\/res\/android"/, 'uses-sdk'); - } else if (fmt === 'pretty-json') { - return JSON.stringify(this, null, '\t'); - } else if (fmt === 'json') { - return JSON.stringify(this); - } - return Object.prototype.toString.call(this); - } - }); - - Object.defineProperty(this, 'save', { - value: function (file) { - if (file) { - fs.ensureDirSync(path.dirname(file)); - fs.writeFileSync(file, this.toString('xml')); - } - return this; - } - }); - - filename && this.load(filename); -} diff --git a/lib/timodule.js b/lib/timodule.js new file mode 100644 index 00000000..b8cb88f8 --- /dev/null +++ b/lib/timodule.js @@ -0,0 +1,818 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import version from './version.js'; +import { unzip } from './zip.js'; +import * as environ from './environ.js'; +import { unlink } from 'node:fs/promises'; + +const platformAliases = { + // add additional aliases here for new platforms + ipad: 'ios', + iphone: 'ios' +}; + +let moduleCache = {}; + +/** + * Scans search paths for Titanium modules. This function will not scan any paths + * other than the ones explicitly told to scan. + * + * @param {Object} searchPaths - An object of scopes to arrays of paths to search for Titanium modules. + * @param {Object} config - The CLI config. + * @param {Object} logger - A logger instance. + * @param {Boolean} [bypassCache=false] - When true, re-scans the specified paths for modules. + * @returns {void} + */ +// This is used by `titanium` npm package (the CLI) to list modules +export async function scopedDetect(searchPaths, _config, logger, bypassCache) { + const results = {}; + + if (!searchPaths || typeof searchPaths !== 'object') { + return results; + } + + const tasks = []; + + for (const scope of Object.keys(searchPaths)) { + const paths = Array.isArray(searchPaths[scope]) ? searchPaths[scope] : [ searchPaths[scope] ]; + for (const searchPath of paths) { + if (!searchPath) { + continue; + } + tasks.push( + detectModules(searchPath, { + bypassCache, + logger + }).then(modules => { + results[scope] = modules; + }) + ); + } + } + + await Promise.all(tasks); + return results; +} + +/** + * Detects all installed Titanium modules, then it will validate that the + * specified modules are found, incompatible, missing, or conflicting. + * + * @param {Array|Object} modulesOrParams - An object with the following params; or An array of modules to search for + * @param {Array|Object} [modulesOrParams.modules] - An array of modules to search for. + * @param {Array|String} [modulesOrParams.platforms] - An array of platform names (if the platform has more than one name) or a string of comma-separated platform names. + * @param {Array|String} [modulesOrParams.deployType] - An array of deploy types or a string of comma-separated deploy types to filter by. + * @param {Object} [modulesOrParams.tiManifest] - The Titanium SDK manifest data. + * @param {Array} [modulesOrParams.searchPaths] - An array of paths to search for Titanium modules. + * @param {Object} [modulesOrParams.logger] - A logger instance. + * @param {Boolean} [modulesOrParams.bypassCache=false] - When true, re-detects all modules. + * @param {Array|String} [platforms] - An array of platform names (if the platform has more than one name) or a string of comma-separated platform names. + * @param {Array|String} [deployType] - An array of deploy types or a string of comma-separated deploy types to filter by. + * @param {Object} [tiManifest] - The Titanium SDK manifest data. + * @param {Array} [searchPaths] - An array of paths to search for Titanium modules. + * @param {Object} [logger] - A logger instance. + * @param {Boolean} [bypassCache=false] - When true, re-detects all modules. + */ +export async function find(modulesOrParams, platforms, deployType, tiManifest, searchPaths, logger, bypassCache) { + const result = { + found: [], + missing: [], + incompatible: [], + conflict: [] + }; + const visited = {}; + const modulesById = {}; + + let sdkVersion; + let moduleAPIVersion; + if (tiManifest && typeof tiManifest === 'object') { + sdkVersion = tiManifest.version; + moduleAPIVersion = tiManifest.moduleAPIVersion; + } else { + sdkVersion = tiManifest; + } + + let params; + if (arguments.length === 1 && typeof modulesOrParams === 'object' && modulesOrParams !== null) { + params = modulesOrParams; + } else { + params = { + bypassCache: bypassCache, + deployType: deployType, + logger: logger, + modules: modulesOrParams, + platforms: platforms, + sdkVersion: sdkVersion, + searchPaths: searchPaths + }; + } + + if (!params.modules || params.modules.length === 0) { + return result; + } + + // clean up platforms + if (typeof params.platforms === 'string') { + params.platforms = params.platforms.split(',').filter(p => p); + } else if (Array.isArray(params.platforms)) { + params.platforms = params.platforms.filter(p => p); + } else { + params.platforms = []; + } + if (!params.platforms.includes('commonjs')) { + params.platforms.push('commonjs'); // add commonjs to the list of valid module platforms + } + // Align the platform aliases for 'iphone'/'ipad'/'ios' to just be 'ios' + // and remove duplicates + params.platforms = Array.from(new Set(params.platforms.map(p => platformAliases[p] || p))); + + const installed = await detect({ + searchPaths: params.searchPaths, + bypassCache: params.bypassCache, + logger: params.logger + }); + + if (params.modules) { + for (const module of params.modules) { + const originalVersion = module.version || 'latest'; + const scopes = [ 'project', 'global' ]; + + // make sure the module has a valid array of platforms + if (!module.platform) { + module.platform = params.platforms; + } + if (!Array.isArray(module.platform)) { + module.platform = module.platform.split(',').map(str => str.trim()); + } + // align 'iphone'/'ipad'/'ios' => 'ios' + module.platform = Array.from(new Set(module.platform.map(p => platformAliases[p] || p))); + + if (!module.deployType) { + module.deployType = params.deployType; + } + if (!Array.isArray(module.deployType)) { + module.deployType = module.deployType.split(',').map(str => str.trim()); + } + + // if this module doesn't support any of the platforms we're building for, skip it + if (!module.deployType.includes(params.deployType) + || !module.platform.some(platform => params.platforms.includes(platform))) { + return; + } + + // strip all platforms that aren't supported by this build + for (let i = 0; i < module.platform.length; i++) { + if (!params.platforms.includes(module.platform[i])) { + module.platform.splice(i--, 1); // we're not asking for this platform, remove it + } + } + + const key = module.id + '|' + module.deployType.join(',') + '|' + module.platform.join(',') + '|' + module.version; + if (visited[key]) { + return; + } + visited[key] = 1; + + params.logger?.debug(`Looking for Titanium module id=${module.id} version=${originalVersion} platform=${module.platform.join(',')} deploy-type=${module.deployType.join(',')}`); + + // loop through each scope (project, global) + let foundIncompatible, found; + for (let i = 0; i < scopes.length; i++) { + const scope = installed[scopes[i]]; + if (!scope) { + continue; + } + + // loop through each platform attribute from + for (let j = 0; j < module.platform.length; j++) { + const platform = module.platform[j]; + + // check that we even have a module with the specified id and platform + if (!scope[platform] || !scope[platform][module.id]) { + continue; + } + + // sort all versions + const sortedVersions = Object.keys(scope[platform][module.id]).sort().reverse().filter(ver => { + return !module.version || ver === module.version; + }); + for (const ver of sortedVersions) { + const info = scope[platform][module.id][ver]; + if (!info) { + return; + } + + const tmp = util.mix({}, module, info); + if (params.sdkVersion && info.manifest && info.manifest.minsdk && version.gt(info.manifest.minsdk, params.sdkVersion)) { + if (params.logger) { + params.logger.debug(__('Found incompatible Titanium module id=%s version=%s platform=%s deploy-type=%s', tmp.id.cyan, tmp.version.cyan, tmp.platform.join(',').cyan, tmp.deployType.join(',').cyan)); + params.logger.debug(__('Module %s requires Titanium SDK %s or newer, but the selected SDK is %s', tmp.id.cyan, info.manifest.minsdk, params.sdkVersion)); + } + result.incompatible.push(tmp); + return; + } + + let platformAPIVersion = moduleAPIVersion && moduleAPIVersion[platform] && Number.parseInt(moduleAPIVersion[platform]); + if (!platformAPIVersion && platform === 'ios') { + platformAPIVersion = moduleAPIVersion && moduleAPIVersion['iphone'] && Number.parseInt(moduleAPIVersion['iphone']); + } + const modAPIVersion = info.manifest && Number.parseInt(info.manifest.apiversion); + if (platformAPIVersion && modAPIVersion && modAPIVersion !== platformAPIVersion) { + if (params.logger) { + params.logger.debug(__('Found incompatible Titanium module id=%s version=%s platform=%s api-version=%s deploy-type=%s', tmp.id.cyan, tmp.version.cyan, tmp.platform.join(',').cyan, String(info.manifest.apiversion).cyan, tmp.deployType.join(',').cyan)); + params.logger.debug(__('Module %s has apiversion=%s, but the selected SDK supports module apiversion=%s on platform=%s', tmp.id.cyan, String(modAPIVersion).cyan, String(platformAPIVersion).cyan, platform.cyan)); + } + result.incompatible.push(tmp); + foundIncompatible = true; + return; + } + + // make sure we haven't already added this module + let alreadyAdded = false; + let foundBetter = false; + let addToModuleMap = true; + for (let k = 0; k < result.found.length; k++) { + if (result.found[k].id === tmp.id) { + // if we find a the same module twice, but the versions differ + if (originalVersion === 'latest') { + if (version.lt(result.found[k].version, ver)) { + // found a better module + params.logger?.info(`Found better matching module id=${tmp.id} version=${originalVersion} platform=${tmp.platform.join(',')} deploy-type=${tmp.deployType.join(',')} path=${tmp.modulePath}`); + result.found.splice(k, 1); + foundBetter = true; + } else if (version.eq(result.found[k].version, ver)) { + alreadyAdded = true; + if (result.found[k].platform.map(p => platformAliases[p] || p).includes(platformAliases[platform] || platform)) { // eslint-disable-line max-statements-per-line + addToModuleMap = false; + } + } else { + alreadyAdded = true; + } + } else if (version.eq(result.found[k].version, ver)) { + alreadyAdded = true; + if (result.found[k].platform.includes(platformAliases[platform] || platform)) { + addToModuleMap = false; + } + } + } + } + + if (!alreadyAdded) { + tmp.platform = [ platform ]; + if (!foundBetter) { + params.logger?.info(`Found Titanium module id=${tmp.id} version=${tmp.version} platform=${tmp.platform.join(',')} deploy-type=${tmp.deployType.join(',')} path=${tmp.modulePath}`); + } + result.found.push(tmp); + } + + if (addToModuleMap) { + // add this module to a hash so we can check later for conflicts + if (!modulesById[module.id]) { + modulesById[module.id] = []; + } + modulesById[module.id].push(tmp); + } + found = true; + } + } + } + + if (!found) { + params.logger?.warn(`Could not find a valid Titanium module id=${module.id} version=${originalVersion} platform=${module.platform.join(',')} deploy-type=${module.deployType.join(',')}`); + // don't add to missing when the module is already in the incompatible list + if (!foundIncompatible) { + result.missing.push(module); + } + } else { + // since we found a valid version, remove this module if was previously detected as incompatible + // this happens when module version is 'latest', we iterated through the list of versions and found a compatible one + // but subsequent versions are added to the incompatible list + for (let x = 0; x < result.incompatible.length; x++) { + if (result.incompatible[x].id === module.id) { + result.incompatible.splice(x--, 1); + } + } + } + } + } + + // detect conflicts + for (const id of Object.keys(modulesById)) { + const mods = modulesById[id], + len = mods.length; + + if (len <= 1) { + return; + } + + let commonJs = 0, + nonCommonJs = 0; + // we have a potential conflict... + // verify that we have at least one commonjs platform and at least one non-commonjs platform + for (let i = 0; i < len; i++) { + platforms = Array.isArray(mods[i].platform) ? mods[i].platform : [ mods[i].platform ]; + platforms.forEach(function (p) { // eslint-disable-line no-loop-func + if (p.toLowerCase() === 'commonjs') { + commonJs++; + } else { + nonCommonJs++; + } + }); + } + if (commonJs && nonCommonJs) { + result.conflict.push({ + id: id, + modules: mods + }); + + // remove from found + for (let i = 0; i < result.found.length; i++) { + if (result.found[i].id === id) { + result.found.splice(i--, 1); + } + } + } + } + + return result; +} + +/** + * Scans search paths for Titanium modules. This function will scan all known + * Titanium SDK locations. + * + * @param {Object|string[]} paramsOrSearchPaths - An object with the following params; or an array of paths to search for Titanium modules. + * @param {Array} [paramsOrSearchPaths.searchPaths] - An array of paths to search for Titanium modules. + * @param {Object} [paramsOrSearchPaths.logger] - A logger instance. + * @param {Boolean} [paramsOrSearchPaths.bypassCache=false] - When true, re-scans the specified paths for modules. + * @param {Object} [logger] - A logger instance. + * @param {Boolean} [bypassCache=false] - When true, re-scans the specified paths for modules. + */ +export async function detect(paramsOrSearchPaths, logger, bypassCache) { + let params; + if (arguments.length === 1 && typeof paramsOrSearchPaths === 'object' && paramsOrSearchPaths !== null) { + params = paramsOrSearchPaths; + } else { + params = { + bypassCache, + logger, + searchPaths: paramsOrSearchPaths + }; + } + + // resolve all sdk paths + const sdkPaths = new Set(environ.os.sdkPaths.map(p => expand(p))); + // Note that we explicitly do not support globally installed npm package native modules + const globalsPromise = Promise.all(sdkPaths.map(sdkPath => detectModules(path.join(sdkPath, 'modules'), params))); + + const additionalSearchPaths = (Array.isArray(params.searchPaths) ? params.searchPaths : [ params.searchPaths ]) + .filter(p => p) // remove nulls + .map(p => expand(p)) // resolve the paths + .filter(p => !sdkPaths.has(p)); // remove duplicates from sdkPaths + // TODO: Put additionalSearchPaths into a Set to remove duplicates in itself! + const projectPath = additionalSearchPaths[0]; // first path should be the project dir! + + const projectTasks = []; + projectTasks.push(detectNodeModules([ path.join(projectPath, 'node_modules') ], params.logger).then(modules => convertArrayOfModulesToHierarchy(modules))); + for (const searchPath of new Set(additionalSearchPaths)) { + projectTasks.push(detectModules(path.join(searchPath, 'modules'), params)); + } + const projectPromise = Promise.all(projectTasks); + + // non-destructively, but deeply mix two objects + const mix = (src, dest) => { + if (!src || !dest) { + return; + } + + for (const key of Object.keys(src)) { + if (!dest[key] || typeof dest[key] !== 'object') { + dest[key] = {}; + } + + if (src[key] !== null && typeof src[key] === 'object' && !Array.isArray(src[key])) { + Object.assign(src[key], dest[key]); + } else { + dest[key] = src[key]; + } + } + }; + + const [ globalModules, projectModules ] = await Promise.all([ globalsPromise, projectPromise ]); + const combined = { + global: {}, + project: {} + }; + + for (const src of globalModules) { + mix(src, combined.global); + } + + for (const src of projectModules) { + mix(src, combined.project); + } + + return combined; +} + +/** + * Searches a directory for Titanium modules. If it encounters a zip file + * that matches module zip filename pattern, it will automatically unzip it and + * remove the zip file prior to detecting modules. + * + * @param {String} modulesDir - A path/dir to search for Titanium modules. + * @param {Object} [options] - An object with the following params. + * @param {Boolean} [options.bypassCache=false] - When true, re-scans the specified path for modules. + * @param {Object} [options.config] - The CLI config. + * @param {Object} [options.logger] - A logger instance. + * @returns {Promise} + * @private + */ +export async function detectModules(modulesDir, options = {}) { + // make sure they specified a modulesDir + if (!modulesDir) { + throw new Error('Missing required argument "modulesDir"'); + } + + if (moduleCache[modulesDir] && !options.bypassCache) { + return moduleCache[modulesDir]; + } + + const moduleRoot = expand(modulesDir, '..'); + + // make sure the module's parent dir (the root) exists + if (!fs.existsSync(moduleRoot)) { + return {}; + } + + const logger = options.logger; // may be undefined! + // auto-unzip zipped modules if we find them + const fileNames = fs.readdirSync(moduleRoot); + await Promise.all(fileNames.map(name => unzipIfNecessary(moduleRoot, name, logger))); + + if (!fs.existsSync(modulesDir)) { + return {}; + } + + logger?.debug(`Detecting modules in ${modulesDir}`); + + const ignoreDirs = new RegExp(options.config && options.config.get('cli.ignoreDirs') || '^(.svn|.git|.hg|.?[Cc][Vv][Ss]|.bzr)$'); // eslint-disable-line security/detect-non-literal-regexp + const osNamesRegExp = /^osx|win32|linux$/; + + const subdirs = fs.readdirSync(modulesDir); + // modules here is an array of object[], so we need to flatten it! + const modules = flattenDeep(await Promise.all(subdirs.map(platform => detectPlatformModules(modulesDir, platform, osNamesRegExp, ignoreDirs, logger)))); + const result = convertArrayOfModulesToHierarchy(modules); // now nest into old hierarchy we returned + + return moduleCache[modulesDir] = result; +} + +/** + * Automatically extracts a module zipfile if detect in module root dir. + * @param {string} moduleRoot root directory where we store modules (parent of "modules" dir) + * @param {string} name basename of zip file + * @param {object} [logger] optional logger object + * @return {Promise} + * @private + */ +async function unzipIfNecessary(moduleRoot, name, logger) { + const zipRegExp = /^.+-.+?-.+?\.zip$/; + const file = path.join(moduleRoot, name); + if (!zipRegExp.test(name)) { + return; + } + try { + const stat = await fs.statSync(file); + if (!stat.isFile()) { + return; + } + } catch { + // ignore, no such file somehow + return; + } + + logger?.info(`Installing module: ${name}`); + try { + await unzip(file, moduleRoot); + await unlink(file); + } catch { + logger?.error(`Failed to unzip module "${file}"`); + } +} + +/** + * @param {string} modulesDir i.e. '~/Library/APplication Support/Titanium/modules' + * @param {string} platform i.e. 'android' or 'iphone' + * @param {RegExp} osNamesRegExp regexp used to skip certain folder names like 'win32' or 'osx' + * @param {RegExp} ignoreDirs additional regexp used to filter directories + * @param {object} [logger] optional logger object + * @returns {Promise} + * @private + */ +async function detectPlatformModules(modulesDir, platform, osNamesRegExp, ignoreDirs, logger) { + const platformDir = path.join(modulesDir, platform); + if (osNamesRegExp.test(platform) || ignoreDirs.test(platform)) { + return []; + } + try { + const stat = await fs.stat(platformDir); + if (!stat.isDirectory()) { + return []; + } + } catch { + // ignore if can't stat dir + return []; + } + // ok, it's a valid platform dir! + + const moduleNameDirs = await fs.readdir(platformDir); + // here we gather modules per-platform, which gives us object[] for each, so use of Promise.all gives us + // an array of object[], so we need to flatten it once gathered + const modules = await Promise.all(moduleNameDirs.map(moduleName => detectModulesByPlatformAndName(platformDir, moduleName, ignoreDirs, logger))); + return flattenDeep(modules); +} + +/** + * @param {string} platformModulesDir i.e. '~/Library/Application Support/Titanium/modules/android' + * @param {string} moduleName i.e. 'hyperloop' + * @param {RegExp} ignoreDirs regexp used to filter directories traversed + * @param {object} [logger] optional logger object + * @returns {Promise} + * @private + */ +async function detectModulesByPlatformAndName(platformModulesDir, moduleName, ignoreDirs, logger) { + if (ignoreDirs.test(moduleName)) { + return []; + } + // loop through module names + const modulePath = path.join(platformModulesDir, moduleName); + try { + const stat = await fs.stat(modulePath); + if (!stat.isDirectory()) { + return []; + } + } catch { + return []; + } + + const versionDirs = await fs.readdir(modulePath); + const modules = await Promise.all(versionDirs.map(ver => detectModule(modulePath, ver, ignoreDirs, logger))); + return modules.filter(m => m); // returns object[], removing nulls +} + +/** + * @param {string} modulePath parent directory (path to module dir holding name of module) + * @param {string} ver basename of current dir holding the module (name is version number of module) + * @param {RegExp} ignoreDirs regexp used to filter directories traversed + * @param {object} [logger] optional logger object + * @returns {Promise} + * @private + */ +async function detectModule(modulePath, ver, ignoreDirs, logger) { + if (ignoreDirs.test(ver)) { + return null; + } + + const versionPath = path.join(modulePath, ver); + const manifestFile = path.join(versionPath, 'manifest'); + if (!fs.existsSync(manifestFile)) { + return null; + } + + const mod = { + version: ver, + modulePath: versionPath, + manifest: {} + }; + + mod.manifest = readManifest(manifestFile); + + if (mod.manifest.platform) { + mod.manifest.platform = platformAliases[mod.manifest.platform] || mod.manifest.platform; + mod.platform = [ mod.manifest.platform ]; + } + // TODO: sanity check that ver === mod.manifest.version? + + logger?.debug(`Detected %s module: ${mod.platform[0]} ${mod.manifest.moduleid} @ ${mod.modulePath}`); + return mod; +} + +/** + * @param {string[]} searchPaths the list of directories to consider. This is assumed to be the full absolute path to node_modules folder(s) + * @param {object} [logger] logger to use + * @return {object[]} + */ +export async function detectNodeModules(searchPaths, logger) { + const results = await Promise.all(searchPaths.map(dir => detectNativeModulesViaNodeModulesDir(dir, logger))); + const flattened = flattenDeep(results); // flatten nested arrays down + return flattened.filter(item => item !== null); // remove nulls +} + +/** + * + * @param {string} nodeModuleDir path to a single node_modules directory to search + * @param {object} [logger] logger to use + * @returns {object[]} the representations of the modules found + * @private + */ +async function detectNativeModulesViaNodeModulesDir(nodeModuleDir, logger) { + logger?.debug(`Detecting modules in ${nodeModuleDir}`); + // List top-level directories under node_modules (or scoped packages dir) + try { + const subDirs = fs.readdirSync(nodeModuleDir); + // for each dir, try and collect module data (or null) + const promises = subDirs.map(dir => { + if (dir.startsWith('@')) { // scoped package, recurse! + return detectNativeModulesViaNodeModulesDir(path.join(nodeModuleDir, dir), logger); + } else { + return detectNativeModuleViaNPMPackage(path.join(nodeModuleDir, dir), logger); + } + }); + return await Promise.all(promises); + } catch { + return []; // folder may not exist! + } +} + +/** + * @param {string} singlePackageDir the npm package directory to look at (child of 'node_modules' or scoped package dir) + * @param {object} [logger] logger to use + * @returns {object[]} empty if no native module found; otherwise an array of objects with metadata about the module, one per-platform. + * @private + */ +async function detectNativeModuleViaNPMPackage(singlePackageDir, logger) { + // is this given package a native module? + let json; + try { + json = fs.readFileSync(path.join(singlePackageDir, 'package.json'), 'utf8'); + } catch { + // ignore if we failed to find/read a package.json file! + return []; + } + + if (json && json.titanium && json.titanium.type === 'native-module') { + // Hey! it's a native module for us! + + // Normalize value to an array of platform names (strings) + const platformValueType = typeof json.titanium.platform; + const platformNames = []; + switch (platformValueType) { + case 'object': + if (Array.isArray(json.titanium.platform)) { + platformNames.push(...json.titanium.platform); + } else { + platformNames.push(...Object.keys(json.titanium.platform)); + } + break; + case 'string': + platformNames.push(json.titanium.platform); + break; + default: + break; + } + // we need to construct a "module" instance for each platform + const platformCount = platformNames.length; + return await Promise.all(platformNames.map(p => detectPlatformSpecificNativeModuleInNPMPackage(singlePackageDir, p, platformCount, json, logger))); + } + return []; +} + +/** + * @param {string} directory the directory holding the npm package + * @param {string} platformName the platform name from the package.json + * @param {integer} platformCount number of platforms listed in JSON + * @param {object} json the package.json as an object + * @param {object} [logger] the logger to use + * @returns {object} the detected module + */ +async function detectPlatformSpecificNativeModuleInNPMPackage(directory, platformName, platformCount, json, logger) { + const platform = platformAliases[platformName] || platformName; // normalize platform name for return data + let modulePath = path.join(directory, platform); // try the normalized platform alias ('ios') first + if (!fs.existsSync(modulePath)) { + // doesn't exist, so fall back to original platform name if it differed + if (platform !== platformName) { + modulePath = path.join(directory, platformName); + if (!fs.existsSync(modulePath)) { + modulePath = directory; + } + } else { + // This is only valid if there's only one platform! + modulePath = directory; + } + } + // implicit top-level dir usage is only valid for single-platform modules! + if (platformCount !== 1 && modulePath === directory) { + throw new Error(`Multiple platform native modules require use of platform-specific subdirectories to separate contents. Module at ${directory} has no ${platform} sub-directory.`); + } + // merge contents of package.json on top of manifest values + let manifest = {}; + const manifestFile = path.join(modulePath, 'manifest'); + if (fs.existsSync(manifestFile)) { + manifest = readManifest(manifestFile); + } + manifest.name = getManifestProperty(logger, json, manifest, platformName, 'name', removeScope(json.name)); + manifest.minsdk = getManifestProperty(logger, json, manifest, platformName, 'minsdk'); + manifest.apiversion = getManifestProperty(logger, json, manifest, platformName, 'apiversion'); + manifest.guid = getManifestProperty(logger, json, manifest, platformName, 'guid'); + manifest.moduleid = getManifestProperty(logger, json, manifest, platformName, 'moduleid', removeScope(json.name)); + manifest.architectures = getManifestProperty(logger, json, manifest, platformName, 'architectures'); + manifest.version = getManifestProperty(logger, json, manifest, platformName, 'version', json.version); + // TODO: Throw a sanity Error if value we *must* have are missing from manifest object! + // TODO: Throw Errors if both manifest and package.json have values but they don't match? + + logger?.debug(`Detected ${platform} module: ${manifest.moduleid} ${json.version} @ ${modulePath}`); + return { + id: manifest.moduleid, + modulePath, + platform: [ platform ], + version: manifest.version, + manifest + }; +} + +/** + * We should consult properties in this order: + * - platform specific section of package.json + * - platform specific manifest file + * - cross-platform section of package.json + * - any possible fallback value locations (say package.json generic properties like name/version/etc) + * @param {object} logger logger + * @param {object} json package.json object + * @param {object} manifest manifest file value + * @param {string} platformName name of platform + * @param {string} propName name of property + * @param {*} fallback default value to use if we have none + * @returns {*} value to be used + */ +function getManifestProperty(logger, json, manifest, platformName, propName, fallback) { + const platformMetadata = (json.titanium.platform && json.titanium.platform[platformName]) || {}; + const manifestValue = manifest[propName]; + const platformSpecificPackageJsonValue = platformMetadata[propName]; + if (manifestValue && platformSpecificPackageJsonValue && (manifestValue !== platformSpecificPackageJsonValue)) { + logger?.warn(`package.json's titanium.platform.${platformName}.${propName} value and ${platformName} manifest file's values differ: + ${platformSpecificPackageJsonValue} and ${manifestValue}, respectively. Preferring ${platformSpecificPackageJsonValue}`); + } + const crossPlatformPackageJsonValue = json.titanium[propName]; + return platformSpecificPackageJsonValue || manifestValue || crossPlatformPackageJsonValue || fallback; +} + +function removeScope(packageName) { + if (packageName.startsWith('@')) { + return packageName.slice(packageName.indexOf('/') + 1); + } + return packageName; +} + +/** + * Handles converting apiversion to an int, architectures to a string[] + * @param {string} manifestFile path to manifest file + * @returns {object} + */ +function readManifest(manifestFile) { + const manifest = {}; + const manifestContents = fs.readFileSync(manifestFile, 'utf8'); + for (const line of manifestContents.split('\n')) { + const p = line.indexOf(':'); + if (!line.startsWith('#') && p !== -1) { + const key = line.substring(0, p); + let value = line.substring(p + 1).trim(); + if (key === 'apiversion') { + value = Number.parseInt(value); + } else if (key === 'architectures') { + value = value.split(' '); + } + manifest[key] = value; + } + } + return manifest; +} + +/** + * @param {object[]} modules array of all the distinct modules found + * @returns {object} the modules re-aligned into a tree structure: platform -> name -> version -> module object + */ +function convertArrayOfModulesToHierarchy(modules) { + const result = {}; + if (Array.isArray(modules)) { + for (const m of modules) { + const platform = m.platform[0]; + const name = m.manifest.moduleid; + const version = m.version; + result[platform] = (result[platform] || {}); + result[platform][name] = (result[platform][name] || {}); + result[platform][name][version] = m; + } + } + return result; +} + +/** + * @param {array} arr1 array + * @returns {array} + * @private + */ +function flattenDeep(arr1) { + return arr1.reduce((acc, val) => { + return Array.isArray(val) ? acc.concat(flattenDeep(val)) : acc.concat(val); + }, []); +} diff --git a/lib/tiplugin.js b/lib/tiplugin.js new file mode 100644 index 00000000..a1999465 --- /dev/null +++ b/lib/tiplugin.js @@ -0,0 +1,287 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import vm from 'node:vm'; +import * as environ from './environ.js'; + +let pluginCache; + +/** + * Scans search paths for Titanium CLI plugins. This function will not scan any + * paths other than the ones explicitly told to scan. + * @param {Array} searchPaths - An array of paths to search for Titanium CLI plugins + * @param {Object} config - The CLI config + * @param {Object} logger - A logger instance + */ +export async function scopedDetect(searchPaths, config, logger) { + if (!searchPaths || typeof searchPaths !== 'object') { + return {}; + } + + const results = await Promise.all( + Object.entries(searchPaths).map(([scope, paths]) => { + return detectPlugins(paths, config, logger).then(results => ({ [scope]: results })); + }) + ); + return Object.assign({}, ...results); +} + +/** + * Scans a project directory as well as global and user-configured search paths + * for Titanium CLI plugins. + * @param {String} projectDir - Path to the project directory + * @param {Object} config - The CLI config + * @param {Object} logger - A logger instance + * @param {boolean} bypassCache - whether to bypass the cache + * @returns {void} + */ +export async function detect(projectDir, config, logger, bypassCache) { + if (pluginCache && !bypassCache) { + return pluginCache; + } + + const results = await Promise.all([ + detectPlugins(path.join(projectDir, 'plugins'), config, logger).then(results => ({ project: results })), + + config.paths && Array.isArray(config.paths.plugins) + ? detectPlugins(config.paths.plugins, config, logger).then(results => ({ user: results })) : null, + + detectPlugins(environ.os.sdkPaths.map(p => path.join(p, 'plugins')), config, logger).then(results => ({ global: results })) + ]); + + pluginCache = Object.assign({}, ...results); + return pluginCache; +} + +/** + * Detects all installed Titanium CLI plugins, then it will validate that the + * specified plugins are found or missing. + * @param {Array} plugins - An array of plugins to search for + * @param {Object|String} searchPaths - An object containing search paths or the + * path to the project directory + * @param {Object} config - The CLI config + * @param {Object} logger - A logger instance + * @returns {Object} + */ +export async function find(plugins, searchPaths, config, logger) { + // if there are plugins to find, then just exit now + if (!plugins || !plugins.length) { + return { + found: [], + missing: [] + }; + } + + const installed = typeof searchPaths === 'string' + // searchPaths is the project directory + ? await detect(searchPaths, config, logger) + // searchPaths is an object of paths + : await scopedDetect(searchPaths, config, logger); + + const result = { + found: [], + missing: [] + }; + const visited = {}; + + for (const plugin of plugins) { + const originalVersion = plugin.version || 'latest'; + const scopes = [ 'project', 'config', 'user', 'global' ]; // the order here represents precendence ('user' is legacy, now we use 'config') + + if (!plugin.version) { + for (const scope of scopes) { + // search both project and global plugins for the latest version + const x = installed[scope]; + if (!plugin.version && x?.[plugin.id]) { + plugin.version = Object.keys(x[plugin.id]).sort().pop(); + } + } + } + + const key = plugin.id + '|' + plugin.version; + if (visited[key]) { + continue; + } + visited[key] = 1; + + logger?.debug(`Looking for Titanium plugin id=${plugin.id} version=${originalVersion}`); + + let found; + for (let i = 0; !found && i < scopes.length; i++) { + const scope = installed[scopes[i]]; + if (scope && scope[plugin.id]) { + const info = scope[plugin.id][plugin.version] || scope[plugin.id]['unknown'] || scope[plugin.id]['-']; + if (info) { + Object.assign(plugin, info); + logger?.info(`Found Titanium plugin id=${plugin.id} version=${originalVersion}`); + result.found.push(plugin); + found = true; + } + } + } + + if (!found) { + logger?.warn(`Could not find Titanium plugin id=${plugin.id} version=${originalVersion}`); + result.missing.push(plugin); + } + } + + return result; +} + +/** + * Searches an array of paths for Titanium CLI plugins. + * @param {Array} searchPaths - An array of paths to search for Titanium CLI plugins + * @param {Object} config - The CLI config + * @param {Object} logger - A logger instance + * @private + */ +async function detectPlugins(searchPaths, config, logger) { + const results = {}; + const ignoreDirs = new RegExp(config?.get('cli.ignoreDirs') || '^(.svn|.git|.hg|.?[Cc][Vv][Ss]|.bzr)$'); + + if (!Array.isArray(searchPaths)) { + searchPaths = [ searchPaths ]; + } + + for (let pluginRoot of searchPaths) { + pluginRoot = expand(pluginRoot); + if (!fs.existsSync(pluginRoot)) { + continue; + } + + logger?.debug(`Detecting plugins in ${pluginRoot}`); + + const packageFile = path.join(pluginRoot, 'package.json'); + const packageFileExists = fs.existsSync(packageFile); + const pluginFile = path.join(pluginRoot, 'plugin.py'); + const pluginFileExists = fs.existsSync(pluginFile); + const pluginName = path.basename(pluginRoot); + + // check if this search path is plugin folder + if (packageFileExists || pluginFileExists) { + // we have a plugin without a version folder + let plugin = results[pluginName]; + if (!plugin) { + plugin = results[pluginName] = {}; + } + plugin['-'] = { + pluginPath: pluginRoot + }; + + if (packageFileExists) { + try { + plugin['-'].manifest = JSON.parse(fs.readFileSync(packageFile)); + } catch {} + } + + if (pluginFileExists) { + plugin['-'].legacyPluginFile = pluginFile; + } + + logger?.debug(`Detected plugin: ${pluginName} @ ${pluginRoot}`); + continue; + } + + // loop through plugin names + for (const name of fs.readdirSync(pluginRoot)) { + const pluginsPath = path.join(pluginRoot, name); + if (!fs.existsSync(pluginsPath) || !fs.statSync(pluginsPath).isDirectory() || ignoreDirs.test(name)) { + continue; + } + + // we have a plugin directory + + const processDir = async (ver, versionPath, dest) => { + const packageFile = path.join(versionPath, 'package.json'); + const packageFileExists = fs.existsSync(packageFile); + const pluginFile = path.join(versionPath, 'plugin.py'); + const pluginFileExists = fs.existsSync(pluginFile); + const jsfile = /\.js$/; + const ignore = /^[._]/; + + dest.pluginPath = versionPath; + dest.commands = []; + dest.hooks = []; + dest.legacyPluginFile = pluginFileExists ? pluginFile : null; + dest.manifest = {}; + + if (packageFileExists) { + try { + dest.manifest = JSON.parse(fs.readFileSync(packageFile)); + } catch {} + } + + const commandsDir = path.join(versionPath, 'commands'); + if (fs.existsSync(commandsDir) && fs.statSync(commandsDir).isDirectory()) { + for (const filename of fs.readdirSync(commandsDir)) { + const file = path.join(commandsDir, filename); + if (fs.statSync(file).isFile() && jsfile.test(filename) && !ignore.test(filename)) { + dest.commands.push({ + name: filename.replace(jsfile, '') + }); + } + } + } + + const hooksDir = path.join(versionPath, 'hooks'); + if (fs.existsSync(hooksDir) && fs.statSync(hooksDir).isDirectory()) { + for (const filename of fs.readdirSync(hooksDir)) { + const file = path.join(hooksDir, filename); + if (fs.statSync(file).isFile() && jsfile.test(filename) && !ignore.test(filename)) { + const info = { + name: filename.replace(jsfile, ''), + path: file + }; + + try { + vm.runInThisContext(`(function (exports, require, module, __filename, __dirname) { ${fs.readFileSync(file, 'utf8')}\n});`, file, 0, false); + const {default: mod} = await import(file); + if (mod.name) { + info.name = mod.name; + } + if (mod.cliVersion) { + info.cliVersion = mod.cliVersion; + } + if (mod.version) { + info.version = mod.version; + } + } catch {} + + dest.hooks.push(info); + } + } + } + + if (ver) { + logger?.debug(`Detected plugin: ${name} ${ver} @ ${versionPath}`); + } else { + logger?.debug(`Detected plugin: ${name} @ ${versionPath}`); + } + }; + + const packageFileExists = fs.existsSync(path.join(pluginsPath, 'package.json')); + const pluginName = path.basename(pluginsPath); + + if (packageFileExists || fs.existsSync(path.join(pluginsPath, 'plugin.py'))) { + // we have a plugin without a version folder or a project level plugin + if (!results[pluginName]) { + results[pluginName] = {}; + } + await processDir(null, pluginsPath, results[pluginName].unknown = {}); + } else { + // loop through versions + for (const ver of fs.readdirSync(pluginsPath)) { + const dir = path.join(pluginsPath, ver); + if (!ignoreDirs.test(ver) && fs.existsSync(dir) && fs.statSync(dir).isDirectory()) { + if (!results[pluginName]) { + results[pluginName] = {}; + } + await processDir(ver, dir, results[pluginName][ver] = {}); + } + } + } + } + } + + return results; +} diff --git a/lib/titanium.js b/lib/titanium.js index 95179a58..4cf0f7db 100644 --- a/lib/titanium.js +++ b/lib/titanium.js @@ -1,141 +1,135 @@ -/** - * Titanium SDK Library for Node.js - * Copyright (c) 2012-2013 by Appcelerator, Inc. All Rights Reserved. - * Please see the LICENSE file for information about licensing. - */ -'use strict'; - -const fs = require('fs'); -const path = require('path'); -const async = require('async'); -const spawn = require('child_process').spawn; // eslint-disable-line security/detect-child-process -const uuid = require('node-uuid'); -const appc = require('node-appc'); -const __ = appc.i18n(__dirname).__; -const afs = appc.fs; -const version = appc.version; -const manifest = appc.pkginfo.manifest(module); +import fs from 'node:fs'; +import path from 'node:path'; +import { spawn } from 'node:child_process'; +import { tiappxml } from './tiappxml'; +import { find as findTiPlugins } from './tiplugin.js'; +import * as version from './version.js'; +import { fileURLToPath } from 'node:url'; +import { loadManifestJson } from './util/load-manifest-json.js'; + +export const manifest = loadManifestJson(path.dirname(fileURLToPath(import.meta.url))); const platformAliases = { // add additional aliases here for new platforms ipad: 'iphone', ios: 'iphone' }; -exports.i18n = require('./i18n'); -exports.tiappxml = require('./tiappxml'); +import * as i18n from './i18n.js'; +import { suggest } from './util/suggest.js'; +export { i18n }; +export { tiappxml }; -exports.manifest = manifest; -exports.platforms = [].concat(manifest.platforms); -exports.targetPlatforms = (manifest.platforms || []).map(p => { +export const platforms = [...manifest.platforms]; +export const targetPlatforms = (manifest.platforms || []).map(p => { return p === 'iphone' ? 'ios' : p; }).sort(); -exports.availablePlatforms = (manifest.platforms || []).sort(); -exports.availablePlatformsNames = (function (platforms) { - Object.keys(platformAliases).forEach(function (alias) { - if (platforms.indexOf(platformAliases[alias]) !== -1) { +export const availablePlatforms = (manifest.platforms || []).sort(); + +export const availablePlatformsNames = (platforms => { + for (const alias of Object.keys(platformAliases)) { + if (platforms.includes(platformAliases[alias])) { platforms.push(alias); } - }); + } return platforms.sort(); -}(manifest.platforms || [])); -exports.allPlatformNames = [ 'android', 'ios', 'iphone', 'ipad' ]; +})(manifest.platforms || []); -exports.commonOptions = function (logger, config) { +export const allPlatformNames = [ 'android', 'ios', 'iphone', 'ipad' ]; + +export function commonOptions(logger, config) { return { 'log-level': { abbr: 'l', - callback: function (value) { - Object.prototype.hasOwnProperty.call(logger.levels, value) && logger.setLevel(value); + callback(value) { + if (Object.hasOwn(logger.levels, value)) { + logger.setLevel(value); + } }, - desc: __('minimum logging level'), + desc: 'minimum logging level', default: config.cli.logLevel || 'trace', - hint: __('level'), + hint: 'level', values: logger.getLevels() } }; -}; +} -exports.platformOptions = function (logger, config, cli, commandName, finished) { - var result = {}, - targetPlatform = !cli.argv.help && (cli.argv.platform || cli.argv.p); +export async function platformOptions(logger, config, cli, commandName) { + const result = {}; + let targetPlatform = !cli.argv.help && (cli.argv.platform || cli.argv.p); if (!commandName) { - finished(result); - return; + return result; } function set(obj, title, platform) { // add the platform and title to the options and flags - [ 'options', 'flags' ].forEach(function (type) { + for (const type of [ 'options', 'flags' ]) { if (obj && obj[type]) { - result[platform] || (result[platform] = { - platform: platform, - title: title || platform - }); + if (!result[platform]) { + result[platform] = { + platform: platform, + title: title || platform + }; + } result[platform][type] = obj[type]; } - }); + } } // translate the platform name targetPlatform = platformAliases[targetPlatform] || targetPlatform; // for each platform, fetch their specific flags/options - async.parallel(manifest.platforms.map(function (platform) { - return function (callback) { - - // only configure target platform - if (targetPlatform && platform !== targetPlatform) { - return callback(); - } + return await Promise.all(manifest.platforms.map(async (platform) => { + // only configure target platform + if (targetPlatform && platform !== targetPlatform) { + return; + } - var platformDir = path.join(path.dirname(module.filename), '..', '..', '..', platform), - platformCommand = path.join(platformDir, 'cli', 'commands', '_' + commandName + '.js'), - command, - conf, - title; + const platformDir = path.join(path.dirname(fileURLToPath(import.meta.url)), '..', '..', '..', platform); + const platformCommand = path.join(platformDir, 'cli', 'commands', `_${commandName}.js`); + let command, conf, title; - if (!fs.existsSync(platformCommand)) { - return callback(); - } + if (!fs.existsSync(platformCommand)) { + return; + } - command = require(platformCommand); - if (!command || !command.config) { - return callback(); - } + command = (await import(platformCommand)).default; + if (!command || !command.config) { + return; + } - // try to get the platform specific configuration - conf = command.config(logger, config, cli); + // try to get the platform specific configuration + conf = command.config(logger, config, cli); - try { - // try to read a title from the platform's package.json - title = JSON.parse(fs.readFileSync(path.join(platformDir, 'package.json'))).title; - } catch (e) {} + try { + // try to read a title from the platform's package.json + title = JSON.parse(fs.readFileSync(path.join(platformDir, 'package.json'))).title; + } catch {} + await new Promise((resolve) => { if (typeof conf === 'function') { // async callback - conf(function (obj) { + conf((obj) => { set(obj, title, platform); - callback(); + resolve(); }); return; } set(conf, title, platform); - callback(); - }; - }), function () { - finished(result); - }); -}; + resolve(); + }); + })); +} -exports.validateProjectDir = function (logger, cli, argv, name) { +export function validateProjectDir(logger, cli, argv, name) { const dir = argv[name] || (process.env.SOURCE_ROOT ? path.join(process.env.SOURCE_ROOT, '..', '..') : '.'); - let projectDir = argv[name] = appc.fs.resolvePath(dir); + let projectDir = argv[name] = expand(dir); if (!fs.existsSync(projectDir)) { logger.banner(); - logger.error(__('Project directory does not exist') + '\n'); + logger.error('Project directory does not exist\n'); process.exit(1); } @@ -147,128 +141,132 @@ exports.validateProjectDir = function (logger, cli, argv, name) { if (tiapp.split(path.sep).length === 2) { logger.banner(); - logger.error(__('Invalid project directory "%s"', dir) + '\n'); - dir === '.' && logger.log(__('Use the %s property to specify the project\'s directory', '--project-dir'.cyan) + '\n'); + logger.error(`Invalid project directory "${dir}"\n`); + if (dir === '.') { + logger.log('Use the --project-dir property to specify the project\'s directory\n'); + } process.exit(1); } // load the tiapp.xml cli.tiapp = new exports.tiappxml(path.join(projectDir, 'tiapp.xml')); -}; +} -exports.validateTiappXml = function (logger, config, tiapp) { +export function validateTiappXml(logger, config, tiapp) { if (!tiapp.id) { - logger.error(__('tiapp.xml is missing the element')); - logger.error(__('The app id must consist of letters, numbers, and underscores.')); - logger.error(__('Note: Android does not allow dashes and iOS does not allow underscores.')); - logger.error(__('The first character must be a letter or underscore.')); - logger.error(__('Usually the app id is your company\'s reversed Internet domain name. (i.e. com.example.myapp)') + '\n'); + logger.error('tiapp.xml is missing the element'); + logger.error('The app id must consist of letters, numbers, and underscores.'); + logger.error('Note: Android does not allow dashes and iOS does not allow underscores.'); + logger.error('The first character must be a letter or underscore.'); + logger.error('Usually the app id is your company\'s reversed Internet domain name. (i.e. com.example.myapp)\n'); process.exit(1); } if (!tiapp.name) { - logger.error(__('tiapp.xml is missing the element')); - logger.error(__('The project name must consist of letters, numbers, dashes, and underscores.')); - logger.error(__('The first character must be a letter.') + '\n'); + logger.error('tiapp.xml is missing the element'); + logger.error('The project name must consist of letters, numbers, dashes, and underscores.'); + logger.error('The first character must be a letter.\n'); process.exit(1); } if (!tiapp.guid) { - logger.error(__('tiapp.xml is missing the element')); - logger.error(__('The guid must be in the format XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX and consist of letters and numbers.') + '\n'); - logger.log(__('If you need a new guid, below are 5 freshly generated new ones that you can choose from:')); + logger.error('tiapp.xml is missing the element'); + logger.error('The guid must be in the format XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX and consist of letters and numbers.\n'); + logger.log('If you need a new guid, below are 5 freshly generated new ones that you can choose from:'); for (let i = 0; i < 5; i++) { - logger.log(' ' + uuid.v4().cyan); + logger.log(' ' + uuid.v4()); } logger.log(); process.exit(1); } if (!/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/.test(tiapp.guid)) { - logger.error(__('tiapp.xml contains an invalid guid "%s"', tiapp.guid)); - logger.error(__('The guid must be in the format XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX and consist of letters and numbers.') + '\n'); - logger.log(__('If you need a new guid, below are 5 freshly generated new ones that you can choose from:')); + logger.error(`tiapp.xml contains an invalid guid "${tiapp.guid}"`); + logger.error('The guid must be in the format XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX and consist of letters and numbers.\n'); + logger.log('If you need a new guid, below are 5 freshly generated new ones that you can choose from:'); for (let i = 0; i < 5; i++) { - logger.log(' ' + uuid.v4().cyan); + logger.log(' ' + uuid.v4()); } logger.log(); process.exit(1); } - tiapp.version || (tiapp.version = '1.0'); + if (!tiapp.version) { + tiapp.version = '1.0'; + } if (!config.get('app.skipVersionValidation') && !tiapp.properties['ti.skipVersionValidation']) { if (!/^\d+(\.\d+(\.\d+(\..+)?)?)?$/.test(tiapp.version)) { - logger.error(__('tiapp.xml contains an invalid version "%s"', tiapp.version)); - logger.error(__('The version must consist of three positive integers in the format "X.Y.Z".') + '\n'); + logger.error(`tiapp.xml contains an invalid version "${tiapp.version}"`); + logger.error('The version must consist of three positive integers in the format "X.Y.Z".\n'); process.exit(1); } if (('' + tiapp.version).charAt(0) == '0') { // eslint-disable-line eqeqeq - logger.warn(__('tiapp.xml contains an invalid version "%s"', tiapp.version)); - logger.warn(__('The app version major number must be greater than zero.')); + logger.warn(`tiapp.xml contains an invalid version "${tiapp.version}"`); + logger.warn('The app version major number must be greater than zero.'); } } -}; +} -exports.validAppId = function (id) { +export function validAppId(id) { const words = { - abstract: 1, - assert: 1, - boolean: 1, - break: 1, - byte: 1, - case: 1, - catch: 1, - char: 1, - class: 1, - const: 1, - continue: 1, - default: 1, - do: 1, - double: 1, - else: 1, - enum: 1, - extends: 1, - false: 1, - final: 1, - finally: 1, - float: 1, - for: 1, - goto: 1, - if: 1, - implements: 1, - import: 1, - instanceof: 1, - int: 1, - interface: 1, - long: 1, - native: 1, - new: 1, - null: 1, - package: 1, - private: 1, - protected: 1, - public: 1, - return: 1, - short: 1, - static: 1, - strictfp: 1, - super: 1, - switch: 1, - synchronized: 1, - this: 1, - throw: 1, - throws: 1, - transient: 1, - true: 1, - try: 1, - void: 1, - volatile: 1, - while: 1 - }, - parts = id.split('.'), - l = parts.length; + abstract: 1, + assert: 1, + boolean: 1, + break: 1, + byte: 1, + case: 1, + catch: 1, + char: 1, + class: 1, + const: 1, + continue: 1, + default: 1, + do: 1, + double: 1, + else: 1, + enum: 1, + extends: 1, + false: 1, + final: 1, + finally: 1, + float: 1, + for: 1, + goto: 1, + if: 1, + implements: 1, + import: 1, + instanceof: 1, + int: 1, + interface: 1, + long: 1, + native: 1, + new: 1, + null: 1, + package: 1, + private: 1, + protected: 1, + public: 1, + return: 1, + short: 1, + static: 1, + strictfp: 1, + super: 1, + switch: 1, + synchronized: 1, + this: 1, + throw: 1, + throws: 1, + transient: 1, + true: 1, + try: 1, + void: 1, + volatile: 1, + while: 1 + }; + const parts = id.split('.'); + const l = parts.length; for (let i = 0; i < l; i++) { if (words[parts[i]]) { @@ -277,74 +275,95 @@ exports.validAppId = function (id) { } return true; -}; +} -exports.loadPlugins = function (logger, config, cli, projectDir, finished, silent, compact) { - var searchPaths = { - project: [ path.join(projectDir, 'plugins') ], - config: [], - global: [] - }, - confPaths = config.get('paths.plugins'), - defaultInstallLocation = cli.env.installPath, - sdkLocations = cli.env.os.sdkPaths.map(function (p) { return afs.resolvePath(p); }); +export function loadPlugins(logger, config, cli, projectDir, finished, silent, compact) { + const searchPaths = { + project: [ path.join(projectDir, 'plugins') ], + config: [], + global: [] + }; + let confPaths = config.get('paths.plugins'); + const defaultInstallLocation = cli.env.installPath; + const sdkLocations = cli.env.os.sdkPaths.map(p => expand(p)); // set our paths from the config file - Array.isArray(confPaths) || (confPaths = [ confPaths ]); - confPaths.forEach(function (p) { - p && fs.existsSync(p = afs.resolvePath(p)) && searchPaths.project.indexOf(p) === -1 && searchPaths.config.indexOf(p) === -1 && (searchPaths.config.push(p)); - }); + if (!Array.isArray(confPaths)) { + confPaths = [ confPaths ]; + } + for (let p of confPaths) { + if (p) { + p = expand(p); + if (fs.existsSync(p) && !searchPaths.project.includes(p) && !searchPaths.config.includes(p)) { + searchPaths.config.push(p); + } + } + } // add any plugins from various sdk locations - sdkLocations.indexOf(defaultInstallLocation) === -1 && sdkLocations.push(defaultInstallLocation); - cli.sdk && sdkLocations.push(afs.resolvePath(cli.sdk.path, '..', '..', '..')); - sdkLocations.forEach(function (p) { - fs.existsSync(p = afs.resolvePath(p, 'plugins')) && searchPaths.project.indexOf(p) === -1 && searchPaths.config.indexOf(p) === -1 && searchPaths.global.indexOf(p) === -1 && (searchPaths.global.push(p)); - }); + if (!sdkLocations.includes(defaultInstallLocation)) { + sdkLocations.push(defaultInstallLocation); + } + if (cli.sdk) { + sdkLocations.push(expand(cli.sdk.path, '..', '..', '..')); + } + for (let p of sdkLocations) { + p = expand(p, 'plugins'); + if (fs.existsSync(p) && !searchPaths.project.includes(p) && !searchPaths.config.includes(p) && !searchPaths.global.includes(p)) { + searchPaths.global.push(p); + } + } // find all hooks for active plugins - appc.tiplugin.find(cli.tiapp.plugins, searchPaths, config, logger, function (plugins) { + findTiPlugins(cli.tiapp.plugins, searchPaths, config, logger, (plugins) => { if (plugins.missing.length) { if (logger) { - logger.error(__('Could not find all required Titanium plugins:')); - plugins.missing.forEach(m => logger.error(' id: ' + m.id + '\t version: ' + m.version)); + logger.error('Could not find all required Titanium plugins:'); + for (const m of plugins.missing) { + logger.error(` id: ${m.id}\t version: ${m.version}`); + } logger.log(); } process.exit(1); } if (plugins.found.length) { - plugins.found.forEach(plugin => cli.scanHooks(afs.resolvePath(plugin.pluginPath, 'hooks'))); + for (const plugin of plugins.found) { + cli.scanHooks(expand(plugin.pluginPath, 'hooks')); + } } else { - logger && logger.debug(__('No project level plugins to load')); + logger?.debug('No project level plugins to load'); } - silent || cli.emit('cli:check-plugins', { compact: compact === undefined ? true : compact }); + if (!silent) { + cli.emit('cli:check-plugins', { compact: compact === undefined ? true : compact }); + } finished(); }); -}; +} -exports.loadModuleManifest = function (logger, manifestFile) { +export function loadModuleManifest(logger, manifestFile) { if (!fs.existsSync(manifestFile)) { - logger.error(__('Missing %s', manifestFile)); + logger.error(`Missing ${manifestFile}`); logger.log(); process.exit(1); } const re = /^(\S+)\s*:\s*(.*)$/; const manifest = {}; - fs.readFileSync(manifestFile).toString().split(/\r?\n/).forEach(function (line) { + const lines = fs.readFileSync(manifestFile).toString().split(/\r?\n/); + for (const line of lines) { const match = line.match(re); if (match) { manifest[match[1].trim()] = match[2].trim(); } - }); + } return manifest; -}; +} -exports.validateModuleManifest = function (logger, cli, manifest) { +export function validateModuleManifest(logger, cli, manifest) { const requiredModuleKeys = [ 'name', 'version', @@ -359,30 +378,29 @@ exports.validateModuleManifest = function (logger, cli, manifest) { ]; // check if all the required module keys are in the list - requiredModuleKeys.forEach(function (key) { + for (const key of requiredModuleKeys) { if (!manifest[key]) { - logger.error(__('Missing required manifest key "%s"', key)); + logger.error(`Missing required manifest key "${key}"`); logger.log(); process.exit(1); } - }); + } if (cli.argv.platform !== exports.resolvePlatform(manifest.platform)) { - logger.error(__('Unable to find "%s" module', cli.argv.platform)); + logger.error(`Unable to find "${cli.argv.platform}" module`); logger.log(); process.exit(1); } -}; +} -exports.validateCorrectSDK = function (logger, config, cli, commandName) { +export function validateCorrectSDK(logger, config, cli, commandName) { // tiapp.xml should exist by the time we get here - var argv = cli.argv, - tiapp = cli.tiapp, - sdkName = tiapp['sdk-version'], - selectedSdk = cli.sdk && cli.sdk.name || manifest.version; + const { argv, tiapp } = cli; + let sdkName = tiapp['sdk-version']; + const selectedSdk = cli.sdk?.name || manifest.version; if (!sdkName) { - sdkName = tiapp['sdk-version'] = cli.sdk && cli.sdk.name || Object.keys(cli.env.sdks).sort().pop(); + sdkName = tiapp['sdk-version'] = cli.sdk?.name || Object.keys(cli.env.sdks).sort().pop(); } if (argv.legacy !== true && (!sdkName || sdkName === selectedSdk)) { @@ -392,53 +410,45 @@ exports.validateCorrectSDK = function (logger, config, cli, commandName) { // check the project's preferred sdk is even installed if (sdkName === '__global__' || !cli.env.sdks[sdkName]) { logger.banner(); - logger.error(__('Unable to compile project because the \'sdk-version\' in the tiapp.xml is not installed') + '\n'); - logger.log(__('The project\'s %s is currently set to %s, which is not installed.', 'sdk-version'.cyan, sdkName.cyan) + '\n'); - logger.log(__('Update the %s in the tiapp.xml to one of the installed Titaniums SDKs:', 'sdk-version'.cyan)); - Object.keys(cli.env.sdks).sort().forEach(function (ver) { + logger.error('Unable to compile project because the in the tiapp.xml is not installed\n'); + logger.log(`The project's is currently set to '${sdkName}', which is not installed.\n`); + logger.log(`Update the in the tiapp.xml to one of the installed Titaniums SDKs:`); + const sortedSdks = Object.keys(cli.env.sdks).sort(); + for (const ver of sortedSdks) { if (ver !== '__global__') { - logger.log(' ' + ver.cyan); + logger.log(' ' + ver); } - }); - logger.log(__('or run \'%s\' to download and install Titanium SDK %s', ('titanium sdk install ' + sdkName).cyan, sdkName) + '\n'); - process.exit(1); - } - - var sdkVersion = cli.env.sdks[sdkName].manifest && cli.env.sdks[sdkName].manifest.version || sdkName; - if (version.gte(sdkVersion, '3.0.0') && version.lte(sdkVersion, '3.0.2') && version.gte(process.version, '0.9.0')) { - logger.banner(); - logger.error(__('Unable to compile project using Titanium SDK %s with Node.js %s', sdkName, process.version) + '\n'); - logger.log(__('Titanium SDK %s requires Node.js v0.8. Node.js v0.10 and newer will not work.', sdkName.cyan) + '\n'); - logger.log(__('Either update your application to Titanium SDK %s or newer or download Node.js %s from %s.', '3.1.0.GA'.cyan, 'v0.8'.cyan, 'http://nodejs.org/dist/'.cyan) + '\n'); + } + logger.log(`or run 'titanium sdk install ${sdkName}' to download and install Titanium SDK ${sdkName}\n`); process.exit(1); } // fork or die if (config.cli.failOnWrongSDK) { logger.banner(); - logger.error(__('Unable to compile a %s project with Titanium SDK %s', sdkName, selectedSdk)); - logger.error(__('To build this application, set the in the tiapp.xml to the current Titaniums SDK: %s', selectedSdk) + '\n'); + logger.error(`Unable to compile a ${sdkName} project with Titanium SDK ${selectedSdk}`); + logger.error(`To build this application, set the in the tiapp.xml to the current Titaniums SDK: ${selectedSdk}\n`); process.exit(1); } - var args = argv.$_, - p = args.indexOf('--sdk'), - platform = exports.resolvePlatform(argv.platform), - cmd = [], - cmdSafe = [], - cmdRoot, - hideBanner = false, - delayCmd = false; - - function cmdAdd() { - for (var i = 0; i < arguments.length; i++) { + const args = argv.$_; + const p = args.indexOf('--sdk'); + const platform = exports.resolvePlatform(argv.platform); + const cmd = []; + const cmdSafe = []; + let cmdRoot; + let hideBanner = false; + let delayCmd = false; + + function cmdAdd(...args) { + for (let i = 0; i < args.length; i++) { cmd.push(arguments[i]); cmdSafe.push(arguments[i]); } } function cmdAddSecret(_param) { - for (var i = 0; i < arguments.length; i++) { + for (let i = 0; i < arguments.length; i++) { cmd.push(arguments[i]); cmdSafe.push('*******'); } @@ -449,9 +459,11 @@ exports.validateCorrectSDK = function (logger, config, cli, commandName) { } if (!argv.legacy) { - logger.info(__('tiapp.xml set to %s, but current Titanium SDK set to %s', sdkName.cyan, selectedSdk.cyan)); + logger.info(`tiapp.xml set to ${sdkName}, but current Titanium SDK set to ${selectedSdk}`); } + const sdkVersion = cli.env.sdks[sdkName].manifest && cli.env.sdks[sdkName].manifest.version || sdkName; + if (argv.legacy || version.lt(sdkVersion, '2.2.0')) { // technically, there is no 2.2, it was released as 3.0 // in 3.2, we renamed --password to --store-password as to not conflict with the // authentication --password option @@ -461,7 +473,7 @@ exports.validateCorrectSDK = function (logger, config, cli, commandName) { cmdRoot = 'python'; - var builderPy = path.join(path.resolve(cli.env.sdks[sdkName].path), platform, 'builder.py'); + const builderPy = path.join(expand(cli.env.sdks[sdkName].path), platform, 'builder.py'); cmdAdd(builderPy); switch (platform) { @@ -495,11 +507,11 @@ exports.validateCorrectSDK = function (logger, config, cli, commandName) { } else { if (argv.target === 'emulator') { if (!argv['avd-id']) { - logger.error(__('Missing required option "%s"', '--avd-id') + '\n'); + logger.error(`Missing required option "${'--avd-id'}"\n`); process.exit(1); } if (!argv['avd-skin']) { - logger.error(__('Missing required option "%s"', '--avd-skin') + '\n'); + logger.error(`Missing required option "${'--avd-skin'}"\n`); process.exit(1); } } @@ -510,9 +522,11 @@ exports.validateCorrectSDK = function (logger, config, cli, commandName) { delayCmd = true; // launch the emulator - var emuArgs = [ builderPy, 'emulator', tiapp.name, argv['android-sdk'], argv['project-dir'], tiapp.id, argv['avd-id'], argv['avd-skin'] ]; - argv['avd-abi'] && emuArgs.push(argv['avd-abi']); - logger.info(__('Launching Android emulator: %s', ('"' + cmdRoot + '" "' + emuArgs.join('" "') + '"').cyan)); + const emuArgs = [ builderPy, 'emulator', tiapp.name, argv['android-sdk'], argv['project-dir'], tiapp.id, argv['avd-id'], argv['avd-skin'] ]; + if (argv['avd-abi']) { + emuArgs.push(argv['avd-abi']); + } + logger.info(`Launching Android emulator: "${cmdRoot}" "${emuArgs.join('" "')}"`); spawn(cmdRoot, emuArgs, { detached: true, stdio: 'ignore' @@ -558,10 +572,10 @@ exports.validateCorrectSDK = function (logger, config, cli, commandName) { hideBanner = true; // If the titanium path has spaces, then we are trying to combine the paths and verify after they were split. - var titaniumPath = (function getTitaniumPath (params) { - var paramsArray = params.split(' '), - pathSegment, - prevPath = ''; + const titaniumPath = (function getTitaniumPath(params) { + const paramsArray = params.split(' '); + let pathSegment; + let prevPath = ''; while ((pathSegment = paramsArray.pop())) { if (fs.existsSync(pathSegment + prevPath)) { return pathSegment + prevPath; @@ -575,41 +589,45 @@ exports.validateCorrectSDK = function (logger, config, cli, commandName) { cmdAdd(titaniumPath); cmdAdd(commandName, '--sdk', sdkName); - var flags = {}, - options = {}; + const flags = {}; + const options = {}; // mix the command and platform specific options together - [ cli.globalContext, cli.command, cli.command.platform ].forEach(function (ctx) { + for (const ctx of [ cli.globalContext, cli.command, cli.command.platform ]) { if (ctx && ctx.conf) { - ctx.conf.flags && appc.util.mix(flags, ctx.conf.flags); - ctx.conf.options && appc.util.mix(options, ctx.conf.options); + if (ctx.conf.flags) { + Object.assign(flags, ctx.conf.flags); + } + if (ctx.conf.options) { + Object.assign(options, ctx.conf.options); + } } - }); + } - Object.keys(flags).forEach(function (name) { - var def = Object.prototype.hasOwnProperty.call(flags[name], 'default') ? flags[name].default : false; + for (const name of Object.keys(flags)) { + const def = Object.prototype.hasOwnProperty.call(flags[name], 'default') ? flags[name].default : false; if (argv[name] !== undefined && def !== argv[name]) { - cmdAdd('--' + (argv[name] ? '' : 'no-') + name); + cmdAdd(`--${(argv[name] ? '' : 'no-')}${name}`); } - }); + } - Object.keys(options).forEach(function (name) { + for (const name of Object.keys(options)) { if (name !== 'sdk' && argv[name] !== undefined) { // in 3.2, we renamed --password to --store-password as to not conflict with the // authentication --password option - var arg = name; + let arg = name; if (argv.platform === 'android' && arg === 'store-password' && version.lt(sdkVersion, '3.2.0')) { arg = 'password'; } - cmdAdd('--' + arg); + cmdAdd(`--${arg}`); if (options[name].secret) { cmdAddSecret(argv[name]); } else { cmdAdd(argv[name]); } } - }); + } } // trim off the empty trailing args @@ -619,29 +637,33 @@ exports.validateCorrectSDK = function (logger, config, cli, commandName) { } if (argv.legacy) { - logger.info(__('Forking legacy SDK command: %s', (cmdRoot + ' "' + cmdSafe.join('" "') + '"').cyan) + '\n'); + logger.info(`Forking legacy SDK command: ${cmdRoot} "${cmdSafe.join('" "')}"\n`); } else { - logger.info(__('Forking correct SDK command: %s', ('"' + cmdRoot + '" "' + cmdSafe.join('" "') + '"').cyan) + '\n'); + logger.info(`Forking correct SDK command: "${cmdRoot}" "${cmdSafe.join('" "')}"\n`); } - hideBanner && cmd.push('--no-banner'); + if (hideBanner) { + cmd.push('--no-banner'); + } // when doing a legacy Android build (1.X or 2.X), then we delay the build to // allow the emulator to start because there is a bug where the builder.py // doesn't like to be run concurrently - setTimeout(function () { + setTimeout(() => { spawn(cmdRoot, cmd, { stdio: 'inherit' - }).on('exit', function (code, _signal) { - code && process.exit(code); + }).on('close', (code, _signal) => { + if (code) { + process.exit(code); + } }); }, delayCmd ? 1000 : 0); -}; +} -exports.validateAppJsExists = function (projectDir, logger, platformDirs) { +export function validateAppJsExists(projectDir, logger, platformDirs) { if (!fs.existsSync(path.join(projectDir, 'Resources'))) { - logger.error(__('"Resources" directory not found')); - logger.error(__('Ensure the "Resources" directory exists and contains an "app.js" file.') + '\n'); + logger.error('"Resources" directory not found'); + logger.error('Ensure the "Resources" directory exists and contains an "app.js" file.\n'); process.exit(1); } @@ -649,71 +671,76 @@ exports.validateAppJsExists = function (projectDir, logger, platformDirs) { path.join(projectDir, 'Resources', 'app.js') ]; - Array.isArray(platformDirs) || (platformDirs = [ platformDirs ]); - platformDirs.forEach(function (platformDir) { + if (!Array.isArray(platformDirs)) { + platformDirs = [ platformDirs ]; + } + for (const platformDir of platformDirs) { files.push(path.join(projectDir, 'Resources', platformDir, 'app.js')); - }); + } if (!files.some(file => fs.existsSync(file))) { - logger.error(__('"app.js" not found')); - logger.error(__('Ensure the "app.js" file exists in your project\'s "Resources" directory.') + '\n'); + logger.error('"app.js" not found'); + logger.error('Ensure the "app.js" file exists in your project\'s "Resources" directory.\n'); process.exit(1); } -}; +} -exports.validatePlatformOptions = function (logger, config, cli, commandName) { - const platform = exports.resolvePlatform(cli.argv.platform), - platformCommand = path.join(path.dirname(module.filename), '..', '..', '..', manifest.platforms[manifest.platforms.indexOf(platform)], 'cli', 'commands', '_' + commandName + '.js'); +export async function validatePlatformOptions(logger, config, cli, commandName) { + const platform = resolvePlatform(cli.argv.platform); + const platformCommand = path.join(path.dirname(import.meta.url), '..', '..', '..', manifest.platforms[manifest.platforms.indexOf(platform)], 'cli', 'commands', `_${commandName}.js`); if (fs.existsSync(platformCommand)) { - const command = require(platformCommand); + const command = await import(platformCommand); return command && typeof command.validate === 'function' ? command.validate(logger, config, cli) : null; } -}; +} -exports.scrubPlatforms = function (platforms) { - const scrubbed = {}, // distinct list of un-aliased platforms - original = {}, - bad = {}; +export function scrubPlatforms(platforms) { + const scrubbed = {}; + const original = {}; + const bad = {}; - platforms.toLowerCase().split(',').forEach(function (platform) { + const platformArray = platforms.toLowerCase().split(','); + for (const platform of platformArray) { const name = platformAliases[platform] || platform; // if name is falsey, then it's invalid anyways if (name) { - if (manifest.platforms.indexOf(name) === -1) { + if (!manifest.platforms.includes(name)) { bad[platform] = 1; } else { scrubbed[name] = 1; original[platform] = 1; } } - }); + } return { scrubbed: Object.keys(scrubbed).sort(), // distinct list of un-aliased platforms original: Object.keys(original).sort(), bad: Object.keys(bad).sort() }; -}; +} -exports.resolvePlatform = function (platform) { +export function resolvePlatform(platform) { return platformAliases[platform] || platform; -}; +} -exports.filterPlatforms = function (platform) { +export function filterPlatforms(platform) { platform = platformAliases[platform] || platform; - return exports.availablePlatformsNames.filter(name => name != platform); // eslint-disable-line eqeqeq -}; + return availablePlatformsNames.filter(name => name != platform); +} -exports.validatePlatform = function (logger, cli, name) { - const platform = name ? cli.argv[name] : cli.argv, - p = cli.argv[name] = platformAliases[platform] || platform; - if (!p || manifest.platforms.indexOf(p) === -1) { +export function validatePlatform(logger, cli, name) { + const platform = name ? cli.argv[name] : cli.argv; + const p = cli.argv[name] = platformAliases[platform] || platform; + if (!p || !manifest.platforms.includes(p)) { logger.banner(); - logger.error(__('Invalid platform "%s"', platform) + '\n'); - appc.string.suggest(platform, exports.targetPlatforms, logger.log); - logger.log(__('Available platforms for SDK version %s:', cli.sdk && cli.sdk.name || manifest.version)); - exports.targetPlatforms.forEach(p => logger.log(' ' + p.cyan)); + logger.error(`Invalid platform "${platform}"\n`); + suggest(platform, targetPlatforms, logger.log); + logger.log(`Available platforms for SDK version ${cli.sdk?.name || manifest.version}:`); + for (const p of targetPlatforms) { + logger.log(` ${p}`); + } logger.log(); process.exit(1); } -}; +} diff --git a/lib/util/load-manifest-json.js b/lib/util/load-manifest-json.js new file mode 100644 index 00000000..d3d4ce8b --- /dev/null +++ b/lib/util/load-manifest-json.js @@ -0,0 +1,29 @@ +import fs from 'node:fs'; +import path from 'node:path'; + +let manifestJsonCache = {}; + +/** + * Attempts to locate and load the current module's manifest.json. + * @param {Object} dir - The directory to start searching for the manifest.json file + * @returns {Object} The manifest.json properties + */ +export function loadManifestJson(dir) { + if (manifestJsonCache) { + return manifestJsonCache; + } + + const { root } = path.parse(dir); + let currentDir = dir; + + while (currentDir !== root) { + const file = path.join(currentDir, 'manifest.json'); + if (fs.existsSync(file)) { + manifestJsonCache = JSON.parse(fs.readFileSync(file, 'utf8')); + return manifestJsonCache; + } + currentDir = path.dirname(currentDir); + } + + return null; +} diff --git a/lib/util/png-info.js b/lib/util/png-info.js new file mode 100644 index 00000000..5846fda5 --- /dev/null +++ b/lib/util/png-info.js @@ -0,0 +1,18 @@ +/** + * Reads in a PNG file and returns the height, width, and color depth. + * + * @param {Buffer} buf - A buffer containing the contents of a PNG file. + * + * @returns {Object} An object containing the image's height, width, and color depth. + */ +export function pngInfo(buf) { + function u32(o) { + return buf[o] << 24 | buf[o + 1] << 16 | buf[o + 2] << 8 | buf[o + 3]; + } + + return { + width: u32(16), + height: u32(16 + 4), + alpha: !!(buf[25] & 4) + }; +} diff --git a/lib/util/resize-image.js b/lib/util/resize-image.js new file mode 100644 index 00000000..4e59132c --- /dev/null +++ b/lib/util/resize-image.js @@ -0,0 +1,67 @@ +import fs from 'node:fs'; +import { spawnSync } from 'node:child_process'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +/** + * Takes a source image and resizes it to one or more images. + * + * @param {String} src - The path to the source image being resized. + * @param {Array|Object} dest - One or more destination objects consisting of the dest `file`, `width`, and `height`. + * @param {Object} [logger] - A logger object containing a `trace()` function. + */ +export async function resizeImage(src, dest, logger) { + if (!src) { + throw new Error('Missing source'); + } + if (!fs.existsSync(src)) { + throw new Error('Source "' + src + '" does not exist'); + } + if (!dest) { + throw new Error('Missing dest'); + } + + if (!Array.isArray(dest)) { + dest = [ dest ]; + } + + const cmd = [ + `java -jar "${path.resolve(__dirname, '..', 'tools', 'resizer', 'resizer.jar')}"`, + `"${src}"` + ]; + + for (const d of dest) { + if (!d || typeof d !== 'object') { + throw new Error('Invalid destination'); + } + if (!d.file) { + throw new Error('Missing destination file'); + } + + let w = d.width | 0; + let h = d.height | 0; + + if (!w && !h) { + throw new Error('Missing destination width and height'); + } else if (w && !h) { + h = w; + } else if (!w && h) { + w = h; + } + + cmd.push(`"${d.file}"`); + cmd.push(w); + cmd.push(h); + } + + const cmdStr = cmd.join(' '); + logger?.trace(`Resizing images: ${cmdStr}`); + + const { status } = spawnSync(cmdStr); + if (status !== 0) { + throw new Error(`Failed to resize image: ${cmdStr}`); + } +} + diff --git a/lib/util/suggest.js b/lib/util/suggest.js new file mode 100644 index 00000000..c1adcdef --- /dev/null +++ b/lib/util/suggest.js @@ -0,0 +1,55 @@ +/** + * Measures the distance between two strings. + * @param {String} s - The first string + * @param {String} c - The second string + * @returns {Number} The distance + */ +export function levenshtein(s, c) { + s = s.split(''); + c = c.split(''); + const len1 = s.length; + const len2 = c.length; + const a = []; + let i = len1 + 1; + let j; + + if (!(len1 || len2)) { + return Math.max(len1, len2); + } + for (; i; a[--i] = [ i ]) { + // + } + for (i = len2 + 1; i;) { + a[0][--i] = i + } + for (i = -1; ++i < len1;) { + for (j = -1; ++j < len2;) { + a[i + 1][j + 1] = Math.min(a[i][j + 1] + 1, a[i + 1][j] + 1, a[i][j] + (s[i] != c[j])); // eslint-disable-line eqeqeq + } + } + return a[len1][len2]; +} + +/** + * Compares a string to an array of options and suggests close matches based on a given threshold. + * @param {String} value - The string to compare + * @param {Array} options - An array of options to compare + * @param {Function} logger - A function that prints output + * @param {Number} [threshold=3] - The match threshold + */ +export function suggest(value, options, logger, threshold) { + value = '' + value; + threshold = threshold || 3; + + const suggestions = options.filter(opt => { + return opt.startsWith(value) || levenshtein(value, opt) <= threshold; + }); + + if (suggestions.length) { + logger('Did you mean this?'); + for (const s of suggestions) { + logger(` ${s}`); + } + logger(); + } +} diff --git a/lib/util/zip.js b/lib/util/zip.js new file mode 100644 index 00000000..a442ac7a --- /dev/null +++ b/lib/util/zip.js @@ -0,0 +1,112 @@ +import fs from 'node:fs'; +import yauzl from 'yauzl'; +import path from 'node:path'; + +const IFMT = 61440; +const IFDIR = 16384; +const IFLNK = 40960; + +/** + * Extracts all files and applies the correct file permissions. + * @param {String} file - The file to extract + * @param {String} dest - The destination to extract the files to + * @param {Object} opts - Extract options + * @param {Function} [opts.visitor] - A function to call when visiting each file being extracted + * @param {Boolean} [opts.overwrite=true] - If true, overwrites files on extraction + * @param {Number} [opts.defaultPerm=0o644] - The default file permissions; should be in octet format + */ +export async function unzip(file, dest, opts) { + const visitor = opts?.visitor || (() => {}); + const overwrite = opts && Object.hasOwn(opts, 'overwrite') ? !!opts.overwrite : true; + const defaultPerm = opts?.defaultPerm || 0o644; + + return new Promise((resolve, reject) => { + yauzl.open(file, { lazyEntries: true }, (err, zipfile) => { + if (err) { + return reject(err); + } + let i = 0; + const len = zipfile.entryCount; + zipfile.once('error', err => reject(err)); + zipfile.on('close', () => resolve()); + zipfile.on('entry', (entry) => { + if (entry.fileName.startsWith('__MACOSX/')) { + zipfile.readEntry(); + return; + } + + // handle visitor function! + if (visitor(entry, i, len) === false) { + zipfile.readEntry(); + return; + } + + const destFile = expand(dest, entry.fileName); + + // convert external file attr int into a fs stat mode int + let mode = (entry.externalFileAttributes >> 16) & 0xFFFF; + // check if it's a symlink or dir (using stat mode constants) + const symlink = (mode & IFMT) === IFLNK; + let isDir = (mode & IFMT) === IFDIR; + // check for windows weird way of specifying a directory + // https://github.com/maxogden/extract-zip/issues/13#issuecomment-154494566 + const madeBy = entry.versionMadeBy >> 8; + if (!isDir) { + isDir = (madeBy === 0 && entry.externalFileAttributes === 16); + } + + // if no mode then default to default modes + if (mode === 0) { + mode = defaultPerm; + } + + // If we're not overwriting and destiantion exists, move on to next entry + if (!overwrite && fs.existsSync(destFile)) { + zipfile.readEntry(); + return; + } + + if (symlink) { + // How do we handle a symlink? + zipfile.openReadStream(entry, (err, readStream) => { + if (err) { + return reject(err); + } + fs.mkdirSync(path.dirname(destFile), { recursive: true }); + const chunks = []; + readStream.on('data', chunk => chunks.push(chunk)); + readStream.on('error', err => reject(err)); + readStream.on('end', () => { + let str = Buffer.concat(chunks).toString('utf8'); + if (fs.existsSync(destFile)) { + fs.unlinkSync(destFile); + } + fs.symlinkSync(str, destFile); + zipfile.readEntry(); + }); + }); + } else if (isDir) { + fs.mkdirSync(destFile, { mode, recursive: true }); + i++; + zipfile.readEntry(); + } else { + // file entry + zipfile.openReadStream(entry, (err, readStream) => { + if (err) { + return reject(err); + } + fs.mkdirSync(path.dirname(destFile), { recursive: true }); + + // pump file contents + readStream.on('end', () => zipfile.readEntry()); + readStream.once('error', err => reject(err)); + const writeStream = fs.createWriteStream(destFile, { mode }); + readStream.pipe(writeStream); + i++; + }); + } + }); + zipfile.readEntry(); + }); + }); +} diff --git a/locales/bn.js b/locales/bn.js deleted file mode 100644 index 9e26dfee..00000000 --- a/locales/bn.js +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/locales/de.js b/locales/de.js deleted file mode 100644 index 9e26dfee..00000000 --- a/locales/de.js +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/locales/el.js b/locales/el.js deleted file mode 100644 index 9e26dfee..00000000 --- a/locales/el.js +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/locales/en.js b/locales/en.js deleted file mode 100644 index 363c35e8..00000000 --- a/locales/en.js +++ /dev/null @@ -1,161 +0,0 @@ -{ - "Unknown adb result \"%s\"": "Unknown adb result \"%s\"", - "Unable to start Android Debug Bridge server (exit code %s)": "Unable to start Android Debug Bridge server (exit code %s)", - "Android SDK not found": "Android SDK not found", - "APK file \"%s\" does not exist": "APK file \"%s\" does not exist", - "device not found": "device not found", - "Executing: %s": "Executing: %s", - "Not enough free space on device": "Not enough free space on device", - "The app is already installed, but signed with a different certificate": "The app is already installed, but signed with a different certificate", - "You need to either manually uninstall the app or rebuild using the same certificate that was used to sign the installed app": "You need to either manually uninstall the app or rebuild using the same certificate that was used to sign the installed app", - "Application \"%s\" is not running": "Application \"%s\" is not running", - "Source file \"%s\" does not exist": "Source file \"%s\" does not exist", - "Failed to create destination directory \"%s\"": "Failed to create destination directory \"%s\"", - "JDK (Java Development Kit) not found.": "JDK (Java Development Kit) not found.", - "If you already have installed the JDK, verify your __JAVA_HOME__ environment variable is correctly set.": "If you already have installed the JDK, verify your __JAVA_HOME__ environment variable is correctly set.", - "The JDK can be downloaded and installed from %s.": "The JDK can be downloaded and installed from %s.", - "The JDK (Java Development Kit) path must not contain ampersands (&) on Windows.": "The JDK (Java Development Kit) path must not contain ampersands (&) on Windows.", - "Please move the JDK into a path without an ampersand and update the __JAVA_HOME__ environment variable.": "Please move the JDK into a path without an ampersand and update the __JAVA_HOME__ environment variable.", - "Unable to locate an /usr/lib/libGL.so.": "Unable to locate an /usr/lib/libGL.so.", - "Without the libGL library, the Android Emulator may not work properly.": "Without the libGL library, the Android Emulator may not work properly.", - "You may be able to fix it by reinstalling your graphics drivers and make sure it installs the 32-bit version.": "You may be able to fix it by reinstalling your graphics drivers and make sure it installs the 32-bit version.", - "i386 architecture is not configured.": "i386 architecture is not configured.", - "To ensure you install the required 32-bit libraries, you need to register the i386 architecture with dpkg.": "To ensure you install the required 32-bit libraries, you need to register the i386 architecture with dpkg.", - "To add the i386 architecture, run \"%s\".": "To add the i386 architecture, run \"%s\".", - "32-bit libraries is not installed.": "32-bit libraries is not installed.", - "Without the 32-bit libraries, the Android SDK will not work properly.": "Without the 32-bit libraries, the Android SDK will not work properly.", - "To install the required 32-bit libraries, run \"%s\".": "To install the required 32-bit libraries, run \"%s\".", - "32-bit glibc library is not installed.": "32-bit glibc library is not installed.", - "Without the 32-bit glibc library, the Android Emulator will not work properly.": "Without the 32-bit glibc library, the Android Emulator will not work properly.", - "To install the required 32-bit glibc library, run \"%s\".": "To install the required 32-bit glibc library, run \"%s\".", - "32-bit libstdc++ library is not installed.": "32-bit libstdc++ library is not installed.", - "Without the 32-bit libstdc++ library, the Android Emulator will not work properly.": "Without the 32-bit libstdc++ library, the Android Emulator will not work properly.", - "To install the required 32-bit libstdc++ library, run \"%s\".": "To install the required 32-bit libstdc++ library, run \"%s\".", - "Unable to locate an Android NDK.": "Unable to locate an Android NDK.", - "Without the NDK, you will not be able to build native Android Titanium modules.": "Without the NDK, you will not be able to build native Android Titanium modules.", - "If you have already downloaded and installed the Android NDK, you can tell Titanium where the Android NDK is located by running '%s', otherwise you can install it by running '%s' or manually downloading from %s.": "If you have already downloaded and installed the Android NDK, you can tell Titanium where the Android NDK is located by running '%s', otherwise you can install it by running '%s' or manually downloading from %s.", - "Unable to locate an Android SDK.": "Unable to locate an Android SDK.", - "If you have already downloaded and installed the Android SDK, you can tell Titanium where the Android SDK is located by running '%s', otherwise you can install it by running '%s' or manually downloading from %s.": "If you have already downloaded and installed the Android SDK, you can tell Titanium where the Android SDK is located by running '%s', otherwise you can install it by running '%s' or manually downloading from %s.", - "The Android SDK path must not contain ampersands (&) on Windows.": "The Android SDK path must not contain ampersands (&) on Windows.", - "Please move the Android SDK into a path without an ampersand and re-run __titanium setup android__.": "Please move the Android SDK into a path without an ampersand and re-run __titanium setup android__.", - "Missing required Android SDK tool: %%s": { - "one": "Missing required Android SDK tool: %%s", - "other": "Missing required Android SDK tools: %%s" - }, - "The Android SDK located at %s has incomplete or out-of-date packages.": "The Android SDK located at %s has incomplete or out-of-date packages.", - "Current installed Android SDK tools:": "Current installed Android SDK tools:", - "Make sure you have the latest Android SDK Tools, Platform Tools, and Build Tools installed.": "Make sure you have the latest Android SDK Tools, Platform Tools, and Build Tools installed.", - "You can also specify the exact location of these required tools by running:": "You can also specify the exact location of these required tools by running:", - "If you need to, run \"%s\" to reconfigure the Titanium Android settings.": "If you need to, run \"%s\" to reconfigure the Titanium Android settings.", - "Android API %s is too old and is no longer supported by Titanium SDK %s.": "Android API %s is too old and is no longer supported by Titanium SDK %s.", - "The minimum supported Android API level by Titanium SDK %s is API level %s.": "The minimum supported Android API level by Titanium SDK %s is API level %s.", - "Android API %s is too new and may or may not work with Titanium SDK %s.": "Android API %s is too new and may or may not work with Titanium SDK %s.", - "The maximum supported Android API level by Titanium SDK %s is API level %s.": "The maximum supported Android API level by Titanium SDK %s is API level %s.", - "No Android APIs found.": "No Android APIs found.", - "Run '%s' to install the latest Android APIs.": "Run '%s' to install the latest Android APIs.", - "No valid Android APIs found that are supported by Titanium SDK %s.": "No valid Android APIs found that are supported by Titanium SDK %s.", - "The Android emulator \"%s\" has a problem:": "The Android emulator \"%s\" has a problem:", - "Found %s emulators": "Found %s emulators", - "Detecting if %s exists...": "Detecting if %s exists...", - "Invalid emulator \"%s\"": "Invalid emulator \"%s\"", - "Emulator exists, detecting all running emulators and connected devices...": "Emulator exists, detecting all running emulators and connected devices...", - "Detected %s running emulators and connected devices": "Detected %s running emulators and connected devices", - "Checking %s devices to see if it's the emulator we want": "Checking %s devices to see if it's the emulator we want", - "Failed to check if the emulator was running: %s": "Failed to check if the emulator was running: %s", - "The emulator is running": "The emulator is running", - "The emulator is NOT running": "The emulator is NOT running", - "Unable to find device \"%s\"": "Unable to find device \"%s\"", - "Timed out while waiting for the emulator to boot; waited %s ms": "Timed out while waiting for the emulator to boot; waited %s ms", - "Checking the boot state for the next %s ms": "Checking the boot state for the next %s ms", - "Waiting for emulator to register with ADB": "Waiting for emulator to register with ADB", - "No devices found, continuing to wait": "No devices found, continuing to wait", - "Found %s devices, checking if any of them are the emulator...": "Found %s devices, checking if any of them are the emulator...", - "Error checking if emulator is running: %s": "Error checking if emulator is running: %s", - "Emulator not running yet, continuing to wait": "Emulator not running yet, continuing to wait", - "Emulator is running!": "Emulator is running!", - "Checking if boot animation has finished...": "Checking if boot animation has finished...", - "Emulator is booted, emitting booted event": "Emulator is booted, emitting booted event", - "Emulator is not booted yet; checking again in %s ms": "Emulator is not booted yet; checking again in %s ms", - "Emulator is booted": "Emulator is booted", - "SD card not required, skipping mount check": "SD card not required, skipping mount check", - "Checking if SD card is mounted": "Checking if SD card is mounted", - "Checking mount points: %s": "Checking mount points: %s", - "SD card is mounted": "SD card is mounted", - "Checking if emulator %s is running...": "Checking if emulator %s is running...", - "Emulator already running": "Emulator already running", - "Emulator not running, detecting running emulators": "Emulator not running, detecting running emulators", - "Starting the emulator...": "Starting the emulator...", - "Emulator is starting, monitoring boot state...": "Emulator is starting, monitoring boot state...", - "Emulator \"%s\" not running": "Emulator \"%s\" not running", - "Compiling localization files": "Compiling localization files", - "Processing i18n file: %s": "Processing i18n file: %s", - "Checking for Splash Screen localization": "Checking for Splash Screen localization", - "Failed to parse %s": "Failed to parse %s", - "%s [line %s, column %s]": "%s [line %s, column %s]", - "Parsing JSS file: %s": "Parsing JSS file: %s", - "Error parsing JSS file.": "Error parsing JSS file.", - "Couldn't find import file %s referenced from %s": "Couldn't find import file %s referenced from %s", - "Loading and parsing JSS files": "Loading and parsing JSS files", - "tiapp.xml file does not exist": "tiapp.xml file does not exist", - "minimum logging level": "minimum logging level", - "level": "level", - "Project directory does not exist": "Project directory does not exist", - "Invalid project directory \"%s\"": "Invalid project directory \"%s\"", - "Use the %s property to specify the project's directory": "Use the %s property to specify the project's directory", - "tiapp.xml is missing the element": "tiapp.xml is missing the element", - "The app id must consist of letters, numbers, and underscores.": "The app id must consist of letters, numbers, and underscores.", - "Note: Android does not allow dashes and iOS does not allow underscores.": "Note: Android does not allow dashes and iOS does not allow underscores.", - "The first character must be a letter or underscore.": "The first character must be a letter or underscore.", - "Usually the app id is your company's reversed Internet domain name. (i.e. com.example.myapp)": "Usually the app id is your company's reversed Internet domain name. (i.e. com.example.myapp)", - "tiapp.xml is missing the element": "tiapp.xml is missing the element", - "The project name must consist of letters, numbers, dashes, and underscores.": "The project name must consist of letters, numbers, dashes, and underscores.", - "The first character must be a letter.": "The first character must be a letter.", - "tiapp.xml is missing the element": "tiapp.xml is missing the element", - "The guid must be in the format XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX and consist of letters and numbers.": "The guid must be in the format XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX and consist of letters and numbers.", - "If you need a new guid, below are 5 freshly generated new ones that you can choose from:": "If you need a new guid, below are 5 freshly generated new ones that you can choose from:", - "tiapp.xml contains an invalid guid \"%s\"": "tiapp.xml contains an invalid guid \"%s\"", - "tiapp.xml contains an invalid version \"%s\"": "tiapp.xml contains an invalid version \"%s\"", - "The version must consist of three positive integers in the format \"X.Y.Z\".": "The version must consist of three positive integers in the format \"X.Y.Z\".", - "The app version major number must be greater than zero.": "The app version major number must be greater than zero.", - "Could not find all required Titanium plugins:": "Could not find all required Titanium plugins:", - "No project level plugins to load": "No project level plugins to load", - "Unable to compile project because the 'sdk-version' in the tiapp.xml is not installed": "Unable to compile project because the 'sdk-version' in the tiapp.xml is not installed", - "The project's %s is currently set to %s, which is not installed.": "The project's %s is currently set to %s, which is not installed.", - "Update the %s in the tiapp.xml to one of the installed Titaniums SDKs:": "Update the %s in the tiapp.xml to one of the installed Titaniums SDKs:", - "or run '%s' to download and install Titanium SDK %s": "or run '%s' to download and install Titanium SDK %s", - "Unable to compile project using Titanium SDK %s with Node.js %s": "Unable to compile project using Titanium SDK %s with Node.js %s", - "Titanium SDK %s requires Node.js v0.8. Node.js v0.10 and newer will not work.": "Titanium SDK %s requires Node.js v0.8. Node.js v0.10 and newer will not work.", - "Either update your application to Titanium SDK %s or newer or download Node.js %s from %s.": "Either update your application to Titanium SDK %s or newer or download Node.js %s from %s.", - "Unable to compile a %s project with Titanium SDK %s": "Unable to compile a %s project with Titanium SDK %s", - "To build this application, set the in the tiapp.xml to the current Titaniums SDK: %s": "To build this application, set the in the tiapp.xml to the current Titaniums SDK: %s", - "tiapp.xml set to %s, but current Titanium SDK set to %s": "tiapp.xml set to %s, but current Titanium SDK set to %s", - "Missing required option \"%s\"": "Missing required option \"%s\"", - "Launching Android emulator: %s": "Launching Android emulator: %s", - "Forking legacy SDK command: %s": "Forking legacy SDK command: %s", - "Forking correct SDK command: %s": "Forking correct SDK command: %s", - "\"Resources\" directory not found": "\"Resources\" directory not found", - "Ensure the \"Resources\" directory exists and contains an \"app.js\" file.": "Ensure the \"Resources\" directory exists and contains an \"app.js\" file.", - "\"app.js\" not found": "\"app.js\" not found", - "Ensure the \"app.js\" file exists in your project's \"Resources\" directory.": "Ensure the \"app.js\" file exists in your project's \"Resources\" directory.", - "Invalid platform \"%s\"": "Invalid platform \"%s\"", - "Available platforms for SDK version %s:": "Available platforms for SDK version %s:", - "Microsoft Visual Studio not found.": "Microsoft Visual Studio not found.", - "You will be unable to build Windows Phone or Windows Store apps.": "You will be unable to build Windows Phone or Windows Store apps.", - "You can install it from %s.": "You can install it from %s.", - "Microsoft Windows Phone SDK not found.": "Microsoft Windows Phone SDK not found.", - "You will be unable to build Windows Phone apps.": "You will be unable to build Windows Phone apps.", - "Microsoft Windows Phone SDK is missing the deploy command.": "Microsoft Windows Phone SDK is missing the deploy command.", - "Failed to run MSBuild.": "Failed to run MSBuild.", - "This is most likely due to Visual Studio cannot find a suitable .NET framework.": "This is most likely due to Visual Studio cannot find a suitable .NET framework.", - "Please install the latest .NET framework.": "Please install the latest .NET framework.", - "The MSBuild version %s is too old.": "The MSBuild version %s is too old.", - "Titanium requires .NET MSBuild '%s'.": "Titanium requires .NET MSBuild '%s'.", - "Failed to enumerate Windows Phone devices.": "Failed to enumerate Windows Phone devices.", - "Ensure that the Windows Phone SDK is properly installed.": "Ensure that the Windows Phone SDK is properly installed.", - "Windows Phone Emulator is not installed.": "Windows Phone Emulator is not installed.", - "Ensure that the Windows Phone Emulator is properly installed.": "Ensure that the Windows Phone Emulator is properly installed.", - "You must be running 64-bit Windows 8.1 Pro with Hyper-V support enabled.": "You must be running 64-bit Windows 8.1 Pro with Hyper-V support enabled.", - "Executing PowerShell scripts is disabled.": "Executing PowerShell scripts is disabled.", - "In order to build Windows Hybrid apps for the Windows Store (winstore), you must change the execution policy to allow PowerShell scripts.": "In order to build Windows Hybrid apps for the Windows Store (winstore), you must change the execution policy to allow PowerShell scripts.", - "To enable PowerShell scripts, search __PowerShell__ in the __Start__ menu, right click the icon, select __Run as administrator__, then run:": "To enable PowerShell scripts, search __PowerShell__ in the __Start__ menu, right click the icon, select __Run as administrator__, then run:" -} \ No newline at end of file diff --git a/locales/es.js b/locales/es.js deleted file mode 100644 index 9e26dfee..00000000 --- a/locales/es.js +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/locales/fr.js b/locales/fr.js deleted file mode 100644 index 9e26dfee..00000000 --- a/locales/fr.js +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/locales/hi.js b/locales/hi.js deleted file mode 100644 index 9e26dfee..00000000 --- a/locales/hi.js +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/locales/it.js b/locales/it.js deleted file mode 100644 index 9e26dfee..00000000 --- a/locales/it.js +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/locales/ja.js b/locales/ja.js deleted file mode 100644 index 9e26dfee..00000000 --- a/locales/ja.js +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/locales/ko.js b/locales/ko.js deleted file mode 100644 index 9e26dfee..00000000 --- a/locales/ko.js +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/locales/ru.js b/locales/ru.js deleted file mode 100644 index 9e26dfee..00000000 --- a/locales/ru.js +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/locales/uk.js b/locales/uk.js deleted file mode 100644 index 9e26dfee..00000000 --- a/locales/uk.js +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/locales/zh.js b/locales/zh.js deleted file mode 100644 index 9e26dfee..00000000 --- a/locales/zh.js +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index dbf44faa..00000000 --- a/package-lock.json +++ /dev/null @@ -1,18699 +0,0 @@ -{ - "name": "node-titanium-sdk", - "version": "6.0.1", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "node-titanium-sdk", - "version": "6.0.1", - "license": "Apache-2.0", - "dependencies": { - "@babel/core": "7.11.6", - "@babel/parser": "7.11.5", - "@babel/plugin-transform-property-literals": "7.10.1", - "@babel/preset-env": "7.10.2", - "async": "3.2.4", - "babel-plugin-transform-titanium": "0.1.1", - "babel-preset-minify": "0.5.2", - "colors": "1.4.0", - "fs-extra": "11.1.1", - "node-appc": "1.1.6", - "node-uuid": "1.4.8", - "stream-splitter": "0.3.2", - "unorm": "1.6.0", - "xmldom": "0.6.0" - }, - "devDependencies": { - "@commitlint/cli": "17.5.0", - "@commitlint/config-conventional": "17.4.4", - "@seadub/danger-plugin-dependencies": "1.0.0", - "@seadub/danger-plugin-eslint": "2.0.0", - "@seadub/danger-plugin-junit": "0.3.0", - "babel-plugin-tester": "10.1.0", - "danger": "11.2.4", - "eslint": "7.4.0", - "eslint-config-axway": "6.0.2", - "eslint-plugin-mocha": "9.0.0", - "husky": "8.0.3", - "lint-staged": "13.2.0", - "mocha": "8.1.1", - "mocha-jenkins-reporter": "0.4.8", - "nyc": "15.1.0", - "semver": "7.3.8", - "should": "13.2.3" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", - "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.6.tgz", - "integrity": "sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.6", - "@babel/helper-module-transforms": "^7.11.0", - "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.11.5", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.11.5", - "@babel/types": "^7.11.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@babel/generator": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz", - "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==", - "dependencies": { - "@babel/types": "^7.21.3", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", - "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", - "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz", - "integrity": "sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-member-expression-to-functions": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.0.tgz", - "integrity": "sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", - "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz", - "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==", - "dependencies": { - "@babel/types": "^7.21.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", - "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.20.7", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "dependencies": { - "@babel/types": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", - "dependencies": { - "@babel/types": "^7.20.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", - "dependencies": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", - "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", - "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", - "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", - "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", - "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", - "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", - "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/template": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", - "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz", - "integrity": "sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", - "dependencies": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", - "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", - "dependencies": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz", - "integrity": "sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==", - "dependencies": { - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-simple-access": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", - "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", - "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-identifier": "^7.19.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", - "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", - "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.1.tgz", - "integrity": "sha512-Kr6+mgag8auNrgEpbfIWzdXYOvqDHZOF0+Bx2xh4H2EDNwcbRb9lY6nkZg8oSjsX+DH9Ebxm9hOqtKW+gRDeNA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", - "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "regenerator-transform": "^0.15.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", - "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.10.2.tgz", - "integrity": "sha512-MjqhX0RZaEgK/KueRzh+3yPSk30oqDKJ5HP5tqTSB1e2gzGS3PLy7K0BIpnp78+0anFuSwOeuCf1zZO7RzRvEA==", - "dependencies": { - "@babel/compat-data": "^7.10.1", - "@babel/helper-compilation-targets": "^7.10.2", - "@babel/helper-module-imports": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/plugin-proposal-async-generator-functions": "^7.10.1", - "@babel/plugin-proposal-class-properties": "^7.10.1", - "@babel/plugin-proposal-dynamic-import": "^7.10.1", - "@babel/plugin-proposal-json-strings": "^7.10.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.1", - "@babel/plugin-proposal-numeric-separator": "^7.10.1", - "@babel/plugin-proposal-object-rest-spread": "^7.10.1", - "@babel/plugin-proposal-optional-catch-binding": "^7.10.1", - "@babel/plugin-proposal-optional-chaining": "^7.10.1", - "@babel/plugin-proposal-private-methods": "^7.10.1", - "@babel/plugin-proposal-unicode-property-regex": "^7.10.1", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.10.1", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-json-strings": "^7.8.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-syntax-numeric-separator": "^7.10.1", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.10.1", - "@babel/plugin-transform-arrow-functions": "^7.10.1", - "@babel/plugin-transform-async-to-generator": "^7.10.1", - "@babel/plugin-transform-block-scoped-functions": "^7.10.1", - "@babel/plugin-transform-block-scoping": "^7.10.1", - "@babel/plugin-transform-classes": "^7.10.1", - "@babel/plugin-transform-computed-properties": "^7.10.1", - "@babel/plugin-transform-destructuring": "^7.10.1", - "@babel/plugin-transform-dotall-regex": "^7.10.1", - "@babel/plugin-transform-duplicate-keys": "^7.10.1", - "@babel/plugin-transform-exponentiation-operator": "^7.10.1", - "@babel/plugin-transform-for-of": "^7.10.1", - "@babel/plugin-transform-function-name": "^7.10.1", - "@babel/plugin-transform-literals": "^7.10.1", - "@babel/plugin-transform-member-expression-literals": "^7.10.1", - "@babel/plugin-transform-modules-amd": "^7.10.1", - "@babel/plugin-transform-modules-commonjs": "^7.10.1", - "@babel/plugin-transform-modules-systemjs": "^7.10.1", - "@babel/plugin-transform-modules-umd": "^7.10.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", - "@babel/plugin-transform-new-target": "^7.10.1", - "@babel/plugin-transform-object-super": "^7.10.1", - "@babel/plugin-transform-parameters": "^7.10.1", - "@babel/plugin-transform-property-literals": "^7.10.1", - "@babel/plugin-transform-regenerator": "^7.10.1", - "@babel/plugin-transform-reserved-words": "^7.10.1", - "@babel/plugin-transform-shorthand-properties": "^7.10.1", - "@babel/plugin-transform-spread": "^7.10.1", - "@babel/plugin-transform-sticky-regex": "^7.10.1", - "@babel/plugin-transform-template-literals": "^7.10.1", - "@babel/plugin-transform-typeof-symbol": "^7.10.1", - "@babel/plugin-transform-unicode-escapes": "^7.10.1", - "@babel/plugin-transform-unicode-regex": "^7.10.1", - "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.10.2", - "browserslist": "^4.12.0", - "core-js-compat": "^3.6.2", - "invariant": "^2.2.2", - "levenary": "^1.1.1", - "semver": "^5.5.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" - }, - "node_modules/@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template/node_modules/@babel/parser": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", - "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz", - "integrity": "sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==", - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.3", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.3", - "@babel/types": "^7.21.3", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/parser": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", - "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/types": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", - "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==", - "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@commitlint/cli": { - "version": "17.5.0", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.5.0.tgz", - "integrity": "sha512-yNW3+M7UM1ioK28LKTrryIVB5qGpXlEv8+rJQiWPMZNayy9/1XR5+lL8qBTNlgopYtZWWnIm5RETcAN29ZTL/A==", - "dev": true, - "dependencies": { - "@commitlint/format": "^17.4.4", - "@commitlint/lint": "^17.4.4", - "@commitlint/load": "^17.5.0", - "@commitlint/read": "^17.4.4", - "@commitlint/types": "^17.4.4", - "execa": "^5.0.0", - "lodash.isfunction": "^3.0.9", - "resolve-from": "5.0.0", - "resolve-global": "1.0.0", - "yargs": "^17.0.0" - }, - "bin": { - "commitlint": "cli.js" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/config-conventional": { - "version": "17.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.4.4.tgz", - "integrity": "sha512-u6ztvxqzi6NuhrcEDR7a+z0yrh11elY66nRrQIpqsqW6sZmpxYkDLtpRH8jRML+mmxYQ8s4qqF06Q/IQx5aJeQ==", - "dev": true, - "dependencies": { - "conventional-changelog-conventionalcommits": "^5.0.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/config-validator": { - "version": "17.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.4.4.tgz", - "integrity": "sha512-bi0+TstqMiqoBAQDvdEP4AFh0GaKyLFlPPEObgI29utoKEYoPQTvF0EYqIwYYLEoJYhj5GfMIhPHJkTJhagfeg==", - "dev": true, - "dependencies": { - "@commitlint/types": "^17.4.4", - "ajv": "^8.11.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/ensure": { - "version": "17.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-17.4.4.tgz", - "integrity": "sha512-AHsFCNh8hbhJiuZ2qHv/m59W/GRE9UeOXbkOqxYMNNg9pJ7qELnFcwj5oYpa6vzTSHtPGKf3C2yUFNy1GGHq6g==", - "dev": true, - "dependencies": { - "@commitlint/types": "^17.4.4", - "lodash.camelcase": "^4.3.0", - "lodash.kebabcase": "^4.1.1", - "lodash.snakecase": "^4.1.1", - "lodash.startcase": "^4.4.0", - "lodash.upperfirst": "^4.3.1" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/execute-rule": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-17.4.0.tgz", - "integrity": "sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==", - "dev": true, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/format": { - "version": "17.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-17.4.4.tgz", - "integrity": "sha512-+IS7vpC4Gd/x+uyQPTAt3hXs5NxnkqAZ3aqrHd5Bx/R9skyCAWusNlNbw3InDbAK6j166D9asQM8fnmYIa+CXQ==", - "dev": true, - "dependencies": { - "@commitlint/types": "^17.4.4", - "chalk": "^4.1.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/format/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@commitlint/format/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@commitlint/format/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@commitlint/format/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@commitlint/format/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@commitlint/format/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@commitlint/is-ignored": { - "version": "17.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.4.4.tgz", - "integrity": "sha512-Y3eo1SFJ2JQDik4rWkBC4tlRIxlXEFrRWxcyrzb1PUT2k3kZ/XGNuCDfk/u0bU2/yS0tOA/mTjFsV+C4qyACHw==", - "dev": true, - "dependencies": { - "@commitlint/types": "^17.4.4", - "semver": "7.3.8" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/lint": { - "version": "17.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.4.4.tgz", - "integrity": "sha512-qgkCRRFjyhbMDWsti/5jRYVJkgYZj4r+ZmweZObnbYqPUl5UKLWMf9a/ZZisOI4JfiPmRktYRZ2JmqlSvg+ccw==", - "dev": true, - "dependencies": { - "@commitlint/is-ignored": "^17.4.4", - "@commitlint/parse": "^17.4.4", - "@commitlint/rules": "^17.4.4", - "@commitlint/types": "^17.4.4" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/load": { - "version": "17.5.0", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.5.0.tgz", - "integrity": "sha512-l+4W8Sx4CD5rYFsrhHH8HP01/8jEP7kKf33Xlx2Uk2out/UKoKPYMOIRcDH5ppT8UXLMV+x6Wm5osdRKKgaD1Q==", - "dev": true, - "dependencies": { - "@commitlint/config-validator": "^17.4.4", - "@commitlint/execute-rule": "^17.4.0", - "@commitlint/resolve-extends": "^17.4.4", - "@commitlint/types": "^17.4.4", - "@types/node": "*", - "chalk": "^4.1.0", - "cosmiconfig": "^8.0.0", - "cosmiconfig-typescript-loader": "^4.0.0", - "lodash.isplainobject": "^4.0.6", - "lodash.merge": "^4.6.2", - "lodash.uniq": "^4.5.0", - "resolve-from": "^5.0.0", - "ts-node": "^10.8.1", - "typescript": "^4.6.4 || ^5.0.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/load/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@commitlint/load/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@commitlint/load/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@commitlint/load/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@commitlint/load/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@commitlint/load/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@commitlint/message": { - "version": "17.4.2", - "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-17.4.2.tgz", - "integrity": "sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q==", - "dev": true, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/parse": { - "version": "17.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-17.4.4.tgz", - "integrity": "sha512-EKzz4f49d3/OU0Fplog7nwz/lAfXMaDxtriidyGF9PtR+SRbgv4FhsfF310tKxs6EPj8Y+aWWuX3beN5s+yqGg==", - "dev": true, - "dependencies": { - "@commitlint/types": "^17.4.4", - "conventional-changelog-angular": "^5.0.11", - "conventional-commits-parser": "^3.2.2" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/read": { - "version": "17.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-17.4.4.tgz", - "integrity": "sha512-B2TvUMJKK+Svzs6eji23WXsRJ8PAD+orI44lVuVNsm5zmI7O8RSGJMvdEZEikiA4Vohfb+HevaPoWZ7PiFZ3zA==", - "dev": true, - "dependencies": { - "@commitlint/top-level": "^17.4.0", - "@commitlint/types": "^17.4.4", - "fs-extra": "^11.0.0", - "git-raw-commits": "^2.0.0", - "minimist": "^1.2.6" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/resolve-extends": { - "version": "17.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.4.4.tgz", - "integrity": "sha512-znXr1S0Rr8adInptHw0JeLgumS11lWbk5xAWFVno+HUFVN45875kUtqjrI6AppmD3JI+4s0uZlqqlkepjJd99A==", - "dev": true, - "dependencies": { - "@commitlint/config-validator": "^17.4.4", - "@commitlint/types": "^17.4.4", - "import-fresh": "^3.0.0", - "lodash.mergewith": "^4.6.2", - "resolve-from": "^5.0.0", - "resolve-global": "^1.0.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/rules": { - "version": "17.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-17.4.4.tgz", - "integrity": "sha512-0tgvXnHi/mVcyR8Y8mjTFZIa/FEQXA4uEutXS/imH2v1UNkYDSEMsK/68wiXRpfW1euSgEdwRkvE1z23+yhNrQ==", - "dev": true, - "dependencies": { - "@commitlint/ensure": "^17.4.4", - "@commitlint/message": "^17.4.2", - "@commitlint/to-lines": "^17.4.0", - "@commitlint/types": "^17.4.4", - "execa": "^5.0.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/to-lines": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-17.4.0.tgz", - "integrity": "sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg==", - "dev": true, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/top-level": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-17.4.0.tgz", - "integrity": "sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g==", - "dev": true, - "dependencies": { - "find-up": "^5.0.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/types": { - "version": "17.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-17.4.4.tgz", - "integrity": "sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/types/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@commitlint/types/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@commitlint/types/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@commitlint/types/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@commitlint/types/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@commitlint/types/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@gitbeaker/core": { - "version": "21.7.0", - "resolved": "https://registry.npmjs.org/@gitbeaker/core/-/core-21.7.0.tgz", - "integrity": "sha512-cw72rE7tA27wc6JJe1WqeAj9v/6w0S7XJcEji+bRNjTlUfE1zgfW0Gf1mbGUi7F37SOABGCosQLfg9Qe63aIqA==", - "dev": true, - "dependencies": { - "@gitbeaker/requester-utils": "^21.7.0", - "form-data": "^3.0.0", - "li": "^1.3.0", - "xcase": "^2.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@gitbeaker/node": { - "version": "21.7.0", - "resolved": "https://registry.npmjs.org/@gitbeaker/node/-/node-21.7.0.tgz", - "integrity": "sha512-OdM3VcTKYYqboOsnbiPcO0XimXXpYK4gTjARBZ6BWc+1LQXKmqo+OH6oUbyxOoaFu9hHECafIt3WZU3NM4sZTg==", - "dev": true, - "dependencies": { - "@gitbeaker/core": "^21.7.0", - "@gitbeaker/requester-utils": "^21.7.0", - "form-data": "^3.0.0", - "got": "^11.1.4", - "xcase": "^2.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@gitbeaker/requester-utils": { - "version": "21.7.0", - "resolved": "https://registry.npmjs.org/@gitbeaker/requester-utils/-/requester-utils-21.7.0.tgz", - "integrity": "sha512-eLTaVXlBnh8Qimj6QuMMA06mu/mLcJm3dy8nqhhn/Vm/D25sPrvpGwmbfFyvzj6QujPqtHvFfsCHtyZddL01qA==", - "dev": true, - "dependencies": { - "form-data": "^3.0.0", - "query-string": "^6.12.1", - "xcase": "^2.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@octokit/auth-token": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", - "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.0.3" - } - }, - "node_modules/@octokit/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz", - "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==", - "dev": true, - "dependencies": { - "@octokit/auth-token": "^2.4.4", - "@octokit/graphql": "^4.5.8", - "@octokit/request": "^5.6.3", - "@octokit/request-error": "^2.0.5", - "@octokit/types": "^6.0.3", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@octokit/endpoint": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", - "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.0.3", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@octokit/graphql": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", - "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", - "dev": true, - "dependencies": { - "@octokit/request": "^5.6.0", - "@octokit/types": "^6.0.3", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "12.11.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz", - "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==", - "dev": true - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "2.21.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz", - "integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.40.0" - }, - "peerDependencies": { - "@octokit/core": ">=2" - } - }, - "node_modules/@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "dev": true, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz", - "integrity": "sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.39.0", - "deprecation": "^2.3.1" - }, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/request": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", - "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", - "dev": true, - "dependencies": { - "@octokit/endpoint": "^6.0.1", - "@octokit/request-error": "^2.1.0", - "@octokit/types": "^6.16.1", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@octokit/request-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", - "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.0.3", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } - }, - "node_modules/@octokit/rest": { - "version": "18.12.0", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz", - "integrity": "sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==", - "dev": true, - "dependencies": { - "@octokit/core": "^3.5.1", - "@octokit/plugin-paginate-rest": "^2.16.8", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^5.12.0" - } - }, - "node_modules/@octokit/types": { - "version": "6.41.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", - "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", - "dev": true, - "dependencies": { - "@octokit/openapi-types": "^12.11.0" - } - }, - "node_modules/@seadub/danger-plugin-dependencies": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@seadub/danger-plugin-dependencies/-/danger-plugin-dependencies-1.0.0.tgz", - "integrity": "sha512-rk1OGopIHXf5/lfYZEIf6Kr9l1opRSSrhEF36CmXT2aoM3/VrLhB2w7g6nIxvl72ixDUSrXJrD02u/mKGLULxQ==", - "dev": true, - "dependencies": { - "date-fns": "^2.16.1", - "lodash.flatten": "^4.4.0", - "lodash.includes": "^4.3.0", - "node-fetch": "^2.6.1", - "semver": "^7.3.2" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/@seadub/danger-plugin-eslint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@seadub/danger-plugin-eslint/-/danger-plugin-eslint-2.0.0.tgz", - "integrity": "sha512-eOfolDJyWwP5vJQqKLVhr6FDayQfbqwmwPMslFWPMd9AhJfgU85Pz3R8MHfjfsdIzn/zNofnDa5k+GSZtMAZ5g==", - "dev": true, - "engines": { - "node": ">=6.0.0" - }, - "peerDependencies": { - "eslint": "*" - } - }, - "node_modules/@seadub/danger-plugin-junit": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@seadub/danger-plugin-junit/-/danger-plugin-junit-0.3.0.tgz", - "integrity": "sha512-x2PkV5Q7cR9UAhS2jsEgyqs4JP7yXGk2psQKdZFq4zuwRrzsMT0e4JpipSzb05zMaGLqtdwV6oW8XJwS3FpHIQ==", - "dev": true, - "dependencies": { - "@xmldom/xmldom": "^0.7.3", - "fs-extra": "^9.0.1", - "glob": "^7.1.6" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/@seadub/danger-plugin-junit/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "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/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dev": true, - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true - }, - "node_modules/@types/babel__core": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", - "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__core/node_modules/@babel/parser": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", - "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", - "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.3.0" - } - }, - "node_modules/@types/babel-plugin-tester": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@types/babel-plugin-tester/-/babel-plugin-tester-9.0.5.tgz", - "integrity": "sha512-NRBPlhi5VkrTXMqDB1hSUnHs7vqLGRopeukC9u1zilOIFe9O1siwqeKZRiuJiVYakgpeDso/HE2Q5DU1aDqBog==", - "dev": true, - "dependencies": { - "@types/babel__core": "*", - "@types/prettier": "*" - } - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "dev": true, - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", - "dev": true - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "18.15.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.7.tgz", - "integrity": "sha512-LFmUbFunqmBn26wJZgZPYZPrDR1RwGOu2v79Mgcka1ndO6V0/cwjivPTc4yoK6n9kmw4/ls1r8cLrvh2iMibFA==", - "dev": true - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "node_modules/@types/prettier": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", - "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", - "dev": true - }, - "node_modules/@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@xmldom/xmldom": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.9.tgz", - "integrity": "sha512-yceMpm/xd4W2a85iqZyO09gTnHvXF6pyiWjD2jcOJs7hRoZtNNOO1eJlhHj1ixA+xip2hOyGn+LgcvLCMo5zXA==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/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==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "dev": true, - "dependencies": { - "default-require-extensions": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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 - }, - "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.map": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.5.tgz", - "integrity": "sha512-gfaKntvwqYIuC7mLLyv2wzZIJqrRhn5PZ9EfFejSx6a78sV7iDsGpG9P+3oUPtm1Rerqm6nrKS4FYuTIvWfo3g==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" - }, - "node_modules/async-retry": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.2.3.tgz", - "integrity": "sha512-tfDb02Th6CE6pJUF2gjW5ZVjsgwlucVXOEQMvEX9JgSJMs9gAX+Nz3xRuJBKuUYjTSYORqvDBORdAQ3LU59g7Q==", - "dev": true, - "dependencies": { - "retry": "0.12.0" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" - }, - "node_modules/babel-helper-evaluate-path": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.5.0.tgz", - "integrity": "sha512-mUh0UhS607bGh5wUMAQfOpt2JX2ThXMtppHRdRU1kL7ZLRWIXxoV2UIV1r2cAeeNeU1M5SB5/RSUgUxrK8yOkA==" - }, - "node_modules/babel-helper-flip-expressions": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.4.3.tgz", - "integrity": "sha512-rSrkRW4YQ2ETCWww9gbsWk4N0x1BOtln349Tk0dlCS90oT68WMLyGR7WvaMp3eAnsVrCqdUtC19lo1avyGPejA==" - }, - "node_modules/babel-helper-is-nodes-equiv": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz", - "integrity": "sha512-ri/nsMFVRqXn7IyT5qW4/hIAGQxuYUFHa3qsxmPtbk6spZQcYlyDogfVpNm2XYOslH/ULS4VEJGUqQX5u7ACQw==" - }, - "node_modules/babel-helper-is-void-0": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-helper-is-void-0/-/babel-helper-is-void-0-0.4.3.tgz", - "integrity": "sha512-07rBV0xPRM3TM5NVJEOQEkECX3qnHDjaIbFvWYPv+T1ajpUiVLiqTfC+MmiZxY5KOL/Ec08vJdJD9kZiP9UkUg==" - }, - "node_modules/babel-helper-mark-eval-scopes": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.4.3.tgz", - "integrity": "sha512-+d/mXPP33bhgHkdVOiPkmYoeXJ+rXRWi7OdhwpyseIqOS8CmzHQXHUp/+/Qr8baXsT0kjGpMHHofHs6C3cskdA==" - }, - "node_modules/babel-helper-remove-or-void": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.4.3.tgz", - "integrity": "sha512-eYNceYtcGKpifHDir62gHJadVXdg9fAhuZEXiRQnJJ4Yi4oUTpqpNY//1pM4nVyjjDMPYaC2xSf0I+9IqVzwdA==" - }, - "node_modules/babel-helper-to-multiple-sequence-expressions": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.5.0.tgz", - "integrity": "sha512-m2CvfDW4+1qfDdsrtf4dwOslQC3yhbgyBFptncp4wvtdrDHqueW7slsYv4gArie056phvQFhT2nRcGS4bnm6mA==" - }, - "node_modules/babel-plugin-minify-builtins": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.5.0.tgz", - "integrity": "sha512-wpqbN7Ov5hsNwGdzuzvFcjgRlzbIeVv1gMIlICbPj0xkexnfoIDe7q+AZHMkQmAE/F9R5jkrB6TLfTegImlXag==" - }, - "node_modules/babel-plugin-minify-constant-folding": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.5.0.tgz", - "integrity": "sha512-Vj97CTn/lE9hR1D+jKUeHfNy+m1baNiJ1wJvoGyOBUx7F7kJqDZxr9nCHjO/Ad+irbR3HzR6jABpSSA29QsrXQ==", - "dependencies": { - "babel-helper-evaluate-path": "^0.5.0" - } - }, - "node_modules/babel-plugin-minify-dead-code-elimination": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.5.2.tgz", - "integrity": "sha512-krq9Lwi0QIzyAlcNBXTL4usqUvevB4BzktdEsb8srcXC1AaYqRJiAQw6vdKdJSaXbz6snBvziGr6ch/aoRCfpA==", - "dependencies": { - "babel-helper-evaluate-path": "^0.5.0", - "babel-helper-mark-eval-scopes": "^0.4.3", - "babel-helper-remove-or-void": "^0.4.3", - "lodash": "^4.17.11" - } - }, - "node_modules/babel-plugin-minify-flip-comparisons": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.4.3.tgz", - "integrity": "sha512-8hNwgLVeJzpeLVOVArag2DfTkbKodzOHU7+gAZ8mGBFGPQHK6uXVpg3jh5I/F6gfi5Q5usWU2OKcstn1YbAV7A==", - "dependencies": { - "babel-helper-is-void-0": "^0.4.3" - } - }, - "node_modules/babel-plugin-minify-guarded-expressions": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.4.4.tgz", - "integrity": "sha512-RMv0tM72YuPPfLT9QLr3ix9nwUIq+sHT6z8Iu3sLbqldzC1Dls8DPCywzUIzkTx9Zh1hWX4q/m9BPoPed9GOfA==", - "dependencies": { - "babel-helper-evaluate-path": "^0.5.0", - "babel-helper-flip-expressions": "^0.4.3" - } - }, - "node_modules/babel-plugin-minify-infinity": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.4.3.tgz", - "integrity": "sha512-X0ictxCk8y+NvIf+bZ1HJPbVZKMlPku3lgYxPmIp62Dp8wdtbMLSekczty3MzvUOlrk5xzWYpBpQprXUjDRyMA==" - }, - "node_modules/babel-plugin-minify-mangle-names": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.5.1.tgz", - "integrity": "sha512-8KMichAOae2FHlipjNDTo2wz97MdEb2Q0jrn4NIRXzHH7SJ3c5TaNNBkeTHbk9WUsMnqpNUx949ugM9NFWewzw==", - "dependencies": { - "babel-helper-mark-eval-scopes": "^0.4.3" - } - }, - "node_modules/babel-plugin-minify-numeric-literals": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.4.3.tgz", - "integrity": "sha512-5D54hvs9YVuCknfWywq0eaYDt7qYxlNwCqW9Ipm/kYeS9gYhJd0Rr/Pm2WhHKJ8DC6aIlDdqSBODSthabLSX3A==" - }, - "node_modules/babel-plugin-minify-replace": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.5.0.tgz", - "integrity": "sha512-aXZiaqWDNUbyNNNpWs/8NyST+oU7QTpK7J9zFEFSA0eOmtUNMU3fczlTTTlnCxHmq/jYNFEmkkSG3DDBtW3Y4Q==" - }, - "node_modules/babel-plugin-minify-simplify": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.5.1.tgz", - "integrity": "sha512-OSYDSnoCxP2cYDMk9gxNAed6uJDiDz65zgL6h8d3tm8qXIagWGMLWhqysT6DY3Vs7Fgq7YUDcjOomhVUb+xX6A==", - "dependencies": { - "babel-helper-evaluate-path": "^0.5.0", - "babel-helper-flip-expressions": "^0.4.3", - "babel-helper-is-nodes-equiv": "^0.0.1", - "babel-helper-to-multiple-sequence-expressions": "^0.5.0" - } - }, - "node_modules/babel-plugin-minify-type-constructors": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.4.3.tgz", - "integrity": "sha512-4ADB0irJ/6BeXWHubjCJmrPbzhxDgjphBMjIjxCc25n4NGJ00NsYqwYt+F/OvE9RXx8KaSW7cJvp+iZX436tnQ==", - "dependencies": { - "babel-helper-is-void-0": "^0.4.3" - } - }, - "node_modules/babel-plugin-tester": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-tester/-/babel-plugin-tester-10.1.0.tgz", - "integrity": "sha512-4P2tNaM/Mtg6ytA9YAqmgONnMYqWvdbGDuwRTpIIC9yFZGQrEHoyvDPCx+X1QALAufVb5DKieOPGj5dffiEiNg==", - "dev": true, - "dependencies": { - "@types/babel-plugin-tester": "^9.0.0", - "lodash.mergewith": "^4.6.2", - "prettier": "^2.0.1", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=10.13", - "npm": ">=6" - }, - "peerDependencies": { - "@babel/core": "^7.11.6" - } - }, - "node_modules/babel-plugin-transform-inline-consecutive-adds": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.4.3.tgz", - "integrity": "sha512-8D104wbzzI5RlxeVPYeQb9QsUyepiH1rAO5hpPpQ6NPRgQLpIVwkS/Nbx944pm4K8Z+rx7CgjPsFACz/VCBN0Q==" - }, - "node_modules/babel-plugin-transform-member-expression-literals": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.9.4.tgz", - "integrity": "sha512-Xq9/Rarpj+bjOZSl1nBbZYETsNEDDJSrb6Plb1sS3/36FukWFLLRysgecva5KZECjUJTrJoQqjJgtWToaflk5Q==" - }, - "node_modules/babel-plugin-transform-merge-sibling-variables": { - "version": "6.9.5", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.9.5.tgz", - "integrity": "sha512-xj/KrWi6/uP+DrD844h66Qh2cZN++iugEIgH8QcIxhmZZPNP6VpOE9b4gP2FFW39xDAY43kCmYMM6U0QNKN8fw==" - }, - "node_modules/babel-plugin-transform-minify-booleans": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.9.4.tgz", - "integrity": "sha512-9pW9ePng6DZpzGPalcrULuhSCcauGAbn8AeU3bE34HcDkGm8Ldt0ysjGkyb64f0K3T5ilV4mriayOVv5fg0ASA==" - }, - "node_modules/babel-plugin-transform-property-literals": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.9.4.tgz", - "integrity": "sha512-Pf8JHTjTPxecqVyL6KSwD/hxGpoTZjiEgV7nCx0KFQsJYM0nuuoCajbg09KRmZWeZbJ5NGTySABYv8b/hY1eEA==", - "dependencies": { - "esutils": "^2.0.2" - } - }, - "node_modules/babel-plugin-transform-regexp-constructors": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.4.3.tgz", - "integrity": "sha512-JjymDyEyRNhAoNFp09y/xGwYVYzT2nWTGrBrWaL6eCg2m+B24qH2jR0AA8V8GzKJTgC8NW6joJmc6nabvWBD/g==" - }, - "node_modules/babel-plugin-transform-remove-console": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.4.tgz", - "integrity": "sha512-88blrUrMX3SPiGkT1GnvVY8E/7A+k6oj3MNvUtTIxJflFzXTw1bHkuJ/y039ouhFMp2prRn5cQGzokViYi1dsg==" - }, - "node_modules/babel-plugin-transform-remove-debugger": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.9.4.tgz", - "integrity": "sha512-Kd+eTBYlXfwoFzisburVwrngsrz4xh9I0ppoJnU/qlLysxVBRgI4Pj+dk3X8F5tDiehp3hhP8oarRMT9v2Z3lw==" - }, - "node_modules/babel-plugin-transform-remove-undefined": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.5.0.tgz", - "integrity": "sha512-+M7fJYFaEE/M9CXa0/IRkDbiV3wRELzA1kKQFCJ4ifhrzLKn/9VCCgj9OFmYWwBd8IB48YdgPkHYtbYq+4vtHQ==", - "dependencies": { - "babel-helper-evaluate-path": "^0.5.0" - } - }, - "node_modules/babel-plugin-transform-simplify-comparison-operators": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.9.4.tgz", - "integrity": "sha512-GLInxhGAQWJ9YIdjwF6dAFlmh4U+kN8pL6Big7nkDzHoZcaDQOtBm28atEhQJq6m9GpAovbiGEShKqXv4BSp0A==" - }, - "node_modules/babel-plugin-transform-titanium": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-titanium/-/babel-plugin-transform-titanium-0.1.1.tgz", - "integrity": "sha512-N2ImhDNsfmT5Q68HeNJfg1xE8Z3NsVYWC+/TWLtckscXPjleDJRciIRzhUhI6876VXhxSjbw5s7ylv1NTa/xoA==" - }, - "node_modules/babel-plugin-transform-undefined-to-void": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.9.4.tgz", - "integrity": "sha512-D2UbwxawEY1xVc9svYAUZQM2xarwSNXue2qDIx6CeV2EuMGaes/0su78zlIDIAgE7BvnMw4UpmSo9fDy+znghg==" - }, - "node_modules/babel-preset-minify": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-preset-minify/-/babel-preset-minify-0.5.2.tgz", - "integrity": "sha512-v4GL+kk0TfovbRIKZnC3HPbu2cAGmPAby7BsOmuPdMJfHV+4FVdsGXTH/OOGQRKYdjemBuL1+MsE6mobobhe9w==", - "dependencies": { - "babel-plugin-minify-builtins": "^0.5.0", - "babel-plugin-minify-constant-folding": "^0.5.0", - "babel-plugin-minify-dead-code-elimination": "^0.5.2", - "babel-plugin-minify-flip-comparisons": "^0.4.3", - "babel-plugin-minify-guarded-expressions": "^0.4.4", - "babel-plugin-minify-infinity": "^0.4.3", - "babel-plugin-minify-mangle-names": "^0.5.1", - "babel-plugin-minify-numeric-literals": "^0.4.3", - "babel-plugin-minify-replace": "^0.5.0", - "babel-plugin-minify-simplify": "^0.5.1", - "babel-plugin-minify-type-constructors": "^0.4.3", - "babel-plugin-transform-inline-consecutive-adds": "^0.4.3", - "babel-plugin-transform-member-expression-literals": "^6.9.4", - "babel-plugin-transform-merge-sibling-variables": "^6.9.5", - "babel-plugin-transform-minify-booleans": "^6.9.4", - "babel-plugin-transform-property-literals": "^6.9.4", - "babel-plugin-transform-regexp-constructors": "^0.4.3", - "babel-plugin-transform-remove-console": "^6.9.4", - "babel-plugin-transform-remove-debugger": "^6.9.4", - "babel-plugin-transform-remove-undefined": "^0.5.0", - "babel-plugin-transform-simplify-comparison-operators": "^6.9.4", - "babel-plugin-transform-undefined-to-void": "^6.9.4", - "lodash": "^4.17.11" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "engines": { - "node": "*" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "dev": true - }, - "node_modules/buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", - "engines": { - "node": ">=0.2.0" - } - }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "dev": true, - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "dev": true, - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, - "dependencies": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "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/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001469", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001469.tgz", - "integrity": "sha512-Rcp7221ScNqQPP3W+lVOYDyjdR6dC+neEQCttoNr5bAyz54AboB4iwpnWgyi8P4YUsPybVzT4LgWiBbI3drL4g==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chokidar": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", - "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.3.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.1.2" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-truncate": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", - "dev": true, - "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true - }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "node_modules/compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "dev": true, - "dependencies": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "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==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-conventionalcommits": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-5.0.0.tgz", - "integrity": "sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0", - "lodash": "^4.17.15", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "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==", - "dev": true, - "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" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "node_modules/core-js": { - "version": "3.29.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.29.1.tgz", - "integrity": "sha512-+jwgnhg6cQxKYIIjGtAHq2nwUOolo9eoFZ4sHfUH09BLXBgxnH4gA0zEd+t+BO2cNB8idaBtZFcFTRjQJRJmAw==", - "dev": true, - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat": { - "version": "3.29.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.29.1.tgz", - "integrity": "sha512-QmchCua884D8wWskMX8tW5ydINzd8oSJVx38lx/pVkFGqztxt73GYre3pm/hyYq8bPf+MW5In4I/uRShFDsbrA==", - "dependencies": { - "browserslist": "^4.21.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - }, - "node_modules/cosmiconfig": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", - "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", - "dev": true, - "dependencies": { - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - } - }, - "node_modules/cosmiconfig-typescript-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.3.0.tgz", - "integrity": "sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==", - "dev": true, - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "peerDependencies": { - "@types/node": "*", - "cosmiconfig": ">=7", - "ts-node": ">=10", - "typescript": ">=3" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/danger": { - "version": "11.2.4", - "resolved": "https://registry.npmjs.org/danger/-/danger-11.2.4.tgz", - "integrity": "sha512-9tSrDm79+vWijG3zLXp6DQFmUqFLXg8Fl3jZmPhymlfsmAX0NaAc4HbC81pTOsSgOdiJfJHWpDwKu7fsTktFOQ==", - "dev": true, - "dependencies": { - "@gitbeaker/node": "^21.3.0", - "@octokit/rest": "^18.12.0", - "async-retry": "1.2.3", - "chalk": "^2.3.0", - "commander": "^2.18.0", - "core-js": "^3.8.2", - "debug": "^4.1.1", - "fast-json-patch": "^3.0.0-1", - "get-stdin": "^6.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "hyperlinker": "^1.0.0", - "json5": "^2.1.0", - "jsonpointer": "^5.0.0", - "jsonwebtoken": "^9.0.0", - "lodash.find": "^4.6.0", - "lodash.includes": "^4.3.0", - "lodash.isobject": "^3.0.2", - "lodash.keys": "^4.0.8", - "lodash.mapvalues": "^4.6.0", - "lodash.memoize": "^4.1.2", - "memfs-or-file-map-to-github-branch": "^1.2.1", - "micromatch": "^4.0.4", - "node-cleanup": "^2.1.2", - "node-fetch": "^2.6.7", - "override-require": "^1.1.1", - "p-limit": "^2.1.0", - "parse-diff": "^0.7.0", - "parse-git-config": "^2.0.3", - "parse-github-url": "^1.0.2", - "parse-link-header": "^2.0.0", - "pinpoint": "^1.1.0", - "prettyjson": "^1.2.1", - "readline-sync": "^1.4.9", - "regenerator-runtime": "^0.13.9", - "require-from-string": "^2.0.2", - "supports-hyperlinks": "^1.0.1" - }, - "bin": { - "danger": "distribution/commands/danger.js", - "danger-ci": "distribution/commands/danger-ci.js", - "danger-init": "distribution/commands/danger-init.js", - "danger-js": "distribution/commands/danger.js", - "danger-local": "distribution/commands/danger-local.js", - "danger-pr": "distribution/commands/danger-pr.js", - "danger-process": "distribution/commands/danger-process.js", - "danger-reset-status": "distribution/commands/danger-reset-status.js", - "danger-runner": "distribution/commands/danger-runner.js" - }, - "engines": { - "node": ">=14.13.1" - } - }, - "node_modules/dargs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", - "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/date-fns": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", - "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", - "dev": true, - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "dev": true, - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true, - "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, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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 - }, - "node_modules/default-require-extensions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", - "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", - "dev": true, - "dependencies": { - "strip-bom": "^4.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "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, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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 - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.340", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.340.tgz", - "integrity": "sha512-zx8hqumOqltKsv/MF50yvdAlPF9S/4PXbyfzJS6ZGhbddGkRegdwImmfSVqCkEziYzrIGZ/TlrzBND4FysfkDg==" - }, - "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 - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "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==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "dev": true - }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.4.0.tgz", - "integrity": "sha512-gU+lxhlPHu45H3JkEGgYhWhkR9wLHHEXC9FbWFnTlEkbKyZKWgWRLgf61E8zWmBuI6g5xKBph9ltg3NtZMVF8g==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "eslint-scope": "^5.1.0", - "eslint-utils": "^2.0.0", - "eslint-visitor-keys": "^1.2.0", - "espree": "^7.1.0", - "esquery": "^1.2.0", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-axway": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/eslint-config-axway/-/eslint-config-axway-6.0.2.tgz", - "integrity": "sha512-+O+kCrTycij3Vyk+hJtljZy/Xa/Xz0PdkJm4c4DRed6YT7JuSVpoH4UPCST/xCT9/Nonpy8VuyuZTa3kneHdjw==", - "dev": true, - "dependencies": { - "eslint-plugin-chai-expect": "^2.2.0", - "eslint-plugin-import": "^2.22.1", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^5.1.0", - "eslint-plugin-security": "^1.4.0", - "find-root": "^1.1.0", - "semver": "^7.3.4" - }, - "peerDependencies": { - "eslint": "7.x" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", - "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-chai-expect": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-chai-expect/-/eslint-plugin-chai-expect-2.2.0.tgz", - "integrity": "sha512-ExTJKhgeYMfY8wDj3UiZmgpMKJOUHGNHmWMlxT49JUDB1vTnw0sSNfXJSxnX+LcebyBD/gudXzjzD136WqPJrQ==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - }, - "peerDependencies": { - "eslint": ">=2.0.0 <= 7.x" - } - }, - "node_modules/eslint-plugin-es": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", - "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", - "dev": true, - "dependencies": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, - "engines": { - "node": ">=8.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=4.19.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", - "has": "^1.0.3", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-mocha": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-9.0.0.tgz", - "integrity": "sha512-d7knAcQj1jPCzZf3caeBIn3BnW6ikcvfz0kSqQpwPYcVGLoJV5sz0l0OJB2LR8I7dvTDbqq1oV6ylhSgzA10zg==", - "dev": true, - "dependencies": { - "eslint-utils": "^3.0.0", - "ramda": "^0.27.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-mocha/node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-plugin-node": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", - "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", - "dev": true, - "dependencies": { - "eslint-plugin-es": "^3.0.0", - "eslint-utils": "^2.0.0", - "ignore": "^5.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.10.1", - "semver": "^6.1.0" - }, - "engines": { - "node": ">=8.10.0" - }, - "peerDependencies": { - "eslint": ">=5.16.0" - } - }, - "node_modules/eslint-plugin-node/node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/eslint-plugin-node/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-promise": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-5.2.0.tgz", - "integrity": "sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw==", - "dev": true, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "peerDependencies": { - "eslint": "^7.0.0" - } - }, - "node_modules/eslint-plugin-security": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.7.1.tgz", - "integrity": "sha512-sMStceig8AFglhhT2LqlU5r+/fn9OwsA72O5bBuQVTssPCdQAOQzL+oMn/ZcpeUY6KcNfLJArgcrsSULNjYYdQ==", - "dev": true, - "dependencies": { - "safe-regex": "^2.1.1" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "dependencies": { - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/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==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.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==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "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/expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", - "dev": true, - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, - "engines": { - "node": ">=0.10.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==" - }, - "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, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-json-patch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", - "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==", - "dev": true - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "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 - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "dependencies": { - "flat-cache": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/filter-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", - "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "dev": true - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", - "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", - "dev": true, - "dependencies": { - "is-buffer": "~2.0.3" - }, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "dependencies": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/fs-exists-sync": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", - "integrity": "sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "deprecated": "\"Please update to latest v2.3 or v2.2\"", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/git-config-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/git-config-path/-/git-config-path-1.0.1.tgz", - "integrity": "sha512-KcJ2dlrrP5DbBnYIZ2nlikALfRhKzNSX0stvv3ImJ+fvC4hXKoV+U+74SV0upg+jlQZbrtQzc0bu6/Zh+7aQbg==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "fs-exists-sync": "^0.1.0", - "homedir-polyfill": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "dev": true, - "dependencies": { - "dargs": "^7.0.0", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "git-raw-commits": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", - "dev": true, - "dependencies": { - "ini": "^1.3.4" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true, - "engines": { - "node": ">=4.x" - } - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/har-validator/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/har-validator/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "dependencies": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hasha/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "dependencies": { - "parse-passwd": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/hosted-git-info/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==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/hosted-git-info/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "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==", - "dev": true - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dev": true, - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/husky": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", - "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", - "dev": true, - "bin": { - "husky": "lib/bin.js" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/typicode" - } - }, - "node_modules/hyperlinker": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hyperlinker/-/hyperlinker-1.0.0.tgz", - "integrity": "sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "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 - }, - "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=4" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dev": true, - "dependencies": { - "text-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "dependencies": { - "append-transform": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/istanbul-lib-processinfo": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", - "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", - "dev": true, - "dependencies": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.3", - "istanbul-lib-coverage": "^3.2.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-processinfo/node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-processinfo/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/iterate-iterator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.2.tgz", - "integrity": "sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/iterate-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", - "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", - "dev": true, - "dependencies": { - "es-get-iterator": "^1.0.2", - "iterate-iterator": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "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==" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/jsonpointer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", - "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/jsonwebtoken": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", - "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", - "dev": true, - "dependencies": { - "jws": "^3.2.2", - "lodash": "^4.17.21", - "ms": "^2.1.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "dev": true, - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "dev": true, - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/levenary": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", - "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", - "dependencies": { - "leven": "^3.1.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/li": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/li/-/li-1.3.0.tgz", - "integrity": "sha512-z34TU6GlMram52Tss5mt1m//ifRIpKH5Dqm7yUVOdHI+BQCs9qGPHFaCUTIzsWX7edN30aa2WrPwR7IO10FHaw==", - "dev": true - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/lint-staged": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.0.tgz", - "integrity": "sha512-GbyK5iWinax5Dfw5obm2g2ccUiZXNGtAS4mCbJ0Lv4rq6iEtfBSjOYdcbOtAIFtM114t0vdpViDDetjVTSd8Vw==", - "dev": true, - "dependencies": { - "chalk": "5.2.0", - "cli-truncate": "^3.1.0", - "commander": "^10.0.0", - "debug": "^4.3.4", - "execa": "^7.0.0", - "lilconfig": "2.1.0", - "listr2": "^5.0.7", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-inspect": "^1.12.3", - "pidtree": "^0.6.0", - "string-argv": "^0.3.1", - "yaml": "^2.2.1" - }, - "bin": { - "lint-staged": "bin/lint-staged.js" - }, - "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/lint-staged" - } - }, - "node_modules/lint-staged/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/commander": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", - "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/lint-staged/node_modules/execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true, - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/lint-staged/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, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dev": true, - "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/lint-staged/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/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, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/listr2": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", - "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", - "dev": true, - "dependencies": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.19", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rfdc": "^1.3.0", - "rxjs": "^7.8.0", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" - }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } - } - }, - "node_modules/listr2/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/listr2/node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/listr2/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/listr2/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/listr2/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/listr2/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/listr2/node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/listr2/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true - }, - "node_modules/lodash.find": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.find/-/lodash.find-4.6.0.tgz", - "integrity": "sha512-yaRZoAV3Xq28F1iafWN1+a0rflOej93l1DQUejs3SZ41h2O9UJBoS9aueGjPDgAl4B6tPC0NuuchLKaDQQ3Isg==", - "dev": true - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", - "dev": true - }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "dev": true - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", - "dev": true - }, - "node_modules/lodash.isfunction": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", - "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", - "dev": true - }, - "node_modules/lodash.isobject": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", - "integrity": "sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA==", - "dev": true - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true - }, - "node_modules/lodash.kebabcase": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", - "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", - "dev": true - }, - "node_modules/lodash.keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-4.2.0.tgz", - "integrity": "sha512-J79MkJcp7Df5mizHiVNpjoHXLi4HLjh9VLS/M7lQSGoQ+0oQ+lWEigREkqKyizPB1IawvQLLKY8mzEcm1tkyxQ==", - "dev": true - }, - "node_modules/lodash.mapvalues": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", - "integrity": "sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==", - "dev": true - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.mergewith": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", - "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", - "dev": true - }, - "node_modules/lodash.snakecase": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", - "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", - "dev": true - }, - "node_modules/lodash.startcase": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", - "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", - "dev": true - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true - }, - "node_modules/lodash.upperfirst": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", - "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", - "dev": true - }, - "node_modules/log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-update/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-update/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/log-update/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/memfs-or-file-map-to-github-branch": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/memfs-or-file-map-to-github-branch/-/memfs-or-file-map-to-github-branch-1.2.1.tgz", - "integrity": "sha512-I/hQzJ2a/pCGR8fkSQ9l5Yx+FQ4e7X6blNHyWBm2ojeFLT3GVzGkTj7xnyWpdclrr7Nq4dmx3xrvu70m3ypzAQ==", - "dev": true, - "dependencies": { - "@octokit/rest": "^16.43.0 || ^17.11.0 || ^18.12.0" - } - }, - "node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dev": true, - "dependencies": { - "@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_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.1.1.tgz", - "integrity": "sha512-p7FuGlYH8t7gaiodlFreseLxEmxTgvyG9RgPHODFPySNhwUehu8NIb0vdSt3WFckSneswZ0Un5typYcWElk7HQ==", - "dev": true, - "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.3.1", - "debug": "3.2.6", - "diff": "4.0.2", - "escape-string-regexp": "1.0.5", - "find-up": "4.1.0", - "glob": "7.1.6", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "3.0.0", - "minimatch": "3.0.4", - "ms": "2.1.2", - "object.assign": "4.1.0", - "promise.allsettled": "1.0.2", - "serialize-javascript": "4.0.0", - "strip-json-comments": "3.0.1", - "supports-color": "7.1.0", - "which": "2.0.2", - "wide-align": "1.1.3", - "workerpool": "6.0.0", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.1" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 10.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/mocha-jenkins-reporter": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/mocha-jenkins-reporter/-/mocha-jenkins-reporter-0.4.8.tgz", - "integrity": "sha512-1nz1Q+YgREUlh2kgFR+lrp+ufEFbdhCdtlEVEJR/5LhgqNLIg52+KG3X94hHpwWnf5SwYLS7udxgBbkWOUbyeQ==", - "dev": true, - "dependencies": { - "diff": "4.0.1", - "mkdirp": "^1.0.4", - "xml": "^1.0.1" - }, - "peerDependencies": { - "mocha": "^5.2.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0" - } - }, - "node_modules/mocha-jenkins-reporter/node_modules/diff": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", - "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/mocha/node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/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, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/mocha/node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/mocha/node_modules/debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/mocha/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/mocha/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/mocha/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/mocha/node_modules/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/mocha/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mocha/node_modules/object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mocha/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/mocha/node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "node_modules/mocha/node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/mocha/node_modules/yargs/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/yargs/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/yargs/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/yargs/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==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/node-appc": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/node-appc/-/node-appc-1.1.6.tgz", - "integrity": "sha512-ZfoHjoDLpNfXYBshztIq+aTjtlvCZF4XAE00ZYNk4u+/qAjQI+8BidCn957b69WzronQtyNw2NtnJEhsP3N7EQ==", - "dependencies": { - "@xmldom/xmldom": "^0.8.6", - "async": "^3.2.4", - "colors": "1.4.0", - "fs-extra": "~9.1.0", - "request": "~2.88.0", - "semver": "~7.3.8", - "sprintf": "^0.1.5", - "temp": "~0.9.4", - "uuid": "~9.0.0", - "yauzl": "^2.10.0" - }, - "engines": { - "node": ">=10.13" - } - }, - "node_modules/node-appc/node_modules/@xmldom/xmldom": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.6.tgz", - "integrity": "sha512-uRjjusqpoqfmRkTaNuLJ2VohVr67Q5YwDATW3VU7PfzTj6IRaihGrYI7zckGZjxQPBIp63nfvJbM+Yu5ICh0Bg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/node-appc/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-cleanup": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/node-cleanup/-/node-cleanup-2.1.2.tgz", - "integrity": "sha512-qN8v/s2PAJwGUtr1/hYTpNKlD6Y9rc4p8KSmJXyGdYGZsDGKXrGThikLFP9OCHFeLeEpQzPwiAtdIvBLqm//Hw==", - "dev": true - }, - "node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", - "dev": true, - "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-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "dependencies": { - "process-on-spawn": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" - }, - "node_modules/node-uuid": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", - "integrity": "sha512-TkCET/3rr9mUuRp+CpO7qfgT++aAxfDRaalQhwPFzI9BY/2rCDn6OfpZOVggi1AXfTPpfkTrg5f5WQx5G1uLxA==", - "deprecated": "Use uuid module instead", - "bin": { - "uuid": "bin/uuid" - } - }, - "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==", - "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "dependencies": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "bin": { - "nyc": "bin/nyc.js" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/nyc/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/nyc/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/nyc/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/nyc/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/nyc/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/nyc/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/nyc/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "engines": { - "node": "*" - } - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/override-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/override-require/-/override-require-1.1.1.tgz", - "integrity": "sha512-eoJ9YWxFcXbrn2U8FKT6RV+/Kj7fiGAB1VvHzbYKt8xM5ZuKZgCGvnHzDxmreEjcBH28ejg5MiOH4iyY1mQnkg==", - "dev": true - }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-diff": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/parse-diff/-/parse-diff-0.7.1.tgz", - "integrity": "sha512-1j3l8IKcy4yRK2W4o9EYvJLSzpAVwz4DXqCewYyx2vEwk2gcf3DBPqc8Fj4XV3K33OYJ08A8fWwyu/ykD/HUSg==", - "dev": true - }, - "node_modules/parse-git-config": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/parse-git-config/-/parse-git-config-2.0.3.tgz", - "integrity": "sha512-Js7ueMZOVSZ3tP8C7E3KZiHv6QQl7lnJ+OkbxoaFazzSa2KyEHqApfGbU3XboUgUnq4ZuUmskUpYKTNx01fm5A==", - "dev": true, - "dependencies": { - "expand-tilde": "^2.0.2", - "git-config-path": "^1.0.1", - "ini": "^1.3.5" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-github-url": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", - "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", - "dev": true, - "bin": { - "parse-github-url": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-link-header": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-link-header/-/parse-link-header-2.0.0.tgz", - "integrity": "sha512-xjU87V0VyHZybn2RrCX5TIFGxTVZE6zqqZWMPlIKiSKuWh/X5WZdt+w1Ki1nXB+8L/KtL+nZ4iq+sfI6MrhhMw==", - "dev": true, - "dependencies": { - "xtend": "~4.0.1" - } - }, - "node_modules/parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pidtree": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", - "dev": true, - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/pinpoint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pinpoint/-/pinpoint-1.1.0.tgz", - "integrity": "sha512-+04FTD9x7Cls2rihLlo57QDCcHoLBGn5Dk51SwtFBWkUWLxZaBXyNVpCw1S+atvE7GmnFjeaRZ0WLq3UYuqAdg==", - "dev": true - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", - "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettyjson": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/prettyjson/-/prettyjson-1.2.5.tgz", - "integrity": "sha512-rksPWtoZb2ZpT5OVgtmy0KHVM+Dca3iVwWY9ifwhcexfjebtgjg3wmrUt9PvJ59XIYBcknQeYHD8IAnVlh9lAw==", - "dev": true, - "dependencies": { - "colors": "1.4.0", - "minimist": "^1.2.0" - }, - "bin": { - "prettyjson": "bin/prettyjson" - } - }, - "node_modules/process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "dev": true, - "dependencies": { - "fromentries": "^1.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise.allsettled": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.2.tgz", - "integrity": "sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg==", - "dev": true, - "dependencies": { - "array.prototype.map": "^1.0.1", - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "iterate-value": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "engines": { - "node": ">=6" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/query-string": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.14.1.tgz", - "integrity": "sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==", - "dev": true, - "dependencies": { - "decode-uri-component": "^0.2.0", - "filter-obj": "^1.1.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ramda": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz", - "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==", - "dev": true - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", - "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", - "dev": true, - "dependencies": { - "picomatch": "^2.0.7" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/readline-sync": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz", - "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "node_modules/regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regexp-tree": { - "version": "0.1.24", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz", - "integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==", - "dev": true, - "bin": { - "regexp-tree": "bin/regexp-tree" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", - "dev": true, - "dependencies": { - "es6-error": "^4.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-global": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", - "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", - "dev": true, - "dependencies": { - "global-dirs": "^0.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dev": true, - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "dev": true - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", - "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", - "dev": true, - "dependencies": { - "regexp-tree": "~0.1.1" - } - }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/should": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", - "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", - "dev": true, - "dependencies": { - "should-equal": "^2.0.0", - "should-format": "^3.0.3", - "should-type": "^1.4.0", - "should-type-adaptors": "^1.0.1", - "should-util": "^1.0.0" - } - }, - "node_modules/should-equal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", - "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", - "dev": true, - "dependencies": { - "should-type": "^1.4.0" - } - }, - "node_modules/should-format": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", - "integrity": "sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==", - "dev": true, - "dependencies": { - "should-type": "^1.3.0", - "should-type-adaptors": "^1.0.1" - } - }, - "node_modules/should-type": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", - "integrity": "sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==", - "dev": true - }, - "node_modules/should-type-adaptors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", - "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", - "dev": true, - "dependencies": { - "should-type": "^1.3.0", - "should-util": "^1.0.0" - } - }, - "node_modules/should-util": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", - "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==", - "dev": true - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "dependencies": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "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, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", - "dev": true - }, - "node_modules/split-on-first": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", - "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "dev": true, - "dependencies": { - "readable-stream": "^3.0.0" - } - }, - "node_modules/sprintf": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/sprintf/-/sprintf-0.1.5.tgz", - "integrity": "sha512-4X5KsuXFQ7f+d7Y+bi4qSb6eI+YoifDTGr0MQJXRoYO7BO7evfRCjds6kk3z7l5CiJYxgDN1x5Er4WiyCt+zTQ==", - "deprecated": "The sprintf package is deprecated in favor of sprintf-js.", - "engines": { - "node": ">=0.2.4" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dev": true, - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/stream-splitter": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/stream-splitter/-/stream-splitter-0.3.2.tgz", - "integrity": "sha512-9VAHJIhskQFJMbyKbf/5flSXV2HsP9MDFdCp3A8WDBWkZ8tP/SOfkI2c5lEHNNUNzbWdNkJEv6iNvQRJnSbYuA==", - "dependencies": { - "buffers": "~0.1.1" - } - }, - "node_modules/strict-uri-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", - "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-argv": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", - "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", - "dev": true, - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/string-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, - "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/string-width/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-hyperlinks": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz", - "integrity": "sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw==", - "dev": true, - "dependencies": { - "has-flag": "^2.0.0", - "supports-color": "^5.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-hyperlinks/node_modules/has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "dependencies": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/table/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/table/node_modules/astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/table/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/table/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/table/node_modules/slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/table/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/table/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/temp": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", - "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", - "dependencies": { - "mkdirp": "^0.5.1", - "rimraf": "~2.6.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "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==", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "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==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node/node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", - "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=12.20" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "engines": { - "node": ">=4" - } - }, - "node_modules/universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", - "dev": true - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unorm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", - "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "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==", - "dev": true - }, - "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==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", - "dev": true - }, - "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2" - } - }, - "node_modules/wide-align/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/workerpool": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.0.tgz", - "integrity": "sha512-fU2OcNA/GVAJLLyKUoHkAgIhKb0JoCpSjLC/G2vYKxUjVmQwGbRVeoPJ1a8U4pnVofz4AQV5Y/NEw8oKqxEBtA==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "dependencies": { - "mkdirp": "^0.5.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/write/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==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/xcase": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/xcase/-/xcase-2.0.1.tgz", - "integrity": "sha512-UmFXIPU+9Eg3E9m/728Bii0lAIuoc+6nbrNUKaRPJOFp91ih44qqGlWtxMB6kXFrRD6po+86ksHM5XHCfk6iPw==", - "dev": true - }, - "node_modules/xml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", - "dev": true - }, - "node_modules/xmldom": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.6.0.tgz", - "integrity": "sha512-iAcin401y58LckRZ0TkI4k0VSM1Qg0KGSc3i8rU+xrxe19A/BN1zHyVSJY7uoutVlaTSzYyk/v5AmkewAP7jtg==", - "engines": { - "node": ">=10.0.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==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "node_modules/yaml": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz", - "integrity": "sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==", - "dev": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.1.tgz", - "integrity": "sha512-qZV14lK9MWsGCmcr7u5oXGH0dbGqZAIxTDrWXZDo5zUr6b6iUmelNKO6x6R1dQT24AH3LgRxJpr8meWy2unolA==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "decamelize": "^1.2.0", - "flat": "^4.1.0", - "is-plain-obj": "^1.1.0", - "yargs": "^14.2.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs-unparser/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs-unparser/node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/yargs-unparser/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/yargs-unparser/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs-unparser/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/yargs-unparser/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs-unparser/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs-unparser/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==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/yargs-unparser/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs-unparser/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs-unparser/node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs-unparser/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/yargs-unparser/node_modules/yargs": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", - "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", - "dev": true, - "dependencies": { - "cliui": "^5.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^15.0.1" - } - }, - "node_modules/yargs-unparser/node_modules/yargs-parser": { - "version": "15.0.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.3.tgz", - "integrity": "sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/compat-data": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", - "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==" - }, - "@babel/core": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.6.tgz", - "integrity": "sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.6", - "@babel/helper-module-transforms": "^7.11.0", - "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.11.5", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.11.5", - "@babel/types": "^7.11.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "@babel/generator": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz", - "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==", - "requires": { - "@babel/types": "^7.21.3", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", - "requires": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", - "requires": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz", - "integrity": "sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-member-expression-to-functions": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.0.tgz", - "integrity": "sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.3.1" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", - "requires": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz", - "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==", - "requires": { - "@babel/types": "^7.21.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==" - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-replace-supers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", - "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.20.7", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" - } - }, - "@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "requires": { - "@babel/types": "^7.20.2" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", - "requires": { - "@babel/types": "^7.20.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==" - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" - }, - "@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==" - }, - "@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", - "requires": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" - } - }, - "@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", - "requires": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" - } - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==" - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "requires": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", - "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", - "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", - "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", - "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", - "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", - "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/template": "^7.20.7" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", - "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz", - "integrity": "sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", - "requires": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", - "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", - "requires": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz", - "integrity": "sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==", - "requires": { - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-simple-access": "^7.20.2" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", - "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", - "requires": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-identifier": "^7.19.1" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", - "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", - "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.1.tgz", - "integrity": "sha512-Kr6+mgag8auNrgEpbfIWzdXYOvqDHZOF0+Bx2xh4H2EDNwcbRb9lY6nkZg8oSjsX+DH9Ebxm9hOqtKW+gRDeNA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", - "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "regenerator-transform": "^0.15.1" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", - "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/preset-env": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.10.2.tgz", - "integrity": "sha512-MjqhX0RZaEgK/KueRzh+3yPSk30oqDKJ5HP5tqTSB1e2gzGS3PLy7K0BIpnp78+0anFuSwOeuCf1zZO7RzRvEA==", - "requires": { - "@babel/compat-data": "^7.10.1", - "@babel/helper-compilation-targets": "^7.10.2", - "@babel/helper-module-imports": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/plugin-proposal-async-generator-functions": "^7.10.1", - "@babel/plugin-proposal-class-properties": "^7.10.1", - "@babel/plugin-proposal-dynamic-import": "^7.10.1", - "@babel/plugin-proposal-json-strings": "^7.10.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.1", - "@babel/plugin-proposal-numeric-separator": "^7.10.1", - "@babel/plugin-proposal-object-rest-spread": "^7.10.1", - "@babel/plugin-proposal-optional-catch-binding": "^7.10.1", - "@babel/plugin-proposal-optional-chaining": "^7.10.1", - "@babel/plugin-proposal-private-methods": "^7.10.1", - "@babel/plugin-proposal-unicode-property-regex": "^7.10.1", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.10.1", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-json-strings": "^7.8.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-syntax-numeric-separator": "^7.10.1", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.10.1", - "@babel/plugin-transform-arrow-functions": "^7.10.1", - "@babel/plugin-transform-async-to-generator": "^7.10.1", - "@babel/plugin-transform-block-scoped-functions": "^7.10.1", - "@babel/plugin-transform-block-scoping": "^7.10.1", - "@babel/plugin-transform-classes": "^7.10.1", - "@babel/plugin-transform-computed-properties": "^7.10.1", - "@babel/plugin-transform-destructuring": "^7.10.1", - "@babel/plugin-transform-dotall-regex": "^7.10.1", - "@babel/plugin-transform-duplicate-keys": "^7.10.1", - "@babel/plugin-transform-exponentiation-operator": "^7.10.1", - "@babel/plugin-transform-for-of": "^7.10.1", - "@babel/plugin-transform-function-name": "^7.10.1", - "@babel/plugin-transform-literals": "^7.10.1", - "@babel/plugin-transform-member-expression-literals": "^7.10.1", - "@babel/plugin-transform-modules-amd": "^7.10.1", - "@babel/plugin-transform-modules-commonjs": "^7.10.1", - "@babel/plugin-transform-modules-systemjs": "^7.10.1", - "@babel/plugin-transform-modules-umd": "^7.10.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", - "@babel/plugin-transform-new-target": "^7.10.1", - "@babel/plugin-transform-object-super": "^7.10.1", - "@babel/plugin-transform-parameters": "^7.10.1", - "@babel/plugin-transform-property-literals": "^7.10.1", - "@babel/plugin-transform-regenerator": "^7.10.1", - "@babel/plugin-transform-reserved-words": "^7.10.1", - "@babel/plugin-transform-shorthand-properties": "^7.10.1", - "@babel/plugin-transform-spread": "^7.10.1", - "@babel/plugin-transform-sticky-regex": "^7.10.1", - "@babel/plugin-transform-template-literals": "^7.10.1", - "@babel/plugin-transform-typeof-symbol": "^7.10.1", - "@babel/plugin-transform-unicode-escapes": "^7.10.1", - "@babel/plugin-transform-unicode-regex": "^7.10.1", - "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.10.2", - "browserslist": "^4.12.0", - "core-js-compat": "^3.6.2", - "invariant": "^2.2.2", - "levenary": "^1.1.1", - "semver": "^5.5.0" - }, - "dependencies": { - "@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" - }, - "@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", - "requires": { - "regenerator-runtime": "^0.13.11" - } - }, - "@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" - }, - "dependencies": { - "@babel/parser": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", - "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==" - } - } - }, - "@babel/traverse": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz", - "integrity": "sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==", - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.3", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.3", - "@babel/types": "^7.21.3", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "@babel/parser": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", - "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==" - } - } - }, - "@babel/types": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", - "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==", - "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - } - }, - "@commitlint/cli": { - "version": "17.5.0", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.5.0.tgz", - "integrity": "sha512-yNW3+M7UM1ioK28LKTrryIVB5qGpXlEv8+rJQiWPMZNayy9/1XR5+lL8qBTNlgopYtZWWnIm5RETcAN29ZTL/A==", - "dev": true, - "requires": { - "@commitlint/format": "^17.4.4", - "@commitlint/lint": "^17.4.4", - "@commitlint/load": "^17.5.0", - "@commitlint/read": "^17.4.4", - "@commitlint/types": "^17.4.4", - "execa": "^5.0.0", - "lodash.isfunction": "^3.0.9", - "resolve-from": "5.0.0", - "resolve-global": "1.0.0", - "yargs": "^17.0.0" - } - }, - "@commitlint/config-conventional": { - "version": "17.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.4.4.tgz", - "integrity": "sha512-u6ztvxqzi6NuhrcEDR7a+z0yrh11elY66nRrQIpqsqW6sZmpxYkDLtpRH8jRML+mmxYQ8s4qqF06Q/IQx5aJeQ==", - "dev": true, - "requires": { - "conventional-changelog-conventionalcommits": "^5.0.0" - } - }, - "@commitlint/config-validator": { - "version": "17.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.4.4.tgz", - "integrity": "sha512-bi0+TstqMiqoBAQDvdEP4AFh0GaKyLFlPPEObgI29utoKEYoPQTvF0EYqIwYYLEoJYhj5GfMIhPHJkTJhagfeg==", - "dev": true, - "requires": { - "@commitlint/types": "^17.4.4", - "ajv": "^8.11.0" - } - }, - "@commitlint/ensure": { - "version": "17.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-17.4.4.tgz", - "integrity": "sha512-AHsFCNh8hbhJiuZ2qHv/m59W/GRE9UeOXbkOqxYMNNg9pJ7qELnFcwj5oYpa6vzTSHtPGKf3C2yUFNy1GGHq6g==", - "dev": true, - "requires": { - "@commitlint/types": "^17.4.4", - "lodash.camelcase": "^4.3.0", - "lodash.kebabcase": "^4.1.1", - "lodash.snakecase": "^4.1.1", - "lodash.startcase": "^4.4.0", - "lodash.upperfirst": "^4.3.1" - } - }, - "@commitlint/execute-rule": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-17.4.0.tgz", - "integrity": "sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==", - "dev": true - }, - "@commitlint/format": { - "version": "17.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-17.4.4.tgz", - "integrity": "sha512-+IS7vpC4Gd/x+uyQPTAt3hXs5NxnkqAZ3aqrHd5Bx/R9skyCAWusNlNbw3InDbAK6j166D9asQM8fnmYIa+CXQ==", - "dev": true, - "requires": { - "@commitlint/types": "^17.4.4", - "chalk": "^4.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@commitlint/is-ignored": { - "version": "17.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.4.4.tgz", - "integrity": "sha512-Y3eo1SFJ2JQDik4rWkBC4tlRIxlXEFrRWxcyrzb1PUT2k3kZ/XGNuCDfk/u0bU2/yS0tOA/mTjFsV+C4qyACHw==", - "dev": true, - "requires": { - "@commitlint/types": "^17.4.4", - "semver": "7.3.8" - } - }, - "@commitlint/lint": { - "version": "17.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.4.4.tgz", - "integrity": "sha512-qgkCRRFjyhbMDWsti/5jRYVJkgYZj4r+ZmweZObnbYqPUl5UKLWMf9a/ZZisOI4JfiPmRktYRZ2JmqlSvg+ccw==", - "dev": true, - "requires": { - "@commitlint/is-ignored": "^17.4.4", - "@commitlint/parse": "^17.4.4", - "@commitlint/rules": "^17.4.4", - "@commitlint/types": "^17.4.4" - } - }, - "@commitlint/load": { - "version": "17.5.0", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.5.0.tgz", - "integrity": "sha512-l+4W8Sx4CD5rYFsrhHH8HP01/8jEP7kKf33Xlx2Uk2out/UKoKPYMOIRcDH5ppT8UXLMV+x6Wm5osdRKKgaD1Q==", - "dev": true, - "requires": { - "@commitlint/config-validator": "^17.4.4", - "@commitlint/execute-rule": "^17.4.0", - "@commitlint/resolve-extends": "^17.4.4", - "@commitlint/types": "^17.4.4", - "@types/node": "*", - "chalk": "^4.1.0", - "cosmiconfig": "^8.0.0", - "cosmiconfig-typescript-loader": "^4.0.0", - "lodash.isplainobject": "^4.0.6", - "lodash.merge": "^4.6.2", - "lodash.uniq": "^4.5.0", - "resolve-from": "^5.0.0", - "ts-node": "^10.8.1", - "typescript": "^4.6.4 || ^5.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@commitlint/message": { - "version": "17.4.2", - "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-17.4.2.tgz", - "integrity": "sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q==", - "dev": true - }, - "@commitlint/parse": { - "version": "17.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-17.4.4.tgz", - "integrity": "sha512-EKzz4f49d3/OU0Fplog7nwz/lAfXMaDxtriidyGF9PtR+SRbgv4FhsfF310tKxs6EPj8Y+aWWuX3beN5s+yqGg==", - "dev": true, - "requires": { - "@commitlint/types": "^17.4.4", - "conventional-changelog-angular": "^5.0.11", - "conventional-commits-parser": "^3.2.2" - } - }, - "@commitlint/read": { - "version": "17.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-17.4.4.tgz", - "integrity": "sha512-B2TvUMJKK+Svzs6eji23WXsRJ8PAD+orI44lVuVNsm5zmI7O8RSGJMvdEZEikiA4Vohfb+HevaPoWZ7PiFZ3zA==", - "dev": true, - "requires": { - "@commitlint/top-level": "^17.4.0", - "@commitlint/types": "^17.4.4", - "fs-extra": "^11.0.0", - "git-raw-commits": "^2.0.0", - "minimist": "^1.2.6" - } - }, - "@commitlint/resolve-extends": { - "version": "17.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.4.4.tgz", - "integrity": "sha512-znXr1S0Rr8adInptHw0JeLgumS11lWbk5xAWFVno+HUFVN45875kUtqjrI6AppmD3JI+4s0uZlqqlkepjJd99A==", - "dev": true, - "requires": { - "@commitlint/config-validator": "^17.4.4", - "@commitlint/types": "^17.4.4", - "import-fresh": "^3.0.0", - "lodash.mergewith": "^4.6.2", - "resolve-from": "^5.0.0", - "resolve-global": "^1.0.0" - } - }, - "@commitlint/rules": { - "version": "17.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-17.4.4.tgz", - "integrity": "sha512-0tgvXnHi/mVcyR8Y8mjTFZIa/FEQXA4uEutXS/imH2v1UNkYDSEMsK/68wiXRpfW1euSgEdwRkvE1z23+yhNrQ==", - "dev": true, - "requires": { - "@commitlint/ensure": "^17.4.4", - "@commitlint/message": "^17.4.2", - "@commitlint/to-lines": "^17.4.0", - "@commitlint/types": "^17.4.4", - "execa": "^5.0.0" - } - }, - "@commitlint/to-lines": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-17.4.0.tgz", - "integrity": "sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg==", - "dev": true - }, - "@commitlint/top-level": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-17.4.0.tgz", - "integrity": "sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g==", - "dev": true, - "requires": { - "find-up": "^5.0.0" - } - }, - "@commitlint/types": { - "version": "17.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-17.4.4.tgz", - "integrity": "sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==", - "dev": true, - "requires": { - "chalk": "^4.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } - } - }, - "@gitbeaker/core": { - "version": "21.7.0", - "resolved": "https://registry.npmjs.org/@gitbeaker/core/-/core-21.7.0.tgz", - "integrity": "sha512-cw72rE7tA27wc6JJe1WqeAj9v/6w0S7XJcEji+bRNjTlUfE1zgfW0Gf1mbGUi7F37SOABGCosQLfg9Qe63aIqA==", - "dev": true, - "requires": { - "@gitbeaker/requester-utils": "^21.7.0", - "form-data": "^3.0.0", - "li": "^1.3.0", - "xcase": "^2.0.1" - } - }, - "@gitbeaker/node": { - "version": "21.7.0", - "resolved": "https://registry.npmjs.org/@gitbeaker/node/-/node-21.7.0.tgz", - "integrity": "sha512-OdM3VcTKYYqboOsnbiPcO0XimXXpYK4gTjARBZ6BWc+1LQXKmqo+OH6oUbyxOoaFu9hHECafIt3WZU3NM4sZTg==", - "dev": true, - "requires": { - "@gitbeaker/core": "^21.7.0", - "@gitbeaker/requester-utils": "^21.7.0", - "form-data": "^3.0.0", - "got": "^11.1.4", - "xcase": "^2.0.1" - } - }, - "@gitbeaker/requester-utils": { - "version": "21.7.0", - "resolved": "https://registry.npmjs.org/@gitbeaker/requester-utils/-/requester-utils-21.7.0.tgz", - "integrity": "sha512-eLTaVXlBnh8Qimj6QuMMA06mu/mLcJm3dy8nqhhn/Vm/D25sPrvpGwmbfFyvzj6QujPqtHvFfsCHtyZddL01qA==", - "dev": true, - "requires": { - "form-data": "^3.0.0", - "query-string": "^6.12.1", - "xcase": "^2.0.1" - } - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "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==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, - "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "@octokit/auth-token": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", - "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", - "dev": true, - "requires": { - "@octokit/types": "^6.0.3" - } - }, - "@octokit/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz", - "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==", - "dev": true, - "requires": { - "@octokit/auth-token": "^2.4.4", - "@octokit/graphql": "^4.5.8", - "@octokit/request": "^5.6.3", - "@octokit/request-error": "^2.0.5", - "@octokit/types": "^6.0.3", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/endpoint": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", - "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", - "dev": true, - "requires": { - "@octokit/types": "^6.0.3", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/graphql": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", - "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", - "dev": true, - "requires": { - "@octokit/request": "^5.6.0", - "@octokit/types": "^6.0.3", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/openapi-types": { - "version": "12.11.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz", - "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==", - "dev": true - }, - "@octokit/plugin-paginate-rest": { - "version": "2.21.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz", - "integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==", - "dev": true, - "requires": { - "@octokit/types": "^6.40.0" - } - }, - "@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "dev": true, - "requires": {} - }, - "@octokit/plugin-rest-endpoint-methods": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz", - "integrity": "sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==", - "dev": true, - "requires": { - "@octokit/types": "^6.39.0", - "deprecation": "^2.3.1" - } - }, - "@octokit/request": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", - "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", - "dev": true, - "requires": { - "@octokit/endpoint": "^6.0.1", - "@octokit/request-error": "^2.1.0", - "@octokit/types": "^6.16.1", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/request-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", - "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", - "dev": true, - "requires": { - "@octokit/types": "^6.0.3", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } - }, - "@octokit/rest": { - "version": "18.12.0", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz", - "integrity": "sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==", - "dev": true, - "requires": { - "@octokit/core": "^3.5.1", - "@octokit/plugin-paginate-rest": "^2.16.8", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^5.12.0" - } - }, - "@octokit/types": { - "version": "6.41.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", - "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", - "dev": true, - "requires": { - "@octokit/openapi-types": "^12.11.0" - } - }, - "@seadub/danger-plugin-dependencies": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@seadub/danger-plugin-dependencies/-/danger-plugin-dependencies-1.0.0.tgz", - "integrity": "sha512-rk1OGopIHXf5/lfYZEIf6Kr9l1opRSSrhEF36CmXT2aoM3/VrLhB2w7g6nIxvl72ixDUSrXJrD02u/mKGLULxQ==", - "dev": true, - "requires": { - "date-fns": "^2.16.1", - "lodash.flatten": "^4.4.0", - "lodash.includes": "^4.3.0", - "node-fetch": "^2.6.1", - "semver": "^7.3.2" - } - }, - "@seadub/danger-plugin-eslint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@seadub/danger-plugin-eslint/-/danger-plugin-eslint-2.0.0.tgz", - "integrity": "sha512-eOfolDJyWwP5vJQqKLVhr6FDayQfbqwmwPMslFWPMd9AhJfgU85Pz3R8MHfjfsdIzn/zNofnDa5k+GSZtMAZ5g==", - "dev": true, - "requires": {} - }, - "@seadub/danger-plugin-junit": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@seadub/danger-plugin-junit/-/danger-plugin-junit-0.3.0.tgz", - "integrity": "sha512-x2PkV5Q7cR9UAhS2jsEgyqs4JP7yXGk2psQKdZFq4zuwRrzsMT0e4JpipSzb05zMaGLqtdwV6oW8XJwS3FpHIQ==", - "dev": true, - "requires": { - "@xmldom/xmldom": "^0.7.3", - "fs-extra": "^9.0.1", - "glob": "^7.1.6" - }, - "dependencies": { - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - } - } - }, - "@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true - }, - "@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dev": true, - "requires": { - "defer-to-connect": "^2.0.0" - } - }, - "@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true - }, - "@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true - }, - "@types/babel__core": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", - "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", - "dev": true, - "requires": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - }, - "dependencies": { - "@babel/parser": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", - "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==", - "dev": true - } - } - }, - "@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", - "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/babel-plugin-tester": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@types/babel-plugin-tester/-/babel-plugin-tester-9.0.5.tgz", - "integrity": "sha512-NRBPlhi5VkrTXMqDB1hSUnHs7vqLGRopeukC9u1zilOIFe9O1siwqeKZRiuJiVYakgpeDso/HE2Q5DU1aDqBog==", - "dev": true, - "requires": { - "@types/babel__core": "*", - "@types/prettier": "*" - } - }, - "@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "dev": true, - "requires": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, - "@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", - "dev": true - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, - "@types/node": { - "version": "18.15.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.7.tgz", - "integrity": "sha512-LFmUbFunqmBn26wJZgZPYZPrDR1RwGOu2v79Mgcka1ndO6V0/cwjivPTc4yoK6n9kmw4/ls1r8cLrvh2iMibFA==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "@types/prettier": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", - "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", - "dev": true - }, - "@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@xmldom/xmldom": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.9.tgz", - "integrity": "sha512-yceMpm/xd4W2a85iqZyO09gTnHvXF6pyiWjD2jcOJs7hRoZtNNOO1eJlhHj1ixA+xip2hOyGn+LgcvLCMo5zXA==", - "dev": true - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ansi-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==", - "dev": true - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "dev": true, - "requires": { - "default-require-extensions": "^3.0.0" - } - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - } - }, - "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 - }, - "array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "is-string": "^1.0.7" - } - }, - "array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.map": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.5.tgz", - "integrity": "sha512-gfaKntvwqYIuC7mLLyv2wzZIJqrRhn5PZ9EfFejSx6a78sV7iDsGpG9P+3oUPtm1Rerqm6nrKS4FYuTIvWfo3g==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" - } - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true - }, - "asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" - }, - "async-retry": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.2.3.tgz", - "integrity": "sha512-tfDb02Th6CE6pJUF2gjW5ZVjsgwlucVXOEQMvEX9JgSJMs9gAX+Nz3xRuJBKuUYjTSYORqvDBORdAQ3LU59g7Q==", - "dev": true, - "requires": { - "retry": "0.12.0" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "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==" - }, - "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==" - }, - "aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" - }, - "babel-helper-evaluate-path": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.5.0.tgz", - "integrity": "sha512-mUh0UhS607bGh5wUMAQfOpt2JX2ThXMtppHRdRU1kL7ZLRWIXxoV2UIV1r2cAeeNeU1M5SB5/RSUgUxrK8yOkA==" - }, - "babel-helper-flip-expressions": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.4.3.tgz", - "integrity": "sha512-rSrkRW4YQ2ETCWww9gbsWk4N0x1BOtln349Tk0dlCS90oT68WMLyGR7WvaMp3eAnsVrCqdUtC19lo1avyGPejA==" - }, - "babel-helper-is-nodes-equiv": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz", - "integrity": "sha512-ri/nsMFVRqXn7IyT5qW4/hIAGQxuYUFHa3qsxmPtbk6spZQcYlyDogfVpNm2XYOslH/ULS4VEJGUqQX5u7ACQw==" - }, - "babel-helper-is-void-0": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-helper-is-void-0/-/babel-helper-is-void-0-0.4.3.tgz", - "integrity": "sha512-07rBV0xPRM3TM5NVJEOQEkECX3qnHDjaIbFvWYPv+T1ajpUiVLiqTfC+MmiZxY5KOL/Ec08vJdJD9kZiP9UkUg==" - }, - "babel-helper-mark-eval-scopes": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.4.3.tgz", - "integrity": "sha512-+d/mXPP33bhgHkdVOiPkmYoeXJ+rXRWi7OdhwpyseIqOS8CmzHQXHUp/+/Qr8baXsT0kjGpMHHofHs6C3cskdA==" - }, - "babel-helper-remove-or-void": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.4.3.tgz", - "integrity": "sha512-eYNceYtcGKpifHDir62gHJadVXdg9fAhuZEXiRQnJJ4Yi4oUTpqpNY//1pM4nVyjjDMPYaC2xSf0I+9IqVzwdA==" - }, - "babel-helper-to-multiple-sequence-expressions": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.5.0.tgz", - "integrity": "sha512-m2CvfDW4+1qfDdsrtf4dwOslQC3yhbgyBFptncp4wvtdrDHqueW7slsYv4gArie056phvQFhT2nRcGS4bnm6mA==" - }, - "babel-plugin-minify-builtins": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.5.0.tgz", - "integrity": "sha512-wpqbN7Ov5hsNwGdzuzvFcjgRlzbIeVv1gMIlICbPj0xkexnfoIDe7q+AZHMkQmAE/F9R5jkrB6TLfTegImlXag==" - }, - "babel-plugin-minify-constant-folding": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.5.0.tgz", - "integrity": "sha512-Vj97CTn/lE9hR1D+jKUeHfNy+m1baNiJ1wJvoGyOBUx7F7kJqDZxr9nCHjO/Ad+irbR3HzR6jABpSSA29QsrXQ==", - "requires": { - "babel-helper-evaluate-path": "^0.5.0" - } - }, - "babel-plugin-minify-dead-code-elimination": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.5.2.tgz", - "integrity": "sha512-krq9Lwi0QIzyAlcNBXTL4usqUvevB4BzktdEsb8srcXC1AaYqRJiAQw6vdKdJSaXbz6snBvziGr6ch/aoRCfpA==", - "requires": { - "babel-helper-evaluate-path": "^0.5.0", - "babel-helper-mark-eval-scopes": "^0.4.3", - "babel-helper-remove-or-void": "^0.4.3", - "lodash": "^4.17.11" - } - }, - "babel-plugin-minify-flip-comparisons": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.4.3.tgz", - "integrity": "sha512-8hNwgLVeJzpeLVOVArag2DfTkbKodzOHU7+gAZ8mGBFGPQHK6uXVpg3jh5I/F6gfi5Q5usWU2OKcstn1YbAV7A==", - "requires": { - "babel-helper-is-void-0": "^0.4.3" - } - }, - "babel-plugin-minify-guarded-expressions": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.4.4.tgz", - "integrity": "sha512-RMv0tM72YuPPfLT9QLr3ix9nwUIq+sHT6z8Iu3sLbqldzC1Dls8DPCywzUIzkTx9Zh1hWX4q/m9BPoPed9GOfA==", - "requires": { - "babel-helper-evaluate-path": "^0.5.0", - "babel-helper-flip-expressions": "^0.4.3" - } - }, - "babel-plugin-minify-infinity": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.4.3.tgz", - "integrity": "sha512-X0ictxCk8y+NvIf+bZ1HJPbVZKMlPku3lgYxPmIp62Dp8wdtbMLSekczty3MzvUOlrk5xzWYpBpQprXUjDRyMA==" - }, - "babel-plugin-minify-mangle-names": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.5.1.tgz", - "integrity": "sha512-8KMichAOae2FHlipjNDTo2wz97MdEb2Q0jrn4NIRXzHH7SJ3c5TaNNBkeTHbk9WUsMnqpNUx949ugM9NFWewzw==", - "requires": { - "babel-helper-mark-eval-scopes": "^0.4.3" - } - }, - "babel-plugin-minify-numeric-literals": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.4.3.tgz", - "integrity": "sha512-5D54hvs9YVuCknfWywq0eaYDt7qYxlNwCqW9Ipm/kYeS9gYhJd0Rr/Pm2WhHKJ8DC6aIlDdqSBODSthabLSX3A==" - }, - "babel-plugin-minify-replace": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.5.0.tgz", - "integrity": "sha512-aXZiaqWDNUbyNNNpWs/8NyST+oU7QTpK7J9zFEFSA0eOmtUNMU3fczlTTTlnCxHmq/jYNFEmkkSG3DDBtW3Y4Q==" - }, - "babel-plugin-minify-simplify": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.5.1.tgz", - "integrity": "sha512-OSYDSnoCxP2cYDMk9gxNAed6uJDiDz65zgL6h8d3tm8qXIagWGMLWhqysT6DY3Vs7Fgq7YUDcjOomhVUb+xX6A==", - "requires": { - "babel-helper-evaluate-path": "^0.5.0", - "babel-helper-flip-expressions": "^0.4.3", - "babel-helper-is-nodes-equiv": "^0.0.1", - "babel-helper-to-multiple-sequence-expressions": "^0.5.0" - } - }, - "babel-plugin-minify-type-constructors": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.4.3.tgz", - "integrity": "sha512-4ADB0irJ/6BeXWHubjCJmrPbzhxDgjphBMjIjxCc25n4NGJ00NsYqwYt+F/OvE9RXx8KaSW7cJvp+iZX436tnQ==", - "requires": { - "babel-helper-is-void-0": "^0.4.3" - } - }, - "babel-plugin-tester": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-tester/-/babel-plugin-tester-10.1.0.tgz", - "integrity": "sha512-4P2tNaM/Mtg6ytA9YAqmgONnMYqWvdbGDuwRTpIIC9yFZGQrEHoyvDPCx+X1QALAufVb5DKieOPGj5dffiEiNg==", - "dev": true, - "requires": { - "@types/babel-plugin-tester": "^9.0.0", - "lodash.mergewith": "^4.6.2", - "prettier": "^2.0.1", - "strip-indent": "^3.0.0" - } - }, - "babel-plugin-transform-inline-consecutive-adds": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.4.3.tgz", - "integrity": "sha512-8D104wbzzI5RlxeVPYeQb9QsUyepiH1rAO5hpPpQ6NPRgQLpIVwkS/Nbx944pm4K8Z+rx7CgjPsFACz/VCBN0Q==" - }, - "babel-plugin-transform-member-expression-literals": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.9.4.tgz", - "integrity": "sha512-Xq9/Rarpj+bjOZSl1nBbZYETsNEDDJSrb6Plb1sS3/36FukWFLLRysgecva5KZECjUJTrJoQqjJgtWToaflk5Q==" - }, - "babel-plugin-transform-merge-sibling-variables": { - "version": "6.9.5", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.9.5.tgz", - "integrity": "sha512-xj/KrWi6/uP+DrD844h66Qh2cZN++iugEIgH8QcIxhmZZPNP6VpOE9b4gP2FFW39xDAY43kCmYMM6U0QNKN8fw==" - }, - "babel-plugin-transform-minify-booleans": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.9.4.tgz", - "integrity": "sha512-9pW9ePng6DZpzGPalcrULuhSCcauGAbn8AeU3bE34HcDkGm8Ldt0ysjGkyb64f0K3T5ilV4mriayOVv5fg0ASA==" - }, - "babel-plugin-transform-property-literals": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.9.4.tgz", - "integrity": "sha512-Pf8JHTjTPxecqVyL6KSwD/hxGpoTZjiEgV7nCx0KFQsJYM0nuuoCajbg09KRmZWeZbJ5NGTySABYv8b/hY1eEA==", - "requires": { - "esutils": "^2.0.2" - } - }, - "babel-plugin-transform-regexp-constructors": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.4.3.tgz", - "integrity": "sha512-JjymDyEyRNhAoNFp09y/xGwYVYzT2nWTGrBrWaL6eCg2m+B24qH2jR0AA8V8GzKJTgC8NW6joJmc6nabvWBD/g==" - }, - "babel-plugin-transform-remove-console": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.4.tgz", - "integrity": "sha512-88blrUrMX3SPiGkT1GnvVY8E/7A+k6oj3MNvUtTIxJflFzXTw1bHkuJ/y039ouhFMp2prRn5cQGzokViYi1dsg==" - }, - "babel-plugin-transform-remove-debugger": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.9.4.tgz", - "integrity": "sha512-Kd+eTBYlXfwoFzisburVwrngsrz4xh9I0ppoJnU/qlLysxVBRgI4Pj+dk3X8F5tDiehp3hhP8oarRMT9v2Z3lw==" - }, - "babel-plugin-transform-remove-undefined": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.5.0.tgz", - "integrity": "sha512-+M7fJYFaEE/M9CXa0/IRkDbiV3wRELzA1kKQFCJ4ifhrzLKn/9VCCgj9OFmYWwBd8IB48YdgPkHYtbYq+4vtHQ==", - "requires": { - "babel-helper-evaluate-path": "^0.5.0" - } - }, - "babel-plugin-transform-simplify-comparison-operators": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.9.4.tgz", - "integrity": "sha512-GLInxhGAQWJ9YIdjwF6dAFlmh4U+kN8pL6Big7nkDzHoZcaDQOtBm28atEhQJq6m9GpAovbiGEShKqXv4BSp0A==" - }, - "babel-plugin-transform-titanium": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-titanium/-/babel-plugin-transform-titanium-0.1.1.tgz", - "integrity": "sha512-N2ImhDNsfmT5Q68HeNJfg1xE8Z3NsVYWC+/TWLtckscXPjleDJRciIRzhUhI6876VXhxSjbw5s7ylv1NTa/xoA==" - }, - "babel-plugin-transform-undefined-to-void": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.9.4.tgz", - "integrity": "sha512-D2UbwxawEY1xVc9svYAUZQM2xarwSNXue2qDIx6CeV2EuMGaes/0su78zlIDIAgE7BvnMw4UpmSo9fDy+znghg==" - }, - "babel-preset-minify": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-preset-minify/-/babel-preset-minify-0.5.2.tgz", - "integrity": "sha512-v4GL+kk0TfovbRIKZnC3HPbu2cAGmPAby7BsOmuPdMJfHV+4FVdsGXTH/OOGQRKYdjemBuL1+MsE6mobobhe9w==", - "requires": { - "babel-plugin-minify-builtins": "^0.5.0", - "babel-plugin-minify-constant-folding": "^0.5.0", - "babel-plugin-minify-dead-code-elimination": "^0.5.2", - "babel-plugin-minify-flip-comparisons": "^0.4.3", - "babel-plugin-minify-guarded-expressions": "^0.4.4", - "babel-plugin-minify-infinity": "^0.4.3", - "babel-plugin-minify-mangle-names": "^0.5.1", - "babel-plugin-minify-numeric-literals": "^0.4.3", - "babel-plugin-minify-replace": "^0.5.0", - "babel-plugin-minify-simplify": "^0.5.1", - "babel-plugin-minify-type-constructors": "^0.4.3", - "babel-plugin-transform-inline-consecutive-adds": "^0.4.3", - "babel-plugin-transform-member-expression-literals": "^6.9.4", - "babel-plugin-transform-merge-sibling-variables": "^6.9.5", - "babel-plugin-transform-minify-booleans": "^6.9.4", - "babel-plugin-transform-property-literals": "^6.9.4", - "babel-plugin-transform-regexp-constructors": "^0.4.3", - "babel-plugin-transform-remove-console": "^6.9.4", - "babel-plugin-transform-remove-debugger": "^6.9.4", - "babel-plugin-transform-remove-undefined": "^0.5.0", - "babel-plugin-transform-simplify-comparison-operators": "^6.9.4", - "babel-plugin-transform-undefined-to-void": "^6.9.4", - "lodash": "^4.17.11" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", - "requires": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" - }, - "buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "dev": true - }, - "buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==" - }, - "cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "dev": true - }, - "cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - } - } - }, - "caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, - "requires": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "dependencies": { - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true - } - } - }, - "caniuse-lite": { - "version": "1.0.30001469", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001469.tgz", - "integrity": "sha512-Rcp7221ScNqQPP3W+lVOYDyjdR6dC+neEQCttoNr5bAyz54AboB4iwpnWgyi8P4YUsPybVzT4LgWiBbI3drL4g==" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chokidar": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", - "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.3.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-truncate": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", - "dev": true, - "requires": { - "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" - } - }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - } - } - }, - "clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "dev": true, - "requires": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "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==", - "dev": true, - "requires": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - } - }, - "conventional-changelog-conventionalcommits": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-5.0.0.tgz", - "integrity": "sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw==", - "dev": true, - "requires": { - "compare-func": "^2.0.0", - "lodash": "^4.17.15", - "q": "^1.5.1" - } - }, - "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==", - "dev": true, - "requires": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - } - }, - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "core-js": { - "version": "3.29.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.29.1.tgz", - "integrity": "sha512-+jwgnhg6cQxKYIIjGtAHq2nwUOolo9eoFZ4sHfUH09BLXBgxnH4gA0zEd+t+BO2cNB8idaBtZFcFTRjQJRJmAw==", - "dev": true - }, - "core-js-compat": { - "version": "3.29.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.29.1.tgz", - "integrity": "sha512-QmchCua884D8wWskMX8tW5ydINzd8oSJVx38lx/pVkFGqztxt73GYre3pm/hyYq8bPf+MW5In4I/uRShFDsbrA==", - "requires": { - "browserslist": "^4.21.5" - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - }, - "cosmiconfig": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", - "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", - "dev": true, - "requires": { - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" - } - }, - "cosmiconfig-typescript-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.3.0.tgz", - "integrity": "sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==", - "dev": true, - "requires": {} - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "danger": { - "version": "11.2.4", - "resolved": "https://registry.npmjs.org/danger/-/danger-11.2.4.tgz", - "integrity": "sha512-9tSrDm79+vWijG3zLXp6DQFmUqFLXg8Fl3jZmPhymlfsmAX0NaAc4HbC81pTOsSgOdiJfJHWpDwKu7fsTktFOQ==", - "dev": true, - "requires": { - "@gitbeaker/node": "^21.3.0", - "@octokit/rest": "^18.12.0", - "async-retry": "1.2.3", - "chalk": "^2.3.0", - "commander": "^2.18.0", - "core-js": "^3.8.2", - "debug": "^4.1.1", - "fast-json-patch": "^3.0.0-1", - "get-stdin": "^6.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "hyperlinker": "^1.0.0", - "json5": "^2.1.0", - "jsonpointer": "^5.0.0", - "jsonwebtoken": "^9.0.0", - "lodash.find": "^4.6.0", - "lodash.includes": "^4.3.0", - "lodash.isobject": "^3.0.2", - "lodash.keys": "^4.0.8", - "lodash.mapvalues": "^4.6.0", - "lodash.memoize": "^4.1.2", - "memfs-or-file-map-to-github-branch": "^1.2.1", - "micromatch": "^4.0.4", - "node-cleanup": "^2.1.2", - "node-fetch": "^2.6.7", - "override-require": "^1.1.1", - "p-limit": "^2.1.0", - "parse-diff": "^0.7.0", - "parse-git-config": "^2.0.3", - "parse-github-url": "^1.0.2", - "parse-link-header": "^2.0.0", - "pinpoint": "^1.1.0", - "prettyjson": "^1.2.1", - "readline-sync": "^1.4.9", - "regenerator-runtime": "^0.13.9", - "require-from-string": "^2.0.2", - "supports-hyperlinks": "^1.0.1" - } - }, - "dargs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", - "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "date-fns": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", - "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", - "dev": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true - } - } - }, - "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 - }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "requires": { - "mimic-response": "^3.1.0" - }, - "dependencies": { - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true - } - } - }, - "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 - }, - "default-require-extensions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", - "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", - "dev": true, - "requires": { - "strip-bom": "^4.0.0" - } - }, - "defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true - }, - "define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - }, - "deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "electron-to-chromium": { - "version": "1.4.340", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.340.tgz", - "integrity": "sha512-zx8hqumOqltKsv/MF50yvdAlPF9S/4PXbyfzJS6ZGhbddGkRegdwImmfSVqCkEziYzrIGZ/TlrzBND4FysfkDg==" - }, - "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 - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", - "dev": true, - "requires": { - "array-buffer-byte-length": "^1.0.0", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" - } - }, - "es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "dev": true - }, - "es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - } - }, - "es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - } - }, - "es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - }, - "eslint": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.4.0.tgz", - "integrity": "sha512-gU+lxhlPHu45H3JkEGgYhWhkR9wLHHEXC9FbWFnTlEkbKyZKWgWRLgf61E8zWmBuI6g5xKBph9ltg3NtZMVF8g==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "eslint-scope": "^5.1.0", - "eslint-utils": "^2.0.0", - "eslint-visitor-keys": "^1.2.0", - "espree": "^7.1.0", - "esquery": "^1.2.0", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "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 - }, - "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==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "eslint-config-axway": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/eslint-config-axway/-/eslint-config-axway-6.0.2.tgz", - "integrity": "sha512-+O+kCrTycij3Vyk+hJtljZy/Xa/Xz0PdkJm4c4DRed6YT7JuSVpoH4UPCST/xCT9/Nonpy8VuyuZTa3kneHdjw==", - "dev": true, - "requires": { - "eslint-plugin-chai-expect": "^2.2.0", - "eslint-plugin-import": "^2.22.1", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^5.1.0", - "eslint-plugin-security": "^1.4.0", - "find-root": "^1.1.0", - "semver": "^7.3.4" - } - }, - "eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", - "dev": true, - "requires": { - "debug": "^3.2.7" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-plugin-chai-expect": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-chai-expect/-/eslint-plugin-chai-expect-2.2.0.tgz", - "integrity": "sha512-ExTJKhgeYMfY8wDj3UiZmgpMKJOUHGNHmWMlxT49JUDB1vTnw0sSNfXJSxnX+LcebyBD/gudXzjzD136WqPJrQ==", - "dev": true, - "requires": {} - }, - "eslint-plugin-es": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", - "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", - "dev": true, - "requires": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - } - }, - "eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", - "dev": true, - "requires": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", - "has": "^1.0.3", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "eslint-plugin-mocha": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-9.0.0.tgz", - "integrity": "sha512-d7knAcQj1jPCzZf3caeBIn3BnW6ikcvfz0kSqQpwPYcVGLoJV5sz0l0OJB2LR8I7dvTDbqq1oV6ylhSgzA10zg==", - "dev": true, - "requires": { - "eslint-utils": "^3.0.0", - "ramda": "^0.27.1" - }, - "dependencies": { - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - } - } - } - }, - "eslint-plugin-node": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", - "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", - "dev": true, - "requires": { - "eslint-plugin-es": "^3.0.0", - "eslint-utils": "^2.0.0", - "ignore": "^5.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.10.1", - "semver": "^6.1.0" - }, - "dependencies": { - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "eslint-plugin-promise": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-5.2.0.tgz", - "integrity": "sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw==", - "dev": true, - "requires": {} - }, - "eslint-plugin-security": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.7.1.tgz", - "integrity": "sha512-sMStceig8AFglhhT2LqlU5r+/fn9OwsA72O5bBuQVTssPCdQAOQzL+oMn/ZcpeUY6KcNfLJArgcrsSULNjYYdQ==", - "dev": true, - "requires": { - "safe-regex": "^2.1.1" - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - }, - "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "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, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-json-patch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", - "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "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 - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "requires": { - "pend": "~1.2.0" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "filter-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", - "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", - "dev": true - }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "dev": true - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", - "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", - "dev": true, - "requires": { - "is-buffer": "~2.0.3" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "requires": { - "is-callable": "^1.1.3" - } - }, - "foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==" - }, - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true - }, - "fs-exists-sync": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", - "integrity": "sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==", - "dev": true - }, - "fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - } - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", - "dev": true - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "git-config-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/git-config-path/-/git-config-path-1.0.1.tgz", - "integrity": "sha512-KcJ2dlrrP5DbBnYIZ2nlikALfRhKzNSX0stvv3ImJ+fvC4hXKoV+U+74SV0upg+jlQZbrtQzc0bu6/Zh+7aQbg==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "fs-exists-sync": "^0.1.0", - "homedir-polyfill": "^1.0.0" - } - }, - "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==", - "dev": true, - "requires": { - "dargs": "^7.0.0", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "requires": { - "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" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", - "dev": true, - "requires": { - "ini": "^1.3.4" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3" - } - }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "dev": true, - "requires": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - } - }, - "graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==" - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - } - } - }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true - }, - "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==" - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "requires": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "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==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "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==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "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==", - "dev": true - }, - "http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dev": true, - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "husky": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", - "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", - "dev": true - }, - "hyperlinker": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hyperlinker/-/hyperlinker-1.0.0.tgz", - "integrity": "sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==", - "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true - }, - "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "requires": { - "has": "^1.0.3" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "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 - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true - }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "dev": true - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", - "dev": true, - "requires": { - "text-extensions": "^1.0.0" - } - }, - "is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "requires": { - "append-transform": "^2.0.0" - } - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-processinfo": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", - "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", - "dev": true, - "requires": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.3", - "istanbul-lib-coverage": "^3.2.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^8.3.2" - }, - "dependencies": { - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - } - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "iterate-iterator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.2.tgz", - "integrity": "sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==", - "dev": true - }, - "iterate-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", - "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", - "dev": true, - "requires": { - "es-get-iterator": "^1.0.2", - "iterate-iterator": "^1.0.1" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "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==" - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true - }, - "jsonpointer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", - "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", - "dev": true - }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, - "jsonwebtoken": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", - "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", - "dev": true, - "requires": { - "jws": "^3.2.2", - "lodash": "^4.17.21", - "ms": "^2.1.1", - "semver": "^7.3.8" - } - }, - "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, - "jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "dev": true, - "requires": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "dev": true, - "requires": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", - "dev": true, - "requires": { - "json-buffer": "3.0.1" - } - }, - "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 - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" - }, - "levenary": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", - "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", - "requires": { - "leven": "^3.1.0" - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "li": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/li/-/li-1.3.0.tgz", - "integrity": "sha512-z34TU6GlMram52Tss5mt1m//ifRIpKH5Dqm7yUVOdHI+BQCs9qGPHFaCUTIzsWX7edN30aa2WrPwR7IO10FHaw==", - "dev": true - }, - "lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "lint-staged": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.0.tgz", - "integrity": "sha512-GbyK5iWinax5Dfw5obm2g2ccUiZXNGtAS4mCbJ0Lv4rq6iEtfBSjOYdcbOtAIFtM114t0vdpViDDetjVTSd8Vw==", - "dev": true, - "requires": { - "chalk": "5.2.0", - "cli-truncate": "^3.1.0", - "commander": "^10.0.0", - "debug": "^4.3.4", - "execa": "^7.0.0", - "lilconfig": "2.1.0", - "listr2": "^5.0.7", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-inspect": "^1.12.3", - "pidtree": "^0.6.0", - "string-argv": "^0.3.1", - "yaml": "^2.2.1" - }, - "dependencies": { - "chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", - "dev": true - }, - "commander": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", - "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", - "dev": true - }, - "execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - } - }, - "human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true - }, - "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 - }, - "mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true - }, - "npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dev": true, - "requires": { - "path-key": "^4.0.0" - } - }, - "onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "requires": { - "mimic-fn": "^4.0.0" - } - }, - "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 - }, - "strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true - } - } - }, - "listr2": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", - "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", - "dev": true, - "requires": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.19", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rfdc": "^1.3.0", - "rxjs": "^7.8.0", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "requires": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - } - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true - }, - "lodash.find": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.find/-/lodash.find-4.6.0.tgz", - "integrity": "sha512-yaRZoAV3Xq28F1iafWN1+a0rflOej93l1DQUejs3SZ41h2O9UJBoS9aueGjPDgAl4B6tPC0NuuchLKaDQQ3Isg==", - "dev": true - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", - "dev": true - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "dev": true - }, - "lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", - "dev": true - }, - "lodash.isfunction": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", - "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", - "dev": true - }, - "lodash.isobject": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", - "integrity": "sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA==", - "dev": true - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true - }, - "lodash.kebabcase": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", - "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", - "dev": true - }, - "lodash.keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-4.2.0.tgz", - "integrity": "sha512-J79MkJcp7Df5mizHiVNpjoHXLi4HLjh9VLS/M7lQSGoQ+0oQ+lWEigREkqKyizPB1IawvQLLKY8mzEcm1tkyxQ==", - "dev": true - }, - "lodash.mapvalues": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", - "integrity": "sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lodash.mergewith": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", - "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", - "dev": true - }, - "lodash.snakecase": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", - "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", - "dev": true - }, - "lodash.startcase": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", - "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true - }, - "lodash.upperfirst": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", - "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", - "dev": true - }, - "log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2" - } - }, - "log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "dev": true, - "requires": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } - } - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "requires": { - "yallist": "^3.0.2" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true - }, - "memfs-or-file-map-to-github-branch": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/memfs-or-file-map-to-github-branch/-/memfs-or-file-map-to-github-branch-1.2.1.tgz", - "integrity": "sha512-I/hQzJ2a/pCGR8fkSQ9l5Yx+FQ4e7X6blNHyWBm2ojeFLT3GVzGkTj7xnyWpdclrr7Nq4dmx3xrvu70m3ypzAQ==", - "dev": true, - "requires": { - "@octokit/rest": "^16.43.0 || ^17.11.0 || ^18.12.0" - } - }, - "meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "dependencies": { - "type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true - } - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" - }, - "minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "mocha": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.1.1.tgz", - "integrity": "sha512-p7FuGlYH8t7gaiodlFreseLxEmxTgvyG9RgPHODFPySNhwUehu8NIb0vdSt3WFckSneswZ0Un5typYcWElk7HQ==", - "dev": true, - "requires": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.3.1", - "debug": "3.2.6", - "diff": "4.0.2", - "escape-string-regexp": "1.0.5", - "find-up": "4.1.0", - "glob": "7.1.6", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "3.0.0", - "minimatch": "3.0.4", - "ms": "2.1.2", - "object.assign": "4.1.0", - "promise.allsettled": "1.0.2", - "serialize-javascript": "4.0.0", - "strip-json-comments": "3.0.1", - "supports-color": "7.1.0", - "which": "2.0.2", - "wide-align": "1.1.3", - "workerpool": "6.0.0", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.1" - }, - "dependencies": { - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "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 - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true - } - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "mocha-jenkins-reporter": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/mocha-jenkins-reporter/-/mocha-jenkins-reporter-0.4.8.tgz", - "integrity": "sha512-1nz1Q+YgREUlh2kgFR+lrp+ufEFbdhCdtlEVEJR/5LhgqNLIg52+KG3X94hHpwWnf5SwYLS7udxgBbkWOUbyeQ==", - "dev": true, - "requires": { - "diff": "4.0.1", - "mkdirp": "^1.0.4", - "xml": "^1.0.1" - }, - "dependencies": { - "diff": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", - "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", - "dev": true - } - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node-appc": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/node-appc/-/node-appc-1.1.6.tgz", - "integrity": "sha512-ZfoHjoDLpNfXYBshztIq+aTjtlvCZF4XAE00ZYNk4u+/qAjQI+8BidCn957b69WzronQtyNw2NtnJEhsP3N7EQ==", - "requires": { - "@xmldom/xmldom": "^0.8.6", - "async": "^3.2.4", - "colors": "1.4.0", - "fs-extra": "~9.1.0", - "request": "~2.88.0", - "semver": "~7.3.8", - "sprintf": "^0.1.5", - "temp": "~0.9.4", - "uuid": "~9.0.0", - "yauzl": "^2.10.0" - }, - "dependencies": { - "@xmldom/xmldom": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.6.tgz", - "integrity": "sha512-uRjjusqpoqfmRkTaNuLJ2VohVr67Q5YwDATW3VU7PfzTj6IRaihGrYI7zckGZjxQPBIp63nfvJbM+Yu5ICh0Bg==" - }, - "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==", - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - } - } - }, - "node-cleanup": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/node-cleanup/-/node-cleanup-2.1.2.tgz", - "integrity": "sha512-qN8v/s2PAJwGUtr1/hYTpNKlD6Y9rc4p8KSmJXyGdYGZsDGKXrGThikLFP9OCHFeLeEpQzPwiAtdIvBLqm//Hw==", - "dev": true - }, - "node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "requires": { - "process-on-spawn": "^1.0.0" - } - }, - "node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" - }, - "node-uuid": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", - "integrity": "sha512-TkCET/3rr9mUuRp+CpO7qfgT++aAxfDRaalQhwPFzI9BY/2rCDn6OfpZOVggi1AXfTPpfkTrg5f5WQx5G1uLxA==" - }, - "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==", - "dev": true, - "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "requires": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "override-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/override-require/-/override-require-1.1.1.tgz", - "integrity": "sha512-eoJ9YWxFcXbrn2U8FKT6RV+/Kj7fiGAB1VvHzbYKt8xM5ZuKZgCGvnHzDxmreEjcBH28ejg5MiOH4iyY1mQnkg==", - "dev": true - }, - "p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - }, - "dependencies": { - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - } - } - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-diff": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/parse-diff/-/parse-diff-0.7.1.tgz", - "integrity": "sha512-1j3l8IKcy4yRK2W4o9EYvJLSzpAVwz4DXqCewYyx2vEwk2gcf3DBPqc8Fj4XV3K33OYJ08A8fWwyu/ykD/HUSg==", - "dev": true - }, - "parse-git-config": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/parse-git-config/-/parse-git-config-2.0.3.tgz", - "integrity": "sha512-Js7ueMZOVSZ3tP8C7E3KZiHv6QQl7lnJ+OkbxoaFazzSa2KyEHqApfGbU3XboUgUnq4ZuUmskUpYKTNx01fm5A==", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "git-config-path": "^1.0.1", - "ini": "^1.3.5" - } - }, - "parse-github-url": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", - "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", - "dev": true - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@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" - } - }, - "parse-link-header": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-link-header/-/parse-link-header-2.0.0.tgz", - "integrity": "sha512-xjU87V0VyHZybn2RrCX5TIFGxTVZE6zqqZWMPlIKiSKuWh/X5WZdt+w1Ki1nXB+8L/KtL+nZ4iq+sfI6MrhhMw==", - "dev": true, - "requires": { - "xtend": "~4.0.1" - } - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pidtree": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", - "dev": true - }, - "pinpoint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pinpoint/-/pinpoint-1.1.0.tgz", - "integrity": "sha512-+04FTD9x7Cls2rihLlo57QDCcHoLBGn5Dk51SwtFBWkUWLxZaBXyNVpCw1S+atvE7GmnFjeaRZ0WLq3UYuqAdg==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - } - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prettier": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", - "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", - "dev": true - }, - "prettyjson": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/prettyjson/-/prettyjson-1.2.5.tgz", - "integrity": "sha512-rksPWtoZb2ZpT5OVgtmy0KHVM+Dca3iVwWY9ifwhcexfjebtgjg3wmrUt9PvJ59XIYBcknQeYHD8IAnVlh9lAw==", - "dev": true, - "requires": { - "colors": "1.4.0", - "minimist": "^1.2.0" - } - }, - "process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "dev": true, - "requires": { - "fromentries": "^1.2.0" - } - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "promise.allsettled": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.2.tgz", - "integrity": "sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg==", - "dev": true, - "requires": { - "array.prototype.map": "^1.0.1", - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "iterate-value": "^1.0.0" - } - }, - "psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "dev": true - }, - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" - }, - "query-string": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.14.1.tgz", - "integrity": "sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==", - "dev": true, - "requires": { - "decode-uri-component": "^0.2.0", - "filter-obj": "^1.1.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" - } - }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true - }, - "ramda": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz", - "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", - "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", - "dev": true, - "requires": { - "picomatch": "^2.0.7" - } - }, - "readline-sync": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz", - "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==", - "dev": true - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" - }, - "regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", - "requires": { - "regenerate": "^1.4.2" - } - }, - "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regexp-tree": { - "version": "0.1.24", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz", - "integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==", - "dev": true - }, - "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "requires": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - } - }, - "regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==" - } - } - }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", - "dev": true, - "requires": { - "es6-error": "^4.0.1" - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "resolve-global": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", - "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", - "dev": true, - "requires": { - "global-dirs": "^0.1.1" - } - }, - "responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dev": true, - "requires": { - "lowercase-keys": "^2.0.0" - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true - }, - "rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", - "dev": true, - "requires": { - "tslib": "^2.1.0" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safe-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", - "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", - "dev": true, - "requires": { - "regexp-tree": "~0.1.1" - } - }, - "safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "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==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "should": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", - "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", - "dev": true, - "requires": { - "should-equal": "^2.0.0", - "should-format": "^3.0.3", - "should-type": "^1.4.0", - "should-type-adaptors": "^1.0.1", - "should-util": "^1.0.0" - } - }, - "should-equal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", - "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", - "dev": true, - "requires": { - "should-type": "^1.4.0" - } - }, - "should-format": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", - "integrity": "sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==", - "dev": true, - "requires": { - "should-type": "^1.3.0", - "should-type-adaptors": "^1.0.1" - } - }, - "should-type": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", - "integrity": "sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==", - "dev": true - }, - "should-type-adaptors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", - "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", - "dev": true, - "requires": { - "should-type": "^1.3.0", - "should-util": "^1.0.0" - } - }, - "should-util": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", - "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "requires": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true - } - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" - }, - "spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "requires": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - } - }, - "spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "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, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", - "dev": true - }, - "split-on-first": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", - "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", - "dev": true - }, - "split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "dev": true, - "requires": { - "readable-stream": "^3.0.0" - } - }, - "sprintf": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/sprintf/-/sprintf-0.1.5.tgz", - "integrity": "sha512-4X5KsuXFQ7f+d7Y+bi4qSb6eI+YoifDTGr0MQJXRoYO7BO7evfRCjds6kk3z7l5CiJYxgDN1x5Er4WiyCt+zTQ==" - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dev": true, - "requires": { - "internal-slot": "^1.0.4" - } - }, - "stream-splitter": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/stream-splitter/-/stream-splitter-0.3.2.tgz", - "integrity": "sha512-9VAHJIhskQFJMbyKbf/5flSXV2HsP9MDFdCp3A8WDBWkZ8tP/SOfkI2c5lEHNNUNzbWdNkJEv6iNvQRJnSbYuA==", - "requires": { - "buffers": "~0.1.1" - } - }, - "strict-uri-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", - "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "string-argv": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", - "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", - "dev": true - }, - "string-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, - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, - "string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "requires": { - "min-indent": "^1.0.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-hyperlinks": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz", - "integrity": "sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw==", - "dev": true, - "requires": { - "has-flag": "^2.0.0", - "supports-color": "^5.0.0" - }, - "dependencies": { - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==", - "dev": true - } - } - }, - "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==" - }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "temp": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", - "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", - "requires": { - "mkdirp": "^0.5.1", - "rimraf": "~2.6.2" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "requires": { - "minimist": "^1.2.6" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", - "dev": true - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "requires": { - "readable-stream": "3" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true - }, - "ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "dependencies": { - "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true - } - } - }, - "tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - } - } - }, - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - }, - "typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - } - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", - "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", - "dev": true - }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==" - }, - "unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==" - }, - "unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==" - }, - "universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", - "dev": true - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" - }, - "unorm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", - "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==" - }, - "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "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==", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", - "dev": true - }, - "which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" - } - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "workerpool": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.0.tgz", - "integrity": "sha512-fU2OcNA/GVAJLLyKUoHkAgIhKb0JoCpSjLC/G2vYKxUjVmQwGbRVeoPJ1a8U4pnVofz4AQV5Y/NEw8oKqxEBtA==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - } - } - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "xcase": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/xcase/-/xcase-2.0.1.tgz", - "integrity": "sha512-UmFXIPU+9Eg3E9m/728Bii0lAIuoc+6nbrNUKaRPJOFp91ih44qqGlWtxMB6kXFrRD6po+86ksHM5XHCfk6iPw==", - "dev": true - }, - "xml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", - "dev": true - }, - "xmldom": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.6.0.tgz", - "integrity": "sha512-iAcin401y58LckRZ0TkI4k0VSM1Qg0KGSc3i8rU+xrxe19A/BN1zHyVSJY7uoutVlaTSzYyk/v5AmkewAP7jtg==" - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "yaml": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz", - "integrity": "sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==", - "dev": true - }, - "yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", - "dev": true, - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true - } - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - }, - "yargs-unparser": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.1.tgz", - "integrity": "sha512-qZV14lK9MWsGCmcr7u5oXGH0dbGqZAIxTDrWXZDo5zUr6b6iUmelNKO6x6R1dQT24AH3LgRxJpr8meWy2unolA==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "decamelize": "^1.2.0", - "flat": "^4.1.0", - "is-plain-obj": "^1.1.0", - "yargs": "^14.2.3" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", - "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^15.0.1" - } - }, - "yargs-parser": { - "version": "15.0.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.3.tgz", - "integrity": "sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } - } -} diff --git a/package.json b/package.json index 45141682..f778af51 100644 --- a/package.json +++ b/package.json @@ -1,89 +1,71 @@ { "name": "node-titanium-sdk", - "description": "Appcelerator Titanium SDK Library", + "version": "7.0.0", + "author": "TiDev, Inc. ", + "description": "Titanium SDK Library", + "type": "module", + "module": "./dist/index.mjs", + "exports": { + ".": { + "types": "./dist/index.d.js", + "import": "./dist/index.mjs", + "require": "./dist/index.cjs" + } + }, + "license": "Apache-2.0", "keywords": [ - "appcelerator", "titanium", + "titanium-sdk", + "tidev", "mobile" ], - "version": "6.1.0", - "author": "TiDev, Inc. ", - "license": "Apache-2.0", - "main": "./lib/titanium", - "directories": { - "lib": "./lib" - }, + "files": [ + "bin", + "dist" + ], "dependencies": { - "@babel/core": "7.11.6", - "@babel/parser": "7.11.5", - "@babel/plugin-transform-property-literals": "7.10.1", - "@babel/preset-env": "7.10.2", - "async": "3.2.4", + "@babel/core": "7.28.6", + "@babel/parser": "7.28.6", + "@babel/plugin-transform-property-literals": "7.27.1", + "@babel/preset-env": "7.28.6", + "@xmldom/xmldom": "0.8.11", "babel-plugin-transform-titanium": "0.1.1", "babel-preset-minify": "0.5.2", - "colors": "1.4.0", - "fs-extra": "11.1.1", - "node-appc": "1.1.6", - "node-uuid": "1.4.8", + "snooplogg": "6.1.1", "stream-splitter": "0.3.2", - "unorm": "1.6.0", - "xmldom": "0.6.0" + "which": "6.0.0" }, "devDependencies": { - "@commitlint/cli": "17.5.0", - "@commitlint/config-conventional": "17.4.4", - "@seadub/danger-plugin-dependencies": "1.0.0", - "@seadub/danger-plugin-eslint": "2.0.0", - "@seadub/danger-plugin-junit": "0.3.0", - "babel-plugin-tester": "10.1.0", - "danger": "11.2.4", - "eslint": "7.4.0", - "eslint-config-axway": "6.0.2", - "eslint-plugin-mocha": "9.0.0", - "husky": "8.0.3", - "lint-staged": "13.2.0", - "mocha": "8.1.1", - "mocha-jenkins-reporter": "0.4.8", - "nyc": "15.1.0", - "semver": "7.3.8", - "should": "13.2.3" + "@rollup/plugin-replace": "6.0.3", + "@types/node": "25.0.7", + "@vitest/coverage-v8": "4.0.17", + "babel-plugin-tester": "12.0.0", + "cross-env": "10.1.0", + "dprint": "0.51.1", + "lefthook": "2.0.14", + "oxlint": "1.39.0", + "rimraf": "6.1.2", + "semver": "7.7.3", + "tsdown": "0.19.0", + "typescript": "5.9.3", + "vitest": "4.0.17" }, "homepage": "https://github.com/tidev/node-titanium-sdk", "bugs": "https://github.com/tidev/node-titanium-sdk/issues", - "repository": "https://github.com/tidev/node-titanium-sdk", - "scripts": { - "lint": "eslint .", - "test": "npm run lint && npm run unit-test", - "unit-test": "nyc mocha tests/*_test.js --exit", - "prepare": "husky install" - }, - "mocha": { - "timeout": 30000, - "check-leaks": true, - "reporter": "mocha-jenkins-reporter", - "reporter-option": "junit_report_path=junit_report.xml" + "repository": { + "type": "git", + "url": "https://github.com/tidev/node-titanium-sdk" }, - "nyc": { - "check-coverage": true, - "lines": 56, - "statements": 56, - "functions": 60, - "branches": 40, - "exclude": [ - "tests/**/*.js", - "locales/**/*.js" - ], - "reporter": [ - "cobertura", - "text" - ] - }, - "lint-staged": { - "*.js": "eslint" - }, - "commitlint": { - "extends": [ - "@commitlint/config-conventional" - ] + "scripts": { + "build": "rimraf dist && tsdown -c tsdown.config.ts", + "check": "pnpm type-check && pnpm lint", + "coverage": "vitest --coverage", + "format": "dprint fmt", + "lint": "oxlint", + "prepublishOnly": "pnpm run build", + "test": "cross-env CI=1 vitest", + "test:bun": "cross-env CI=1 bun --bun --config=bunfig.toml ./node_modules/vitest/vitest.mjs --reporter=verbose", + "test:deno": "cross-env CI=1 deno run --allow-all --sloppy-imports ./node_modules/vitest/vitest.mjs", + "type-check": "tsc --noEmit" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..effe18d5 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,3878 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@babel/core': + specifier: 7.28.6 + version: 7.28.6 + '@babel/parser': + specifier: 7.28.6 + version: 7.28.6 + '@babel/plugin-transform-property-literals': + specifier: 7.27.1 + version: 7.27.1(@babel/core@7.28.6) + '@babel/preset-env': + specifier: 7.28.6 + version: 7.28.6(@babel/core@7.28.6) + '@xmldom/xmldom': + specifier: 0.8.11 + version: 0.8.11 + babel-plugin-transform-titanium: + specifier: 0.1.1 + version: 0.1.1 + babel-preset-minify: + specifier: 0.5.2 + version: 0.5.2 + snooplogg: + specifier: 6.1.1 + version: 6.1.1 + stream-splitter: + specifier: 0.3.2 + version: 0.3.2 + which: + specifier: 6.0.0 + version: 6.0.0 + devDependencies: + '@rollup/plugin-replace': + specifier: 6.0.3 + version: 6.0.3(rollup@4.52.5) + '@types/node': + specifier: 25.0.7 + version: 25.0.7 + '@vitest/coverage-v8': + specifier: 4.0.17 + version: 4.0.17(vitest@4.0.17(@types/node@25.0.7)) + babel-plugin-tester: + specifier: 12.0.0 + version: 12.0.0(@babel/core@7.28.6) + cross-env: + specifier: 10.1.0 + version: 10.1.0 + dprint: + specifier: 0.51.1 + version: 0.51.1 + lefthook: + specifier: 2.0.14 + version: 2.0.14 + oxlint: + specifier: 1.39.0 + version: 1.39.0 + rimraf: + specifier: 6.1.2 + version: 6.1.2 + semver: + specifier: 7.7.3 + version: 7.7.3 + tsdown: + specifier: 0.19.0 + version: 0.19.0(typescript@5.9.3) + typescript: + specifier: 5.9.3 + version: 5.9.3 + vitest: + specifier: 4.0.17 + version: 4.0.17(@types/node@25.0.7) + +packages: + + '@-xun/debug@2.0.2': + resolution: {integrity: sha512-qGaZ4bUZJuWc+YzndcaeOudFmHu4plOcjQGdod/8gafcZY+9oHkrsZNmA1tWrEpQwJV9AJ4QkYgfpreZp9W/Hg==} + engines: {node: ^20.18.0 || ^22.12.0 || >=23.3.0} + + '@-xun/fs@2.0.0': + resolution: {integrity: sha512-252CZ4OJRszsbP0n+vQRrhdFyDyEzt4NqYvJ/P2Iha4dw/jtmQvAF0wYqARPDZe7uuUG6Og0uQxMUfXFO2BQ7g==} + engines: {node: ^20.18.0 || ^22.12.0 || >=23.3.0} + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/code-frame@7.28.6': + resolution: {integrity: sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.6': + resolution: {integrity: sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.6': + resolution: {integrity: sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.5': + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.6': + resolution: {integrity: sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.28.6': + resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.28.6': + resolution: {integrity: sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-create-regexp-features-plugin@7.28.5': + resolution: {integrity: sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-define-polyfill-provider@0.6.5': + resolution: {integrity: sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.28.5': + resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.28.6': + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-module-transforms@7.28.6': + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.28.6': + resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} + engines: {node: '>=6.9.0'} + + '@babel/helper-remap-async-to-generator@7.27.1': + resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-replace-supers@7.27.1': + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-replace-supers@7.28.6': + resolution: {integrity: sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-wrap-function@7.28.3': + resolution: {integrity: sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.6': + resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.6': + resolution: {integrity: sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5': + resolution: {integrity: sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': + resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': + resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': + resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6': + resolution: {integrity: sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-assertions@7.28.6': + resolution: {integrity: sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.28.6': + resolution: {integrity: sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-arrow-functions@7.27.1': + resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-generator-functions@7.28.6': + resolution: {integrity: sha512-9knsChgsMzBV5Yh3kkhrZNxH3oCYAfMBkNNaVN4cP2RVlFPe8wYdwwcnOsAbkdDoV9UjFtOXWrWB52M8W4jNeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-to-generator@7.28.6': + resolution: {integrity: sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoped-functions@7.27.1': + resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoping@7.28.6': + resolution: {integrity: sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-properties@7.28.6': + resolution: {integrity: sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-static-block@7.28.6': + resolution: {integrity: sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + + '@babel/plugin-transform-classes@7.28.6': + resolution: {integrity: sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-computed-properties@7.28.6': + resolution: {integrity: sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-destructuring@7.28.5': + resolution: {integrity: sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-dotall-regex@7.28.6': + resolution: {integrity: sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-keys@7.27.1': + resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.28.6': + resolution: {integrity: sha512-5suVoXjC14lUN6ZL9OLKIHCNVWCrqGqlmEp/ixdXjvgnEl/kauLvvMO/Xw9NyMc95Joj1AeLVPVMvibBgSoFlA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-dynamic-import@7.27.1': + resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-explicit-resource-management@7.28.6': + resolution: {integrity: sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-exponentiation-operator@7.28.6': + resolution: {integrity: sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-export-namespace-from@7.27.1': + resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-for-of@7.27.1': + resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-function-name@7.27.1': + resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-json-strings@7.28.6': + resolution: {integrity: sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-literals@7.27.1': + resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-logical-assignment-operators@7.28.6': + resolution: {integrity: sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-member-expression-literals@7.27.1': + resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-amd@7.27.1': + resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.28.6': + resolution: {integrity: sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-systemjs@7.28.5': + resolution: {integrity: sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-umd@7.27.1': + resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-new-target@7.27.1': + resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-nullish-coalescing-operator@7.28.6': + resolution: {integrity: sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-numeric-separator@7.28.6': + resolution: {integrity: sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-rest-spread@7.28.6': + resolution: {integrity: sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-super@7.27.1': + resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-catch-binding@7.28.6': + resolution: {integrity: sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-chaining@7.28.6': + resolution: {integrity: sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-parameters@7.27.7': + resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-methods@7.28.6': + resolution: {integrity: sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-property-in-object@7.28.6': + resolution: {integrity: sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-property-literals@7.27.1': + resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regenerator@7.28.6': + resolution: {integrity: sha512-eZhoEZHYQLL5uc1gS5e9/oTknS0sSSAtd5TkKMUp3J+S/CaUjagc0kOUPsEbDmMeva0nC3WWl4SxVY6+OBuxfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regexp-modifiers@7.28.6': + resolution: {integrity: sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-reserved-words@7.27.1': + resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-shorthand-properties@7.27.1': + resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-spread@7.28.6': + resolution: {integrity: sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-sticky-regex@7.27.1': + resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-template-literals@7.27.1': + resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typeof-symbol@7.27.1': + resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-escapes@7.27.1': + resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-property-regex@7.28.6': + resolution: {integrity: sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-regex@7.27.1': + resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-sets-regex@7.28.6': + resolution: {integrity: sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/preset-env@7.28.6': + resolution: {integrity: sha512-GaTI4nXDrs7l0qaJ6Rg06dtOXTBCG6TMDB44zbqofCIC4PqC7SEvmFFtpxzCDw9W5aJ7RKVshgXTLvLdBFV/qw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-modules@0.1.6-no-external-plugins': + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.28.6': + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.5': + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.6': + resolution: {integrity: sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.6': + resolution: {integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@1.0.2': + resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} + engines: {node: '>=18'} + + '@dprint/darwin-arm64@0.51.1': + resolution: {integrity: sha512-C7fkaz0/NGf/X4G9Cq65izdJgerND5jWShOaPiOgGs4A0CyCMKMLRd45m3xKIttuO8x0IQiZVixD22qmVglXmQ==} + cpu: [arm64] + os: [darwin] + + '@dprint/darwin-x64@0.51.1': + resolution: {integrity: sha512-/CESb4SJejshTWb/nO2gucrioKdLD/fK2gKB5Immi4XecAjhkV1HZpUMRLsIeVDQ6ha7xktKbnnvudJRI0maSg==} + cpu: [x64] + os: [darwin] + + '@dprint/linux-arm64-glibc@0.51.1': + resolution: {integrity: sha512-W+QD/4TkQKMPq02uz+ZIz/EI91YEtS2zHBu/Jihx2lfNh3HjUKgyY1KfqCTg2WGJVDkJtPc5KDw+M8yd4rI+Rg==} + cpu: [arm64] + os: [linux] + + '@dprint/linux-arm64-musl@0.51.1': + resolution: {integrity: sha512-P4Cfn8wrdSvdoMoz0HtsC5zZpbh8Kk3OjRzgG4qs/gub5Ba3CCLcVaQvQmIOCvgPzdhPB41eSn5qAK87mh7vCQ==} + cpu: [arm64] + os: [linux] + + '@dprint/linux-loong64-glibc@0.51.1': + resolution: {integrity: sha512-dxDShELBrSGB9PktRqhYrm1UWCL+7N430rGuDTFg+i4d1wL4JD7EI5NDS/5IVbg3lrKJUu6gAJoY9NWF4sZ0mQ==} + cpu: [loong64] + os: [linux] + + '@dprint/linux-loong64-musl@0.51.1': + resolution: {integrity: sha512-l+uNPzUBNxkywGN1HgvTV0CzUDpzXC+s6VEvjYRdVAEKl9TAsIfLMfZifS8rnlOi9hz/0sckmpny+wL40G6dhQ==} + cpu: [loong64] + os: [linux] + + '@dprint/linux-riscv64-glibc@0.51.1': + resolution: {integrity: sha512-YI6SemJRMsLUrtognhkAYOJ67j/AkiufHfx6+cPv/7qO6zBoBL6otR1e5yFYvAgEJOzRZD5g51EdqCcuK19B+g==} + cpu: [riscv64] + os: [linux] + + '@dprint/linux-x64-glibc@0.51.1': + resolution: {integrity: sha512-Hm9ntOWeclXU6/rZGYIN2XjuAhsRUZ77lRJC5EiM1rP6Ayh0J/YMsDdqlPAs+xZGdFFzt8ZeUpqJJJsbc54ZjQ==} + cpu: [x64] + os: [linux] + + '@dprint/linux-x64-musl@0.51.1': + resolution: {integrity: sha512-iUs/9Z4Ky6+2GAK+i1jF1ZwM27CSIGaqw3LxTXtmE8eBCRwyCW+opzn9bzaFtlT9REUAGMC5PXihAPmzP3ttWg==} + cpu: [x64] + os: [linux] + + '@dprint/win32-arm64@0.51.1': + resolution: {integrity: sha512-oXjEL7Blf/160/j7U8MapRzSOVQvLIdAKEZbslIHA4Fwj10fvoDizqpfVU/aVj/BVrlIcZ/+AH8kfSC9XAyjLw==} + cpu: [arm64] + os: [win32] + + '@dprint/win32-x64@0.51.1': + resolution: {integrity: sha512-RM9thb/+Jm6GkXJS+eW+0Pzmz2PNeDk8ZOWcjunE1jv2RabHgm+GbeGpS+WZPOM9W3LSntswv6f4wjzfUkWD0g==} + cpu: [x64] + os: [win32] + + '@emnapi/core@1.7.1': + resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} + + '@emnapi/runtime@1.7.1': + resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} + + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + + '@epic-web/invariant@1.0.0': + resolution: {integrity: sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==} + + '@esbuild/aix-ppc64@0.25.11': + resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.11': + resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.11': + resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.11': + resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.11': + resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.11': + resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.11': + resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.11': + resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.11': + resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.11': + resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.11': + resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.11': + resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.11': + resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.11': + resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.11': + resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.11': + resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.11': + resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.11': + resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.11': + resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.11': + resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.11': + resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.11': + resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.11': + resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.11': + resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.11': + resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.11': + resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + + '@jest/schemas@30.0.5': + resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@napi-rs/wasm-runtime@1.1.1': + resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} + + '@oxc-project/types@0.107.0': + resolution: {integrity: sha512-QFDRbYfV2LVx8tyqtyiah3jQPUj1mK2+RYwxyFWyGoys6XJnwTdlzO6rdNNHOPorHAu5Uo34oWRKcvNpbJarmQ==} + + '@oxlint/darwin-arm64@1.39.0': + resolution: {integrity: sha512-lT3hNhIa02xCujI6YGgjmYGg3Ht/X9ag5ipUVETaMpx5Rd4BbTNWUPif1WN1YZHxt3KLCIqaAe7zVhatv83HOQ==} + cpu: [arm64] + os: [darwin] + + '@oxlint/darwin-x64@1.39.0': + resolution: {integrity: sha512-UT+rfTWd+Yr7iJeSLd/7nF8X4gTYssKh+n77hxl6Oilp3NnG1CKRHxZDy3o3lIBnwgzJkdyUAiYWO1bTMXQ1lA==} + cpu: [x64] + os: [darwin] + + '@oxlint/linux-arm64-gnu@1.39.0': + resolution: {integrity: sha512-qocBkvS2V6rH0t9AT3DfQunMnj3xkM7srs5/Ycj2j5ZqMoaWd/FxHNVJDFP++35roKSvsRJoS0mtA8/77jqm6Q==} + cpu: [arm64] + os: [linux] + + '@oxlint/linux-arm64-musl@1.39.0': + resolution: {integrity: sha512-arZzAc1PPcz9epvGBBCMHICeyQloKtHX3eoOe62B3Dskn7gf6Q14wnDHr1r9Vp4vtcBATNq6HlKV14smdlC/qA==} + cpu: [arm64] + os: [linux] + + '@oxlint/linux-x64-gnu@1.39.0': + resolution: {integrity: sha512-ZVt5qsECpuNprdWxAPpDBwoixr1VTcZ4qAEQA2l/wmFyVPDYFD3oBY/SWACNnWBddMrswjTg9O8ALxYWoEpmXw==} + cpu: [x64] + os: [linux] + + '@oxlint/linux-x64-musl@1.39.0': + resolution: {integrity: sha512-pB0hlGyKPbxr9NMIV783lD6cWL3MpaqnZRM9MWni4yBdHPTKyFNYdg5hGD0Bwg+UP4S2rOevq/+OO9x9Bi7E6g==} + cpu: [x64] + os: [linux] + + '@oxlint/win32-arm64@1.39.0': + resolution: {integrity: sha512-Gg2SFaJohI9+tIQVKXlPw3FsPQFi/eCSWiCgwPtPn5uzQxHRTeQEZKuluz1fuzR5U70TXubb2liZi4Dgl8LJQA==} + cpu: [arm64] + os: [win32] + + '@oxlint/win32-x64@1.39.0': + resolution: {integrity: sha512-sbi25lfj74hH+6qQtb7s1wEvd1j8OQbTaH8v3xTcDjrwm579Cyh0HBv1YSZ2+gsnVwfVDiCTL1D0JsNqYXszVA==} + cpu: [x64] + os: [win32] + + '@quansync/fs@1.0.0': + resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} + + '@rolldown/binding-android-arm64@1.0.0-beta.59': + resolution: {integrity: sha512-6yLLgyswYwiCfls9+hoNFY9F8TQdwo15hpXDHzlAR0X/GojeKF+AuNcXjYNbOJ4zjl/5D6lliE8CbpB5t1OWIQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-beta.59': + resolution: {integrity: sha512-hqGXRc162qCCIOAcHN2Cw4eXiVTwYsMFLOhAy1IG2CxY+dwc/l4Ga+dLPkLor3Ikqy5WDn+7kxHbbh6EmshEpQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-beta.59': + resolution: {integrity: sha512-ezvvGuhteE15JmMhJW0wS7BaXmhwLy1YHeEwievYaPC1PgGD86wgBKfOpHr9tSKllAXbCe0BeeMvasscWLhKdA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-beta.59': + resolution: {integrity: sha512-4fhKVJiEYVd5n6no/mrL3LZ9kByfCGwmONOrdtvx8DJGDQhehH/q3RfhG3V/4jGKhpXgbDjpIjkkFdybCTcgew==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.59': + resolution: {integrity: sha512-T3Y52sW6JAhvIqArBw+wtjNU1Ieaz4g0NBxyjSJoW971nZJBZygNlSYx78G4cwkCmo1dYTciTPDOnQygLV23pA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.59': + resolution: {integrity: sha512-NIW40jQDSQap2KDdmm9z3B/4OzWJ6trf8dwx3FD74kcQb3v34ThsBFTtzE5KjDuxnxgUlV+DkAu+XgSMKrgufw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.59': + resolution: {integrity: sha512-CCKEk+H+8c0WGe/8n1E20n85Tq4Pv+HNAbjP1KfUXW+01aCWSMjU56ChNrM2tvHnXicfm7QRNoZyfY8cWh7jLQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.59': + resolution: {integrity: sha512-VlfwJ/HCskPmQi8R0JuAFndySKVFX7yPhE658o27cjSDWWbXVtGkSbwaxstii7Q+3Rz87ZXN+HLnb1kd4R9Img==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.59': + resolution: {integrity: sha512-kuO92hTRyGy0Ts3Nsqll0rfO8eFsEJe9dGQGktkQnZ2hrJrDVN0y419dMgKy/gB2S2o7F2dpWhpfQOBehZPwVA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.59': + resolution: {integrity: sha512-PXAebvNL4sYfCqi8LdY4qyFRacrRoiPZLo3NoUmiTxm7MPtYYR8CNtBGNokqDmMuZIQIecRaD/jbmFAIDz7DxQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.59': + resolution: {integrity: sha512-yJoklQg7XIZq8nAg0bbkEXcDK6sfpjxQGxpg2Nd6ERNtvg+eOaEBRgPww0BVTrYFQzje1pB5qPwC2VnJHT3koQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.59': + resolution: {integrity: sha512-ljZ4+McmCbIuZwEBaoGtiG8Rq2nJjaXEnLEIx+usWetXn1ECjXY0LAhkELxOV6ytv4ensEmoJJ8nXg47hRMjlw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.59': + resolution: {integrity: sha512-bMY4tTIwbdZljW+xe/ln1hvs0SRitahQSXfWtvgAtIzgSX9Ar7KqJzU7lRm33YTRFIHLULRi53yNjw9nJGd6uQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-beta.59': + resolution: {integrity: sha512-aoh6LAJRyhtazs98ydgpNOYstxUlsOV1KJXcpf/0c0vFcUA8uyd/hwKRhqE/AAPNqAho9RliGsvitCoOzREoVA==} + + '@rollup/plugin-replace@6.0.3': + resolution: {integrity: sha512-J4RZarRvQAm5IF0/LwUUg+obsm+xZhYnbMXmXROyoSE1ATJe3oXSb9L5MMppdxP2ylNSjv6zFBwKYjcKMucVfA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.52.5': + resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.52.5': + resolution: {integrity: sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.52.5': + resolution: {integrity: sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.52.5': + resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.52.5': + resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.52.5': + resolution: {integrity: sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': + resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.52.5': + resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.52.5': + resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.52.5': + resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.52.5': + resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.52.5': + resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.52.5': + resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.52.5': + resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.52.5': + resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.52.5': + resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.52.5': + resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openharmony-arm64@4.52.5': + resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.52.5': + resolution: {integrity: sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.52.5': + resolution: {integrity: sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.52.5': + resolution: {integrity: sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.52.5': + resolution: {integrity: sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==} + cpu: [x64] + os: [win32] + + '@sinclair/typebox@0.34.41': + resolution: {integrity: sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==} + + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node@25.0.7': + resolution: {integrity: sha512-C/er7DlIZgRJO7WtTdYovjIFzGsz0I95UlMyR9anTb4aCpBSRWe5Jc1/RvLKUfzmOxHPGjSE5+63HgLtndxU4w==} + + '@vitest/coverage-v8@4.0.17': + resolution: {integrity: sha512-/6zU2FLGg0jsd+ePZcwHRy3+WpNTBBhDY56P4JTRqUN/Dp6CvOEa9HrikcQ4KfV2b2kAHUFB4dl1SuocWXSFEw==} + peerDependencies: + '@vitest/browser': 4.0.17 + vitest: 4.0.17 + peerDependenciesMeta: + '@vitest/browser': + optional: true + + '@vitest/expect@4.0.17': + resolution: {integrity: sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==} + + '@vitest/mocker@4.0.17': + resolution: {integrity: sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@4.0.17': + resolution: {integrity: sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==} + + '@vitest/runner@4.0.17': + resolution: {integrity: sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==} + + '@vitest/snapshot@4.0.17': + resolution: {integrity: sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==} + + '@vitest/spy@4.0.17': + resolution: {integrity: sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==} + + '@vitest/utils@4.0.17': + resolution: {integrity: sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==} + + '@xmldom/xmldom@0.8.11': + resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==} + engines: {node: '>=10.0.0'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansis@4.2.0: + resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} + engines: {node: '>=14'} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + ast-kit@2.2.0: + resolution: {integrity: sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==} + engines: {node: '>=20.19.0'} + + ast-v8-to-istanbul@0.3.10: + resolution: {integrity: sha512-p4K7vMz2ZSk3wN8l5o3y2bJAoZXT3VuJI5OLTATY/01CYWumWvwkUw0SqDBnNq6IiTO3qDa1eSQDibAV8g7XOQ==} + + babel-helper-evaluate-path@0.5.0: + resolution: {integrity: sha512-mUh0UhS607bGh5wUMAQfOpt2JX2ThXMtppHRdRU1kL7ZLRWIXxoV2UIV1r2cAeeNeU1M5SB5/RSUgUxrK8yOkA==} + + babel-helper-flip-expressions@0.4.3: + resolution: {integrity: sha512-rSrkRW4YQ2ETCWww9gbsWk4N0x1BOtln349Tk0dlCS90oT68WMLyGR7WvaMp3eAnsVrCqdUtC19lo1avyGPejA==} + + babel-helper-is-nodes-equiv@0.0.1: + resolution: {integrity: sha512-ri/nsMFVRqXn7IyT5qW4/hIAGQxuYUFHa3qsxmPtbk6spZQcYlyDogfVpNm2XYOslH/ULS4VEJGUqQX5u7ACQw==} + + babel-helper-is-void-0@0.4.3: + resolution: {integrity: sha512-07rBV0xPRM3TM5NVJEOQEkECX3qnHDjaIbFvWYPv+T1ajpUiVLiqTfC+MmiZxY5KOL/Ec08vJdJD9kZiP9UkUg==} + + babel-helper-mark-eval-scopes@0.4.3: + resolution: {integrity: sha512-+d/mXPP33bhgHkdVOiPkmYoeXJ+rXRWi7OdhwpyseIqOS8CmzHQXHUp/+/Qr8baXsT0kjGpMHHofHs6C3cskdA==} + + babel-helper-remove-or-void@0.4.3: + resolution: {integrity: sha512-eYNceYtcGKpifHDir62gHJadVXdg9fAhuZEXiRQnJJ4Yi4oUTpqpNY//1pM4nVyjjDMPYaC2xSf0I+9IqVzwdA==} + + babel-helper-to-multiple-sequence-expressions@0.5.0: + resolution: {integrity: sha512-m2CvfDW4+1qfDdsrtf4dwOslQC3yhbgyBFptncp4wvtdrDHqueW7slsYv4gArie056phvQFhT2nRcGS4bnm6mA==} + + babel-plugin-minify-builtins@0.5.0: + resolution: {integrity: sha512-wpqbN7Ov5hsNwGdzuzvFcjgRlzbIeVv1gMIlICbPj0xkexnfoIDe7q+AZHMkQmAE/F9R5jkrB6TLfTegImlXag==} + + babel-plugin-minify-constant-folding@0.5.0: + resolution: {integrity: sha512-Vj97CTn/lE9hR1D+jKUeHfNy+m1baNiJ1wJvoGyOBUx7F7kJqDZxr9nCHjO/Ad+irbR3HzR6jABpSSA29QsrXQ==} + + babel-plugin-minify-dead-code-elimination@0.5.2: + resolution: {integrity: sha512-krq9Lwi0QIzyAlcNBXTL4usqUvevB4BzktdEsb8srcXC1AaYqRJiAQw6vdKdJSaXbz6snBvziGr6ch/aoRCfpA==} + + babel-plugin-minify-flip-comparisons@0.4.3: + resolution: {integrity: sha512-8hNwgLVeJzpeLVOVArag2DfTkbKodzOHU7+gAZ8mGBFGPQHK6uXVpg3jh5I/F6gfi5Q5usWU2OKcstn1YbAV7A==} + + babel-plugin-minify-guarded-expressions@0.4.4: + resolution: {integrity: sha512-RMv0tM72YuPPfLT9QLr3ix9nwUIq+sHT6z8Iu3sLbqldzC1Dls8DPCywzUIzkTx9Zh1hWX4q/m9BPoPed9GOfA==} + + babel-plugin-minify-infinity@0.4.3: + resolution: {integrity: sha512-X0ictxCk8y+NvIf+bZ1HJPbVZKMlPku3lgYxPmIp62Dp8wdtbMLSekczty3MzvUOlrk5xzWYpBpQprXUjDRyMA==} + + babel-plugin-minify-mangle-names@0.5.1: + resolution: {integrity: sha512-8KMichAOae2FHlipjNDTo2wz97MdEb2Q0jrn4NIRXzHH7SJ3c5TaNNBkeTHbk9WUsMnqpNUx949ugM9NFWewzw==} + + babel-plugin-minify-numeric-literals@0.4.3: + resolution: {integrity: sha512-5D54hvs9YVuCknfWywq0eaYDt7qYxlNwCqW9Ipm/kYeS9gYhJd0Rr/Pm2WhHKJ8DC6aIlDdqSBODSthabLSX3A==} + + babel-plugin-minify-replace@0.5.0: + resolution: {integrity: sha512-aXZiaqWDNUbyNNNpWs/8NyST+oU7QTpK7J9zFEFSA0eOmtUNMU3fczlTTTlnCxHmq/jYNFEmkkSG3DDBtW3Y4Q==} + + babel-plugin-minify-simplify@0.5.1: + resolution: {integrity: sha512-OSYDSnoCxP2cYDMk9gxNAed6uJDiDz65zgL6h8d3tm8qXIagWGMLWhqysT6DY3Vs7Fgq7YUDcjOomhVUb+xX6A==} + + babel-plugin-minify-type-constructors@0.4.3: + resolution: {integrity: sha512-4ADB0irJ/6BeXWHubjCJmrPbzhxDgjphBMjIjxCc25n4NGJ00NsYqwYt+F/OvE9RXx8KaSW7cJvp+iZX436tnQ==} + + babel-plugin-polyfill-corejs2@0.4.14: + resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.13.0: + resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.6.5: + resolution: {integrity: sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-tester@12.0.0: + resolution: {integrity: sha512-V3ZFYmXPV9fm3ArpLHbvh0R5IfwnyFwlvdZ2FFQ49af4seC10U0JDWssjhXInuDDli6hyQsoOybGFSTCovrGyA==} + engines: {node: ^20.18.0 || ^22.12.0 || >=23.3.0} + peerDependencies: + '@babel/core': '>=7.22.0' + + babel-plugin-transform-inline-consecutive-adds@0.4.3: + resolution: {integrity: sha512-8D104wbzzI5RlxeVPYeQb9QsUyepiH1rAO5hpPpQ6NPRgQLpIVwkS/Nbx944pm4K8Z+rx7CgjPsFACz/VCBN0Q==} + + babel-plugin-transform-member-expression-literals@6.9.4: + resolution: {integrity: sha512-Xq9/Rarpj+bjOZSl1nBbZYETsNEDDJSrb6Plb1sS3/36FukWFLLRysgecva5KZECjUJTrJoQqjJgtWToaflk5Q==} + + babel-plugin-transform-merge-sibling-variables@6.9.5: + resolution: {integrity: sha512-xj/KrWi6/uP+DrD844h66Qh2cZN++iugEIgH8QcIxhmZZPNP6VpOE9b4gP2FFW39xDAY43kCmYMM6U0QNKN8fw==} + + babel-plugin-transform-minify-booleans@6.9.4: + resolution: {integrity: sha512-9pW9ePng6DZpzGPalcrULuhSCcauGAbn8AeU3bE34HcDkGm8Ldt0ysjGkyb64f0K3T5ilV4mriayOVv5fg0ASA==} + + babel-plugin-transform-property-literals@6.9.4: + resolution: {integrity: sha512-Pf8JHTjTPxecqVyL6KSwD/hxGpoTZjiEgV7nCx0KFQsJYM0nuuoCajbg09KRmZWeZbJ5NGTySABYv8b/hY1eEA==} + + babel-plugin-transform-regexp-constructors@0.4.3: + resolution: {integrity: sha512-JjymDyEyRNhAoNFp09y/xGwYVYzT2nWTGrBrWaL6eCg2m+B24qH2jR0AA8V8GzKJTgC8NW6joJmc6nabvWBD/g==} + + babel-plugin-transform-remove-console@6.9.4: + resolution: {integrity: sha512-88blrUrMX3SPiGkT1GnvVY8E/7A+k6oj3MNvUtTIxJflFzXTw1bHkuJ/y039ouhFMp2prRn5cQGzokViYi1dsg==} + + babel-plugin-transform-remove-debugger@6.9.4: + resolution: {integrity: sha512-Kd+eTBYlXfwoFzisburVwrngsrz4xh9I0ppoJnU/qlLysxVBRgI4Pj+dk3X8F5tDiehp3hhP8oarRMT9v2Z3lw==} + + babel-plugin-transform-remove-undefined@0.5.0: + resolution: {integrity: sha512-+M7fJYFaEE/M9CXa0/IRkDbiV3wRELzA1kKQFCJ4ifhrzLKn/9VCCgj9OFmYWwBd8IB48YdgPkHYtbYq+4vtHQ==} + + babel-plugin-transform-simplify-comparison-operators@6.9.4: + resolution: {integrity: sha512-GLInxhGAQWJ9YIdjwF6dAFlmh4U+kN8pL6Big7nkDzHoZcaDQOtBm28atEhQJq6m9GpAovbiGEShKqXv4BSp0A==} + + babel-plugin-transform-titanium@0.1.1: + resolution: {integrity: sha512-N2ImhDNsfmT5Q68HeNJfg1xE8Z3NsVYWC+/TWLtckscXPjleDJRciIRzhUhI6876VXhxSjbw5s7ylv1NTa/xoA==} + + babel-plugin-transform-undefined-to-void@6.9.4: + resolution: {integrity: sha512-D2UbwxawEY1xVc9svYAUZQM2xarwSNXue2qDIx6CeV2EuMGaes/0su78zlIDIAgE7BvnMw4UpmSo9fDy+znghg==} + + babel-preset-minify@0.5.2: + resolution: {integrity: sha512-v4GL+kk0TfovbRIKZnC3HPbu2cAGmPAby7BsOmuPdMJfHV+4FVdsGXTH/OOGQRKYdjemBuL1+MsE6mobobhe9w==} + + baseline-browser-mapping@2.8.20: + resolution: {integrity: sha512-JMWsdF+O8Orq3EMukbUN1QfbLK9mX2CkUmQBcW2T0s8OmdAUL5LLM/6wFwSrqXzlXB13yhyK9gTKS1rIizOduQ==} + hasBin: true + + birpc@4.0.0: + resolution: {integrity: sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==} + + browserslist@4.27.0: + resolution: {integrity: sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffers@0.1.1: + resolution: {integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==} + engines: {node: '>=0.2.0'} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + caniuse-lite@1.0.30001751: + resolution: {integrity: sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==} + + chai@6.2.1: + resolution: {integrity: sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==} + engines: {node: '>=18'} + + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + core-js-compat@3.46.0: + resolution: {integrity: sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==} + + core-js@3.46.0: + resolution: {integrity: sha512-vDMm9B0xnqqZ8uSBpZ8sNtRtOdmfShrvT6h2TuQGLs0Is+cR0DYbj/KWP6ALVNbWPpqA/qPLoOuppJN07humpA==} + + cross-env@10.1.0: + resolution: {integrity: sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==} + engines: {node: '>=20'} + hasBin: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + + dprint@0.51.1: + resolution: {integrity: sha512-CEx+wYARxLAe9o7RCZ77GKae6DF7qjn5Rd98xbWdA3hB4PFBr+kHwLANmNHscNumBAIrCg5ZJj/Kz+OYbJ+GBA==} + hasBin: true + + dts-resolver@2.1.3: + resolution: {integrity: sha512-bihc7jPC90VrosXNzK0LTE2cuLP6jr0Ro8jk+kMugHReJVLIpHz/xadeq3MhuwyO4TD4OA3L1Q8pBBFRc08Tsw==} + engines: {node: '>=20.19.0'} + peerDependencies: + oxc-resolver: '>=11.0.0' + peerDependenciesMeta: + oxc-resolver: + optional: true + + electron-to-chromium@1.5.241: + resolution: {integrity: sha512-ILMvKX/ZV5WIJzzdtuHg8xquk2y0BOGlFOxBVwTpbiXqWIH0hamG45ddU4R3PQ0gYu+xgo0vdHXHli9sHIGb4w==} + + empathic@2.0.0: + resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} + engines: {node: '>=14'} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + esbuild@0.25.11: + resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + exit-hook@4.0.0: + resolution: {integrity: sha512-Fqs7ChZm72y40wKjOFXBKg7nJZvQJmewP5/7LtePDdnah/+FH9Hp5sgMujSCMPXlxOAW2//1jrW9pnsY7o20vQ==} + engines: {node: '>=18'} + + expect-type@1.2.2: + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} + engines: {node: '>=12.0.0'} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-tsconfig@4.13.0: + resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} + + glob@13.0.0: + resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==} + engines: {node: 20 || >=22} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hookable@6.0.1: + resolution: {integrity: sha512-uKGyY8BuzN/a5gvzvA+3FVWo0+wUjgtfSdnmjtrOVwQCZPHpHDH2WRO3VZSOeluYrHoDCiXFffZXs8Dj1ULWtw==} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + import-without-cache@0.2.5: + resolution: {integrity: sha512-B6Lc2s6yApwnD2/pMzFh/d5AVjdsDXjgkeJ766FmFuJELIGHNycKRj+l3A39yZPM4CchqNCB4RITEAYB1KUM6A==} + engines: {node: '>=20.19.0'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + lefthook-darwin-arm64@2.0.14: + resolution: {integrity: sha512-5pSYHM3oiI2dApZ/r+fUE6EEh3fJx5ggUnS3B/XoK7moM8T2gLJJqvSyU8kGP/KE0xZrQs37RQYm1UskO/zeNA==} + cpu: [arm64] + os: [darwin] + + lefthook-darwin-x64@2.0.14: + resolution: {integrity: sha512-Hp8DJ9rRfG3eluguHomUz8XU2bGM2wctjsWQYoQ1OTh6eWL6BMQjToumComEt1imJXjO8EVmME5gNjBUJNgjxw==} + cpu: [x64] + os: [darwin] + + lefthook-freebsd-arm64@2.0.14: + resolution: {integrity: sha512-3dwB8e0Jedzgwq8q8pg7QjdLHIX46+fPJ33uH/DkFHayzh0wqaz8cU63VSwFWKo7uq5SJ8IJ8qvTjBpDqfdKTQ==} + cpu: [arm64] + os: [freebsd] + + lefthook-freebsd-x64@2.0.14: + resolution: {integrity: sha512-hL8DJzCYDRZH0oW1+QGXUtBPcsl1ZLxutiuuqBUHtFNt0M25QxSKAN7yAx77l1xEYVg+GgxUgOytYSr0Q7K9wQ==} + cpu: [x64] + os: [freebsd] + + lefthook-linux-arm64@2.0.14: + resolution: {integrity: sha512-VubfIiTNthTsjiDX/ZDROLtXyDFkN3REKQjLYu+VA6VJPHrNPVhRs30bc3975JTFT6bf20gKDSAIWqCokDrewQ==} + cpu: [arm64] + os: [linux] + + lefthook-linux-x64@2.0.14: + resolution: {integrity: sha512-osVNjNAxPTsJnZnX5ahHJJW1XvDYvYuMdddAQ+49mnXPfTyHPQQsPIGo90nHm7WmBi6oUwfOCZC5HPPzqEc2oA==} + cpu: [x64] + os: [linux] + + lefthook-openbsd-arm64@2.0.14: + resolution: {integrity: sha512-VikhZ+oo9pHWa7HGtYVti/aEUACll/t93Lh06UKeLp9ctUqILINs/pYB0NatUXT0Krc4g6u8w5LtzMtDS8qdlg==} + cpu: [arm64] + os: [openbsd] + + lefthook-openbsd-x64@2.0.14: + resolution: {integrity: sha512-TW3GUSYlbdmrwRJ61bduLJEyXrTTQzOeGszODlf4caRr2cu7jmml1/vSz2wLJ43Gokx/59FXeSIcysMKijIBhw==} + cpu: [x64] + os: [openbsd] + + lefthook-windows-arm64@2.0.14: + resolution: {integrity: sha512-TH04uiyvEIe6r1adfQUxQwFDtE7GRGfOcFsRZb7hwMc5OzixLw5a/HqT3qDmNbBlq8QYFpSH9R9VtjLjio/Odw==} + cpu: [arm64] + os: [win32] + + lefthook-windows-x64@2.0.14: + resolution: {integrity: sha512-ucxZc+FJErQu9gS/+ldhEMTKbhA/Ez4F1dPIR06E14Jax7pqdls1IyRWPhRPlvsDh7dkmXrEuBm1iglWpR0/8w==} + cpu: [x64] + os: [win32] + + lefthook@2.0.14: + resolution: {integrity: sha512-JpNpQLXwJJlWNZB/4gDD8UW1pVdABZ6bYRbCShjYHoPq70xbcuZKVIKj177IxJ4R5Nz6xD33BJVdUb1N1NdO7g==} + hasBin: true + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + lru-cache@11.2.2: + resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} + engines: {node: 20 || >=22} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + magicast@0.5.1: + resolution: {integrity: sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@10.1.1: + resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} + engines: {node: 20 || >=22} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + node-releases@2.0.26: + resolution: {integrity: sha512-S2M9YimhSjBSvYnlr5/+umAnPHE++ODwt5e2Ij6FoX45HA/s4vHdkDx1eax2pAPeAOqu4s9b7ppahsyEFdVqQA==} + + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + + oxlint@1.39.0: + resolution: {integrity: sha512-wSiLr0wjG+KTU6c1LpVoQk7JZ7l8HCKlAkVDVTJKWmCGazsNxexxnOXl7dsar92mQcRnzko5g077ggP3RINSjA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + oxlint-tsgolint: '>=0.10.0' + peerDependenciesMeta: + oxlint-tsgolint: + optional: true + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@2.0.1: + resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} + engines: {node: 20 || >=22} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + engines: {node: '>=14'} + hasBin: true + + pretty-format@30.2.0: + resolution: {integrity: sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + quansync@1.0.0: + resolution: {integrity: sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + regenerate-unicode-properties@10.2.2: + resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regexpu-core@6.4.0: + resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} + engines: {node: '>=4'} + + regjsgen@0.8.0: + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + + regjsparser@0.13.0: + resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==} + hasBin: true + + rejoinder@2.1.0: + resolution: {integrity: sha512-dLN0+SBPutC6bVFCH2+1o2VrHrvAj/PX6MzTemeaEKlCL10JKPMRlqszkitLQnHVgm90QQ94wxoBJRgfIEkstg==} + engines: {node: ^20.18.0 || ^22.12.0 || >=23.3.0} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} + hasBin: true + + rimraf@6.1.2: + resolution: {integrity: sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==} + engines: {node: 20 || >=22} + hasBin: true + + rolldown-plugin-dts@0.20.0: + resolution: {integrity: sha512-cLAY1kN2ilTYMfZcFlGWbXnu6Nb+8uwUBsi+Mjbh4uIx7IN8uMOmJ7RxrrRgPsO4H7eSz3E+JwGoL1gyugiyUA==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@ts-macro/tsc': ^0.3.6 + '@typescript/native-preview': '>=7.0.0-dev.20250601.1' + rolldown: ^1.0.0-beta.57 + typescript: ^5.0.0 + vue-tsc: ~3.2.0 + peerDependenciesMeta: + '@ts-macro/tsc': + optional: true + '@typescript/native-preview': + optional: true + typescript: + optional: true + vue-tsc: + optional: true + + rolldown@1.0.0-beta.59: + resolution: {integrity: sha512-Slm000Gd8/AO9z4Kxl4r8mp/iakrbAuJ1L+7ddpkNxgQ+Vf37WPvY63l3oeyZcfuPD1DRrUYBsRPIXSOhvOsmw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + rollup@4.52.5: + resolution: {integrity: sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + snooplogg@6.1.1: + resolution: {integrity: sha512-ERUf0zDe+4/wdzoTlz9aj45PCXRO/jckRY6BwlGLl4dZVr8hanHEW13MSYLSqOz9aDbRR8PGnb4arak+Nh4VqQ==} + engines: {node: '>=18.17'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + + stream-splitter@0.3.2: + resolution: {integrity: sha512-9VAHJIhskQFJMbyKbf/5flSXV2HsP9MDFdCp3A8WDBWkZ8tP/SOfkI2c5lEHNNUNzbWdNkJEv6iNvQRJnSbYuA==} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + tinyrainbow@3.0.3: + resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} + engines: {node: '>=14.0.0'} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + tsdown@0.19.0: + resolution: {integrity: sha512-uqg8yzlS7GemFWcM6aCp/sptF4bJiJbWUibuHTRLLCBEsGCgJxuqxPhuVTqyHXqoEkh9ohwAdlyDKli5MEWCyQ==} + engines: {node: '>=20.19.0'} + hasBin: true + peerDependencies: + '@arethetypeswrong/core': ^0.18.1 + '@vitejs/devtools': '*' + publint: ^0.3.0 + typescript: ^5.0.0 + unplugin-lightningcss: ^0.4.0 + unplugin-unused: ^0.5.0 + peerDependenciesMeta: + '@arethetypeswrong/core': + optional: true + '@vitejs/devtools': + optional: true + publint: + optional: true + typescript: + optional: true + unplugin-lightningcss: + optional: true + unplugin-unused: + optional: true + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + unconfig-core@7.4.2: + resolution: {integrity: sha512-VgPCvLWugINbXvMQDf8Jh0mlbvNjNC6eSUziHsBCMpxR05OPrNrvDnyatdMjRgcHaaNsCqz+wjNXxNw1kRLHUg==} + + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + + unicode-canonical-property-names-ecmascript@2.0.1: + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.2.1: + resolution: {integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.2.0: + resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} + engines: {node: '>=4'} + + unrun@0.2.24: + resolution: {integrity: sha512-xa4/O5q2jmI6EqxweJ+sOy5cyORZWcsgmi8pmABVSUyg24Fh44qJrneUHavZEMsbJbghHYWKSraFy5hDCb/m4w==} + engines: {node: '>=20.19.0'} + hasBin: true + peerDependencies: + synckit: ^0.11.11 + peerDependenciesMeta: + synckit: + optional: true + + update-browserslist-db@1.1.4: + resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + vite@7.1.12: + resolution: {integrity: sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@4.0.17: + resolution: {integrity: sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.0.17 + '@vitest/browser-preview': 4.0.17 + '@vitest/browser-webdriverio': 4.0.17 + '@vitest/ui': 4.0.17 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@opentelemetry/api': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + which@6.0.0: + resolution: {integrity: sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==} + engines: {node: ^20.17.0 || >=22.9.0} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + +snapshots: + + '@-xun/debug@2.0.2': + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.3(supports-color@8.1.1) + supports-color: 8.1.1 + type-fest: 4.41.0 + + '@-xun/fs@2.0.0': + dependencies: + type-fest: 4.41.0 + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/code-frame@7.28.6': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.6': {} + + '@babel/core@7.28.6': + dependencies: + '@babel/code-frame': 7.28.6 + '@babel/generator': 7.28.6 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.6) + '@babel/helpers': 7.28.6 + '@babel/parser': 7.28.6 + '@babel/template': 7.28.6 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3(supports-color@8.1.1) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.28.5': + dependencies: + '@babel/parser': 7.28.6 + '@babel/types': 7.28.5 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/generator@7.28.6': + dependencies: + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.27.3': + dependencies: + '@babel/types': 7.28.5 + + '@babel/helper-compilation-targets@7.28.6': + dependencies: + '@babel/compat-data': 7.28.6 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.27.0 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.28.6) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.6 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-annotate-as-pure': 7.27.3 + regexpu-core: 6.4.0 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + debug: 4.4.3(supports-color@8.1.1) + lodash.debounce: 4.0.8 + resolve: 1.22.11 + transitivePeerDependencies: + - supports-color + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-member-expression-to-functions@7.28.5': + dependencies: + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.28.6': + dependencies: + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.27.1': + dependencies: + '@babel/types': 7.28.5 + + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-plugin-utils@7.28.6': {} + + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-wrap-function': 7.28.3 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helper-wrap-function@7.28.3': + dependencies: + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helpers@7.28.6': + dependencies: + '@babel/template': 7.28.6 + '@babel/types': 7.28.6 + + '@babel/parser@7.28.6': + dependencies: + '@babel/types': 7.28.6 + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.28.6) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + + '@babel/plugin-syntax-import-assertions@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-async-generator-functions@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.6) + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-async-to-generator@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.6) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-block-scoping@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-class-properties@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-static-block@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-classes@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-globals': 7.28.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.28.6) + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-computed-properties@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/template': 7.28.6 + + '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-dotall-regex@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-explicit-resource-management@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.6) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-exponentiation-operator@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-json-strings@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-logical-assignment-operators@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-commonjs@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-systemjs@7.28.5(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-nullish-coalescing-operator@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-numeric-separator@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-object-rest-spread@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.6) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.6) + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.6) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-optional-catch-binding@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-optional-chaining@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-private-methods@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-property-in-object@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-regenerator@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-regexp-modifiers@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-spread@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-unicode-property-regex@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-unicode-sets-regex@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/preset-env@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/compat-data': 7.28.6 + '@babel/core': 7.28.6 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.28.5(@babel/core@7.28.6) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.6) + '@babel/plugin-syntax-import-assertions': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.6) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-async-generator-functions': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-class-static-block': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-computed-properties': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.6) + '@babel/plugin-transform-dotall-regex': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-explicit-resource-management': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-exponentiation-operator': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-json-strings': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-logical-assignment-operators': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-modules-systemjs': 7.28.5(@babel/core@7.28.6) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-numeric-separator': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-optional-catch-binding': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.6) + '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-private-property-in-object': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-regenerator': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-regexp-modifiers': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-unicode-property-regex': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-unicode-sets-regex': 7.28.6(@babel/core@7.28.6) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.6) + babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.6) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.6) + babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.6) + core-js-compat: 3.46.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/types': 7.28.5 + esutils: 2.0.3 + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.6 + '@babel/types': 7.28.5 + + '@babel/template@7.28.6': + dependencies: + '@babel/code-frame': 7.28.6 + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 + + '@babel/traverse@7.28.5': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.6 + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + debug: 4.4.3(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + '@babel/traverse@7.28.6': + dependencies: + '@babel/code-frame': 7.28.6 + '@babel/generator': 7.28.6 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.6 + '@babel/template': 7.28.6 + '@babel/types': 7.28.6 + debug: 4.4.3(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + '@babel/types@7.28.5': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@babel/types@7.28.6': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@bcoe/v8-coverage@1.0.2': {} + + '@dprint/darwin-arm64@0.51.1': + optional: true + + '@dprint/darwin-x64@0.51.1': + optional: true + + '@dprint/linux-arm64-glibc@0.51.1': + optional: true + + '@dprint/linux-arm64-musl@0.51.1': + optional: true + + '@dprint/linux-loong64-glibc@0.51.1': + optional: true + + '@dprint/linux-loong64-musl@0.51.1': + optional: true + + '@dprint/linux-riscv64-glibc@0.51.1': + optional: true + + '@dprint/linux-x64-glibc@0.51.1': + optional: true + + '@dprint/linux-x64-musl@0.51.1': + optional: true + + '@dprint/win32-arm64@0.51.1': + optional: true + + '@dprint/win32-x64@0.51.1': + optional: true + + '@emnapi/core@1.7.1': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.7.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@epic-web/invariant@1.0.0': {} + + '@esbuild/aix-ppc64@0.25.11': + optional: true + + '@esbuild/android-arm64@0.25.11': + optional: true + + '@esbuild/android-arm@0.25.11': + optional: true + + '@esbuild/android-x64@0.25.11': + optional: true + + '@esbuild/darwin-arm64@0.25.11': + optional: true + + '@esbuild/darwin-x64@0.25.11': + optional: true + + '@esbuild/freebsd-arm64@0.25.11': + optional: true + + '@esbuild/freebsd-x64@0.25.11': + optional: true + + '@esbuild/linux-arm64@0.25.11': + optional: true + + '@esbuild/linux-arm@0.25.11': + optional: true + + '@esbuild/linux-ia32@0.25.11': + optional: true + + '@esbuild/linux-loong64@0.25.11': + optional: true + + '@esbuild/linux-mips64el@0.25.11': + optional: true + + '@esbuild/linux-ppc64@0.25.11': + optional: true + + '@esbuild/linux-riscv64@0.25.11': + optional: true + + '@esbuild/linux-s390x@0.25.11': + optional: true + + '@esbuild/linux-x64@0.25.11': + optional: true + + '@esbuild/netbsd-arm64@0.25.11': + optional: true + + '@esbuild/netbsd-x64@0.25.11': + optional: true + + '@esbuild/openbsd-arm64@0.25.11': + optional: true + + '@esbuild/openbsd-x64@0.25.11': + optional: true + + '@esbuild/openharmony-arm64@0.25.11': + optional: true + + '@esbuild/sunos-x64@0.25.11': + optional: true + + '@esbuild/win32-arm64@0.25.11': + optional: true + + '@esbuild/win32-ia32@0.25.11': + optional: true + + '@esbuild/win32-x64@0.25.11': + optional: true + + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + + '@jest/schemas@30.0.5': + dependencies: + '@sinclair/typebox': 0.34.41 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@napi-rs/wasm-runtime@1.1.1': + dependencies: + '@emnapi/core': 1.7.1 + '@emnapi/runtime': 1.7.1 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@oxc-project/types@0.107.0': {} + + '@oxlint/darwin-arm64@1.39.0': + optional: true + + '@oxlint/darwin-x64@1.39.0': + optional: true + + '@oxlint/linux-arm64-gnu@1.39.0': + optional: true + + '@oxlint/linux-arm64-musl@1.39.0': + optional: true + + '@oxlint/linux-x64-gnu@1.39.0': + optional: true + + '@oxlint/linux-x64-musl@1.39.0': + optional: true + + '@oxlint/win32-arm64@1.39.0': + optional: true + + '@oxlint/win32-x64@1.39.0': + optional: true + + '@quansync/fs@1.0.0': + dependencies: + quansync: 1.0.0 + + '@rolldown/binding-android-arm64@1.0.0-beta.59': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-beta.59': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-beta.59': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-beta.59': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.59': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.59': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.59': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.59': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.59': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.59': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.59': + dependencies: + '@napi-rs/wasm-runtime': 1.1.1 + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.59': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.59': + optional: true + + '@rolldown/pluginutils@1.0.0-beta.59': {} + + '@rollup/plugin-replace@6.0.3(rollup@4.52.5)': + dependencies: + '@rollup/pluginutils': 5.3.0(rollup@4.52.5) + magic-string: 0.30.21 + optionalDependencies: + rollup: 4.52.5 + + '@rollup/pluginutils@5.3.0(rollup@4.52.5)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.52.5 + + '@rollup/rollup-android-arm-eabi@4.52.5': + optional: true + + '@rollup/rollup-android-arm64@4.52.5': + optional: true + + '@rollup/rollup-darwin-arm64@4.52.5': + optional: true + + '@rollup/rollup-darwin-x64@4.52.5': + optional: true + + '@rollup/rollup-freebsd-arm64@4.52.5': + optional: true + + '@rollup/rollup-freebsd-x64@4.52.5': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.52.5': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.52.5': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.52.5': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-x64-musl@4.52.5': + optional: true + + '@rollup/rollup-openharmony-arm64@4.52.5': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.52.5': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.52.5': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.52.5': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.52.5': + optional: true + + '@sinclair/typebox@0.34.41': {} + + '@standard-schema/spec@1.0.0': {} + + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + + '@types/deep-eql@4.0.2': {} + + '@types/estree@1.0.8': {} + + '@types/ms@2.1.0': {} + + '@types/node@25.0.7': + dependencies: + undici-types: 7.16.0 + + '@vitest/coverage-v8@4.0.17(vitest@4.0.17(@types/node@25.0.7))': + dependencies: + '@bcoe/v8-coverage': 1.0.2 + '@vitest/utils': 4.0.17 + ast-v8-to-istanbul: 0.3.10 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-reports: 3.2.0 + magicast: 0.5.1 + obug: 2.1.1 + std-env: 3.10.0 + tinyrainbow: 3.0.3 + vitest: 4.0.17(@types/node@25.0.7) + + '@vitest/expect@4.0.17': + dependencies: + '@standard-schema/spec': 1.0.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.0.17 + '@vitest/utils': 4.0.17 + chai: 6.2.1 + tinyrainbow: 3.0.3 + + '@vitest/mocker@4.0.17(vite@7.1.12(@types/node@25.0.7))': + dependencies: + '@vitest/spy': 4.0.17 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 7.1.12(@types/node@25.0.7) + + '@vitest/pretty-format@4.0.17': + dependencies: + tinyrainbow: 3.0.3 + + '@vitest/runner@4.0.17': + dependencies: + '@vitest/utils': 4.0.17 + pathe: 2.0.3 + + '@vitest/snapshot@4.0.17': + dependencies: + '@vitest/pretty-format': 4.0.17 + magic-string: 0.30.21 + pathe: 2.0.3 + + '@vitest/spy@4.0.17': {} + + '@vitest/utils@4.0.17': + dependencies: + '@vitest/pretty-format': 4.0.17 + tinyrainbow: 3.0.3 + + '@xmldom/xmldom@0.8.11': {} + + ansi-styles@5.2.0: {} + + ansis@4.2.0: {} + + assertion-error@2.0.1: {} + + ast-kit@2.2.0: + dependencies: + '@babel/parser': 7.28.6 + pathe: 2.0.3 + + ast-v8-to-istanbul@0.3.10: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + estree-walker: 3.0.3 + js-tokens: 9.0.1 + + babel-helper-evaluate-path@0.5.0: {} + + babel-helper-flip-expressions@0.4.3: {} + + babel-helper-is-nodes-equiv@0.0.1: {} + + babel-helper-is-void-0@0.4.3: {} + + babel-helper-mark-eval-scopes@0.4.3: {} + + babel-helper-remove-or-void@0.4.3: {} + + babel-helper-to-multiple-sequence-expressions@0.5.0: {} + + babel-plugin-minify-builtins@0.5.0: {} + + babel-plugin-minify-constant-folding@0.5.0: + dependencies: + babel-helper-evaluate-path: 0.5.0 + + babel-plugin-minify-dead-code-elimination@0.5.2: + dependencies: + babel-helper-evaluate-path: 0.5.0 + babel-helper-mark-eval-scopes: 0.4.3 + babel-helper-remove-or-void: 0.4.3 + lodash: 4.17.21 + + babel-plugin-minify-flip-comparisons@0.4.3: + dependencies: + babel-helper-is-void-0: 0.4.3 + + babel-plugin-minify-guarded-expressions@0.4.4: + dependencies: + babel-helper-evaluate-path: 0.5.0 + babel-helper-flip-expressions: 0.4.3 + + babel-plugin-minify-infinity@0.4.3: {} + + babel-plugin-minify-mangle-names@0.5.1: + dependencies: + babel-helper-mark-eval-scopes: 0.4.3 + + babel-plugin-minify-numeric-literals@0.4.3: {} + + babel-plugin-minify-replace@0.5.0: {} + + babel-plugin-minify-simplify@0.5.1: + dependencies: + babel-helper-evaluate-path: 0.5.0 + babel-helper-flip-expressions: 0.4.3 + babel-helper-is-nodes-equiv: 0.0.1 + babel-helper-to-multiple-sequence-expressions: 0.5.0 + + babel-plugin-minify-type-constructors@0.4.3: + dependencies: + babel-helper-is-void-0: 0.4.3 + + babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.6): + dependencies: + '@babel/compat-data': 7.28.6 + '@babel/core': 7.28.6 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.6) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.6): + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.6) + core-js-compat: 3.46.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.6): + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.6) + transitivePeerDependencies: + - supports-color + + babel-plugin-tester@12.0.0(@babel/core@7.28.6): + dependencies: + '@-xun/fs': 2.0.0 + '@babel/core': 7.28.6 + core-js: 3.46.0 + lodash.mergewith: 4.6.2 + prettier: 3.6.2 + pretty-format: 30.2.0 + rejoinder: 2.1.0 + strip-indent~3: strip-indent@3.0.0 + type-fest: 4.41.0 + + babel-plugin-transform-inline-consecutive-adds@0.4.3: {} + + babel-plugin-transform-member-expression-literals@6.9.4: {} + + babel-plugin-transform-merge-sibling-variables@6.9.5: {} + + babel-plugin-transform-minify-booleans@6.9.4: {} + + babel-plugin-transform-property-literals@6.9.4: + dependencies: + esutils: 2.0.3 + + babel-plugin-transform-regexp-constructors@0.4.3: {} + + babel-plugin-transform-remove-console@6.9.4: {} + + babel-plugin-transform-remove-debugger@6.9.4: {} + + babel-plugin-transform-remove-undefined@0.5.0: + dependencies: + babel-helper-evaluate-path: 0.5.0 + + babel-plugin-transform-simplify-comparison-operators@6.9.4: {} + + babel-plugin-transform-titanium@0.1.1: {} + + babel-plugin-transform-undefined-to-void@6.9.4: {} + + babel-preset-minify@0.5.2: + dependencies: + babel-plugin-minify-builtins: 0.5.0 + babel-plugin-minify-constant-folding: 0.5.0 + babel-plugin-minify-dead-code-elimination: 0.5.2 + babel-plugin-minify-flip-comparisons: 0.4.3 + babel-plugin-minify-guarded-expressions: 0.4.4 + babel-plugin-minify-infinity: 0.4.3 + babel-plugin-minify-mangle-names: 0.5.1 + babel-plugin-minify-numeric-literals: 0.4.3 + babel-plugin-minify-replace: 0.5.0 + babel-plugin-minify-simplify: 0.5.1 + babel-plugin-minify-type-constructors: 0.4.3 + babel-plugin-transform-inline-consecutive-adds: 0.4.3 + babel-plugin-transform-member-expression-literals: 6.9.4 + babel-plugin-transform-merge-sibling-variables: 6.9.5 + babel-plugin-transform-minify-booleans: 6.9.4 + babel-plugin-transform-property-literals: 6.9.4 + babel-plugin-transform-regexp-constructors: 0.4.3 + babel-plugin-transform-remove-console: 6.9.4 + babel-plugin-transform-remove-debugger: 6.9.4 + babel-plugin-transform-remove-undefined: 0.5.0 + babel-plugin-transform-simplify-comparison-operators: 6.9.4 + babel-plugin-transform-undefined-to-void: 6.9.4 + lodash: 4.17.21 + + baseline-browser-mapping@2.8.20: {} + + birpc@4.0.0: {} + + browserslist@4.27.0: + dependencies: + baseline-browser-mapping: 2.8.20 + caniuse-lite: 1.0.30001751 + electron-to-chromium: 1.5.241 + node-releases: 2.0.26 + update-browserslist-db: 1.1.4(browserslist@4.27.0) + + buffers@0.1.1: {} + + cac@6.7.14: {} + + caniuse-lite@1.0.30001751: {} + + chai@6.2.1: {} + + chalk@5.6.2: {} + + convert-source-map@2.0.0: {} + + core-js-compat@3.46.0: + dependencies: + browserslist: 4.27.0 + + core-js@3.46.0: {} + + cross-env@10.1.0: + dependencies: + '@epic-web/invariant': 1.0.0 + cross-spawn: 7.0.6 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + debug@4.4.3(supports-color@8.1.1): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 + + defu@6.1.4: {} + + dprint@0.51.1: + optionalDependencies: + '@dprint/darwin-arm64': 0.51.1 + '@dprint/darwin-x64': 0.51.1 + '@dprint/linux-arm64-glibc': 0.51.1 + '@dprint/linux-arm64-musl': 0.51.1 + '@dprint/linux-loong64-glibc': 0.51.1 + '@dprint/linux-loong64-musl': 0.51.1 + '@dprint/linux-riscv64-glibc': 0.51.1 + '@dprint/linux-x64-glibc': 0.51.1 + '@dprint/linux-x64-musl': 0.51.1 + '@dprint/win32-arm64': 0.51.1 + '@dprint/win32-x64': 0.51.1 + + dts-resolver@2.1.3: {} + + electron-to-chromium@1.5.241: {} + + empathic@2.0.0: {} + + es-module-lexer@1.7.0: {} + + esbuild@0.25.11: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.11 + '@esbuild/android-arm': 0.25.11 + '@esbuild/android-arm64': 0.25.11 + '@esbuild/android-x64': 0.25.11 + '@esbuild/darwin-arm64': 0.25.11 + '@esbuild/darwin-x64': 0.25.11 + '@esbuild/freebsd-arm64': 0.25.11 + '@esbuild/freebsd-x64': 0.25.11 + '@esbuild/linux-arm': 0.25.11 + '@esbuild/linux-arm64': 0.25.11 + '@esbuild/linux-ia32': 0.25.11 + '@esbuild/linux-loong64': 0.25.11 + '@esbuild/linux-mips64el': 0.25.11 + '@esbuild/linux-ppc64': 0.25.11 + '@esbuild/linux-riscv64': 0.25.11 + '@esbuild/linux-s390x': 0.25.11 + '@esbuild/linux-x64': 0.25.11 + '@esbuild/netbsd-arm64': 0.25.11 + '@esbuild/netbsd-x64': 0.25.11 + '@esbuild/openbsd-arm64': 0.25.11 + '@esbuild/openbsd-x64': 0.25.11 + '@esbuild/openharmony-arm64': 0.25.11 + '@esbuild/sunos-x64': 0.25.11 + '@esbuild/win32-arm64': 0.25.11 + '@esbuild/win32-ia32': 0.25.11 + '@esbuild/win32-x64': 0.25.11 + + escalade@3.2.0: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + esutils@2.0.3: {} + + exit-hook@4.0.0: {} + + expect-type@1.2.2: {} + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + get-tsconfig@4.13.0: + dependencies: + resolve-pkg-maps: 1.0.0 + + glob@13.0.0: + dependencies: + minimatch: 10.1.1 + minipass: 7.1.2 + path-scurry: 2.0.1 + + has-flag@4.0.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hookable@6.0.1: {} + + html-escaper@2.0.2: {} + + import-without-cache@0.2.5: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + isexe@2.0.0: {} + + isexe@3.1.1: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-reports@3.2.0: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + js-tokens@4.0.0: {} + + js-tokens@9.0.1: {} + + jsesc@3.1.0: {} + + json5@2.2.3: {} + + lefthook-darwin-arm64@2.0.14: + optional: true + + lefthook-darwin-x64@2.0.14: + optional: true + + lefthook-freebsd-arm64@2.0.14: + optional: true + + lefthook-freebsd-x64@2.0.14: + optional: true + + lefthook-linux-arm64@2.0.14: + optional: true + + lefthook-linux-x64@2.0.14: + optional: true + + lefthook-openbsd-arm64@2.0.14: + optional: true + + lefthook-openbsd-x64@2.0.14: + optional: true + + lefthook-windows-arm64@2.0.14: + optional: true + + lefthook-windows-x64@2.0.14: + optional: true + + lefthook@2.0.14: + optionalDependencies: + lefthook-darwin-arm64: 2.0.14 + lefthook-darwin-x64: 2.0.14 + lefthook-freebsd-arm64: 2.0.14 + lefthook-freebsd-x64: 2.0.14 + lefthook-linux-arm64: 2.0.14 + lefthook-linux-x64: 2.0.14 + lefthook-openbsd-arm64: 2.0.14 + lefthook-openbsd-x64: 2.0.14 + lefthook-windows-arm64: 2.0.14 + lefthook-windows-x64: 2.0.14 + + lodash.debounce@4.0.8: {} + + lodash.mergewith@4.6.2: {} + + lodash@4.17.21: {} + + lru-cache@11.2.2: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magicast@0.5.1: + dependencies: + '@babel/parser': 7.28.6 + '@babel/types': 7.28.5 + source-map-js: 1.2.1 + + make-dir@4.0.0: + dependencies: + semver: 7.7.3 + + min-indent@1.0.1: {} + + minimatch@10.1.1: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + + minipass@7.1.2: {} + + ms@2.1.3: {} + + nanoid@3.3.11: {} + + node-releases@2.0.26: {} + + obug@2.1.1: {} + + oxlint@1.39.0: + optionalDependencies: + '@oxlint/darwin-arm64': 1.39.0 + '@oxlint/darwin-x64': 1.39.0 + '@oxlint/linux-arm64-gnu': 1.39.0 + '@oxlint/linux-arm64-musl': 1.39.0 + '@oxlint/linux-x64-gnu': 1.39.0 + '@oxlint/linux-x64-musl': 1.39.0 + '@oxlint/win32-arm64': 1.39.0 + '@oxlint/win32-x64': 1.39.0 + + package-json-from-dist@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@2.0.1: + dependencies: + lru-cache: 11.2.2 + minipass: 7.1.2 + + pathe@2.0.3: {} + + picocolors@1.1.1: {} + + picomatch@4.0.3: {} + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prettier@3.6.2: {} + + pretty-format@30.2.0: + dependencies: + '@jest/schemas': 30.0.5 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + quansync@1.0.0: {} + + react-is@18.3.1: {} + + regenerate-unicode-properties@10.2.2: + dependencies: + regenerate: 1.4.2 + + regenerate@1.4.2: {} + + regexpu-core@6.4.0: + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.2.2 + regjsgen: 0.8.0 + regjsparser: 0.13.0 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.2.1 + + regjsgen@0.8.0: {} + + regjsparser@0.13.0: + dependencies: + jsesc: 3.1.0 + + rejoinder@2.1.0: + dependencies: + '@-xun/debug': 2.0.2 + chalk: 5.6.2 + core-js: 3.46.0 + exit-hook: 4.0.0 + + resolve-pkg-maps@1.0.0: {} + + resolve@1.22.11: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + rimraf@6.1.2: + dependencies: + glob: 13.0.0 + package-json-from-dist: 1.0.1 + + rolldown-plugin-dts@0.20.0(rolldown@1.0.0-beta.59)(typescript@5.9.3): + dependencies: + '@babel/generator': 7.28.5 + '@babel/parser': 7.28.6 + '@babel/types': 7.28.5 + ast-kit: 2.2.0 + birpc: 4.0.0 + dts-resolver: 2.1.3 + get-tsconfig: 4.13.0 + obug: 2.1.1 + rolldown: 1.0.0-beta.59 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - oxc-resolver + + rolldown@1.0.0-beta.59: + dependencies: + '@oxc-project/types': 0.107.0 + '@rolldown/pluginutils': 1.0.0-beta.59 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-beta.59 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.59 + '@rolldown/binding-darwin-x64': 1.0.0-beta.59 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.59 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.59 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.59 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.59 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.59 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.59 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.59 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.59 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.59 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.59 + + rollup@4.52.5: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.52.5 + '@rollup/rollup-android-arm64': 4.52.5 + '@rollup/rollup-darwin-arm64': 4.52.5 + '@rollup/rollup-darwin-x64': 4.52.5 + '@rollup/rollup-freebsd-arm64': 4.52.5 + '@rollup/rollup-freebsd-x64': 4.52.5 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.5 + '@rollup/rollup-linux-arm-musleabihf': 4.52.5 + '@rollup/rollup-linux-arm64-gnu': 4.52.5 + '@rollup/rollup-linux-arm64-musl': 4.52.5 + '@rollup/rollup-linux-loong64-gnu': 4.52.5 + '@rollup/rollup-linux-ppc64-gnu': 4.52.5 + '@rollup/rollup-linux-riscv64-gnu': 4.52.5 + '@rollup/rollup-linux-riscv64-musl': 4.52.5 + '@rollup/rollup-linux-s390x-gnu': 4.52.5 + '@rollup/rollup-linux-x64-gnu': 4.52.5 + '@rollup/rollup-linux-x64-musl': 4.52.5 + '@rollup/rollup-openharmony-arm64': 4.52.5 + '@rollup/rollup-win32-arm64-msvc': 4.52.5 + '@rollup/rollup-win32-ia32-msvc': 4.52.5 + '@rollup/rollup-win32-x64-gnu': 4.52.5 + '@rollup/rollup-win32-x64-msvc': 4.52.5 + fsevents: 2.3.3 + + semver@6.3.1: {} + + semver@7.7.3: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + siginfo@2.0.0: {} + + snooplogg@6.1.1: {} + + source-map-js@1.2.1: {} + + stackback@0.0.2: {} + + std-env@3.10.0: {} + + stream-splitter@0.3.2: + dependencies: + buffers: 0.1.1 + + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + tinybench@2.9.0: {} + + tinyexec@1.0.2: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tinyrainbow@3.0.3: {} + + tree-kill@1.2.2: {} + + tsdown@0.19.0(typescript@5.9.3): + dependencies: + ansis: 4.2.0 + cac: 6.7.14 + defu: 6.1.4 + empathic: 2.0.0 + hookable: 6.0.1 + import-without-cache: 0.2.5 + obug: 2.1.1 + picomatch: 4.0.3 + rolldown: 1.0.0-beta.59 + rolldown-plugin-dts: 0.20.0(rolldown@1.0.0-beta.59)(typescript@5.9.3) + semver: 7.7.3 + tinyexec: 1.0.2 + tinyglobby: 0.2.15 + tree-kill: 1.2.2 + unconfig-core: 7.4.2 + unrun: 0.2.24 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - '@ts-macro/tsc' + - '@typescript/native-preview' + - oxc-resolver + - synckit + - vue-tsc + + tslib@2.8.1: + optional: true + + type-fest@4.41.0: {} + + typescript@5.9.3: {} + + unconfig-core@7.4.2: + dependencies: + '@quansync/fs': 1.0.0 + quansync: 1.0.0 + + undici-types@7.16.0: {} + + unicode-canonical-property-names-ecmascript@2.0.1: {} + + unicode-match-property-ecmascript@2.0.0: + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.1 + unicode-property-aliases-ecmascript: 2.2.0 + + unicode-match-property-value-ecmascript@2.2.1: {} + + unicode-property-aliases-ecmascript@2.2.0: {} + + unrun@0.2.24: + dependencies: + rolldown: 1.0.0-beta.59 + + update-browserslist-db@1.1.4(browserslist@4.27.0): + dependencies: + browserslist: 4.27.0 + escalade: 3.2.0 + picocolors: 1.1.1 + + vite@7.1.12(@types/node@25.0.7): + dependencies: + esbuild: 0.25.11 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.52.5 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 25.0.7 + fsevents: 2.3.3 + + vitest@4.0.17(@types/node@25.0.7): + dependencies: + '@vitest/expect': 4.0.17 + '@vitest/mocker': 4.0.17(vite@7.1.12(@types/node@25.0.7)) + '@vitest/pretty-format': 4.0.17 + '@vitest/runner': 4.0.17 + '@vitest/snapshot': 4.0.17 + '@vitest/spy': 4.0.17 + '@vitest/utils': 4.0.17 + es-module-lexer: 1.7.0 + expect-type: 1.2.2 + magic-string: 0.30.21 + obug: 2.1.1 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 1.0.2 + tinyglobby: 0.2.15 + tinyrainbow: 3.0.3 + vite: 7.1.12(@types/node@25.0.7) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 25.0.7 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - yaml + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + which@6.0.0: + dependencies: + isexe: 3.1.1 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + yallist@3.1.1: {} diff --git a/src/android/adb.ts b/src/android/adb.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/android/android-ndk.ts b/src/android/android-ndk.ts new file mode 100644 index 00000000..6c2f87c9 --- /dev/null +++ b/src/android/android-ndk.ts @@ -0,0 +1,240 @@ +import { config } from '../config.js'; +import { basename, join } from 'node:path'; +import { isDir } from '../util/is-dir.js'; +import { isFile } from '../util/is-file.js'; +import { expand } from '../util/expand.js'; +import { tailgate } from '../util/tailgate.js'; +import { createHash } from 'node:crypto'; +import snooplogg from 'snooplogg'; +import { Issue } from '../util/issue.js'; +import { readdir, readFile } from 'node:fs/promises'; +import { readPropertiesFile } from './util/read-properties-file.js'; +import which from 'which'; + +const { error, log } = snooplogg('android:ndk'); + +const cmd = process.platform === 'win32' ? '.cmd' : ''; + +/** + * A cached regex for matching the NDK architecture. + * @type {RegExp} + */ +const archRegExp = /\w-x86_64[/\\]/m; + +/** + * A cached regex for matching the NDK release version. + * @type {RegExp} + */ +const releaseRegExp = /^(r(\d+)([A-Za-z])?)(?:\s+\(([^)]+)\))?$/; + +/** + * A cached regex for matching the NDK version. + * @type {RegExp} + */ +const versionRegExp = /^(\d+)(?:\.(\d+))?/; + +/** + * Detects and organizes Android NDK information. + */ +export class AndroidNDK { + arch: string; + executables: Record; + name: string; + path: string; + version: string | null; + + private constructor({ path, name, version, arch, executables }: { path: string, name: string, version: string | null, arch: string, executables: Record }) { + this.arch = arch; + this.executables = executables; + this.name = name; + this.path = path; + this.version = version; + } + + static async load(path: string): Promise { + log(`Loading: ${path}`); + if (typeof path !== 'string' || !path) { + throw new TypeError('Expected Android NDK path to be a valid string'); + } + if (!isDir(path)) { + throw new Error('Android NDK path does not exist: ${path}'); + } + + for (const name of [ 'build', 'platforms' ]) { + if (!isDir(join(path, name))) { + throw new Error(`Directory does not contain the "${name}" directory`); + } + } + + let ndkWhich = join(path, `ndk-which${cmd}`); + + if (process.platform === 'win32' && !isFile(ndkWhich)) { + // For some reason, some releases of the Android NDK have a `ndk-which` + // executable without a `.cmd` extension + ndkWhich = join(path, 'ndk-which'); + } + + let name = basename(path); + let version: string | null = null; + let arch = '32-bit'; + let executables = { + 'ndk-build': join(path, `ndk-build${cmd}`), + 'ndk-which': ndkWhich + }; + + for (const name of Object.keys(executables)) { + if (!isFile(executables[name])) { + throw new Error(`Directory does not contain the "${name}" executable`); + } + } + + // get the archtecture + if (archRegExp.test(await readFile(executables['ndk-which'], 'utf8'))) { + arch = '64-bit'; + } + + // get the version + const sourceProps = await readPropertiesFile(join(path, 'source.properties')); + if (sourceProps) { + version = sourceProps['Pkg.Revision']; + if (version) { + const m = version.match(versionRegExp); + if (m) { + if (m[2] === undefined) { + version = `${m[1]}.0`; + } else if (Number.parseInt(m[2]) !== 0) { + name = `r${m[1]}${String.fromCharCode('a'.charCodeAt(0) + Number.parseInt(m[2]))}`; + } + } + } + } + + if (!version) { + // no version, try to find it in the release.txt file + for (const filename of await readdir(path)) { + if (filename.toLowerCase() === 'release.txt') { + const release = (await readFile(join(path, filename), 'utf8')).split(/\r?\n/).shift()?.trim(); + // release comes back in the format "r10e (64-bit)", so we + // need to extract a meaningful version number from that + const m = release?.match(releaseRegExp); + if (m) { + name = m[1]; + const minor = (m[3] ? m[3].toLowerCase() : 'a').charCodeAt(0) - 'a'.charCodeAt(0); + version = `${m[2]}.${minor}`; + if (m[4] && m[4].toLowerCase() === '64-bit') { + arch = '64-bit'; + } + } + break; + } + } + } + + log(`Found Android NDK: ${path} (version: ${version}, arch: ${arch})`); + return new AndroidNDK({ + arch, + executables, + name, + path, + version, + }); + } +} + +interface NDKs { + ndks: AndroidNDK[]; + issues: Issue[]; +} + +let ndkCache: NDKs | null = null; +let ndkSearchPathsHash: string | null = null; + +/** + * Detects installed letAndroid NDKs, then caches and returns the results. + * + * @param {Boolean} [force=false] - When `true`, bypasses cache and forces redetection. + * @returns {Promise>} + */ +export async function detect(options: { + bypassCache?: boolean; + searchPaths?: string[]; +} = {}): Promise { + const searchPaths = await getSearchPaths(options); + const searchPathsHash = createHash('sha256') + .update(searchPaths.toSorted().join()).digest('hex'); + + if (ndkCache !== null && !options.bypassCache && ndkSearchPathsHash === searchPathsHash) { + return ndkCache; + } + + return tailgate('android:ndk:detect', async () => { + const results = await Promise.allSettled(searchPaths.map(async path => { + try { + return await AndroidNDK.load(path); + } catch (e) { + // Not an NDK, check subdirectories + if (isDir(path)) { + for (const name of await readdir(path)) { + try { + return await AndroidNDK.load(join(path, name)); + } catch { + // Not an NDK + } + } + } + throw e; + } + })); + const ndks: AndroidNDK[] = []; + const issues: Issue[] = []; + + for (const result of results) { + if (result.status === 'fulfilled' && result.value) { + ndks.push(result.value); + } else if (result.status === 'rejected') { + error(result.reason.message); + } + } + + if (!ndks.length) { + issues.push(new Issue('No Android NDKs found', { + id: 'ANDROID_NDK_NOT_FOUND', + type: 'warning', + details: 'No Android NDKs found. Please install the Android NDK and try again.', + })); + } + + ndkCache = { + ndks, + issues, + }; + ndkSearchPathsHash = searchPathsHash; + + return ndkCache; + }); +} + +async function getSearchPaths(options: { searchPaths?: string[] }) { + const paths: string[] = []; + if (Array.isArray(options.searchPaths)) { + paths.push(...options.searchPaths); + } + const configPaths = config.android.ndk.searchPaths[process.platform]; + if (Array.isArray(configPaths)) { + paths.push(...configPaths); + } + + const searchPaths = new Set(); + if (paths) { + for (const path of paths) { + searchPaths.add(expand(path)); + } + } + + const ndkBuildPath = await which(`ndk-build${cmd}`, { nothrow: true }); + if (ndkBuildPath) { + searchPaths.add(expand(ndkBuildPath, '..', '..')); + } + + return Array.from(searchPaths); +} diff --git a/src/android/android-sdk.ts b/src/android/android-sdk.ts new file mode 100644 index 00000000..498153a1 --- /dev/null +++ b/src/android/android-sdk.ts @@ -0,0 +1,415 @@ +import { config } from '../config.js'; +import { expand } from '../util/expand.js'; +import { createHash } from 'node:crypto'; +import { tailgate } from '../util/tailgate.js'; +import snooplogg from 'snooplogg'; +import { isDir } from '../util/is-dir.js'; +import { join, relative } from 'node:path'; +import { readPropertiesFile } from './util/read-properties-file.js'; +import { isFile } from '../util/is-file.js'; +import { readdir } from 'node:fs/promises'; +import { Issue } from '../util/issue.js'; + +const { error, log } = snooplogg('android:sdk'); + +const exe = process.platform === 'win32' ? '.exe' : ''; + +type AndroidSDKExecutables = { + adb: string; + emulator: string; +}; + +type SystemImage = { + abi: string; + sdk: string; + skins: string[]; + type: string; +}; + +type Platform = { + abis: Record; + androidJar: string | null; + apiLevel: number; + codename: string | null; + defaultSkin: string | null; + minToolsRev: number | null; + name: string; + path: string; + revision: number | null; + sdk: string; + skins: string[]; + version: string; +}; + +type Addon = { + abis: Record | null; + androidJar: string | null; + apiLevel: number; + basedOn: { version: string; apiLevel: number } | null; + codename: string | null; + defaultSkin: string | null; + description: string | null; + minToolsRev: number | null; + name: string; + path: string; + revision: number | null; + sdk: string; + skins: string[] | null; + vendor: string; + version: string | null; +}; + +type AndroidSDKOptions = { + addons: Addon[]; + executables: AndroidSDKExecutables; + issues: Issue[]; + path: string; + platforms: Platform[]; + systemImages: Record; +}; + +export class AndroidSDK { + addons!: Addon[]; + executables!: AndroidSDKExecutables; + issues!: Issue[]; + path!: string; + platforms!: Platform[]; + systemImages!: Record; + + constructor(options: AndroidSDKOptions) { + Object.assign(this, options); + } + + static async load(path: string): Promise { + log(`Loading: ${path}`); + if (typeof path !== 'string' || !path) { + throw new TypeError('Expected Android SDK path to be a valid string'); + } + if (!isDir(path)) { + throw new Error(`Android SDK path does not exist: ${path}`); + } + + const executables = { + adb: join(path, 'platform-tools', `adb${exe}`), + emulator: join(path, 'emulator', `emulator${exe}`), + }; + for (const [key, value] of Object.entries(executables)) { + if (!isFile(value)) { + throw new Error(`Invalid Android SDK: missing required executable "${key}"`); + } + } + + const issues: Issue[] = []; + + const systemImages = await AndroidSDK.detectSystemImages(path, issues); + const platforms = await AndroidSDK.detectPlatforms(path, systemImages, issues); + const addons = await AndroidSDK.detectAddons(path, platforms); + + return new AndroidSDK({ + addons, + executables, + issues, + path, + platforms, + systemImages + }); + } + + static async detectSystemImages(path: string, issues: Issue[]): Promise> { + const systemImages: Record = {}; + const systemImagesDir = join(path, 'system-images'); + + if (isDir(systemImagesDir)) { + for (const platform of await readdir(systemImagesDir)) { + const platformDir = join(systemImagesDir, platform); + if (!isDir(platformDir)) { + continue; + } + + for (const tag of await readdir(platformDir)) { + const tagDir = join(platformDir, tag); + if (!isDir(tagDir)) { + continue; + } + + for (const abi of await readdir(tagDir)) { + const abiDir = join(tagDir, abi); + if (!isDir(abiDir)) { + continue; + } + + const props = await readPropertiesFile(join(abiDir, 'source.properties')); + if (props?.['AndroidVersion.ApiLevel'] && props['SystemImage.TagId'] && props['SystemImage.Abi']) { + const imageDir = relative(systemImagesDir, abiDir).replace(/\\/g, '/'); + const skinsDir = join(abiDir, 'skins'); + const skins: string[] = []; + if (isDir(skinsDir)) { + for (const name of await readdir(skinsDir)) { + if (isFile(join(skinsDir, name, 'hardware.ini'))) { + skins.push(name); + } + } + } + systemImages[imageDir] = { + abi: props['SystemImage.Abi'], + sdk: `android-${props['AndroidVersion.CodeName'] || props['AndroidVersion.ApiLevel']}`, + skins, + type: props['SystemImage.TagId'] + }; + } + } + } + } + } + + return systemImages; + } + + static async detectPlatforms(path: string, systemImages: Record, issues: Issue[]): Promise { + const platforms: Platform[] = []; + const platformsDir = join(path, 'platforms'); + + if (isDir(platformsDir)) { + for (const name of await readdir(platformsDir)) { + const dir = join(platformsDir, name); + if (!isFile(join(dir, 'build.prop'))) { + continue; + } + + const sourceProps = await readPropertiesFile(join(dir, 'source.properties')); + if (!sourceProps) { + continue; + } + + const apiLevel = sourceProps['AndroidVersion.ApiLevel'] + ? Number.parseInt(sourceProps['AndroidVersion.ApiLevel']) + : null; + if (!apiLevel) { + continue; + } + + // read in the sdk properties, if exists + const sdkProps = await readPropertiesFile(join(dir, 'sdk.properties')); + + // detect the available skins + const skinsDir = join(dir, 'skins'); + const skins: string[] = []; + if (isDir(skinsDir)) { + for (const name of await readdir(skinsDir)) { + if (isFile(join(skinsDir, name, 'hardware.ini'))) { + skins.push(name); + } + } + } + let defaultSkin: string | null = sdkProps?.['sdk.skin.default'] ?? 'WVGA800'; + if (defaultSkin && skins.includes(defaultSkin) && !skins.includes('WVGA800')) { + defaultSkin = skins[skins.length - 1] || null; + } + + const apiName = sourceProps?.['AndroidVersion.CodeName'] || apiLevel; + const sdk = `android-${apiName}`; + + const abis: Record = {}; + for (const image of Object.values(systemImages)) { + if (image.sdk === sdk) { + if (!abis[image.type]) { + abis[image.type] = []; + } + if (!abis[image.type].includes(image.abi)) { + abis[image.type].push(image.abi); + } + for (const skin of image.skins) { + if (!skins.includes(skin)) { + skins.push(skin); + } + } + } + } + + const androidJarFile = join(dir, 'android.jar'); + + platforms.push({ + abis: abis, + androidJar: isFile(androidJarFile) ? androidJarFile : null, + apiLevel, + codename: sourceProps['AndroidVersion.CodeName'] || null, + defaultSkin, + minToolsRev: sourceProps['Platform.MinToolsRev'] ? Number.parseInt(sourceProps['Platform.MinToolsRev']) : null, + name: `Android ${sourceProps['Platform.Version']}${sourceProps['AndroidVersion.CodeName'] ? ' (Preview)' : ''}`, + path: dir, + revision: sourceProps['Layoutlib.Revision'] ? Number.parseInt(sourceProps['Layoutlib.Revision']) : null, + sdk, + skins, + version: sourceProps['Platform.Version'] + }); + } + } + + if (Object.keys(platforms).length === 0) { + issues.push(new Issue('No platforms found', { + id: 'ANDROID_SDK_NO_PLATFORMS', + type: 'error', + details: 'Unable to find any platforms.' + })); + return []; + } + + return platforms.sort(sortPackages); + } + + static async detectAddons(path: string, platforms: Platform[]): Promise { + const addons: Addon[] = []; + const addonsDir = join(path, 'add-ons'); + if (!isDir(addonsDir)) { + return []; + } + + for (const name of await readdir(addonsDir)) { + const dir = join(addonsDir, name); + const props = await readPropertiesFile(join(dir, 'source.properties')) || await readPropertiesFile(join(dir, 'manifest.ini')); + if (!props) { + continue; + } + + const apiLevel = Number.parseInt(props['AndroidVersion.ApiLevel'] || props.api); + const vendorDisplay = props['Addon.VendorDisplay'] || props.vendor; + const nameDisplay = props['Addon.NameDisplay'] || props.name; + if (!apiLevel || isNaN(apiLevel) || !vendorDisplay || !nameDisplay) { + continue; + } + + let basedOn: Platform | null = null; + for (const platform of platforms) { + if (platform.codename === null && platform.apiLevel === apiLevel) { + basedOn = platform; + break; + } + } + + addons.push({ + abis: basedOn?.abis || null, + androidJar: basedOn?.androidJar || null, + apiLevel: apiLevel, + basedOn: basedOn ? { version: basedOn.version, apiLevel: basedOn.apiLevel } : null, + codename: props['AndroidVersion.CodeName'] || props.codename || null, + defaultSkin: basedOn && basedOn.defaultSkin || null, + description: props['Pkg.Desc'] || props.description || null, + minToolsRev: basedOn && basedOn.minToolsRev || null, + name: nameDisplay, + path: dir, + revision: Number.parseInt(props['Pkg.Revision'] || props.revision) || null, + sdk: `${vendorDisplay}:${nameDisplay}:${apiLevel}`, + skins: basedOn && basedOn.skins || null, + vendor: vendorDisplay, + version: basedOn && basedOn.version || null + }); + } + + return addons.sort(sortPackages); + } +} + +interface SDKs { + sdks: AndroidSDK[]; + issues: Issue[]; +} + +let sdkCache: SDKs | null = null; +let sdkSearchPathsHash: string | null = null; + +export async function detect(options: { + bypassCache?: boolean; + searchPaths?: string[]; +} = {}): Promise { + const searchPaths = await getSearchPaths(options); + const searchPathsHash = createHash('sha256') + .update(searchPaths.toSorted().join()).digest('hex'); + + if (sdkCache !== null && !options.bypassCache && sdkSearchPathsHash === searchPathsHash) { + return sdkCache; + } + + return tailgate('android:sdk:detect', async () => { + const results = await Promise.allSettled(searchPaths.map(async path => { + try { + return await AndroidSDK.load(path); + } catch (e) { + // Not an SDK, check subdirectories + if (isDir(path)) { + for (const name of await readdir(path)) { + try { + return await AndroidSDK.load(join(path, name)); + } catch { + // Not an SDK + } + } + } + throw e; + } + })); + const sdks: AndroidSDK[] = []; + const issues: Issue[] = []; + + for (const result of results) { + if (result.status === 'fulfilled' && result.value) { + sdks.push(result.value); + } else if (result.status === 'rejected') { + error(result.reason.message); + } + } + + if (!sdks.length) { + issues.push(new Issue('No Android SDKs found', { + id: 'ANDROID_SDK_NOT_FOUND', + type: 'warning', + details: 'No Android SDKs found. Please install the Android SDK and try again.', + })); + } + + sdkCache = { + sdks, + issues, + }; + sdkSearchPathsHash = searchPathsHash; + + return sdkCache; + }); +} + +async function getSearchPaths(options: { searchPaths?: string[] }) { + const paths: string[] = []; + if (Array.isArray(options.searchPaths)) { + paths.push(...options.searchPaths); + } + const configPaths = config.android.ndk.searchPaths[process.platform]; + if (Array.isArray(configPaths)) { + paths.push(...configPaths); + } + + const searchPaths = new Set(); + if (paths) { + for (const path of paths) { + searchPaths.add(expand(path)); + } + } + + return Array.from(searchPaths); +} + +type SortablePackage = { + apiLevel: number; + codename: string | null; +} + +function sortPackages(a: T, b: T) { + if (a.codename === null) { + if (b.codename !== null && a.apiLevel === b.apiLevel) { + // sort GA releases before preview releases + return -1; + } + } else if (a.apiLevel === b.apiLevel) { + return b.codename === null ? 1 : a.codename.localeCompare(b.codename); + } + + return a.apiLevel - b.apiLevel; +} diff --git a/src/android/device.ts b/src/android/device.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/android/emulator.ts b/src/android/emulator.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/android/util/read-properties-file.ts b/src/android/util/read-properties-file.ts new file mode 100644 index 00000000..dcbe0c94 --- /dev/null +++ b/src/android/util/read-properties-file.ts @@ -0,0 +1,29 @@ +import { readFile } from 'node:fs/promises'; +import { isFile } from '../../util/is-file.js'; + +/** + * Cached regex for matching key/values in properties files. + */ +const pkgPropRegExp = /^(?!\s*#)\s*([^=\s]+)\s*=\s*(.+?)\s*$/; + +/** + * Reads and parses the specified properties file into an object. + * + * @param file - The properties file to parse. + * @returns A record of key/values from the properties file, or `null` if the + * file does not exist. + */ +export async function readPropertiesFile(file: string): Promise | null> { + if (!isFile(file)) { + return null; + } + + const props: Record = {}; + for (const line of (await readFile(file, 'utf8')).split(/\r?\n/)) { + const m = line.match(pkgPropRegExp); + if (m) { + props[m[1]] = m[2]; + } + } + return props; +} diff --git a/src/config.ts b/src/config.ts new file mode 100644 index 00000000..eedbb18d --- /dev/null +++ b/src/config.ts @@ -0,0 +1,328 @@ +import type { Config } from './types.js'; + +export const defaultConfig: Config = { + android: { + adb: { + install: { + /** + * The number of milliseconds to wait before installing an app times out. + * @type {Number} + */ + timeout: null, + }, + + /** + * The path to the ADB executable. + * @type {String} + */ + path: null, + + /** + * The port to connect to ADB. + * @type {Number} + */ + port: null, + + /** + * The options to start ADB. + * @type {Object} + */ + start: { + /** + * The number of milliseconds to wait before retrying to start ADB. + * @type {Number} + */ + retryInterval: null, + + /** + * The number of milliseconds to wait before starting ADB times out. + * @type {Number} + */ + timeout: null, + }, + }, + avd: { + /** + * The path to where AVDs are stored. + * @type {String} + */ + path: '~/.android/avd', + }, + emulator: { + start: { + /** + * The number of milliseconds to wait before starting the Android emulator times out. + * @type {Number} + */ + timeout: null, + }, + }, + ndk: { + /** + * A list of paths to search for Android NDKs. + * @type {String[]|Object} + */ + searchPaths: { + darwin: [ + '~/Library/Android/sdk/ndk', + '~/Library/Android/sdk/ndk-bundle', + ], + linux: [ + '~/Android/sdk/ndk', + '~/Android/sdk/ndk-bundle', + ], + win32: [ + '%LOCALAPPDATA%\\Android\\sdk\\ndk', + '%LOCALAPPDATA%\\Android\\sdk\\ndk-bundle', + ], + }, + }, + sdk: { + /** + * A list of paths to search for Android SDKs. + * @type {String[]|Object} + */ + searchPaths: { + darwin: [ + '~/Library/Android/sdk', + '/usr/local/share', + ], + linux: [ + '~/Android/sdk', + '/usr/local/share', + ], + win32: [ + '%LOCALAPPDATA%\\Android\\sdk', + ], + }, + }, + }, + + env: { + /** + * An override for the `PATH` environment variable. + * @type {String} + */ + path: null, + }, + + ios: { + executables: { + /** + * Path to the `security` executable. + * @type {String} + */ + security: null, + + /** + * Path to the `sqlite` or `sqlite3` executable. Used to read the Xcode teams database. + * @type {String} + */ + sqlite: null, + + /** + * Path to the `xcode-select` executable. + * @type {String} + */ + xcodeSelect: null, + }, + + keychainMetaFile: '~/Library/Preferences/com.apple.security.plist', + + provisioning: { + /** + * A list of paths to search for provisioning profiles. + * @type {String[]} + */ + searchPaths: [ + '~/Library/Developer/Xcode/UserData/Provisioning Profiles', + '~/Library/MobileDevice/Provisioning Profiles', + ], + }, + + simulator: { + /** + * The path to the directory containing the simulator crash logs. + * @type {String} + */ + crashLogsDir: '~/Library/Logs/DiagnosticReports', + + /** + * The path to the directory containing the simulator device directories. + * @type {String} + */ + devicesDir: '~/Library/Developer/CoreSimulator/Devices', + + /** + * The path to the directory containing the simulator runtimes. + * @type {String} + */ + runtimesDir: '/Library/Developer/CoreSimulator/Profiles/Runtimes', + }, + + xcode: { + /** + * A list of paths to search for Xcode installations. + * @type {String[]} + */ + searchPaths: [ + '/Applications', + '~/Applications', + ], + }, + }, + + jdk: { + javaHome: null, + + /** + * A list of paths to search for JDKs. + * @type {String[]|Object} + */ + searchPaths: { + darwin: [ + '/Library/Java/JavaVirtualMachines', + '/System/Library/Java/JavaVirtualMachines', + ], + linux: [ + '/usr/lib/jvm/default', + '/usr/lib/jvm', + ], + win32: [ + '%ProgramFiles%\\Java', + '%ProgramFiles(x86)%\\Java', + '~\\Java', + ], + }, + + windows: { + /** + * The registry keys to search for JDKs. + * @type {String[]} + */ + registryKeys: [ + 'HKLM\\SOFTWARE\\JavaSoft\\Java Development Kit', + 'HKLM\\SOFTWARE\\Wow6432Node\\JavaSoft\\Java Development Kit', + 'HKLM\\SOFTWARE\\JavaSoft\\JDK', + ], + }, + }, + + network: { + /** + * The options to pass to the `http.Agent` constructor. + * @type {Object} + */ + agentOptions: null, + + /** + * The path to the CA file. + * @type {String} + */ + caFile: null, + + /** + * The path to the certificate file. + * @type {String} + */ + certFile: null, + + /** + * The HTTP proxy to use. + * @type {String} + */ + httpProxy: null, + + /** + * The HTTPS proxy to use. + * @type {String} + */ + httpsProxy: null, + + /** + * The path to the key file. + * @type {String} + */ + keyFile: null, + + /** + * The passphrase to use. + * @type {String} + */ + passphrase: null, + + /** + * Whether to use strict SSL. + * @type {Boolean} + */ + strictSSL: true, + }, + + titanium: { + modules: { + /** + * A list of paths to search for Titanium modules. + * @type {String[]|Object} + */ + searchPaths: { + darwin: [ + '~/Library/Application Support/Titanium', + '/Library/Application Support/Titanium', // legacy + ], + linux: [ + '~/.titanium', + ], + win32: [ + '%ProgramData%\\Titanium', + '%APPDATA%\\Titanium', + '%ALLUSERSPROFILE%\\Application Data\\Titanium', + ], + }, + }, + + sdk: { + downloadURLs: { + branches: 'https://downloads.titaniumsdk.com/registry/branches.json', + branchBuilds: 'https://downloads.titaniumsdk.com/registry/${branch}.json', + releases: { + beta: 'https://downloads.titaniumsdk.com/registry/beta.json', + rc: 'https://downloads.titaniumsdk.com/registry/rc.json', + ga: 'https://downloads.titaniumsdk.com/registry/ga.json', + }, + }, + + installPath: { + darwin: '~/Library/Application Support/Titanium', + linux: '~/.titanium', + win32: '%ProgramData%\\Titanium', + }, + + /** + * A list of paths to search for Titanium SDKs. + * @type {String[]|Object} + */ + searchPaths: { + darwin: [ + '~/Library/Application Support/Titanium', + '/Library/Application Support/Titanium', // legacy + ], + linux: [ + '~/.titanium', + ], + win32: [ + '%ProgramData%\\Titanium', + '%APPDATA%\\Titanium', + '%ALLUSERSPROFILE%\\Application Data\\Titanium', + ], + }, + }, + }, +}; + +export let config: Config = { + ...defaultConfig, +}; + +export function resetConfig(): void { + config = { ...defaultConfig }; +} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 00000000..e99267a2 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,3 @@ +export { defaultConfig } from './config.js'; +export * as i18n from './titanium/i18n.js'; +export * as version from './util/version.js'; diff --git a/src/jdk.ts b/src/jdk.ts new file mode 100644 index 00000000..52386e57 --- /dev/null +++ b/src/jdk.ts @@ -0,0 +1,261 @@ +import { execFile } from 'node:child_process'; +import { createHash } from 'node:crypto'; +import { existsSync } from 'node:fs'; +import { realpath } from 'node:fs/promises'; +import { join } from 'node:path'; +import { promisify } from 'node:util'; +import snooplogg from 'snooplogg'; +import { config } from './config.js'; +import { expand } from './util/expand.js'; +import { isDir } from './util/is-dir.js'; +import { isFile } from './util/is-file.js'; +import { Issue } from './util/issue.js'; +import { tailgate } from './util/tailgate.js'; +import which from 'which'; + +const { error, log } = snooplogg('jdk'); + +const execFileAsync = promisify(execFile); + +/** + * Common search paths for the JVM library. This is used only for validating if + * a directory is a JDK. + * @type {Object} + */ +export const libjvmLocations: Record = { + linux: [ + 'lib/amd64/client/libjvm.so', + 'lib/amd64/server/libjvm.so', + 'lib/i386/client/libjvm.so', + 'lib/i386/server/libjvm.so', + 'jre/lib/amd64/client/libjvm.so', + 'jre/lib/amd64/server/libjvm.so', + 'jre/lib/i386/client/libjvm.so', + 'jre/lib/i386/server/libjvm.so', + 'lib/server/libjvm.so', + ], + darwin: [ + 'jre/lib/server/libjvm.dylib', + '../Libraries/libjvm.dylib', + 'lib/server/libjvm.dylib', + ], + win32: [ + 'jre/bin/server/jvm.dll', + 'jre/bin/client/jvm.dll', + 'bin/server/jvm.dll', + ], +}; + +const exe = process.platform === 'win32' ? '.exe' : ''; + +type JDKExecutables = { + java: string; + javac: string; + keytool: string; + jarsigner: string; +}; + +/** + * Detects and organizes JDK information. + */ +export class JDK { + build: number | null; + executables: JDKExecutables; + path: string; + version: string; + + private constructor({ + build, + executables, + path, + version, + }: { + build: number | null; + executables: JDKExecutables; + path: string; + version: string; + }) { + this.build = build; + this.executables = executables; + this.path = path; + this.version = version; + } + + static async load(path: string): Promise { + log(`Loading: ${path}`); + if (typeof path !== 'string') { + throw new TypeError('Expected JDK path to be a valid string'); + } + if (!isDir(path)) { + throw new Error(`JDK path does not exist: ${path}`); + } + + // on macOS, the JDK lives in Contents/Home + if (process.platform === 'darwin') { + const macosPath = join(path, 'Contents', 'Home'); + if (isDir(macosPath)) { + path = macosPath; + } + } + + const executables: JDKExecutables = { + java: '', + javac: '', + keytool: '', + jarsigner: '', + }; + + await Promise.all( + Object.keys(executables).map(async cmd => { + const p = join(path, 'bin', `${cmd}${exe}`); + if (isFile(p)) { + executables[cmd] = await realpath(p); + } else { + throw new Error(`Directory missing required program: ${path}`); + } + }) + ); + + let output = ''; + try { + const { stderr, stdout } = await execFileAsync(executables.javac, ['-version']); + output = stderr || stdout || ''; + } catch (error: any) { + // javac -version may exit with non-zero code but still provide output + output = error.stderr || ''; + } + + const result = output.trim().match(/javac (.+?)(?:_(.+))?$/); + const version = result?.[1] ?? ''; + if (!version) { + throw new Error(`Failed to determine JDK version: ${path}`); + } + const build = result?.[2] ? Number.parseInt(result[2]) : null; + + log(`Found JDK: ${path} (version: ${version}, build: ${build})`); + + return new JDK({ + build, + executables, + path, + version, + }); + } +} + +interface JDKs { + home: string | null; + jdks: JDK[]; + issues: Issue[]; +} + +let jdkCache: JDKs | null = null; +let jdkSearchPathsHash: string | null = null; + +export async function detect(options: { + bypassCache?: boolean; + javaHome?: string; + searchPaths?: string[]; +} = {}): Promise { + const { home, searchPaths } = await getSearchPaths(options); + const searchPathsHash = createHash('sha256') + .update(searchPaths.toSorted().join()).digest('hex'); + + if (jdkCache !== null && !options.bypassCache && jdkSearchPathsHash === searchPathsHash) { + return jdkCache; + } + + return tailgate('jdk:detect', async () => { + const results = await Promise.allSettled(searchPaths.map(path => JDK.load(path))); + const jdks: JDK[] = []; + const issues: Issue[] = []; + + for (const result of results) { + if (result.status === 'fulfilled' && result.value) { + jdks.push(result.value); + } else if (result.status === 'rejected') { + error(result.reason.message); + if (result.reason instanceof Issue) { + issues.push(result.reason); + } + } + } + + if (process.platform === 'win32') { + for (const jdk of jdks) { + if (jdk.path.includes('&')) { + issues.push(new Issue(`JDK path contains ampersand: ${jdk.path}`, { + id: 'JDK_PATH_CONTAINS_AMPERSAND', + type: 'warning', + details: 'The JDK path contains an ampersand (&) and may cause issues.', + })); + } + } + } + + if (!jdks.length) { + issues.push( + new Issue('No JDKs found', { + id: 'JDK_NOT_FOUND', + type: 'error', + details: `JDK (Java Development Kit) not installed. +If you already have installed the JDK, verify your __JAVA_HOME__ environment variable is correctly set. +The JDK is required for Titanium and must be manually downloaded and installed from __https://www.oracle.com/java/technologies/downloads/__ +or __https://jdk.java.net/arpathschive/__.`, + }) + ); + } + + jdkCache = { + home, + jdks, + issues, + }; + jdkSearchPathsHash = searchPathsHash; + + return jdkCache; + }); +} + +async function getSearchPaths(options: { javaHome?: string; searchPaths?: string[] }) { + const paths: string[] = []; + if (Array.isArray(options.searchPaths)) { + paths.push(...options.searchPaths); + } + const configPaths = config.jdk.searchPaths[process.platform]; + if (Array.isArray(configPaths)) { + paths.push(...configPaths); + } + + const searchPaths = new Set(); + if (paths) { + for (const path of paths) { + searchPaths.add(expand(path)); + } + } + + let home = options.javaHome ?? config.jdk.javaHome ?? process.env.JAVA_HOME ?? null; + if (home && typeof home === 'string') { + home = expand(home); + if (existsSync(home)) { + searchPaths.add(home); + } else { + home = null; + } + } + + if (process.platform === 'win32') { + // TODO: check the Windows Registry + // config.jdk.windows.registryKeys + } + + const javacPath = await which(`javac${exe}`, { nothrow: true }); + if (javacPath) { + searchPaths.add(expand(javacPath, '..')); + } + + return { + home, + searchPaths: Array.from(searchPaths), + }; +} diff --git a/src/titanium/i18n.ts b/src/titanium/i18n.ts new file mode 100644 index 00000000..c81c3355 --- /dev/null +++ b/src/titanium/i18n.ts @@ -0,0 +1,138 @@ +import { DOMParser } from '@xmldom/xmldom'; +import { readdir, readFile } from 'node:fs/promises'; +import path from 'node:path'; +import snooplogg from 'snooplogg'; +import { expand } from '../util/expand.js'; +import { isDir } from '../util/is-dir.js'; +import { isFile } from '../util/is-file.js'; +import * as xml from '../util/xml.js'; + +const { debug } = snooplogg('titanium')('i18n'); + +interface LoadOptions { + ignoreDirs?: RegExp; + ignoreFiles?: RegExp; +} + +interface LaunchScreensCache { + [projectDir: string]: string[]; +} + +interface I18NLangData { + app?: Record; + strings?: Record; +} + +interface I18NData { + [lang: string]: I18NLangData; +} + +const launchScreensCache: LaunchScreensCache = {}; + +/** + * Loads the i18n data from the project directory. + * + * @param projectDir - The project directory. + * @param opts - The options for the i18n data. + * @returns The i18n data. + */ +export async function load( + projectDir: string, + opts: LoadOptions = {} +): Promise { + const i18nDir = expand(projectDir, 'i18n'); + const data: I18NData = {}; + const ignoreDirs = opts?.ignoreDirs; + const ignoreFiles = opts?.ignoreFiles; + + if (!isDir(i18nDir)) { + debug('i18n directory not found in %s', projectDir); + return data; + } + + debug('Compiling localization files in %s', i18nDir); + + for (const lang of await readdir(i18nDir)) { + const langDir = path.join(i18nDir, lang); + if (!isDir(langDir) || (!ignoreDirs || !ignoreDirs.test(lang))) { + continue; + } + + const strings: I18NLangData = {}; + data[lang] = strings; + + for (const name of await readdir(langDir)) { + const file = path.join(langDir, name); + if ( + name.endsWith('.xml') && (!ignoreFiles || !ignoreFiles.test(name)) && isFile(file) + ) { + debug(`Processing i18n file: ${lang}/${name}`); + + const dest = name === 'app.xml' ? 'app' : 'strings'; + if (!strings[dest]) { + strings[dest] = {}; + } + const obj = strings[dest]; + const dom = new DOMParser().parseFromString( + await readFile(file, 'utf8'), + 'text/xml' + ); + + xml.forEachElement(dom.documentElement, (elem) => { + if (elem.nodeType === xml.ELEMENT_NODE && elem.tagName === 'string') { + const name = xml.getAttrString(elem, 'name'); + if (name !== null) { + obj[name] = xml.getValueString(elem); + } + } + }); + } + } + } + + return data; +} + +interface FindLaunchScreensOptions { + bypassCache?: boolean; + ignoreDirs?: RegExp; +} + +const launchScreensRegex = + /^(Default(-(Landscape|Portrait))?(-[0-9]+h)?(@[2-9]x)?)\.png$/; + +/** + * Finds the launch screens in the i18n directory. + * + * @param projectDir - The project directory. + * @param opts - The options for the launch screens. + * @returns The launch screens. + */ +export async function findLaunchScreens( + projectDir: string, + opts: FindLaunchScreensOptions = {} +): Promise { + if (!opts.bypassCache && launchScreensCache[projectDir]) { + return launchScreensCache[projectDir]; + } + + const i18nDir = path.join(projectDir, 'i18n'); + const launchScreens: string[] = []; + + if (isDir(i18nDir)) { + debug('Checking for Splash Screen localization in %s', i18nDir); + for (const lang of await readdir(i18nDir)) { + const langDir = path.join(i18nDir, lang); + if (isDir(langDir) && (!opts.ignoreDirs || !opts.ignoreDirs.test(lang))) { + for (const name of await readdir(langDir)) { + if (launchScreensRegex.test(name)) { + launchScreens.push(path.join(langDir, name)); + } + } + } + } + } + + launchScreensCache[projectDir] = launchScreens; + return launchScreens; +} diff --git a/src/titanium/tiappxml.ts b/src/titanium/tiappxml.ts new file mode 100644 index 00000000..4e311b07 --- /dev/null +++ b/src/titanium/tiappxml.ts @@ -0,0 +1,850 @@ +import { DOMParser, type Options } from '@xmldom/xmldom'; +import { mkdir, readFile, writeFile } from 'node:fs/promises'; +import path from 'node:path'; +import { capitalize } from '../util/capitalize.js'; +import { isFile } from '../util/is-file.js'; +import { Plist } from '../util/plist.js'; +import * as version from '../util/version.js'; +import * as xml from '../util/xml.js'; + +interface TiappDocument extends XMLDocument { + create( + tag: string, + attrs: Record | null, + parent: Node, + callback?: (node: Node) => void + ): Element; +} + +interface TiappIOS { + capabilities?: Record; + entitlements?: Record; + plist?: Record; + extensions?: Record; + iphone?: Record; + excludeDirFromAssetCatalog?: boolean; + enableLaunchScreenStoryboard?: boolean; + enableCoverage?: boolean; + enableMDFind?: boolean; + minIOSVer?: number; + defaultBackgroundColor?: string; +} + +interface TiappIPhone { + orientations: Record; + backgroundModes?: string[]; + requiredFeatures?: string[]; + types?: Record; +} + +interface TiappAndroid { + manifest?: string; + toolAPILevel?: number; + abi?: string[]; + activities?: Record; + services?: Record; +} + +interface TiappModules { + platform?: string; + version?: number; + deployType?: string; + id?: string; +} + +declare module '@xmldom/xmldom' { + interface Options { + xmlns?: { [key: string]: string }; + } +} + +const defaultDOMParserArgs: Options = { + errorHandler: () => {}, +}; + +function toXml(dom: TiappDocument, parent: Node, name: string, value: any) { + // properties is a super special case + if (name === 'properties') { + for (const v of Object.keys(value)) { + dom.create('property', { + name: v, + type: value[v].type || 'string', + nodeValue: value[v].value, + }, parent); + } + return; + } + + const node = dom.create(name, null, parent); + + switch (name) { + case 'deployment-targets': + for (const v of Object.keys(value)) { + dom.create('target', { + device: v, + nodeValue: value[v], + }, node); + } + break; + + case 'ios': + if (Object.prototype.hasOwnProperty.call(value, 'exclude-dir-from-asset-catalog')) { + dom.create('exclude-dir-from-asset-catalog', { + nodeValue: !!value['exclude-dir-from-asset-catalog'], + }, node); + } + + if ( + Object.prototype.hasOwnProperty.call(value, 'enable-launch-screen-storyboard') + ) { + dom.create('enable-launch-screen-storyboard', { + nodeValue: !!value['enable-launch-screen-storyboard'], + }, node); + } + + if (Object.prototype.hasOwnProperty.call(value, 'enablecoverage')) { + dom.create('enablecoverage', { nodeValue: !!value['enablecoverage'] }, node); + } + + if (Object.prototype.hasOwnProperty.call(value, 'enablemdfind')) { + dom.create('enablemdfind', { nodeValue: !!value['enablemdfind'] }, node); + } + + if (Object.prototype.hasOwnProperty.call(value, 'min-ios-ver')) { + dom.create( + 'min-ios-ver', + { nodeValue: version.format(value['min-ios-ver'], 2) }, + node + ); + } + + if (Object.prototype.hasOwnProperty.call(value, 'default-background-color')) { + dom.create('default-background-color', { + nodeValue: value['default-background-color'], + }, node); + } + + if (Object.prototype.hasOwnProperty.call(value, 'team-id')) { + dom.create('team-id', { nodeValue: value['team-id'] }, node); + } + + if (Object.prototype.hasOwnProperty.call(value, 'use-jscore-framework')) { + dom.create( + 'use-jscore-framework', + { nodeValue: !!value['use-jscore-framework'] }, + node + ); + } + + if (Object.prototype.hasOwnProperty.call(value, 'run-on-main-thread')) { + dom.create( + 'run-on-main-thread', + { nodeValue: !!value['run-on-main-thread'] }, + node + ); + } + + if (Object.prototype.hasOwnProperty.call(value, 'use-autolayout')) { + dom.create('use-autolayout', { nodeValue: !!value['use-autolayout'] }, node); + } + + if (Object.prototype.hasOwnProperty.call(value, 'use-new-build-system')) { + dom.create( + 'use-new-build-system', + { nodeValue: !!value['use-new-build-system'] }, + node + ); + } + + if (Object.prototype.hasOwnProperty.call(value, 'use-app-thinning')) { + dom.create('use-app-thinning', { nodeValue: !!value['use-app-thinning'] }, node); + } + + if (Object.prototype.hasOwnProperty.call(value, 'log-server-port')) { + dom.create('log-server-port', { nodeValue: value['log-server-port'] }, node); + } + + if (value.capabilities) { + const capNode = dom.create('capabilities', null, node); + for (const cap of Object.keys(value.capabilities)) { + if (cap === 'app-groups') { + const appGroupNode = dom.create(cap, null, capNode); + for (const group of value.capabilities[cap]) { + dom.create('group', { nodeValue: group }, appGroupNode); + } + appGroupNode.appendChild(dom.createTextNode('\r\n\t\t\t')); + capNode.appendChild(dom.createTextNode('\r\n\t\t')); + } + } + } + + if (value.entitlements) { + const enNode = dom.create('entitlements', null, node); + const pl = new Plist(); + Object.assign(pl, value.entitlements); + const doc = pl.toXml(3); + enNode.appendChild(dom.createTextNode('\r\n\t\t\t')); + xml.forEachElement(doc, (elem) => { + enNode.appendChild(elem); + }); + enNode.appendChild(dom.createTextNode('\r\n\t\t')); + } + + if (value.plist) { + const plNode = dom.create('plist', null, node); + const pl = new Plist(); + Object.assign(pl, value.plist); + const doc = pl.toXml(3); + plNode.appendChild(dom.createTextNode('\r\n\t\t\t')); + xml.forEachElement(doc, (elem) => { + plNode.appendChild(elem); + }); + plNode.appendChild(dom.createTextNode('\r\n\t\t')); + } + + if (Array.isArray(value.extensions)) { + const extsNode = dom.create('extentions', null, node); + for (const ext of value.extensions) { + const extNode = dom.create( + 'extention', + { projectPath: ext.projectPath }, + extsNode + ); + if (Array.isArray(ext.targets)) { + for (const target of ext.targets) { + const targetNode = dom.create('target', { name: target.name }, extNode); + if ( + target.ppUUIDs && typeof target.ppUUIDs === 'object' + && Object.keys(target.ppUUIDs).length + ) { + const ppUUIDsNode = dom.create('provisioning-profiles', null, targetNode); + for (const type of Object.keys(target.ppUUIDs)) { + dom.create(type, { nodeValue: target.ppUUIDs[type] }, ppUUIDsNode); + } + ppUUIDsNode.appendChild(dom.createTextNode('\r\n\t\t\t\t\t')); + } + targetNode.appendChild(dom.createTextNode('\r\n\t\t\t\t')); + } + } + extNode.appendChild(dom.createTextNode('\r\n\t\t\t')); + } + extsNode.appendChild(dom.createTextNode('\r\n\t\t')); + } + break; + + case 'iphone': + if (value.orientations) { + for (const o of Object.keys(value.orientations)) { + dom.create('orientations', { device: o }, node, (orientations) => { + for (const p of value.orientations[o]) { + dom.create('orientation', { nodeValue: p }, orientations); + } + }); + } + } + + if (Array.isArray(value.backgroundModes)) { + dom.create('background', null, node, (background) => { + for (const mode of value.backgroundModes) { + dom.create('mode', { nodeValue: mode }, background); + } + }); + } + + if (Array.isArray(value.requiredFeatures)) { + dom.create('requires', null, node, (requires) => { + for (const feature of value.requiredFeatures) { + dom.create('feature', { nodeValue: feature }, requires); + } + }); + } + + if (Array.isArray(value.types)) { + dom.create('types', null, node, (types) => { + for (const typeObj of value.types) { + dom.create('type', null, types, (typeNode) => { + dom.create('name', { nodeValue: typeObj.name }, typeNode); + dom.create('icon', { nodeValue: typeObj.icon }, typeNode); + dom.create('uti', { nodeValue: typeObj.uti.join(',') }, typeNode); + dom.create('owner', { nodeValue: !!typeObj.owner }, typeNode); + }); + } + }); + } + break; + + case 'android': + node.setAttribute('xmlns:android', 'http://schemas.android.com/apk/res/android'); + + if (value.manifest) { + node.appendChild(dom.createTextNode(`\r\n${'\t'.repeat(3)}`)); + const opts = defaultDOMParserArgs; + opts.xmlns = { android: 'http://schemas.android.com/apk/res/android' }; + node.appendChild(new DOMParser(opts).parseFromString(value.manifest)); + } + + if (Object.prototype.hasOwnProperty.call(value, 'tool-api-level')) { + dom.create('tool-api-level', { nodeValue: value['tool-api-level'] }, node); + } + + if (Object.prototype.hasOwnProperty.call(value, 'abi')) { + dom.create('abi', { + nodeValue: Array.isArray(value.abi) ? value.abi.join(',') : value.abi, + }, node); + } + + if (value.activities) { + dom.create('activities', null, node, (node) => { + for (const url of Object.keys(value.activities)) { + const attrs = {}; + for (const attr of Object.keys(value.activities[url])) { + if (attr !== 'classname') { + attrs[attr] = value.activities[url][attr]; + } + } + dom.create('activity', attrs, node); + } + }); + } + + if (value.services) { + dom.create('services', null, node, (node) => { + for (const url of Object.keys(value.services)) { + const attrs = {}; + for (const attr of Object.keys(value.services[url])) { + if (attr !== 'classname') { + attrs[attr] = value.services[url][attr]; + } + } + dom.create('service', attrs, node); + } + }); + } + break; + + case 'modules': + if (Array.isArray(value)) { + for (const mod of value) { + dom.create('module', { + platform: mod.platform, + version: mod.version ? version.format(mod.version, 2) : null, + 'deploy-type': mod.deployType || null, + nodeValue: mod.id, + }, node); + } + } + break; + + default: + node.appendChild(dom.createTextNode(value)); + return; + } + + node.appendChild(dom.createTextNode(`\r\n${'\t'.repeat(2)}`)); +} + +function toJS(obj: any, doc: Element, targetPlatform?: string) { + let node = doc.firstChild; + while (node) { + if (node.nodeType === xml.ELEMENT_NODE) { + const elem = node as Element; + switch (elem.tagName) { + case 'property': + const name = xml.getAttr(elem, 'name'); + const type = xml.getAttr(elem, 'type') || 'string'; + const value = xml.getValue(elem); + if (name) { + if (!obj.properties) { + obj.properties = {}; + } + obj.properties[name] = { + type: type, + value: type === 'bool' + ? (typeof value === 'boolean' ? value : value === 'true') + : type === 'int' + ? (typeof value === 'string' ? Number.parseInt(value) : value || 0) + : type === 'double' + ? (typeof value === 'string' ? Number.parseFloat(value) : value || 0) + : '' + value, + }; + } + break; + + case 'deployment-targets': + const targets = obj['deployment-targets'] = {}; + xml.forEachElement(node as Element, (elem) => { + const dev = xml.getAttr(elem, 'device'); + if (dev) { + targets[dev] = xml.getValueString(elem); + } + }); + break; + + case 'ios': + const ios: TiappIOS = {}; + obj.ios = ios; + xml.forEachElement(node as Element, (elem) => { + switch (elem.tagName) { + case 'exclude-dir-from-asset-catalog': + case 'enable-launch-screen-storyboard': + case 'enablecoverage': + case 'enablemdfind': + case 'default-background-color': + case 'team-id': + case 'use-jscore-framework': + case 'run-on-main-thread': + case 'use-autolayout': + case 'use-app-thinning': + case 'use-new-build-system': + case 'log-server-port': + ios[elem.tagName] = xml.getValueString(elem); + break; + + case 'min-ios-ver': + if (elem.firstChild) { + ios['min-ios-ver'] = Number.parseFloat(xml.getValueString(elem)) || 0; + } + break; + + case 'capabilities': + const capabilities: Record = {}; + xml.forEachElement(elem, (elem) => { + if (elem.tagName === 'app-groups') { + const appGroups: string[] = []; + capabilities[elem.tagName] = appGroups; + xml.forEachElement(elem, (elem) => { + if (elem.tagName === 'group') { + const group = xml.getValueString(elem); + if (group) { + appGroups.push(group); + } + } + }); + } + }); + ios.capabilities = capabilities; + break; + + case 'entitlements': + const entitlements: Record = {}; + xml.forEachElement(elem, (elem) => { + if (elem.tagName === 'dict') { + const pl = new Plist(); + pl.parse(`${elem.toString()}`); + for (const prop of Object.keys(pl)) { + entitlements[prop] = pl[prop]; + } + } + }); + ios.entitlements = entitlements; + break; + + case 'plist': + const plist: Record = {}; + xml.forEachElement(elem, (elem) => { + if (elem.tagName === 'dict') { + const pl = new Plist().parse( + `${elem.toString()}` + ); + for (const prop of Object.keys(pl)) { + if ( + !/^CFBundle(DisplayName|Executable|IconFile|Identifier|InfoDictionaryVersion|Name|PackageType|Signature)|LSRequiresIPhoneOS$/ + .test(prop) + ) { + plist[prop] = pl[prop]; + } + } + } + }); + ios.plist = plist; + break; + + case 'extensions': + const extensions: Record[] = []; + xml.forEachElement(elem, (elem) => { + if (elem.tagName !== 'extension') { + return; + } + + const ext: Record = { + projectPath: elem.getAttribute('projectPath') || null, + targets: [], + }; + extensions.push(ext); + + xml.forEachElement(elem, (elem) => { + if (elem.tagName !== 'target') { + return; + } + + const target: Record = { + name: elem.getAttribute('name'), + ppUUIDs: {}, + }; + ext.targets.push(target); + + xml.forEachElement(elem, (elem) => { + if (elem.tagName === 'provisioning-profiles') { + xml.forEachElement(elem, (elem) => { + target.ppUUIDs[elem.tagName] = xml.getValue(elem) as string; + }); + } + }); + }); + }); + ios.extensions = extensions; + break; + } + }); + break; + + case 'iphone': + const iphone: TiappIPhone = { + orientations: {}, + }; + obj.iphone = iphone; + xml.forEachElement(node as Element, (elem) => { + switch (elem.tagName) { + case 'orientations': + const dev = xml.getAttr(elem, 'device'); + if (dev) { + if (!iphone.orientations[dev]) { + iphone.orientations[dev] = []; + } + xml.forEachElement(elem, (elem) => { + iphone.orientations[dev].push(xml.getValueString(elem)); + }); + } + break; + + case 'background': + xml.forEachElement(elem, (elem) => { + if (elem.tagName === 'mode') { + if (!iphone.backgroundModes) { + iphone.backgroundModes = []; + } + iphone.backgroundModes.push(xml.getValueString(elem)); + } + }); + break; + + case 'requires': + xml.forEachElement(elem, (elem) => { + if (elem.tagName === 'feature') { + if (!iphone.requiredFeatures) { + iphone.requiredFeatures = []; + } + iphone.requiredFeatures.push(xml.getValueString(elem)); + } + }); + break; + + case 'types': + xml.forEachElement(elem, (elem) => { + if (elem.tagName === 'type') { + if (!iphone.types) { + iphone.types = []; + } + const type = { + name: '', + icon: '', + uti: [], + owner: false, + }; + xml.forEachElement(elem, (elem) => { + const v = xml.getValueString(elem); + type[elem.tagName] = elem.tagName === 'uti' + ? v.split(',').map(s => s.trim()) + : v; + }); + iphone.types.push(type); + } + }); + break; + } + }); + break; + + case 'android': + const android: TiappAndroid = {}; + obj.android = android; + const formatUrl = (url) => { + return capitalize( + url.replace(/^app:\/\//, '').replace(/\.js$/, '').replace(/\//g, '_') + ).replace(/[/ .$&@]/g, '_'); + }; + + xml.forEachElement(node as Element, (elem) => { + switch (elem.tagName) { + case 'manifest': + // the tag is an XML document and we're just gonna + // defer the parsing to whoever wants its data + // Strip the 'android' XML namespace on the uses-sdk tag! It's already defined at tag level! + android.manifest = elem.toString().replace( + / xmlns:android="http:\/\/schemas\.android\.com\/apk\/res\/android"/g, + '' + ); + break; + + case 'abi': + android.abi = xml.getValueString(elem).split(',').map(s => s.trim()); + break; + + case 'tool-api-level': + android.toolAPILevel = Number.parseFloat(xml.getValueString(elem)) || 0; + break; + + case 'activities': + case 'services': + const type = elem.tagName; + const dest: Record = {}; + android[type] = dest; + + xml.forEachElement(elem, (elem) => { + if ( + (type === 'activities' && elem.tagName === 'activity') + || (type === 'services' && elem.tagName === 'service') + ) { + const url = xml.getAttr(elem, 'url') || xml.getValueString(elem) + || ''; + if (url) { + const a: Record = {}; + dest[url] = a; + xml.forEachAttr(elem, (attr) => { + a[attr.name] = xml.parse(attr.value); + }); + a['classname'] = formatUrl(url) + + (type === 'activities' ? 'Activity' : 'Service'); + if (type === 'services') { + a['type'] = xml.getAttr(elem, 'type') || 'standard'; + } + a['url'] = url; + xml.forEachElement(elem, (elem) => { + if (elem.tagName === 'intent-filter') { + let intentFilter: Record | null = null; + xml.forEachElement(elem, (elem) => { + if ( + elem.tagName === 'action' || elem.tagName === 'category' + || elem.tagName === 'data' + ) { + if (!intentFilter) { + intentFilter = {}; + } + if (!intentFilter[elem.tagName]) { + intentFilter[elem.tagName] = []; + } + if (elem.tagName === 'data') { + const a = {}; + xml.forEachAttr(elem, (attr) => { + a[attr.name.replace(/^android:/, '')] = xml.parse( + attr.value + ); + }); + intentFilter[elem.tagName].push(a); + } else { + intentFilter[elem.tagName].push( + xml.getAttr(elem, 'android:name') + ); + } + } + }); + if (intentFilter) { + if (!a['intent-filter']) { + a['intent-filter'] = []; + } + a['intent-filter'].push(intentFilter); + } + } else if (elem.tagName === 'meta-data') { + const obj: Record = {}; + xml.forEachAttr(elem, (attr) => { + obj[attr.name.replace(/^android:/, '')] = xml.parse( + attr.value + ); + }); + if (obj.name) { + if (!a['meta-data']) { + a['meta-data'] = {}; + } + a['meta-data'][obj.name] = obj; + } + } + }); + } + } + }); + break; + } + }); + break; + + case 'modules': + const modules: TiappModules[] = []; + obj.modules = modules; + xml.forEachElement(node as Element, (elem) => { + const opts: TiappModules = { + id: xml.getValueString(elem), + platform: xml.getAttrString(elem, 'platform'), + }; + const version = elem.getAttribute('version'); + const deployType = xml.getAttrString(elem, 'deploy-type'); + if (version) { + opts.version = Number.parseFloat(version) || 0; + } + if (deployType) { + opts.deployType = deployType; + } + modules.push(opts); + }); + break; + + case 'version': + obj.version = xml.getValueString(node as Element).replace(/\n/g, '').trim(); + break; + + case 'id': + if ( + (targetPlatform + && xml.getAttrString(node as Element, 'platform') === targetPlatform) + || obj[(node as Element).tagName] === undefined + ) { + obj[(node as Element).tagName] = xml.getValueString(node as Element); + if (typeof obj[(node as Element).tagName] === 'string') { + obj[(node as Element).tagName] = obj[(node as Element).tagName].replace( + /\n/g, + '' + ); + } + } + break; + + case 'name': + case 'guid': + case 'icon': + // need to strip out line returns which shouldn't be there in the first place + obj[(node as Element).tagName] = xml.getValueString(node as Element); + if (typeof obj[(node as Element).tagName] === 'string') { + obj[(node as Element).tagName] = obj[(node as Element).tagName].replace( + /\n/g, + '' + ); + } + break; + + default: + obj[(node as Element).tagName] = xml.getValueString(node as Element); + } + } + node = node.nextSibling; + } +} + +export class tiappxml { + platform?: string; + + constructor(filename?: string, platform?: string) { + this.platform = platform; + if (filename) { + this.load(filename); + } + } + + async load(file: string): Promise { + if (!isFile(file)) { + throw new Error('tiapp.xml file does not exist'); + } + const dom = new DOMParser(defaultDOMParserArgs); + const doc = dom.parseFromString( + await readFile(file, 'utf8'), + 'text/xml' + ) as TiappDocument; + toJS(this, doc.documentElement, this.platform); + return this; + } + + parse(str: string): this { + toJS( + this, + (new DOMParser(defaultDOMParserArgs).parseFromString(str, 'text/xml')) + .documentElement, + this.platform + ); + return this; + } + + toString(fmt?: string): string { + if (fmt === 'xml') { + const dom = new DOMParser(defaultDOMParserArgs).parseFromString( + '', + 'text/xml' + ) as TiappDocument; + + dom.create = ( + tag: string, + attrs: Record, + parent: Node, + callback?: (node: Node) => void + ): Element => { + const node = dom.createElement(tag); + let i = 0; + let p = parent; + + if (attrs) { + for (const attr of Object.keys(attrs)) { + if (attr === 'nodeValue') { + node.appendChild(dom.createTextNode('' + attrs[attr])); + } else if (attrs[attr] !== undefined) { + node.setAttribute(attr, '' + attrs[attr]); + } + } + } + + if (p) { + while (p.parentNode) { + i++; + p = p.parentNode; + } + parent.appendChild(dom.createTextNode(`\r\n${'\t'.repeat(i + 1)}`)); + } + + if (parent) { + parent.appendChild(node); + } + + if (callback) { + callback(node); + node.appendChild(dom.createTextNode(`\r\n${'\t'.repeat(i + 1)}`)); + } + return node; + }; + + for (const key of Object.keys(this)) { + toXml(dom, dom.documentElement, key, this[key]); + } + + dom.documentElement.appendChild(dom.createTextNode('\r\n')); + + const xml = dom.documentElement.toString(); + return `\n${ + xml.replace( + /uses-sdk xmlns:android="http:\/\/schemas\.android\.com\/apk\/res\/android"/, + 'uses-sdk' + ) + }`; + } else if (fmt === 'pretty-json') { + return JSON.stringify(this, null, '\t'); + } else if (fmt === 'json') { + return JSON.stringify(this); + } + return Object.prototype.toString.call(this); + } + + async save(file: string): Promise { + if (file) { + await mkdir(path.dirname(file), { recursive: true }); + await writeFile(file, this.toString('xml')); + } + return this; + } +} + +export default tiappxml; diff --git a/src/titanium/titanium-sdk.ts b/src/titanium/titanium-sdk.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 00000000..d829f876 --- /dev/null +++ b/src/types.ts @@ -0,0 +1,103 @@ +import type { AgentOptions } from 'node:http'; + +export type ConfigSearchPaths = string[] | { + darwin?: string[]; + linux?: string[]; + win32?: string[]; +}; + +export interface Config { + android: { + adb: { + install: { + timeout: number | null; + }; + path: string | null; + port: number | null; + start: { + retryInterval: number | null; + timeout: number | null; + }; + }; + avd: { + path: string; + }; + emulator: { + start: { + timeout: number | null; + }; + }; + ndk: { + searchPaths: ConfigSearchPaths; + }; + sdk: { + searchPaths: ConfigSearchPaths; + }; + }; + + env: { + path: string | null; + }; + + ios: { + executables: { + security: string | null; + sqlite: string | null; + xcodeSelect: string | null; + }; + keychainMetaFile: string; + provisioning: { + searchPaths: ConfigSearchPaths; + }; + simulator: { + crashLogsDir: string; + devicesDir: string; + runtimesDir: string; + }; + xcode: { + searchPaths: ConfigSearchPaths; + }; + }; + + jdk: { + javaHome: string | null; + searchPaths: ConfigSearchPaths; + windows: { + registryKeys: string[]; + }; + }; + + network: { + agentOptions: AgentOptions | null; + caFile: string | null; + certFile: string | null; + httpProxy: string | null; + httpsProxy: string | null; + keyFile: string | null; + passphrase: string | null; + strictSSL: boolean; + }; + + titanium: { + modules: { + searchPaths: ConfigSearchPaths; + }; + sdk: { + downloadURLs: { + branches: string; + branchBuilds: string; + releases: { + beta: string; + rc: string; + ga: string; + }; + }; + installPath: { + darwin: string; + linux: string; + win32: string; + }; + searchPaths: ConfigSearchPaths; + }; + }; +} diff --git a/src/util/capitalize.ts b/src/util/capitalize.ts new file mode 100644 index 00000000..ca5cb1bc --- /dev/null +++ b/src/util/capitalize.ts @@ -0,0 +1,3 @@ +export function capitalize(str: string): string { + return str.charAt(0).toUpperCase() + str.slice(1); +} diff --git a/src/util/expand.ts b/src/util/expand.ts new file mode 100644 index 00000000..b5359866 --- /dev/null +++ b/src/util/expand.ts @@ -0,0 +1,21 @@ +import { join, resolve } from 'node:path'; + +const homeDirRegExp = /^~([\\|/].*)?$/; +const winRegExp = /^win/; +const winEnvVarRegExp = /(%([^%]*)%)/g; + +export function expand(...segments: string[]): string { + segments[0] = segments[0].replace( + homeDirRegExp, + (process.env.HOME || process.env.USERPROFILE) + '$1' + ); + /* v8 ignore next 6 */ + if (winRegExp.test(process.platform)) { + return resolve( + join(...segments).replace(winEnvVarRegExp, (_s, m, n) => { + return process.env[n] || m; + }) + ); + } + return resolve(...segments); +} diff --git a/src/util/is-dir.ts b/src/util/is-dir.ts new file mode 100644 index 00000000..a6192210 --- /dev/null +++ b/src/util/is-dir.ts @@ -0,0 +1,9 @@ +import { statSync } from 'fs'; + +export function isDir(dir: string): boolean { + try { + return statSync(dir).isDirectory(); + } catch { + return false; + } +} diff --git a/src/util/is-file.ts b/src/util/is-file.ts new file mode 100644 index 00000000..483415f7 --- /dev/null +++ b/src/util/is-file.ts @@ -0,0 +1,9 @@ +import { statSync } from 'fs'; + +export function isFile(file: string): boolean { + try { + return statSync(file).isFile(); + } catch { + return false; + } +} diff --git a/src/util/issue.ts b/src/util/issue.ts new file mode 100644 index 00000000..45aa9b24 --- /dev/null +++ b/src/util/issue.ts @@ -0,0 +1,16 @@ +export class Issue extends Error { + id: string; + type: 'error' | 'warning'; + details: string; + + constructor(message: string, options: { + id: string; + type: 'error' | 'warning'; + details: string; + }) { + super(message); + this.id = options.id; + this.type = options.type; + this.details = options.details; + } +} diff --git a/src/util/plist.ts b/src/util/plist.ts new file mode 100644 index 00000000..d7b5945a --- /dev/null +++ b/src/util/plist.ts @@ -0,0 +1,377 @@ +import { DOMParser } from '@xmldom/xmldom'; +import { mkdir, readFile, writeFile } from 'node:fs/promises'; +import path from 'node:path'; +import { isFile } from './is-file.js'; +import * as xml from './xml.js'; + +interface PlistDocument extends XMLDocument { + create(tag: string, nodeValue: string | null, parent: Node): Element; +} + +class PlistType { + className: string; + type: string; + value: any; + + /** + * Creates a JavaScript type-friendly plist value. + * @param type - The custom data type + * @param value - The value + */ + constructor(type: string, value: any) { + this.className = 'PlistType'; + this.type = type; + this.value = type === 'real' && Number.parseInt(value) === value + ? value.toFixed(1) + : value; + } +} + +/** + * JSON stringify formatter that properly translates PlistType objects. + * @param _key - The object key (unused) + * @param value - The value being stringify + * @returns The value being stringified + */ +function plistTypeFormatter(_key: string, value: any) { + if (value && typeof value === 'object' && value.className === 'PlistType') { + return value.value; + } + return value; +} + +/** + * Recursively converts a JSON object to XML. + * @param dom - The destination XML DOM + * @param parent - The parent object XML DOM node + * @param it - The variable to add to the XML DOM + * @param indent - The depth in which to indent + */ +function toXml(dom: PlistDocument, parent: Node, it: any, indent: number = 0) { + let i = indent || 0; + let p; + let q = parent; + const type = Object.prototype.toString.call(it); + + while (q.parentNode) { + i++; + q = q.parentNode; + } + + switch (type) { + case '[object Object]': + if (it.className === 'PlistType') { + dom.create(it.type, it.value, parent); + } else { + p = dom.create('dict', null, parent); + for (const name of Object.keys(it)) { + dom.create('key', name, p); + toXml(dom, p, it[name], indent); + } + p.appendChild(dom.createTextNode(`\r\n${'\t'.repeat(i)}`)); + } + break; + + case '[object Array]': + p = dom.create('array', null, parent); + for (const val of it) { + toXml(dom, p, val, indent); + } + p.appendChild(dom.createTextNode(`\r\n${'\t'.repeat(i)}`)); + break; + + case '[object Date]': + // note: plists do not support milliseconds + dom.create('date', it.toISOString().replace(/\.\d+Z$/, 'Z'), parent); + break; + + case '[object Boolean]': + p = dom.create(it ? 'true' : 'false', null, parent); + break; + + case '[object Null]': + break; + + case '[object String]': + dom.create('string', it, parent); + break; + + case '[object Number]': + dom.create(Number.parseInt(it) === it ? 'integer' : 'real', it, parent); + break; + } +} + +/** + * Recursively walks a XML node that represents a plist tag. + * @param obj - The destination JSON object + * @param node - The DOM node to walk + */ +function walkDict(obj: any, node: Node) { + let key; + let next; + + while (node) { + if (node.nodeType === xml.ELEMENT_NODE) { + if ((node as Element).tagName !== 'key') { + throw new Error('Error parsing plist: Expected entry'); + } + + key = (node.firstChild && (node.firstChild as Text).data || '').trim(); + + next = (node as Node).nextSibling; + while (next && (next as Node).nodeType !== xml.ELEMENT_NODE) { + next = next.nextSibling; + } + + if (!next) { + // all done + return; + } + + node = next as Node; + + if ((next as Element).tagName === 'key') { + obj[key] = null; + continue; + } + + if (next.tagName === 'dict') { + walkDict(obj[key] = {}, next.firstChild); + } else if (next.tagName === 'true') { + obj[key] = true; + } else if (next.tagName === 'false') { + obj[key] = false; + } else if (next.tagName === 'string') { + obj[key] = '' + (next.firstChild && next.firstChild.data || '').trim(); // cast all values as strings + } else if (next.tagName === 'integer') { + obj[key] = Number.parseInt(next.firstChild && next.firstChild.data) || 0; + } else if (next.tagName === 'real') { + obj[key] = Number.parseFloat(next.firstChild && next.firstChild.data) || 0; + } else if (next.tagName === 'date') { + // note: plists do not support milliseconds + const d = (next.firstChild && next.firstChild.data || '').trim(); + obj[key] = d ? new Date(d) : null; // note: toXml() can't convert a null date back to a tag + } else if (next.tagName === 'array') { + walkArray(obj[key] = [], next.firstChild); + } else if (next.tagName === 'data') { + obj[key] = new PlistType( + 'data', + (next.firstChild && next.firstChild.data || '').replace(/\s*/g, '') + ); + node = next; + } + } + node = node.nextSibling as Node; + } +} + +/** + * Recursively walks a XML node that represents a plist tag. + * @param arr - The destination JavaScript array + * @param node - The DOM node to walk + */ +function walkArray(arr: any[], node: Node) { + while (node) { + if (node.nodeType === xml.ELEMENT_NODE) { + switch ((node as Element).tagName) { + case 'string': + arr.push('' + (node.firstChild?.textContent || '').trim()); + break; + + case 'integer': + arr.push(Number.parseInt(node.firstChild?.textContent || '') || 0); + break; + + case 'real': + arr.push(Number.parseFloat(node.firstChild?.textContent || '') || 0.0); + break; + + case 'true': + arr.push(true); + break; + + case 'false': + arr.push(false); + break; + + case 'array': + const a = []; + walkArray(a, node.firstChild as Node); + arr.push(a); + break; + + case 'date': + // note: plists do not support milliseconds + const d = (node.firstChild?.textContent || '').trim(); + arr.push(d ? new Date(d) : null); + break; + + case 'dict': + const obj = {}; + walkDict(obj, node.firstChild as Node); + arr.push(obj); + break; + + case 'data': + arr.push( + new PlistType( + 'data', + (node.firstChild?.textContent || '').replace(/\s*/g, '') + ) + ); + } + } + node = node.nextSibling as Node; + } +} + +/** + * Converts an XML DOM to a JSON object. + * @param obj - The destination JSON object + * @param doc - The DOM node to walk + */ +function toJS(obj: any, doc: Element) { + let node = doc.firstChild; + + // the first child should be a element + while (node) { + if (node.nodeType === xml.ELEMENT_NODE && (node as Element).tagName === 'dict') { + node = node.firstChild; + break; + } + node = node.nextSibling; + } + + if (node) { + walkDict(obj, node); + } +} + +export class Plist { + filename?: string; + + /** + * Creates an empty plist object or loads and parses a plist file. + * @param filename - A plist file to load + */ + constructor(filename?: string) { + this.filename = filename; + + if (filename) { + this.load(filename); + } + } + + /** + * Loads and parses a plist file. + * @param file - A plist file to load + * @returns The plist instance + * @throws If plist file does not exist + */ + async load(file: string): Promise { + if (!isFile(file)) { + throw new Error('plist file does not exist'); + } + return this.parse(await readFile(file, 'utf8')); + } + + /** + * Parses a plist from a string. + * @param str - The plist string + * @returns The plist instance + * @throws If plist is malformed XML + */ + parse(str: string): this { + const dom = new DOMParser({ + errorHandler: (_level, err) => { + throw err; + }, + }).parseFromString(str, 'text/xml'); + + toJS(this, dom.documentElement); + + return this; + } + + /** + * Serializes a plist instance to an XML document. + * @param indent - The depth in which to indent + * @returns A XML document object + */ + toXml(indent = 0): Element { + const dom = new DOMParser().parseFromString( + '' + ) as PlistDocument; + + dom.create = (tag: string, nodeValue: string | null, parent: Node) => { + const node = dom.createElement(tag); + let i = indent || 0; + let p = parent; + + if (nodeValue) { + node.appendChild(dom.createTextNode('' + nodeValue)); + } + + if (p) { + while (p.parentNode) { + i++; + p = p.parentNode; + } + parent.appendChild(dom.createTextNode(`\r\n${'\t'.repeat(i)}`)); + } + + if (parent) { + parent.appendChild(node); + } + + return node; + }; + + toXml(dom, dom.documentElement, this, indent); + + dom.documentElement.appendChild(dom.createTextNode('\r\n')); + + return dom.documentElement; + } + + /** + * Creates a custom plist data type. + * @param type - The custom data type + * @param value - The value + * @returns The plist data value + */ + type(type: string, value: any): PlistType { + return new PlistType(type, value); + } + + /** + * Serializes a plist instance to a string. + * @param fmt - The format: undefined, 'xml', 'pretty-json', or 'json' + * @returns The serialized plist + */ + toString(fmt?: string): string { + if (fmt === 'xml') { + return '\n\n' + + this.toXml().toString().replace(/\r\n/g, '\n').replace(/\r/g, '\n'); + } else if (fmt === 'pretty-json') { + return JSON.stringify(this, plistTypeFormatter, '\t'); + } else if (fmt === 'json') { + return JSON.stringify(this, plistTypeFormatter); + } + return Object.prototype.toString.call(this); + } + + /** + * Serializes a plist instance to XML, then writes it to the specified file. + * @param file - The plist file to be written + * @returns The plist instance + */ + async save(file: string): Promise { + if (file) { + await mkdir(path.dirname(file), { recursive: true }); + await writeFile(file, this.toString('xml')); + } + return this; + } +} diff --git a/src/util/tailgate.ts b/src/util/tailgate.ts new file mode 100644 index 00000000..9898b6b2 --- /dev/null +++ b/src/util/tailgate.ts @@ -0,0 +1,50 @@ +type TailgateResolver = { + resolve: (value: T | PromiseLike) => void; + reject: (reason?: unknown) => void; +}; + +const tailgates: Record[]> = {}; + +/** + * Ensures that only a function is executed by a single task at a time. If a + * task is already running, then additional requests are queued. When the task + * completes, the result is immediately shared with the queued up callers. + * + * @param name - The tailgate name. + * @param callback - A function to call to get results. + * @returns Resolves whatever value `callback` returns/resolves. + */ +export function tailgate(name: string, callback: () => T): Promise { + return new Promise((resolve, reject) => { + if (Object.hasOwn(tailgates, name)) { + tailgates[name].push({ resolve, reject }); + return; + } + + tailgates[name] = [{ resolve, reject }]; + + const dispatchResolvers = (type: 'resolve' | 'reject', value: unknown) => { + const pending = tailgates[name]; + delete tailgates[name]; + for (const resolver of pending) { + resolver[type](value); + } + }; + + let result: unknown; + try { + result = callback(); + } catch (err: unknown) { + dispatchResolvers('reject', err); + return; + } + + if (result instanceof Promise) { + result + .then(result => dispatchResolvers('resolve', result)) + .catch(err => dispatchResolvers('reject', err)); + } else { + dispatchResolvers('resolve', result); + } + }); +} diff --git a/src/util/version.ts b/src/util/version.ts new file mode 100644 index 00000000..fc7c9073 --- /dev/null +++ b/src/util/version.ts @@ -0,0 +1,249 @@ +import semver from 'semver'; + +const versionRegExp = /^(\d+)\.(\d+)\.(\d+)(?:-(.+))?/i; + +/** + * Compare function for sort(). + * @param {String} a - Version A + * @param {String} b - Version B + * @returns {Number} + */ +export function compare(a: string | number, b: string | number): number { + const matchA = format(a, 3).toLowerCase().match(versionRegExp); + const matchB = format(b, 3).toLowerCase().match(versionRegExp); + if (!matchA || !matchB) { + throw new Error('Invalid version format'); + } + const [, amajor, aminor, apatch, atag] = matchA; + const [, bmajor, bminor, bpatch, btag] = matchB; + + let n = Number.parseInt(amajor) - Number.parseInt(bmajor); + if (n !== 0) { + return n; + } + + n = Number.parseInt(aminor) - Number.parseInt(bminor); + if (n !== 0) { + return n; + } + + n = Number.parseInt(apatch) - Number.parseInt(bpatch); + if (n !== 0) { + return n; + } + + if (atag && btag) { + return atag.localeCompare(btag); + } + + return atag ? 1 : btag ? -1 : 0; +} + +/** + * Formats a version based on a minimum and maximum number of segments. + * @param {String} ver - The version + * @param {Number} [min] - The minimum number of segments + * @param {Number} [max] - The maximum number of segments + * @param {Boolean} [chopDash] - If true, chops off the dash and anything after it + * @returns {String} The formatted version + */ +export function format( + ver: string | number, + min?: number, + max?: number, + chopDash?: boolean +): string { + if (typeof ver !== 'string' && typeof ver !== 'number') { + throw new Error(`Invalid version "${ver}"`); + } + ver = String(ver || 0); + if (chopDash) { + ver = ver.replace(/(-.*)?$/, ''); + } + const parts = ver.split('.'); + if (min !== undefined) { + while (parts.length < min) { + parts.push('0'); + } + } + if (max !== undefined) { + return parts.slice(0, max).join('.'); + } + return parts.join('.'); +} + +/** + * Converts two versions into 3 segment format, then checks if they are equal to each other. + * @param {String} v1 - The first version to compare + * @param {String} v2 - The second version to compare + * @returns {Boolean} True if the versions are equal + */ +export function eq(v1: string | number, v2: string | number): boolean { + return semver.eq(format(v1, 3, 3), format(v2, 3, 3)); +} + +/** + * Converts two versions into 3 segment format, then checks if the first version is less than the + * second version. + * @param {String} v1 - The first version to compare + * @param {String} v2 - The second version to compare + * @returns {Boolean} True if the first version is less than the second version + */ +export function lt(v1: string | number, v2: string | number): boolean { + return semver.lt(format(v1, 3, 3), format(v2, 3, 3)); +} + +/** + * Converts two versions into 3 segment format, then checks if the first version is less than or + * equal to the second version. + * @param {String} v1 - The first version to compare + * @param {String} v2 - The second version to compare + * @returns {Boolean} True if the first version is less than or equal to the second version + */ +export function lte(v1: string | number, v2: string | number): boolean { + return semver.lte(format(v1, 3, 3), format(v2, 3, 3)); +} + +/** + * Converts two versions into 3 segment format, then checks if the first version is greater than the + * second version. + * @param {String} v1 - The first version to compare + * @param {String} v2 - The second version to compare + * @returns {Boolean} True if the first version is greater than the second version + */ +export function gt(v1: string | number, v2: string | number): boolean { + return semver.gt(format(v1, 3, 3), format(v2, 3, 3)); +} + +/** + * Converts two versions into 3 segment format, then checks if the first version is greater than or + * equal to the second version. + * @param {String} v1 - The first version to compare + * @param {String} v2 - The second version to compare + * @returns {Boolean} True if the first version is greater than or equal to the second version + */ +export function gte(v1: string | number, v2: string | number): boolean { + return semver.gte(format(v1, 3, 3), format(v2, 3, 3)); +} + +/** + * Checks if a version is valid. + * @param {String} v - The version to validate + * @returns {Boolean} `true` if the version is valid, `false` otherwise + */ +export function isValid(v: string | number): boolean { + try { + return semver.valid(format(v, 3, 3)) !== null; + } catch { + return false; + } +} + +/** + * Determines the most minimum value of the supplied range. + * @param {String} str - A string contain one or more versions or version ranges + * @returns {String} The minimum version found or undefined + */ +export function parseMin(str: string): string | undefined { + let min; + + for (const range of str.split(/\s*\|\|\s*/)) { + const x = range.split(' ').shift()?.replace(/[^.\d]/g, ''); + if (x && (!min || lt(x, min))) { + min = x.replace(/\.$/, ''); + } + } + + return min; +} + +/** + * Determines the most maximum value of the supplied range. + * @param {String} str - A string contain one or more versions or version ranges + * @param {Boolean} [allowX=false] - When true, treats 'x' as apart of the version + * @returns {String} The maximum version found or undefined + */ +export function parseMax(str: string, allowX?: boolean): string | undefined { + let max: string | undefined; + let lt: boolean | undefined; + + for (const range of str.split(/\s*\|\|\s*/)) { + const segments = range.split(' '); + let x = segments.length === 1 ? segments.shift() : segments.slice(1).shift(); + if (x && !allowX) { + x = x.replace(/.x$/i, ''); + } + const y = x?.replace(allowX ? /[^.xX\d]/g : /[^.\d]/g, ''); + if (x && y && (!max || gt(y, max))) { + lt = /^<[^=]\d/.test(x); + max = y.replace(/\.$/, ''); + } + } + + return (lt ? '<' : '') + max; +} + +/** + * Checks if a version is in any of the supplied ranges. + * @param {String} ver - The version to check + * @param {String} str - The version ranges to validate against + * @param {Boolean} [maybe] - If true and the version is greater than at least + * one of the ranges, then it will return 'maybe'. + * @returns {Boolean|String} True if the version matches one of the ranges + */ +export function satisfies(ver: string, str: string, maybe?: boolean): boolean | string { + ver = format(ver, 3, 3, true); + + // if we get 1.x, we force it to 1.99999999 so that we should match + const replacedStr = str.replace(/(<=?\d+(\.\d+)*?)\.x/g, '$1.99999999').replace( + /(>=?\d+(\.\d+)*?)\.x/g, + '$1.0' + ); + + try { + if (replacedStr === '*' || eq(ver, replacedStr)) { + return true; + } + } catch {} + + const r = replacedStr.split(/\s*\|\|\s*/).some(range => { + // semver is picky with the '-' in comparisons and it just so happens when it + // parses versions in the range, it will add '-0' and cause '1.0.0' != '1.0.0-0', + // so we test our version with and without the '-9' + return range === '*' || semver.satisfies(ver, range) + || (!ver.includes('-') && semver.satisfies(ver + '-0', range)); + }); + + // if true or we don't care if it maybe matches, then return now + if (r || !maybe) { + return r; + } + + // need to determine if the version is greater than any range + const range = new semver.Range(replacedStr); + for (let i = 0; i < range.set.length; i++) { + const set = range.set[i]; + for (let j = set.length - 1; j >= 0; j--) { + if (set[j].semver instanceof semver.SemVer) { + if ( + (set[j].operator === '<' || set[j].operator === '<=') + && !semver.cmp(ver, set[j].operator, set[j].semver, set[j].loose) + ) { + return 'maybe'; + } + break; + } + } + } + + return false; +} + +/** + * Sorts an array of version numbers in ascending order. + * @param {Array} arr - The array of version numbers to sort + * @returns {Array} The sorted versions + */ +export function sort(arr: string[]): string[] { + return arr.sort(compare); +} diff --git a/src/util/xml.ts b/src/util/xml.ts new file mode 100644 index 00000000..4fcd9b60 --- /dev/null +++ b/src/util/xml.ts @@ -0,0 +1,105 @@ +/** + * @constant {Number} Node type constant for an element node. + */ +export const ELEMENT_NODE = 1; + +/** + * Loops through all child element nodes for a given XML node skipping all + * non-element nodes (i.e. text, comment, etc) and calls the specified function + * for each element node found. + * @param node - An XML node + * @param fn - The function to call for each element node found + */ +export function forEachElement(node: Element, fn: (child: Element) => void): void { + let child = node.firstChild; + while (child) { + if (child.nodeType === ELEMENT_NODE) { + fn(child as Element); + } + child = child.nextSibling; + } +} + +/** + * Loops through all attributes for a given DOM node and calls a function for + * each attribute. + * @param node - An XML node + * @param fn - The function to call for each attribute + */ +export function forEachAttr(node: Element, fn: (attr: Attr) => void): void { + const len = node.attributes.length; + for (let i = 0; i < len; i++) { + fn(node.attributes.item(i) as Attr); + } +} + +/** + * Parses a XML value and converts the value to a JS value if it detects it as a + * boolean, null, or a number. + * @param value - The value of the XML node + * @param parseBoolean - Whether to parse the value as a boolean + * @returns The parsed value + */ +export function parse( + value: string | null, + parseBoolean?: boolean +): string | number | boolean | null { + if (value === null || value === 'null') { + return null; + } + const num = Number(value); + if (value === '' || typeof value !== 'string' || isNaN(num)) { + value = value == undefined ? '' : value.toString().trim(); // eslint-disable-line eqeqeq + if (parseBoolean && value === 'true') { + return true; + } + if (parseBoolean && value === 'false') { + return false; + } + return value; + } + return num; +} + +/** + * Gets and parses an attribute of an XML node. If attribute does not exist, it + * returns an empty string. + * @param node - An XML node + * @param attr - The name of the attribute to get + * @returns The value of the attribute or empty string if attribute does not exist + * string if attribute does not exist + */ +export function getAttr(node: Element, attr: string): string | number | null { + return node && (parse(node.getAttribute(attr), false) as string | number | null) + || null; +} + +/** + * Gets and parses an attribute of an XML node as a string. If attribute does + * not exist, it returns an empty string. + * @param node - An XML node + * @param attr - The name of the attribute to get + * @returns The value of the attribute or empty string if attribute does not exist + */ +export function getAttrString(node: Element, attr: string): string { + return node.getAttribute(attr) || ''; +} + +/** + * Determines if the specified XML node has a child data node and returns it as + * a string. + * @param node - An XML node + * @returns The value of the XML node + */ +export function getValueString(node: Element): string { + return node?.firstChild?.textContent || ''; +} + +/** + * Determines if the specified XML node has a child data node and returns it. + * @param node - An XML node + * @returns The value of the XML node + */ +export function getValue(node: Element): string | number | boolean | null { + return node?.firstChild ? parse(node.firstChild.textContent || '', true) : ''; +} diff --git a/test-old/adb.test.js b/test-old/adb.test.js new file mode 100644 index 00000000..71700ac3 --- /dev/null +++ b/test-old/adb.test.js @@ -0,0 +1,176 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import { setTimeout as delay } from 'node:timers/promises'; +import { fileURLToPath } from 'node:url'; +import { rimraf } from 'rimraf'; +import { afterAll, beforeAll, describe, expect, it } from 'vitest'; +import { ADB } from '../lib/adb.js'; +import { setAndroidPackageJson } from '../lib/android.js'; +import { EmulatorManager } from '../lib/emulator.js'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +setAndroidPackageJson({ + vendorDependencies: { + 'android sdk': '>=23.x <=27.x', + 'android build tools': '>=25.x <=27.x', + 'android platform tools': '27.x', + 'android tools': '<=26.x', + 'android ndk': '>=r11c <=r16c', + node: '>=4.0 <=8.x', + java: '>=1.8.x', + }, +}); + +function MockConfig() { + this.get = (_s, d) => d; +} + +const config = new MockConfig(); +const adb = new ADB(config); +const emulator = new EmulatorManager(config); + +describe('adb', () => { + it('#version() returns a valid semver string', async () => { + const ver = await adb.version(); + expect(ver).toMatch(/^1\.0\.\d+/); + expect(semver.valid(ver)).not.toBeNull(); + }); + + // TODO: Add test where we start an emulator first, get it in listing, then stop it? + it('#devices() returns empty Array when no emulators running', async () => { + const devices = await adb.devices(); + expect(devices).toBeInstanceOf(Array); + }); + + // TODO: Start an emulator, make sure we get event? + it('#trackDevices()', () => + new Promise((resolve, reject) => { + const connection = adb.trackDevices((err, devices) => { + connection.end(); + if (err) { + return reject(err); + } + // console.log('trackDevicesCallback: ' + JSON.stringify(devices)); + expect(devices).toBeInstanceOf(Array); + resolve(); + }); + })); + + describe('with an emulator running', () => { + let avd; + let device; + + beforeAll(async () => { + const avds = await emulator.detect(); + if (avds.length === 0) { + throw new Error('Tests require at least one emulator defined!'); + } + avd = avds[0]; + + const emu = await emulator.start(avd.id); + await new Promise((resolve, reject) => { + emu.on('ready', (d) => { + device = d; + resolve(); + }); + + emu.on('timeout', () => reject(new Error('emulator.start() timed out'))); + }); + }, 30000); + + afterAll(async () => { + // Just call finished if there is no device, there may have been an issue when starting + // the emulator in the before + if (!device) { + return; + } + await emulator.stop(device.emulator.id); + await delay(5000); // let it wait 5 seconds or else adb will still report it as connected + }, 30000); + + it('#shell()', async () => { + const data = await adb.shell(device.id, 'cat /system/build.prop'); + // data is a Buffer! + expect(data).toBeTruthy(); + // (typeof data).should.eql('Buffer'); + }); + + it('#startApp(), #getPid() and #stopApp()', async () => { + const appId = 'com.android.settings'; + const data = await adb.startApp(device.id, appId, 'wifi.WifiStatusTest'); + + // data is a Buffer! + expect(data).toBeTruthy(); // TODO: Test data.toString() holds particular text? + + const pid = await adb.getPid(device.id, appId); + expect(err).toBeNull(); + + expect(pid).toBeInstanceOf(Number); + expect(pid).not.toEqual(0); + + await adb.stopApp(device.id, appId); + }, 30000); + + it('#pull()', async () => { + const dest = path.join(__dirname, 'hosts'); + expect(fs.existsSync(dest)).toBeFalsy(); + + await adb.pull(device.id, '/system/etc/hosts', __dirname); + + // verify build.prop exists in current dir now! + try { + expect(fs.existsSync(dest)).toBeTruthy(); + } finally { + try { + rimraf(dest); + } catch { + // squash + } + } + }); + + it('#push()', async () => { + const dest = '/mnt/sdcard/tmp/test-adb.js'; + + // Ensure dest file doesn't exist + await adb.shell(device.id, `rm -f '${dest}'`); + + // Then piush this file to dest + await adb.push(device.id, __filename, dest); + + // verify it now exists and matches + const data = await adb.shell(device.id, `cat '${dest}'`); + + // data is a Buffer! + expect(data).toBeTruthy(); + // normalize newlines, android uses \r\n + expect(data.toString().replace(/\r\n/g, '\n')).toEqual( + fs.readFileSync(__filename).toString() + ); + }); + }); // with running emulator + + // TODO: Install a pre-built test app! + // function testInstallApp() { + // adb.installApp('emulator-5554', '~/appc/workspace/testapp2/build/android/bin/app.apk', (err, data) => { + // if (err) { + // console.error('ERROR! ' + err + '\n'); + // } else { + // console.log('-----------------------------------------------------------------'); + // console.log(data); + // console.log(''); + // } + // }); + // } + // + // function testForward() { + // adb.forward('015d21d4ff181a17', 'tcp:5000', 'tcp:6000', (err, data) => { + // if (err) { + // console.error('ERROR! ' + err + '\n'); + // } else { + // console.log('result = ' + data + '\n'); + // } + // }); + // } +}); diff --git a/test-old/android.test.js b/test-old/android.test.js new file mode 100644 index 00000000..8fb2f9a8 --- /dev/null +++ b/test-old/android.test.js @@ -0,0 +1,26 @@ +import { describe, expect, it } from 'vitest'; +import { detect as detectAndroid, setAndroidPackageJson } from '../lib/android.js'; + +function MockConfig() { + this.get = (_s, d) => d; +} + +setAndroidPackageJson({ + vendorDependencies: { + 'android sdk': '>=23.x <=27.x', + 'android build tools': '>=25.x <=27.x', + 'android platform tools': '27.x', + 'android tools': '<=26.x', + 'android ndk': '>=r11c <=r16c', + node: '>=4.0 <=8.x', + java: '>=1.8.x', + }, +}); +const config = new MockConfig(); + +describe('android', () => { + it('should detect Android environment', async () => { + const info = await detectAndroid(config); + console.log(info); + }); +}); diff --git a/test-old/avd.test.js b/test-old/avd.test.js new file mode 100644 index 00000000..f1b08aa7 --- /dev/null +++ b/test-old/avd.test.js @@ -0,0 +1,75 @@ +import { beforeAll, describe, expect, it } from 'vitest'; +import { setAndroidPackageJson } from '../lib/android.js'; +import { EmulatorManager } from '../lib/emulator.js'; + +function MockConfig() { + this.get = (_s, d) => d; +} + +setAndroidPackageJson({ + vendorDependencies: { + 'android sdk': '>=23.x <=27.x', + 'android build tools': '>=25.x <=27.x', + 'android platform tools': '27.x', + 'android tools': '<=26.x', + 'android ndk': '>=r11c <=r16c', + node: '>=4.0 <=8.x', + java: '>=1.8.x', + }, +}); +const config = new MockConfig(); +const emulator = new EmulatorManager(config); + +describe('emulator', () => { + it('#detect() any', async () => { + const avds = await emulator.detect(); + expect(avds).toBeInstanceOf(Array); + }); + + it('#detect() type: avd', async () => { + const avds = await emulator.detect({ type: 'avd' }); + expect(avds).toBeInstanceOf(Array); + }); + + describe('lifecycle', () => { + let avd; + + beforeAll(async () => { + const avds = await emulator.detect(); + if (avds.length === 0) { + throw new Error('Tests require at least one emulator defined!'); + } + avd = avds[0]; + }); + + it('#isRunning() returns null object when not running', async () => { + const emu = await emulator.isRunning(avd.id); + expect(emu).toBeTruthy(); + }); + + // FIXME: This test isn't right. I think it will only pass when the emulator is running and we pass in the id (that has port in the value)? + // it('#isEmulator() returns matching emulator?', async () => { + // const emu = await emulator.isEmulator(avd.name); + // expect(emu).toBeTruthy(); + // }); + + it('#start(), #isRunning() and #stop()', async () => { + const emu = await emulator.start(avd.id); + expect(emu).toBeTruthy(); + + await new Promise((resolve, reject) => { + emu.on('ready', async (device) => { + expect(device).toBeTruthy(); + + const emu = await emulator.isRunning(device.emulator.id); + expect(emu).toBeTruthy(); + + await emulator.stop(device.emulator.id); + setTimeout(() => resolve(), 6000); // let it wait 5 seconds or else adb will still report it as connected + }); + + emu.on('timeout', () => reject(new Error('emulator.start() timed out'))); + }); + }, 30000); + }); +}); diff --git a/tests/i18n/en/Default-568h@2x.png b/test-old/i18n/en/Default-568h@2x.png similarity index 100% rename from tests/i18n/en/Default-568h@2x.png rename to test-old/i18n/en/Default-568h@2x.png diff --git a/test-old/i18n/en/en.xml b/test-old/i18n/en/en.xml new file mode 100644 index 00000000..f19244c1 --- /dev/null +++ b/test-old/i18n/en/en.xml @@ -0,0 +1,3 @@ + + value + diff --git a/test-old/i18n/es/app.xml b/test-old/i18n/es/app.xml new file mode 100644 index 00000000..1a8ed566 --- /dev/null +++ b/test-old/i18n/es/app.xml @@ -0,0 +1,3 @@ + + my spanish value + diff --git a/test-old/jsanalyze.test.js b/test-old/jsanalyze.test.js new file mode 100644 index 00000000..1e1cbc6e --- /dev/null +++ b/test-old/jsanalyze.test.js @@ -0,0 +1,280 @@ +import fs from 'node:fs'; +import { mkdir } from 'node:fs/promises'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { rimraf } from 'rimraf'; +import { afterAll, beforeAll, describe, expect, it } from 'vitest'; +import { + analyzeHtml, + analyzeHtmlFile, + analyzeJs, + analyzeJsFile, + getAPIUsage, + sortObject, +} from '../lib/jsanalyze.js'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +describe('jsanalyze', () => { + describe('#analyzeJs()', () => { + const tmpDir = path.join(__dirname, 'tmp'); + + beforeAll(async () => { + if (fs.existsSync(tmpDir)) { + await rimraf(tmpDir); + } + await mkdir(tmpDir, { recursive: true }); + }); + + afterAll(async () => { + await rimraf(tmpDir); + }); + + it('tracks Ti API symbols', () => { + const results = analyzeJs('Ti.API.info("yeah");', {}); + expect(results.symbols).toEqual(['API.info', 'API']); + }); + + it('Should ignore Ti in string', () => { + const results = analyzeJs( + ` + Ti.API.info("Ti. In A String Causes Issues?".toUpperCase()); + Ti.API.info(\`Ti.UI.AlertDialog selected button at index: \${index}\`); + const message = \`Ti.UI.TabbedBar changed to index: \${index}\`; + const messageAfterTranspile = "Ti.UI.TabbedBar changed to index: ".concat(index); + const view = Ti.UI.createLabel(); + console.log(\`version is \${Ti.API.version}\`); + "Ti.Test".toUpperCase(); + Ti['UI'].createWebView(); + "Ti.Test"`, + {} + ); + expect(results.symbols).toEqual([ + 'API.info', + 'API', + 'UI.createLabel', + 'UI', + 'API.version', + 'UI.createWebView', + ]); + }); + + it('tracks Ti API usage across multiple calls', () => { + const results = analyzeJs('Ti.UI.createView({});', {}); + expect(results.symbols).toEqual(['UI.createView', 'UI']); // symbols only includes from this call + // includes symbols from this test and the one above! + expect(getAPIUsage()).toEqual({ + 'Titanium.API': 4, + 'Titanium.API.info': 3, + 'Titanium.API.version': 1, + 'Titanium.UI': 3, + 'Titanium.UI.createLabel': 1, + 'Titanium.UI.createView': 1, + 'Titanium.UI.createWebView': 1, + }); + }); + + it('converts global "this" references into "global" references when transpiling', () => { + const results = analyzeJs('this.myGlobalMethod = function() {};', { + transpile: true, + }); + expect(results.contents).toEqual('global.myGlobalMethod = function () {};'); + }); + + it('doesn\'t converts function-scoped "this" references into "global" references when transpiling', () => { + const results = analyzeJs('var myGlobalMethod = function() { return this; };', { + transpile: true, + }); + expect(results.contents).toEqual( + 'var myGlobalMethod = function myGlobalMethod() {return this;};' + ); + }); + + it('generates source maps inline into generated js file', () => { + const inputJSFile = path.join(__dirname, 'resources/input.js'); + const contents = fs.readFileSync(inputJSFile, 'utf-8'); + let expectedSourceMap = JSON.parse(fs.readFileSync(`${inputJSFile}.map`, 'utf8')); + + expectedSourceMap.sourceRoot = path.dirname(inputJSFile); + expectedSourceMap = sortObject(expectedSourceMap); + + const results = analyzeJs(contents, { + transpile: true, + sourceMap: true, + filename: inputJSFile, + }); + const expectedBase64Map = Buffer.from(JSON.stringify(expectedSourceMap)).toString( + 'base64' + ); + expect(results.contents).toEqual( + `var myGlobalMethod = function myGlobalMethod() {return this;};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,${expectedBase64Map}\n` + ); + }); + + it('generates source maps inline into generated js file and removes sourcesContent for android platform', () => { + const inputJSFile = path.join(__dirname, 'resources/input.js'); + const contents = fs.readFileSync(inputJSFile, 'utf-8'); + let expectedSourceMap = JSON.parse(fs.readFileSync(`${inputJSFile}.map`, 'utf8')); + expectedSourceMap.sourceRoot = path.dirname(inputJSFile); + delete expectedSourceMap.sourcesContent; + expectedSourceMap = sortObject(expectedSourceMap); + const results = analyzeJs(contents, { + transpile: true, + sourceMap: true, + filename: inputJSFile, + platform: 'android', + }); + const expectedBase64Map = Buffer.from(JSON.stringify(expectedSourceMap)).toString( + 'base64' + ); + expect(results.contents).toEqual( + `var myGlobalMethod = function myGlobalMethod() {return this;};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,${expectedBase64Map}\n` + ); + }); + + it('handles input JS file with existing sourceMappingURL pointing to file', () => { + const inputMapFile = path.join(__dirname, 'resources/input.js.map'); + const inputJSFile = path.join(__dirname, 'resources/input.js'); + const results = analyzeJs( + `var myGlobalMethod = function() { return this; };\n//# sourceMappingURL=file://${inputMapFile}`, + { + transpile: true, + sourceMap: true, + filename: 'intermediate.js', + } + ); + let expectedSourceMap = JSON.parse( + fs.readFileSync(path.join(__dirname, 'resources/intermediate.js.map'), 'utf8') + ); + expectedSourceMap.sourceRoot = path.dirname(inputJSFile); // passes along the original source file via sources/sourceRoot + expectedSourceMap = sortObject(expectedSourceMap); + const expectedBase64Map = Buffer.from(JSON.stringify(expectedSourceMap)).toString( + 'base64' + ); + expect(results.contents).toEqual( + `var myGlobalMethod = function myGlobalMethod() {return this;};\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,${expectedBase64Map}\n` + ); + }); + + it('handles input JS file with existing sourceMappingURL with data: uri', () => { + const originalSourceFile = path.join(__dirname, 'resources/input.js'); + // given that it's inlined, it will try to resolve the relative 'input.js' source as relative to the JS filename we pass along in options. + const results = analyzeJs( + 'var myGlobalMethod = function() { return this; };\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImlucHV0LmpzIl0sIm5hbWVzIjpbIm15R2xvYmFsTWV0aG9kIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxjQUFjLEdBQUcsU0FBakJBLGNBQWMsR0FBYyxDQUFFLE9BQU8sSUFBSSxDQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgbXlHbG9iYWxNZXRob2QgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH07Il19', + { + transpile: true, + sourceMap: true, + filename: path.join(__dirname, 'resources/intermediate.js'), + } + ); + let expectedSourceMap = JSON.parse( + fs.readFileSync(path.join(__dirname, 'resources/intermediate.js.map'), 'utf8') + ); + expectedSourceMap.sourceRoot = path.dirname(originalSourceFile); // passes along the original source file via sources/sourceRoot + expectedSourceMap = sortObject(expectedSourceMap); + const expectedBase64Map = Buffer.from(JSON.stringify(expectedSourceMap)).toString( + 'base64' + ); + expect(results.contents).toEqual( + `var myGlobalMethod = function myGlobalMethod() {return this;};\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,${expectedBase64Map}\n` + ); + }); + + it('handles input JS file with existing sourceMappingURL pointing to non-existent file', () => { + // treat like there is no original input source map.... + // only difference here is that there's an extra newline to deal with versus the "base" test case + const inputJSFile = path.join( + __dirname, + 'resources/input.nonexistent.sourcemapfile.js' + ); + const contents = fs.readFileSync(inputJSFile, 'utf-8'); + let expectedSourceMap = JSON.parse( + fs.readFileSync( + path.join(__dirname, 'resources/input.nonexistent.sourcemapfile.js.map'), + 'utf8' + ) + ); + expectedSourceMap.sourceRoot = path.dirname(inputJSFile); + expectedSourceMap = sortObject(expectedSourceMap); + const results = analyzeJs(contents, { + transpile: true, + sourceMap: true, + filename: inputJSFile, + }); + const expectedBase64Map = Buffer.from(JSON.stringify(expectedSourceMap)).toString( + 'base64' + ); + expect(results.contents).toEqual( + `var myGlobalMethod = function myGlobalMethod() {return this;};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,${expectedBase64Map}\n` + ); + }); + + // babel-plugin-transform-titanium + it('converts OS_IOS into boolean', () => { + const results = analyzeJs('if (OS_IOS) {}', { + transpile: true, + transform: { platform: 'ios' }, + }); + expect(results.contents).toEqual('if (true) {}'); + }); + + it('should fallback to looser parsing if required', () => { + const results = analyzeJs('return "foo";'); + expect(results.contents).toEqual('return "foo";'); + }); + + it('should handle errors', () => { + expect(() => analyzeJs('return foo!;console.log("bar");')).toThrow( + 'Failed to parse undefined\nMissing semicolon. (1:10)' + ); + }); + }); + + describe('#analyzeJsFile()', () => { + it('should transform contents', () => { + const inputJSFile = path.join(__dirname, 'resources/input.js'); + + let expectedSourceMap = JSON.parse(fs.readFileSync(`${inputJSFile}.map`, 'utf8')); + expectedSourceMap.sourceRoot = path.dirname(inputJSFile); + expectedSourceMap = sortObject(expectedSourceMap); + const results = analyzeJsFile(inputJSFile, { + transpile: true, + sourceMap: true, + }); + const expectedBase64Map = Buffer.from(JSON.stringify(expectedSourceMap)).toString( + 'base64' + ); + expect(results.contents).toEqual( + `var myGlobalMethod = function myGlobalMethod() {return this;};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,${expectedBase64Map}\n` + ); + }); + }); + + describe('#analyzeHtml', () => { + it('should analyze an html file', () => { + const inputFile = path.join(__dirname, 'resources/hello.html'); + + const results = analyzeHtml(fs.readFileSync(inputFile, 'utf8')); + expect(results).toBeInstanceOf(Array); + expect(results.length).toEqual(2); + expect(results).toEqual([ + 'input.js', + 'resources/input.js', + ]); + }); + }); + + describe('#analyzeHtmlFile', () => { + it('should analyze an html file', () => { + const inputFile = path.join(__dirname, 'resources/hello.html'); + + const results = analyzeHtmlFile(inputFile); + expect(results).toBeInstanceOf(Array); + expect(results.length).toEqual(2); + expect(results).toEqual([ + 'input.js', + 'resources/input.js', + ]); + }); + }); +}); diff --git a/tests/resources/global-plugin/app.js b/test-old/resources/global-plugin/app.js similarity index 54% rename from tests/resources/global-plugin/app.js rename to test-old/resources/global-plugin/app.js index 61271eb4..921549e1 100644 --- a/tests/resources/global-plugin/app.js +++ b/test-old/resources/global-plugin/app.js @@ -1,5 +1,5 @@ function foobar() { - var x = 'bar'; + var x = 'bar'; } global.aGlobalVar = 'foobar'; @@ -7,15 +7,15 @@ global.aGlobalVar = 'foobar'; const foo = () => {}; let win = Ti.UI.createWindow({ - backgroundColor: 'white' + backgroundColor: 'white', }); var textField = Ti.UI.createTextField({ - borderStyle: Ti.UI.INPUT_BORDERSTYLE_BEZEL, - color: '#336699', - top: 10, - left: 10, - width: 250, - height: 60 + borderStyle: Ti.UI.INPUT_BORDERSTYLE_BEZEL, + color: '#336699', + top: 10, + left: 10, + width: 250, + height: 60, }); win.add(textField); win.open(); diff --git a/tests/resources/global-plugin/output.js b/test-old/resources/global-plugin/output.js similarity index 63% rename from tests/resources/global-plugin/output.js rename to test-old/resources/global-plugin/output.js index ee3566d2..d8068358 100644 --- a/tests/resources/global-plugin/output.js +++ b/test-old/resources/global-plugin/output.js @@ -1,5 +1,5 @@ function foobar() { - var x = 'bar'; + var x = 'bar'; } global.foobar = foobar; @@ -9,16 +9,16 @@ const foo = () => {}; global.foo = foo; let win = Ti.UI.createWindow({ - backgroundColor: 'white' + backgroundColor: 'white', }); global.win = win; var textField = Ti.UI.createTextField({ - borderStyle: Ti.UI.INPUT_BORDERSTYLE_BEZEL, - color: '#336699', - top: 10, - left: 10, - width: 250, - height: 60 + borderStyle: Ti.UI.INPUT_BORDERSTYLE_BEZEL, + color: '#336699', + top: 10, + left: 10, + width: 250, + height: 60, }); global.textField = textField; win.add(textField); diff --git a/test-old/resources/hello.html b/test-old/resources/hello.html new file mode 100644 index 00000000..72077347 --- /dev/null +++ b/test-old/resources/hello.html @@ -0,0 +1,13 @@ + + + + + + A Small Hello + + + +

Hi

+

This is very minimal "hello world" HTML document.

+ + diff --git a/test-old/resources/input.js b/test-old/resources/input.js new file mode 100644 index 00000000..b1e8f3e4 --- /dev/null +++ b/test-old/resources/input.js @@ -0,0 +1,3 @@ +var myGlobalMethod = function() { + return this; +}; diff --git a/tests/resources/input.js.map b/test-old/resources/input.js.map similarity index 100% rename from tests/resources/input.js.map rename to test-old/resources/input.js.map diff --git a/test-old/resources/input.nonexistent.sourcemapfile.js b/test-old/resources/input.nonexistent.sourcemapfile.js new file mode 100644 index 00000000..9e6ede0c --- /dev/null +++ b/test-old/resources/input.nonexistent.sourcemapfile.js @@ -0,0 +1,4 @@ +var myGlobalMethod = function() { + return this; +}; +// # sourceMappingURL=madeup.js.map diff --git a/tests/resources/input.nonexistent.sourcemapfile.js.map b/test-old/resources/input.nonexistent.sourcemapfile.js.map similarity index 100% rename from tests/resources/input.nonexistent.sourcemapfile.js.map rename to test-old/resources/input.nonexistent.sourcemapfile.js.map diff --git a/tests/resources/intermediate.js.map b/test-old/resources/intermediate.js.map similarity index 100% rename from tests/resources/intermediate.js.map rename to test-old/resources/intermediate.js.map diff --git a/test-old/resources/tiapp1.xml b/test-old/resources/tiapp1.xml new file mode 100644 index 00000000..dc608138 --- /dev/null +++ b/test-old/resources/tiapp1.xml @@ -0,0 +1,41 @@ + + + ti.testapp + testapp + 1.0 + tester + http:// + not specified + 2012 by tester + appicon.png + false + false + default + false + false + false + false + 088dc83c-64af-4a81-b57c-7407649453f0 + system + + + Ti.UI.PORTRAIT + + + Ti.UI.PORTRAIT + Ti.UI.UPSIDE_PORTRAIT + Ti.UI.LANDSCAPE_LEFT + Ti.UI.LANDSCAPE_RIGHT + + + + + + + true + true + + default + + + diff --git a/test-old/resources/tiapp2.xml b/test-old/resources/tiapp2.xml new file mode 100644 index 00000000..feaf2da7 --- /dev/null +++ b/test-old/resources/tiapp2.xml @@ -0,0 +1,285 @@ + + + + true + true + true + + 2.2.0 + ti.testapp + testapp + 1.0 + tester + http:// + not specified + 2012 by tester + appicon.png + false + false + default + false + false + false + false + 088dc83c-64af-4a81-b57c-7407649453f0 + system + production + true + false + false + false + this "one" with quotes + ti.testapp.invoke.push + ti.testapp.invoke.open + Some Title for BB Push, typically the app name" + true + + true + + ti-api-usage-finder + + + xyz + + + + true + true + true + true + #FFFFFF + 5.0 + foo + 10571 + + + group.com.appc.foo + group.com.appc.bar + + + + + application-identifier + XXXXXXXXXX.com.test.app + aps-environment + production + beta-reports-active + + get-task-allow + + keychain-access-groups + + XXXXXXXXXX.com.test.app + + + + + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIBackgroundModes + + audio + location + voip + newsstand-content + external-accessory + bluetooth-central + + UIRequiredDeviceCapabilities + + telephony + wifi + sms + still-camera + auto-focus-camera + front-facing-camera + camera-flash + video-camera + accelerometer + gyroscope + location-services + gps + magnetometer + gamekit + microphone + opengles-1 + opengles-2 + armv6 + armv7 + peer-peer + bluetooth-le + + UIRequiresPersistentWiFi + + UIPrerenderedIcon + + UIStatusBarHidden + + UIStatusBarStyle + UIStatusBarStyleBlackTranslucent + UIAppFonts + + /fonts/MyFont_1.otf + /fonts/MyFont_2.otf + + + + + + + + + + + + + abc + 123 + + + + + + + + + + + + Ti.UI.PORTRAIT + + + Ti.UI.PORTRAIT + Ti.UI.UPSIDE_PORTRAIT + Ti.UI.LANDSCAPE_LEFT + Ti.UI.LANDSCAPE_RIGHT + + + audio + location + voip + + + telephony + wifi + sms + still-camera + auto-focus-camera + front-facing-camera + camera-flash + video-camera + accelerometer + gyroscope + location-services + gps + magnetometer + gamekit + microphone + opengles-1 + opengles-2 + armv6 + armv7 + peer-peer + + + + something + someicon.png + public.item,public.content + true + + + + + + + + + + + + + + + + + + + + + + + + 10 + true + armeabi,armeabi-v7a,x86 + + + + + + alloy + + some_module + + + + ti.alltest + ti.cjstest + ti.mwtest + ti.androidtest + ti.iphonetest + + + ti_sample_plugin + + diff --git a/test-old/resources/tiapp3.xml b/test-old/resources/tiapp3.xml new file mode 100644 index 00000000..1cbc7c0b --- /dev/null +++ b/test-old/resources/tiapp3.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + activity2.js + activity3.js + + 10 + true + armeabi,armeabi-v7a,x86 + + + + testservice3.js + + + diff --git a/test-old/resources/tiapp4.xml b/test-old/resources/tiapp4.xml new file mode 100644 index 00000000..db216f55 --- /dev/null +++ b/test-old/resources/tiapp4.xml @@ -0,0 +1,44 @@ + + + ti.testapp + testapp + 1.0 + tester + http:// + not specified + 2012 by tester + appicon.png + false + false + default + false + false + false + false + 088dc83c-64af-4a81-b57c-7407649453f0 + system + + + Ti.UI.PORTRAIT + + + Ti.UI.PORTRAIT + Ti.UI.UPSIDE_PORTRAIT + Ti.UI.LANDSCAPE_LEFT + Ti.UI.LANDSCAPE_RIGHT + + + + + + + true + true + + default + + + + com.windows.example + + diff --git a/test-old/results/tiapp2.json b/test-old/results/tiapp2.json new file mode 100644 index 00000000..18d4b14b --- /dev/null +++ b/test-old/results/tiapp2.json @@ -0,0 +1,151 @@ +{ + "deployment-targets": { "iphone": true, "ipad": true, "android": true }, + "sdk-version": "2.2.0", + "id": "ti.testapp", + "name": "testapp", + "version": "1.0", + "publisher": "tester", + "url": "http://", + "description": "not specified", + "copyright": "2012 by tester", + "icon": "appicon.png", + "persistent-wifi": false, + "prerendered-icon": false, + "statusbar-style": "default", + "statusbar-hidden": false, + "fullscreen": false, + "navbar-hidden": false, + "analytics": false, + "guid": "088dc83c-64af-4a81-b57c-7407649453f0", + "properties": { + "ti.ui.defaultunit": { "type": "string", "value": "system" }, + "ti.deploytype": { "type": "string", "value": "production" }, + "ti.android.debug": { "type": "bool", "value": true }, + "ti.android.loadfromsdcard": { "type": "bool", "value": false }, + "ti.android.compilejs": { "type": "bool", "value": false }, + "ti.android.include_all_modules": { "type": "bool", "value": false }, + "another property": { "type": "string", "value": "this \"one\" with quotes" }, + "ti.bb.invoke.target.key.push": { "type": "string", "value": "ti.testapp.invoke.push" }, + "ti.bb.invoke.target.key.open": { "type": "string", "value": "ti.testapp.invoke.open" }, + "push_title": { "type": "string", "value": "Some Title for BB Push, typically the app name\"" }, + "run-on-main-thread": { "type": "bool", "value": true } + }, + "code-processor": { "enabled": true, "plugins": ["ti-api-usage-finder"], "options": { "some-option": "xyz" } }, + "ios": { + "enable-launch-screen-storyboard": true, + "use-app-thinning": true, + "enablecoverage": true, + "enablemdfind": true, + "default-background-color": "#FFFFFF", + "min-ios-ver": 5, + "team-id": "foo", + "log-server-port": 10571, + "capabilities": { "app-groups": ["group.com.appc.foo", "group.com.appc.bar"] }, + "entitlements": { + "application-identifier": "XXXXXXXXXX.com.test.app", + "aps-environment": "production", + "beta-reports-active": true, + "get-task-allow": false, + "keychain-access-groups": ["XXXXXXXXXX.com.test.app"] + }, + "plist": { + "UISupportedInterfaceOrientations": [ + "UIInterfaceOrientationPortrait", + "UIInterfaceOrientationPortraitUpsideDown", + "UIInterfaceOrientationLandscapeLeft", + "UIInterfaceOrientationLandscapeRight" + ], + "UIBackgroundModes": [ + "audio", + "location", + "voip", + "newsstand-content", + "external-accessory", + "bluetooth-central" + ], + "UIRequiredDeviceCapabilities": [ + "telephony", + "wifi", + "sms", + "still-camera", + "auto-focus-camera", + "front-facing-camera", + "camera-flash", + "video-camera", + "accelerometer", + "gyroscope", + "location-services", + "gps", + "magnetometer", + "gamekit", + "microphone", + "opengles-1", + "opengles-2", + "armv6", + "armv7", + "peer-peer", + "bluetooth-le" + ], + "UIRequiresPersistentWiFi": true, + "UIPrerenderedIcon": true, + "UIStatusBarHidden": true, + "UIStatusBarStyle": "UIStatusBarStyleBlackTranslucent", + "UIAppFonts": ["/fonts/MyFont_1.otf", "/fonts/MyFont_2.otf"] + }, + "extensions": [ + { "projectPath": "/path/to/extention", "targets": [{ "name": "Some Target", "ppUUIDs": {} }] }, + { + "projectPath": "/path/to/extention2", + "targets": [ + { "name": "Another Target", "ppUUIDs": { "device": "abc", "dist-appstore": 123, "dist-adhoc": "" } } + ] + }, + { "projectPath": "/path/to/another/extention", "targets": [{ "name": "Test WatchKit Extension", "ppUUIDs": {} }] } + ] + }, + "iphone": { + "orientations": { + "iphone": ["Ti.UI.PORTRAIT"], + "ipad": ["Ti.UI.PORTRAIT", "Ti.UI.UPSIDE_PORTRAIT", "Ti.UI.LANDSCAPE_LEFT", "Ti.UI.LANDSCAPE_RIGHT"] + }, + "backgroundModes": ["audio", "location", "voip"], + "requiredFeatures": [ + "telephony", + "wifi", + "sms", + "still-camera", + "auto-focus-camera", + "front-facing-camera", + "camera-flash", + "video-camera", + "accelerometer", + "gyroscope", + "location-services", + "gps", + "magnetometer", + "gamekit", + "microphone", + "opengles-1", + "opengles-2", + "armv6", + "armv7", + "peer-peer" + ], + "types": [{ "name": "something", "icon": "someicon.png", "uti": ["public.item", "public.content"], "owner": true }] + }, + "android": { + "manifest": "\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t", + "tool-api-level": 10, + "abi": ["armeabi", "armeabi-v7a", "x86"], + "services": { "testservice.js": { "type": "interval", "url": "testservice.js", "classname": "TestserviceService" } } + }, + "webpack": { "type": "alloy", "transpileDependencies": ["some_module"] }, + "modules": [ + { "id": "ti.alltest", "platform": "", "version": "1.2.3" }, + { "id": "ti.cjstest", "platform": "commonjs", "version": "1.2.3" }, + { "id": "ti.mwtest", "platform": "mobileweb", "version": "4.5.6" }, + { "id": "ti.androidtest", "platform": "android", "version": "7.8" }, + { "id": "ti.iphonetest", "platform": "iphone", "version": "9.0" } + ], + "plugins": [{ "id": "ti_sample_plugin", "version": "1.0" }] +} diff --git a/test-old/results/tiapp2.pretty.json b/test-old/results/tiapp2.pretty.json new file mode 100644 index 00000000..b3d17913 --- /dev/null +++ b/test-old/results/tiapp2.pretty.json @@ -0,0 +1,290 @@ +{ + "deployment-targets": { + "iphone": true, + "ipad": true, + "android": true + }, + "sdk-version": "2.2.0", + "id": "ti.testapp", + "name": "testapp", + "version": "1.0", + "publisher": "tester", + "url": "http://", + "description": "not specified", + "copyright": "2012 by tester", + "icon": "appicon.png", + "persistent-wifi": false, + "prerendered-icon": false, + "statusbar-style": "default", + "statusbar-hidden": false, + "fullscreen": false, + "navbar-hidden": false, + "analytics": false, + "guid": "088dc83c-64af-4a81-b57c-7407649453f0", + "properties": { + "ti.ui.defaultunit": { + "type": "string", + "value": "system" + }, + "ti.deploytype": { + "type": "string", + "value": "production" + }, + "ti.android.debug": { + "type": "bool", + "value": true + }, + "ti.android.loadfromsdcard": { + "type": "bool", + "value": false + }, + "ti.android.compilejs": { + "type": "bool", + "value": false + }, + "ti.android.include_all_modules": { + "type": "bool", + "value": false + }, + "another property": { + "type": "string", + "value": "this \"one\" with quotes" + }, + "ti.bb.invoke.target.key.push": { + "type": "string", + "value": "ti.testapp.invoke.push" + }, + "ti.bb.invoke.target.key.open": { + "type": "string", + "value": "ti.testapp.invoke.open" + }, + "push_title": { + "type": "string", + "value": "Some Title for BB Push, typically the app name\"" + }, + "run-on-main-thread": { + "type": "bool", + "value": true + } + }, + "code-processor": { + "enabled": true, + "plugins": [ + "ti-api-usage-finder" + ], + "options": { + "some-option": "xyz" + } + }, + "ios": { + "enable-launch-screen-storyboard": true, + "use-app-thinning": true, + "enablecoverage": true, + "enablemdfind": true, + "default-background-color": "#FFFFFF", + "min-ios-ver": 5, + "team-id": "foo", + "log-server-port": 10571, + "capabilities": { + "app-groups": [ + "group.com.appc.foo", + "group.com.appc.bar" + ] + }, + "entitlements": { + "application-identifier": "XXXXXXXXXX.com.test.app", + "aps-environment": "production", + "beta-reports-active": true, + "get-task-allow": false, + "keychain-access-groups": [ + "XXXXXXXXXX.com.test.app" + ] + }, + "plist": { + "UISupportedInterfaceOrientations": [ + "UIInterfaceOrientationPortrait", + "UIInterfaceOrientationPortraitUpsideDown", + "UIInterfaceOrientationLandscapeLeft", + "UIInterfaceOrientationLandscapeRight" + ], + "UIBackgroundModes": [ + "audio", + "location", + "voip", + "newsstand-content", + "external-accessory", + "bluetooth-central" + ], + "UIRequiredDeviceCapabilities": [ + "telephony", + "wifi", + "sms", + "still-camera", + "auto-focus-camera", + "front-facing-camera", + "camera-flash", + "video-camera", + "accelerometer", + "gyroscope", + "location-services", + "gps", + "magnetometer", + "gamekit", + "microphone", + "opengles-1", + "opengles-2", + "armv6", + "armv7", + "peer-peer", + "bluetooth-le" + ], + "UIRequiresPersistentWiFi": true, + "UIPrerenderedIcon": true, + "UIStatusBarHidden": true, + "UIStatusBarStyle": "UIStatusBarStyleBlackTranslucent", + "UIAppFonts": [ + "/fonts/MyFont_1.otf", + "/fonts/MyFont_2.otf" + ] + }, + "extensions": [ + { + "projectPath": "/path/to/extention", + "targets": [ + { + "name": "Some Target", + "ppUUIDs": {} + } + ] + }, + { + "projectPath": "/path/to/extention2", + "targets": [ + { + "name": "Another Target", + "ppUUIDs": { + "device": "abc", + "dist-appstore": 123, + "dist-adhoc": "" + } + } + ] + }, + { + "projectPath": "/path/to/another/extention", + "targets": [ + { + "name": "Test WatchKit Extension", + "ppUUIDs": {} + } + ] + } + ] + }, + "iphone": { + "orientations": { + "iphone": [ + "Ti.UI.PORTRAIT" + ], + "ipad": [ + "Ti.UI.PORTRAIT", + "Ti.UI.UPSIDE_PORTRAIT", + "Ti.UI.LANDSCAPE_LEFT", + "Ti.UI.LANDSCAPE_RIGHT" + ] + }, + "backgroundModes": [ + "audio", + "location", + "voip" + ], + "requiredFeatures": [ + "telephony", + "wifi", + "sms", + "still-camera", + "auto-focus-camera", + "front-facing-camera", + "camera-flash", + "video-camera", + "accelerometer", + "gyroscope", + "location-services", + "gps", + "magnetometer", + "gamekit", + "microphone", + "opengles-1", + "opengles-2", + "armv6", + "armv7", + "peer-peer" + ], + "types": [ + { + "name": "something", + "icon": "someicon.png", + "uti": [ + "public.item", + "public.content" + ], + "owner": true + } + ] + }, + "android": { + "manifest": "\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t", + "tool-api-level": 10, + "abi": [ + "armeabi", + "armeabi-v7a", + "x86" + ], + "services": { + "testservice.js": { + "type": "interval", + "url": "testservice.js", + "classname": "TestserviceService" + } + } + }, + "webpack": { + "type": "alloy", + "transpileDependencies": [ + "some_module" + ] + }, + "modules": [ + { + "id": "ti.alltest", + "platform": "", + "version": "1.2.3" + }, + { + "id": "ti.cjstest", + "platform": "commonjs", + "version": "1.2.3" + }, + { + "id": "ti.mwtest", + "platform": "mobileweb", + "version": "4.5.6" + }, + { + "id": "ti.androidtest", + "platform": "android", + "version": "7.8" + }, + { + "id": "ti.iphonetest", + "platform": "iphone", + "version": "9.0" + } + ], + "plugins": [ + { + "id": "ti_sample_plugin", + "version": "1.0" + } + ] +} diff --git a/test-old/results/tiapp2.xml b/test-old/results/tiapp2.xml new file mode 100644 index 00000000..19e84c09 --- /dev/null +++ b/test-old/results/tiapp2.xml @@ -0,0 +1,280 @@ + + + + true + true + true + + 2.2.0 + ti.testapp + testapp + 1.0 + tester + http:// + not specified + 2012 by tester + appicon.png + false + false + default + false + false + false + false + 088dc83c-64af-4a81-b57c-7407649453f0 + system + production + true + false + false + false + this "one" with quotes + ti.testapp.invoke.push + ti.testapp.invoke.open + Some Title for BB Push, typically the app name" + true + + true + + ti-api-usage-finder + + + xyz + + + + true + true + true + 5.0 + #FFFFFF + foo + true + 10571 + + + group.com.appc.foo + group.com.appc.bar + + + + + application-identifier + XXXXXXXXXX.com.test.app + aps-environment + production + beta-reports-active + + get-task-allow + + keychain-access-groups + + XXXXXXXXXX.com.test.app + + + + + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIBackgroundModes + + audio + location + voip + newsstand-content + external-accessory + bluetooth-central + + UIRequiredDeviceCapabilities + + telephony + wifi + sms + still-camera + auto-focus-camera + front-facing-camera + camera-flash + video-camera + accelerometer + gyroscope + location-services + gps + magnetometer + gamekit + microphone + opengles-1 + opengles-2 + armv6 + armv7 + peer-peer + bluetooth-le + + UIRequiresPersistentWiFi + + UIPrerenderedIcon + + UIStatusBarHidden + + UIStatusBarStyle + UIStatusBarStyleBlackTranslucent + UIAppFonts + + /fonts/MyFont_1.otf + /fonts/MyFont_2.otf + + + + + + + + + + + abc + 123 + + + + + + + + + + + + Ti.UI.PORTRAIT + + + Ti.UI.PORTRAIT + Ti.UI.UPSIDE_PORTRAIT + Ti.UI.LANDSCAPE_LEFT + Ti.UI.LANDSCAPE_RIGHT + + + audio + location + voip + + + telephony + wifi + sms + still-camera + auto-focus-camera + front-facing-camera + camera-flash + video-camera + accelerometer + gyroscope + location-services + gps + magnetometer + gamekit + microphone + opengles-1 + opengles-2 + armv6 + armv7 + peer-peer + + + + something + someicon.png + public.item,public.content + true + + + + + + + + + + + + + + + + + + + + + + + 10 + armeabi,armeabi-v7a,x86 + + + + + + alloy + + some_module + + + + ti.alltest + ti.cjstest + ti.mwtest + ti.androidtest + ti.iphonetest + + + ti_sample_plugin + + diff --git a/tests/tiappxml_test.js b/test-old/tiappxml.test.js similarity index 56% rename from tests/tiappxml_test.js rename to test-old/tiappxml.test.js index 9c5eba31..ab9d79ca 100644 --- a/tests/tiappxml_test.js +++ b/test-old/tiappxml.test.js @@ -1,11 +1,13 @@ -const should = require('should'); // eslint-disable-line no-unused-vars +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { describe, expect, it } from 'vitest'; +import { tiappxml } from '../lib/tiappxml.js'; -const ti = require('../lib/titanium'), - fs = require('fs'), - path = require('path'); +const __dirname = path.dirname(fileURLToPath(import.meta.url)); -describe('tiappxml', function () { -/* +describe('tiappxml', () => { + /* (function () { var tiapp = new ti.tiappxml(); @@ -47,7 +49,7 @@ describe('tiappxml', function () { }()); (function () { - var tiapp = new ti.tiappxml(path.dirname(module.filename) + '/resources/tiapp1.xml'); + var tiapp = new ti.tiappxml(path.dirname(fileURLToPath(import.meta.url)) + '/resources/tiapp1.xml'); console.log('\nReading tiapp1.xml'); console.log('toString():') @@ -61,7 +63,7 @@ describe('tiappxml', function () { }()); (function () { - var tiapp = new ti.tiappxml(path.dirname(module.filename) + '/resources/tiapp1.xml'); + var tiapp = new ti.tiappxml(path.dirname(fileURLToPath(import.meta.url)) + '/resources/tiapp1.xml'); tiapp.id = 'com.another.app'; tiapp.name = 'Another App'; @@ -79,37 +81,51 @@ describe('tiappxml', function () { console.log('\nXML:'); console.log(tiapp.toString('xml')); }()); -*/ - - it('tiapp2.xml', function () { - var xmlPath = path.join(__dirname, 'resources', 'tiapp2.xml'), - tiapp = new ti.tiappxml(xmlPath); - - tiapp.toString().should.eql('[object Object]'); - (tiapp.toString('json') + '\n').should.eql(fs.readFileSync(path.join(__dirname, 'results', 'tiapp2.json')).toString()); - (tiapp.toString('pretty-json') + '\n').should.eql(fs.readFileSync(path.join(__dirname, 'results', 'tiapp2.pretty.json')).toString()); + */ + + it('tiapp2.xml', () => { + const xmlPath = path.join(__dirname, 'resources', 'tiapp2.xml'); + const tiapp = new tiappxml(xmlPath); + + expect(tiapp.toString()).toBe('[object Object]'); + expect(tiapp.toString('json') + '\n').toBe( + fs.readFileSync(path.join(__dirname, 'results', 'tiapp2.json')).toString() + ); + expect(tiapp.toString('pretty-json') + '\n').toBe( + fs.readFileSync(path.join(__dirname, 'results', 'tiapp2.pretty.json')).toString() + ); // have to ignore newlines, since thye can differ in OS-style - (tiapp.toString('xml').replace(/(\r\n|\n|\r)/gm, '')).should.eql(fs.readFileSync(path.join(__dirname, 'results', 'tiapp2.xml')).toString().replace(/(\r\n|\n|\r)/gm, '')); + expect(tiapp.toString('xml').replace(/(\r\n|\n|\r)/gm, '')).toBe( + fs.readFileSync(path.join(__dirname, 'results', 'tiapp2.xml')).toString().replace( + /(\r\n|\n|\r)/gm, + '' + ) + ); }); - it('tiapp4.xml', function () { - var tiapp = new ti.tiappxml(path.join(__dirname, '/resources/tiapp4.xml')); - tiapp.id.should.eql('ti.testapp'); + it('tiapp4.xml', () => { + const tiapp = new tiappxml(path.join(__dirname, '/resources/tiapp4.xml')); + expect(tiapp.id).toBe('ti.testapp'); }); - it('should throw if file does not exist', function () { - should(() => new ti.tiappxml('foo')).throw('tiapp.xml file does not exist'); + it('should throw if file does not exist', () => { + expect(() => new tiappxml('foo')).toThrow('tiapp.xml file does not exist'); }); - it('should support parsing a tiapp from a string', function () { - var contents = fs.readFileSync(path.join(__dirname, 'resources', 'tiapp2.xml'), 'utf8'); - var tiapp = new ti.tiappxml(); + it('should support parsing a tiapp from a string', () => { + const contents = fs.readFileSync( + path.join(__dirname, 'resources', 'tiapp2.xml'), + 'utf8' + ); + const tiapp = new tiappxml(); tiapp.parse(contents); - (tiapp.toString('json') + '\n').should.eql(fs.readFileSync(path.join(__dirname, 'results', 'tiapp2.json')).toString()); + expect(tiapp.toString('json') + '\n').toBe( + fs.readFileSync(path.join(__dirname, 'results', 'tiapp2.json')).toString() + ); }); -/* + /* (function () { - var tiapp = new ti.tiappxml(path.dirname(module.filename) + '/resources/tiapp3.xml'); + var tiapp = new ti.tiappxml(path.dirname(fileURLToPath(import.meta.url)) + '/resources/tiapp3.xml'); console.log('\nReading tiapp3.xml'); console.log('toString():') @@ -123,5 +139,5 @@ describe('tiappxml', function () { console.log('\Original:'); console.log(fs.readFileSync(__dirname + '/resources/tiapp3.xml').toString()); }()); -*/ + */ }); diff --git a/test/android/android-ndk.test.ts b/test/android/android-ndk.test.ts new file mode 100644 index 00000000..a0a6eaf8 --- /dev/null +++ b/test/android/android-ndk.test.ts @@ -0,0 +1,191 @@ +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { afterEach, describe, expect, it } from 'vitest'; +import { config, resetConfig } from '../../src/config.js'; +import { detect, AndroidNDK } from '../../src/android/android-ndk.js'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const cmd = process.platform === 'win32' ? '.cmd' : ''; + +describe('Android NDK', () => { + afterEach(() => resetConfig()); + + describe('load()', () => { + it('should error if directory is invalid', async () => { + await expect(AndroidNDK.load(undefined as any)) + .rejects.toThrowError(new TypeError('Expected Android NDK path to be a valid string')); + await expect(AndroidNDK.load(123 as any)) + .rejects.toThrowError(new TypeError('Expected Android NDK path to be a valid string')); + await expect(AndroidNDK.load('')) + .rejects.toThrowError(new TypeError('Expected Android NDK path to be a valid string')); + }); + + it('should error if directory does not exist', async () => { + await expect(AndroidNDK.load(join(__dirname, 'doesnotexist'))) + .rejects.toThrowError(new Error('Android NDK path does not exist: ${path}')); + }); + + it('should error if directory is missing the "build" directory', async () => { + await expect(AndroidNDK.load(join(__dirname, 'mocks', 'ndk', 'all', 'no-build-dir'))) + .rejects.toThrowError(new Error('Directory does not contain the "build" directory')); + }); + + it('should error if directory is missing the "platforms" directory', async () => { + await expect(AndroidNDK.load(join(__dirname, 'mocks', 'ndk', 'all', 'no-platforms-dir'))) + .rejects.toThrowError(new Error('Directory does not contain the "platforms" directory')); + });', ' + + it('should error if directory is missing the "ndk-build" executable', async () => { + await expect(AndroidNDK.load(join(__dirname, 'mocks', 'ndk', 'all', 'no-ndk-build'))) + .rejects.toThrowError(new Error('Directory does not contain the "ndk-build" executable')); + }); + + it('should error if directory is missing the "ndk-which" executable', async () => { + await expect(AndroidNDK.load(join(__dirname, 'mocks', 'ndk', process.platform, 'no-ndk-which'))) + .rejects.toThrowError(new Error('Directory does not contain the "ndk-which" executable')); + }); + + it('should detect an NDK with no version', async () => { + const dir = join(__dirname, 'mocks', 'ndk', process.platform, 'no-version'); + const ndk = await AndroidNDK.load(dir); + expect(ndk).toEqual({ + path: dir, + name: 'no-version', + version: null, + arch: '64-bit', + executables: { + 'ndk-build': join(dir, `ndk-build${cmd}`), + 'ndk-which': join(dir, `ndk-which${cmd}`) + }, + }); + }); + + it('should detect an NDK r9 64-bit release', async () => { + const dir = join(__dirname, 'mocks', 'ndk', process.platform, 'r9d-64bit'); + const ndk = await AndroidNDK.load(dir); + expect(ndk).toEqual({ + path: dir, + name: 'r9d', + version: '9.3', + arch: '64-bit', + executables: { + 'ndk-build': join(dir, `ndk-build${cmd}`), + 'ndk-which': join(dir, `ndk-which${cmd}`) + } + }); + }); + + it('should detect an NDK r9d 32-bit release', async () => { + const dir = join(__dirname, 'mocks', 'ndk', process.platform, 'r9d-32bit'); + const ndk = await AndroidNDK.load(dir); + expect(ndk).toEqual({ + path: dir, + name: 'r9d', + version: '9.3', + arch: '32-bit', + executables: { + 'ndk-build': join(dir, `ndk-build${cmd}`), + 'ndk-which': join(dir, `ndk-which${cmd}`) + } + }); + }); + + it('should detect an NDK r11b 64-bit release', async () => { + const dir = join(__dirname, 'mocks', 'ndk', process.platform, 'r11b-64bit'); + const ndk = await AndroidNDK.load(dir); + expect(ndk).toEqual({ + path: dir, + name: 'r11b', + version: '11.1.2683735', + arch: '64-bit', + executables: { + 'ndk-build': join(dir, `ndk-build${cmd}`), + 'ndk-which': join(dir, `ndk-which${cmd}`) + } + }); + }); + + it('should detect an NDK r11b 32-bit release', async () => { + const dir = join(__dirname, 'mocks', 'ndk', process.platform, 'r11b-32bit'); + const ndk = await AndroidNDK.load(dir); + expect(ndk).toEqual({ + path: dir, + name: 'r11b', + version: '11.1.2683735', + arch: '32-bit', + executables: { + 'ndk-build': join(dir, `ndk-build${cmd}`), + 'ndk-which': join(dir, `ndk-which${cmd}`) + } + }); + }); + + it('should detect an NDK r29', async () => { + const dir = join(__dirname, 'mocks', 'ndk', process.platform, 'r29'); + const ndk = await AndroidNDK.load(dir); + expect(ndk).toEqual({ + path: dir, + name: 'r29', + version: '29.0.14206865', + arch: '64-bit', + executables: { + 'ndk-build': join(dir, `ndk-build${cmd}`), + 'ndk-which': join(dir, `ndk-which${cmd}`) + } + }); + }); + }); + + describe('detect()', () => { + it('should find Android NDKs', async () => { + const dir = join(__dirname, 'mocks', 'ndk', process.platform, 'r29'); + config.android.ndk.searchPaths[process.platform] = []; + const { ndks } = await detect({ + bypassCache: true, + searchPaths: [ + dir, + ], + }); + expect(ndks).toHaveLength(1); + expect(ndks[0]).toEqual({ + arch: '64-bit', + executables: { + 'ndk-build': join(dir, `ndk-build${cmd}`), + 'ndk-which': join(dir, `ndk-which${cmd}`) + }, + name: 'r29', + path: dir, + version: '29.0.14206865', + }); + }); + + it('should cache Android NDKs', async () => { + const dir = join(__dirname, 'mocks', 'ndk', process.platform, 'r29'); + config.android.ndk.searchPaths[process.platform] = [dir]; + const results1 = await detect({ bypassCache: true }); + const results2 = await detect(); + expect(results1).toBe(results2); + }); + + it('should return issues if no Android NDKs are found', async () => { + config.android.ndk.searchPaths[process.platform] = ['does_not_exist']; + const { ndks, issues } = await detect({ bypassCache: true }); + expect(ndks).toEqual([]); + expect(issues.length).toBe(1); + expect(issues[0].id).toBe('ANDROID_NDK_NOT_FOUND'); + expect(issues[0].type).toBe('warning'); + }); + + it('should return issues if no valid Android NDKs are found', async () => { + delete process.env.JAVA_HOME; + config.android.ndk.searchPaths[process.platform] = [ + join(__dirname, 'mocks', 'ndk', process.platform, 'no-ndk-build'), + ]; + const { ndks, issues } = await detect({ bypassCache: true }); + expect(ndks).toEqual([]); + expect(issues.length).toBe(1); + expect(issues[0].id).toBe('ANDROID_NDK_NOT_FOUND'); + expect(issues[0].type).toBe('warning'); + }); + }); +}); diff --git a/test/android/android-sdk.test.ts b/test/android/android-sdk.test.ts new file mode 100644 index 00000000..05d4d093 --- /dev/null +++ b/test/android/android-sdk.test.ts @@ -0,0 +1,156 @@ +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { afterEach, describe, expect, it } from 'vitest'; +import { config, resetConfig } from '../../src/config.js'; +import { detect, AndroidSDK } from '../../src/android/android-sdk.js'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const exe = process.platform === 'win32' ? '.exe' : ''; +const testPlatform = process.platform === 'win32' ? 'win32' : 'posix'; + +describe('Android SDK', () => { + afterEach(() => resetConfig()); + + describe('load()', () => { + it('should error if directory is invalid', async () => { + await expect(AndroidSDK.load(undefined as any)) + .rejects.toThrowError(new TypeError('Expected Android SDK path to be a valid string')); + await expect(AndroidSDK.load(123 as any)) + .rejects.toThrowError(new TypeError('Expected Android SDK path to be a valid string')); + await expect(AndroidSDK.load('')) + .rejects.toThrowError(new TypeError('Expected Android SDK path to be a valid string')); + }); + + it('should error if directory does not exist', async () => { + await expect(AndroidSDK.load(join(__dirname, 'doesnotexist'))) + .rejects.toThrowError(new Error(`Android SDK path does not exist: ${join(__dirname, 'doesnotexist')}`)); + }); + + it('should error if missing adb executable', async () => { + await expect(AndroidSDK.load(join(__dirname, 'mocks', 'sdk', testPlatform, 'missing-adb'))) + .rejects.toThrowError(new Error('Invalid Android SDK: missing required executable "adb"')); + }); + + it('should error if missing emulator executable', async () => { + await expect(AndroidSDK.load(join(__dirname, 'mocks', 'sdk', testPlatform, 'missing-emulator'))) + .rejects.toThrowError(new Error('Invalid Android SDK: missing required executable "emulator"')); + }); + + it('should detect minimal sdk', async () => { + const path = join(__dirname, 'mocks', 'sdk', testPlatform, 'minimal'); + const sdk = await AndroidSDK.load(path); + expect(sdk.addons).to.have.length(0); + expect(sdk.executables).to.deep.equal({ + adb: join(path, 'platform-tools', `adb${exe}`), + emulator: join(path, 'emulator', `emulator${exe}`), + }); + expect(sdk.path).to.equal(path); + expect(sdk.platforms).to.deep.equal([]); + expect(sdk.systemImages).to.deep.equal({}); + + expect(sdk.issues).to.have.length(1); + expect(sdk.issues[0].id).to.equal('ANDROID_SDK_NO_PLATFORMS'); + }); + + it('should detect sdk with platforms and system images', async () => { + const path = join(__dirname, 'mocks', 'sdk', testPlatform, 'with-platforms-and-system-images'); + const sdk = await AndroidSDK.load(path); + expect(sdk.addons).to.have.length(0); + expect(sdk.executables).to.deep.equal({ + adb: join(path, 'platform-tools', `adb${exe}`), + emulator: join(path, 'emulator', `emulator${exe}`), + }); + expect(sdk.path).to.equal(path); + expect(sdk.platforms).to.deep.equal([ + { + abis: {}, + androidJar: null, + apiLevel: 36, + codename: null, + defaultSkin: 'WVGA800', + minToolsRev: 22, + name: 'Android 16', + path: join(path, 'platforms', 'android-36'), + revision: 1, + sdk: 'android-36', + skins: ['WVGA800'], + version: '16' + } + ]); + expect(sdk.systemImages).to.deep.equal({ + 'android-36.1/example/x86_64': { + abi: 'x86_64', + sdk: 'android-36.1', + skins: [], + type: 'example' + } + }); + + expect(sdk.issues).to.have.length(0); + }); + }); + + describe('detect()', () => { + it('should find Android SDKs', async () => { + const path = join(__dirname, 'mocks', 'sdk', testPlatform, 'with-platforms-and-system-images'); + config.android.sdk.searchPaths[testPlatform] = []; + const { sdks } = await detect({ + bypassCache: true, + searchPaths: [path], + }); + expect(sdks).toHaveLength(1); + expect(sdks).toEqual([ + { + addons: [], + executables: { + adb: join(path, 'platform-tools', `adb${exe}`), + emulator: join(path, 'emulator', `emulator${exe}`), + }, + issues: [], + path, + platforms: [ + { + abis: {}, + androidJar: null, + apiLevel: 36, + codename: null, + defaultSkin: 'WVGA800', + minToolsRev: 22, + name: 'Android 16', + path: join(path, 'platforms', 'android-36'), + revision: 1, + sdk: 'android-36', + skins: ['WVGA800'], + version: '16' + } + ], + systemImages: { + 'android-36.1/example/x86_64': { + abi: 'x86_64', + sdk: 'android-36.1', + skins: [], + type: 'example' + } + } + } + ]); + }); + + it('should cache Android SDKs', async () => { + const dir = join(__dirname, 'mocks', 'sdk', testPlatform, 'r29'); + config.android.sdk.searchPaths[testPlatform] = [dir]; + const results1 = await detect({ bypassCache: true }); + const results2 = await detect(); + expect(results1).toBe(results2); + }); + + it('should return issues if no Android SDKs are found', async () => { + config.android.sdk.searchPaths[testPlatform] = ['does_not_exist']; + const { sdks, issues } = await detect({ bypassCache: true }); + expect(sdks).toEqual([]); + expect(issues.length).toBe(1); + expect(issues[0].id).toBe('ANDROID_SDK_NOT_FOUND'); + expect(issues[0].type).toBe('warning'); + }); + }); +}); diff --git a/test/android/mocks/adb-server.js b/test/android/mocks/adb-server.js new file mode 100644 index 00000000..013d271d --- /dev/null +++ b/test/android/mocks/adb-server.js @@ -0,0 +1,86 @@ +import appcdLogger from 'appcd-logger'; + +const net = require('net'); +const { log } = appcdLogger('test:androidlib:adb-server'); + +class MockAdbServer { + constructor(port = 9999) { + this.server = null; + this.port = port; + } + + async start() { + let toClose = true; + + this.server = net.createServer(socket => { + socket.setNoDelay(true); + + log(`CONNECTED: ${socket.remoteAddress}:${socket.remotePort}`); + let timer; + + socket.on('data', data => { + log(`DATA ${socket.remoteAddress}: ${data}`); + + if (data.indexOf('host:fake') !== -1) { + socket.write('FAIL0014unknown host service'); + + } else if (data.indexOf('host:version') !== -1) { + socket.write('OKAY00040030'); + + } else if (data.indexOf('host:nodevices') !== -1) { + socket.write('OKAY00000'); + + } else if (data.indexOf('host:twodevices') !== -1) { + socket.write('OKAY002aemulator-5556\tdevice\nemulator-5554\tdevice\n'); + + } else if (data.indexOf('shell:ps') !== -1) { + toClose = false; + socket.write('OKAY'); + clearTimeout(timer); + timer = setTimeout(() => { + try { + socket.write('USER PID PPID VSIZE RSS WCHAN PC NAME\n'); + socket.write('root 1 0 8784 608 c00be88c 00026cbc S /init BYTES\n'); + socket.write('u0_a27 977 67 462792 24452 ffffffff b6e2cc9c S com.android.exchange'); + socket.end(); + } catch (e) { + // squelch + } + }, 10); + } else if (data.indexOf('host:transport:emulator-5554') !== -1) { + toClose = false; + clearTimeout(timer); + timer = setTimeout(() => { + socket.write('OKAY'); + }, 500); + } + + if (toClose) { + socket.end(); + } + }); + + socket.on('close', data => { + log(`CLOSED: ${socket.remoteAddress}:${socket.remotePort}`); + clearTimeout(timer); + }); + }); + + await new Promise(resolve => { + this.server.listen(this.port, '127.0.0.1', () => { + log(`Server listening on 127.0.0.1:${this.port}`); + resolve(); + }); + }); + } + + async stop() { + if (this.server) { + return await new Promise(resolve => { + this.server.close(resolve); + }); + } + } +} + +module.exports = MockAdbServer; diff --git a/test/android/mocks/avd/test.avd/config.ini b/test/android/mocks/avd/test.avd/config.ini new file mode 100644 index 00000000..a360059b --- /dev/null +++ b/test/android/mocks/avd/test.avd/config.ini @@ -0,0 +1,41 @@ +AvdId=test_API_23 +abi.type=x86 +avd.ini.displayname=Test API 23 +avd.ini.encoding=UTF-8 +disk.dataPartition.size=800M +hw.accelerometer=yes +hw.audioInput=yes +hw.battery=yes +hw.camera.back=emulated +hw.camera.front=emulated +hw.cpu.arch=x86 +hw.cpu.ncore=4 +hw.dPad=no +hw.device.hash2=MD5:bc5032b2a871da511332401af3ac6bb0 +hw.device.manufacturer=Google +hw.device.name=Nexus 5X +hw.gps=yes +hw.gpu.enabled=yes +hw.gpu.mode=auto +hw.initialOrientation=Portrait +hw.keyboard=yes +hw.lcd.density=420 +hw.lcd.height=1920 +hw.lcd.width=1080 +hw.mainKeys=no +hw.ramSize=1536 +hw.sdCard=yes +hw.sensors.orientation=yes +hw.sensors.proximity=yes +hw.trackBall=no +image.sysdir.1=system-images/android-23/google_apis/x86/ +runtime.network.latency=none +runtime.network.speed=full +sdcard.path=/path/to/sdcard.img +showDeviceFrame=yes +skin.dynamic=yes +skin.name=nexus_5x +skin.path=/path/to/skins/nexus_5x +tag.display=Google APIs +tag.id=google_apis +vm.heapSize=256 diff --git a/test/android/mocks/avd/test.ini b/test/android/mocks/avd/test.ini new file mode 100644 index 00000000..db4690a1 --- /dev/null +++ b/test/android/mocks/avd/test.ini @@ -0,0 +1,3 @@ +avd.ini.encoding=UTF-8 +path.rel=avd/test.avd +target=android-23 diff --git a/test/android/mocks/avd2/config.ini b/test/android/mocks/avd2/config.ini new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/empty/.gitignore b/test/android/mocks/empty/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/all/no-build-dir/.gitignore b/test/android/mocks/ndk/all/no-build-dir/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/all/no-ndk-build/build/.gitignore b/test/android/mocks/ndk/all/no-ndk-build/build/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/all/no-ndk-build/platforms/.gitignore b/test/android/mocks/ndk/all/no-ndk-build/platforms/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/all/no-platforms-dir/build/.gitignore b/test/android/mocks/ndk/all/no-platforms-dir/build/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/darwin/no-ndk-which/build/.gitignore b/test/android/mocks/ndk/darwin/no-ndk-which/build/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/darwin/no-ndk-which/ndk-build b/test/android/mocks/ndk/darwin/no-ndk-which/ndk-build new file mode 100755 index 00000000..b821d6d4 --- /dev/null +++ b/test/android/mocks/ndk/darwin/no-ndk-which/ndk-build @@ -0,0 +1,2 @@ +#!/bin/sh +echo "mock ndk-build" diff --git a/test/android/mocks/ndk/darwin/no-ndk-which/platforms/.gitignore b/test/android/mocks/ndk/darwin/no-ndk-which/platforms/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/darwin/no-version/RELEASE.TXT b/test/android/mocks/ndk/darwin/no-version/RELEASE.TXT new file mode 100644 index 00000000..facd29e7 --- /dev/null +++ b/test/android/mocks/ndk/darwin/no-version/RELEASE.TXT @@ -0,0 +1 @@ +wtf diff --git a/test/android/mocks/ndk/darwin/no-version/build/.gitignore b/test/android/mocks/ndk/darwin/no-version/build/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/darwin/no-version/ndk-build b/test/android/mocks/ndk/darwin/no-version/ndk-build new file mode 100644 index 00000000..b821d6d4 --- /dev/null +++ b/test/android/mocks/ndk/darwin/no-version/ndk-build @@ -0,0 +1,2 @@ +#!/bin/sh +echo "mock ndk-build" diff --git a/test/android/mocks/ndk/darwin/no-version/ndk-which b/test/android/mocks/ndk/darwin/no-version/ndk-which new file mode 100644 index 00000000..24c5bc0d --- /dev/null +++ b/test/android/mocks/ndk/darwin/no-version/ndk-which @@ -0,0 +1,4 @@ +#!/bin/sh +echo "mock ndk-which" + +# dummy-x86_64/ diff --git a/test/android/mocks/ndk/darwin/no-version/platforms/.gitignore b/test/android/mocks/ndk/darwin/no-version/platforms/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/darwin/r11b-32bit/build/.gitignore b/test/android/mocks/ndk/darwin/r11b-32bit/build/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/darwin/r11b-32bit/ndk-build b/test/android/mocks/ndk/darwin/r11b-32bit/ndk-build new file mode 100644 index 00000000..b821d6d4 --- /dev/null +++ b/test/android/mocks/ndk/darwin/r11b-32bit/ndk-build @@ -0,0 +1,2 @@ +#!/bin/sh +echo "mock ndk-build" diff --git a/test/android/mocks/ndk/darwin/r11b-32bit/ndk-which b/test/android/mocks/ndk/darwin/r11b-32bit/ndk-which new file mode 100644 index 00000000..d2a267f0 --- /dev/null +++ b/test/android/mocks/ndk/darwin/r11b-32bit/ndk-which @@ -0,0 +1,2 @@ +#!/bin/sh +echo "mock ndk-which" diff --git a/test/android/mocks/ndk/darwin/r11b-32bit/platforms/.gitignore b/test/android/mocks/ndk/darwin/r11b-32bit/platforms/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/darwin/r11b-32bit/source.properties b/test/android/mocks/ndk/darwin/r11b-32bit/source.properties new file mode 100644 index 00000000..97322096 --- /dev/null +++ b/test/android/mocks/ndk/darwin/r11b-32bit/source.properties @@ -0,0 +1,2 @@ +Pkg.Desc = Android NDK +Pkg.Revision = 11.1.2683735 diff --git a/test/android/mocks/ndk/darwin/r11b-64bit/build/.gitignore b/test/android/mocks/ndk/darwin/r11b-64bit/build/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/darwin/r11b-64bit/ndk-build b/test/android/mocks/ndk/darwin/r11b-64bit/ndk-build new file mode 100644 index 00000000..b821d6d4 --- /dev/null +++ b/test/android/mocks/ndk/darwin/r11b-64bit/ndk-build @@ -0,0 +1,2 @@ +#!/bin/sh +echo "mock ndk-build" diff --git a/test/android/mocks/ndk/darwin/r11b-64bit/ndk-which b/test/android/mocks/ndk/darwin/r11b-64bit/ndk-which new file mode 100644 index 00000000..24c5bc0d --- /dev/null +++ b/test/android/mocks/ndk/darwin/r11b-64bit/ndk-which @@ -0,0 +1,4 @@ +#!/bin/sh +echo "mock ndk-which" + +# dummy-x86_64/ diff --git a/test/android/mocks/ndk/darwin/r11b-64bit/platforms/.gitignore b/test/android/mocks/ndk/darwin/r11b-64bit/platforms/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/darwin/r11b-64bit/source.properties b/test/android/mocks/ndk/darwin/r11b-64bit/source.properties new file mode 100644 index 00000000..97322096 --- /dev/null +++ b/test/android/mocks/ndk/darwin/r11b-64bit/source.properties @@ -0,0 +1,2 @@ +Pkg.Desc = Android NDK +Pkg.Revision = 11.1.2683735 diff --git a/test/android/mocks/ndk/darwin/r29/build/.gitignore b/test/android/mocks/ndk/darwin/r29/build/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/darwin/r29/ndk-build b/test/android/mocks/ndk/darwin/r29/ndk-build new file mode 100644 index 00000000..b821d6d4 --- /dev/null +++ b/test/android/mocks/ndk/darwin/r29/ndk-build @@ -0,0 +1,2 @@ +#!/bin/sh +echo "mock ndk-build" diff --git a/test/android/mocks/ndk/darwin/r29/ndk-which b/test/android/mocks/ndk/darwin/r29/ndk-which new file mode 100644 index 00000000..24c5bc0d --- /dev/null +++ b/test/android/mocks/ndk/darwin/r29/ndk-which @@ -0,0 +1,4 @@ +#!/bin/sh +echo "mock ndk-which" + +# dummy-x86_64/ diff --git a/test/android/mocks/ndk/darwin/r29/platforms/.gitignore b/test/android/mocks/ndk/darwin/r29/platforms/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/darwin/r29/source.properties b/test/android/mocks/ndk/darwin/r29/source.properties new file mode 100644 index 00000000..5eb143b8 --- /dev/null +++ b/test/android/mocks/ndk/darwin/r29/source.properties @@ -0,0 +1,4 @@ +Pkg.Desc = Android NDK +Pkg.Revision = 29.0.14206865 +Pkg.BaseRevision = 29.0.14206865 +Pkg.ReleaseName = r29 diff --git a/test/android/mocks/ndk/darwin/r9d-32bit/RELEASE.TXT b/test/android/mocks/ndk/darwin/r9d-32bit/RELEASE.TXT new file mode 100644 index 00000000..1c18d2bc --- /dev/null +++ b/test/android/mocks/ndk/darwin/r9d-32bit/RELEASE.TXT @@ -0,0 +1 @@ +r9d (32-bit) diff --git a/test/android/mocks/ndk/darwin/r9d-32bit/build/.gitignore b/test/android/mocks/ndk/darwin/r9d-32bit/build/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/darwin/r9d-32bit/ndk-build b/test/android/mocks/ndk/darwin/r9d-32bit/ndk-build new file mode 100644 index 00000000..b821d6d4 --- /dev/null +++ b/test/android/mocks/ndk/darwin/r9d-32bit/ndk-build @@ -0,0 +1,2 @@ +#!/bin/sh +echo "mock ndk-build" diff --git a/test/android/mocks/ndk/darwin/r9d-32bit/ndk-which b/test/android/mocks/ndk/darwin/r9d-32bit/ndk-which new file mode 100644 index 00000000..d2a267f0 --- /dev/null +++ b/test/android/mocks/ndk/darwin/r9d-32bit/ndk-which @@ -0,0 +1,2 @@ +#!/bin/sh +echo "mock ndk-which" diff --git a/test/android/mocks/ndk/darwin/r9d-32bit/platforms/.gitignore b/test/android/mocks/ndk/darwin/r9d-32bit/platforms/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/darwin/r9d-64bit/RELEASE.TXT b/test/android/mocks/ndk/darwin/r9d-64bit/RELEASE.TXT new file mode 100644 index 00000000..4472de7e --- /dev/null +++ b/test/android/mocks/ndk/darwin/r9d-64bit/RELEASE.TXT @@ -0,0 +1 @@ +r9d (64-bit) diff --git a/test/android/mocks/ndk/darwin/r9d-64bit/build/.gitignore b/test/android/mocks/ndk/darwin/r9d-64bit/build/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/darwin/r9d-64bit/ndk-build b/test/android/mocks/ndk/darwin/r9d-64bit/ndk-build new file mode 100755 index 00000000..b821d6d4 --- /dev/null +++ b/test/android/mocks/ndk/darwin/r9d-64bit/ndk-build @@ -0,0 +1,2 @@ +#!/bin/sh +echo "mock ndk-build" diff --git a/test/android/mocks/ndk/darwin/r9d-64bit/ndk-which b/test/android/mocks/ndk/darwin/r9d-64bit/ndk-which new file mode 100644 index 00000000..24c5bc0d --- /dev/null +++ b/test/android/mocks/ndk/darwin/r9d-64bit/ndk-which @@ -0,0 +1,4 @@ +#!/bin/sh +echo "mock ndk-which" + +# dummy-x86_64/ diff --git a/test/android/mocks/ndk/darwin/r9d-64bit/platforms/.gitignore b/test/android/mocks/ndk/darwin/r9d-64bit/platforms/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/linux/no-ndk-build/build/.gitignore b/test/android/mocks/ndk/linux/no-ndk-build/build/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/linux/no-ndk-build/platforms/.gitignore b/test/android/mocks/ndk/linux/no-ndk-build/platforms/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/linux/no-ndk-which/build/.gitignore b/test/android/mocks/ndk/linux/no-ndk-which/build/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/linux/no-ndk-which/ndk-build b/test/android/mocks/ndk/linux/no-ndk-which/ndk-build new file mode 100644 index 00000000..b821d6d4 --- /dev/null +++ b/test/android/mocks/ndk/linux/no-ndk-which/ndk-build @@ -0,0 +1,2 @@ +#!/bin/sh +echo "mock ndk-build" diff --git a/test/android/mocks/ndk/linux/no-ndk-which/platforms/.gitignore b/test/android/mocks/ndk/linux/no-ndk-which/platforms/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/linux/no-version/RELEASE.TXT b/test/android/mocks/ndk/linux/no-version/RELEASE.TXT new file mode 100644 index 00000000..facd29e7 --- /dev/null +++ b/test/android/mocks/ndk/linux/no-version/RELEASE.TXT @@ -0,0 +1 @@ +wtf diff --git a/test/android/mocks/ndk/linux/no-version/build/.gitignore b/test/android/mocks/ndk/linux/no-version/build/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/linux/no-version/ndk-build b/test/android/mocks/ndk/linux/no-version/ndk-build new file mode 100644 index 00000000..b821d6d4 --- /dev/null +++ b/test/android/mocks/ndk/linux/no-version/ndk-build @@ -0,0 +1,2 @@ +#!/bin/sh +echo "mock ndk-build" diff --git a/test/android/mocks/ndk/linux/no-version/ndk-which b/test/android/mocks/ndk/linux/no-version/ndk-which new file mode 100644 index 00000000..24c5bc0d --- /dev/null +++ b/test/android/mocks/ndk/linux/no-version/ndk-which @@ -0,0 +1,4 @@ +#!/bin/sh +echo "mock ndk-which" + +# dummy-x86_64/ diff --git a/test/android/mocks/ndk/linux/no-version/platforms/.gitignore b/test/android/mocks/ndk/linux/no-version/platforms/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/linux/platforms/.gitignore b/test/android/mocks/ndk/linux/platforms/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/linux/r11b-32bit/build/.gitignore b/test/android/mocks/ndk/linux/r11b-32bit/build/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/linux/r11b-32bit/ndk-build b/test/android/mocks/ndk/linux/r11b-32bit/ndk-build new file mode 100644 index 00000000..b821d6d4 --- /dev/null +++ b/test/android/mocks/ndk/linux/r11b-32bit/ndk-build @@ -0,0 +1,2 @@ +#!/bin/sh +echo "mock ndk-build" diff --git a/test/android/mocks/ndk/linux/r11b-32bit/ndk-which b/test/android/mocks/ndk/linux/r11b-32bit/ndk-which new file mode 100644 index 00000000..d2a267f0 --- /dev/null +++ b/test/android/mocks/ndk/linux/r11b-32bit/ndk-which @@ -0,0 +1,2 @@ +#!/bin/sh +echo "mock ndk-which" diff --git a/test/android/mocks/ndk/linux/r11b-32bit/platforms/.gitignore b/test/android/mocks/ndk/linux/r11b-32bit/platforms/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/linux/r11b-32bit/source.properties b/test/android/mocks/ndk/linux/r11b-32bit/source.properties new file mode 100644 index 00000000..97322096 --- /dev/null +++ b/test/android/mocks/ndk/linux/r11b-32bit/source.properties @@ -0,0 +1,2 @@ +Pkg.Desc = Android NDK +Pkg.Revision = 11.1.2683735 diff --git a/test/android/mocks/ndk/linux/r11b-64bit/build/.gitignore b/test/android/mocks/ndk/linux/r11b-64bit/build/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/linux/r11b-64bit/ndk-build b/test/android/mocks/ndk/linux/r11b-64bit/ndk-build new file mode 100644 index 00000000..b821d6d4 --- /dev/null +++ b/test/android/mocks/ndk/linux/r11b-64bit/ndk-build @@ -0,0 +1,2 @@ +#!/bin/sh +echo "mock ndk-build" diff --git a/test/android/mocks/ndk/linux/r11b-64bit/ndk-which b/test/android/mocks/ndk/linux/r11b-64bit/ndk-which new file mode 100644 index 00000000..24c5bc0d --- /dev/null +++ b/test/android/mocks/ndk/linux/r11b-64bit/ndk-which @@ -0,0 +1,4 @@ +#!/bin/sh +echo "mock ndk-which" + +# dummy-x86_64/ diff --git a/test/android/mocks/ndk/linux/r11b-64bit/platforms/.gitignore b/test/android/mocks/ndk/linux/r11b-64bit/platforms/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/linux/r11b-64bit/source.properties b/test/android/mocks/ndk/linux/r11b-64bit/source.properties new file mode 100644 index 00000000..97322096 --- /dev/null +++ b/test/android/mocks/ndk/linux/r11b-64bit/source.properties @@ -0,0 +1,2 @@ +Pkg.Desc = Android NDK +Pkg.Revision = 11.1.2683735 diff --git a/test/android/mocks/ndk/linux/r29/build/.gitignore b/test/android/mocks/ndk/linux/r29/build/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/linux/r29/ndk-build b/test/android/mocks/ndk/linux/r29/ndk-build new file mode 100644 index 00000000..b821d6d4 --- /dev/null +++ b/test/android/mocks/ndk/linux/r29/ndk-build @@ -0,0 +1,2 @@ +#!/bin/sh +echo "mock ndk-build" diff --git a/test/android/mocks/ndk/linux/r29/ndk-which b/test/android/mocks/ndk/linux/r29/ndk-which new file mode 100644 index 00000000..24c5bc0d --- /dev/null +++ b/test/android/mocks/ndk/linux/r29/ndk-which @@ -0,0 +1,4 @@ +#!/bin/sh +echo "mock ndk-which" + +# dummy-x86_64/ diff --git a/test/android/mocks/ndk/linux/r29/platforms/.gitignore b/test/android/mocks/ndk/linux/r29/platforms/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/linux/r29/source.properties b/test/android/mocks/ndk/linux/r29/source.properties new file mode 100644 index 00000000..5eb143b8 --- /dev/null +++ b/test/android/mocks/ndk/linux/r29/source.properties @@ -0,0 +1,4 @@ +Pkg.Desc = Android NDK +Pkg.Revision = 29.0.14206865 +Pkg.BaseRevision = 29.0.14206865 +Pkg.ReleaseName = r29 diff --git a/test/android/mocks/ndk/linux/r9d-32bit/RELEASE.TXT b/test/android/mocks/ndk/linux/r9d-32bit/RELEASE.TXT new file mode 100644 index 00000000..1c18d2bc --- /dev/null +++ b/test/android/mocks/ndk/linux/r9d-32bit/RELEASE.TXT @@ -0,0 +1 @@ +r9d (32-bit) diff --git a/test/android/mocks/ndk/linux/r9d-32bit/build/.gitignore b/test/android/mocks/ndk/linux/r9d-32bit/build/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/linux/r9d-32bit/ndk-build b/test/android/mocks/ndk/linux/r9d-32bit/ndk-build new file mode 100644 index 00000000..b821d6d4 --- /dev/null +++ b/test/android/mocks/ndk/linux/r9d-32bit/ndk-build @@ -0,0 +1,2 @@ +#!/bin/sh +echo "mock ndk-build" diff --git a/test/android/mocks/ndk/linux/r9d-32bit/ndk-which b/test/android/mocks/ndk/linux/r9d-32bit/ndk-which new file mode 100644 index 00000000..d2a267f0 --- /dev/null +++ b/test/android/mocks/ndk/linux/r9d-32bit/ndk-which @@ -0,0 +1,2 @@ +#!/bin/sh +echo "mock ndk-which" diff --git a/test/android/mocks/ndk/linux/r9d-32bit/platforms/.gitignore b/test/android/mocks/ndk/linux/r9d-32bit/platforms/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/linux/r9d-64bit/RELEASE.TXT b/test/android/mocks/ndk/linux/r9d-64bit/RELEASE.TXT new file mode 100644 index 00000000..4472de7e --- /dev/null +++ b/test/android/mocks/ndk/linux/r9d-64bit/RELEASE.TXT @@ -0,0 +1 @@ +r9d (64-bit) diff --git a/test/android/mocks/ndk/linux/r9d-64bit/build/.gitignore b/test/android/mocks/ndk/linux/r9d-64bit/build/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/linux/r9d-64bit/ndk-build b/test/android/mocks/ndk/linux/r9d-64bit/ndk-build new file mode 100644 index 00000000..b821d6d4 --- /dev/null +++ b/test/android/mocks/ndk/linux/r9d-64bit/ndk-build @@ -0,0 +1,2 @@ +#!/bin/sh +echo "mock ndk-build" diff --git a/test/android/mocks/ndk/linux/r9d-64bit/ndk-which b/test/android/mocks/ndk/linux/r9d-64bit/ndk-which new file mode 100644 index 00000000..24c5bc0d --- /dev/null +++ b/test/android/mocks/ndk/linux/r9d-64bit/ndk-which @@ -0,0 +1,4 @@ +#!/bin/sh +echo "mock ndk-which" + +# dummy-x86_64/ diff --git a/test/android/mocks/ndk/linux/r9d-64bit/platforms/.gitignore b/test/android/mocks/ndk/linux/r9d-64bit/platforms/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/win32/no-ndk-which/build/.gitignore b/test/android/mocks/ndk/win32/no-ndk-which/build/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/win32/no-ndk-which/ndk-build.cmd b/test/android/mocks/ndk/win32/no-ndk-which/ndk-build.cmd new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/win32/no-ndk-which/platforms/.gitignore b/test/android/mocks/ndk/win32/no-ndk-which/platforms/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/win32/no-version/RELEASE.TXT b/test/android/mocks/ndk/win32/no-version/RELEASE.TXT new file mode 100644 index 00000000..facd29e7 --- /dev/null +++ b/test/android/mocks/ndk/win32/no-version/RELEASE.TXT @@ -0,0 +1 @@ +wtf diff --git a/test/android/mocks/ndk/win32/no-version/build/.gitignore b/test/android/mocks/ndk/win32/no-version/build/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/win32/no-version/ndk-build.cmd b/test/android/mocks/ndk/win32/no-version/ndk-build.cmd new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/win32/no-version/ndk-which.cmd b/test/android/mocks/ndk/win32/no-version/ndk-which.cmd new file mode 100644 index 00000000..ed7509a5 --- /dev/null +++ b/test/android/mocks/ndk/win32/no-version/ndk-which.cmd @@ -0,0 +1 @@ +dummy-x86_64/ diff --git a/test/android/mocks/ndk/win32/no-version/platforms/.gitignore b/test/android/mocks/ndk/win32/no-version/platforms/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/win32/r11b-32bit/build/.gitignore b/test/android/mocks/ndk/win32/r11b-32bit/build/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/win32/r11b-32bit/ndk-build.cmd b/test/android/mocks/ndk/win32/r11b-32bit/ndk-build.cmd new file mode 100755 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/win32/r11b-32bit/ndk-which.cmd b/test/android/mocks/ndk/win32/r11b-32bit/ndk-which.cmd new file mode 100644 index 00000000..3f1b426b --- /dev/null +++ b/test/android/mocks/ndk/win32/r11b-32bit/ndk-which.cmd @@ -0,0 +1 @@ +dummy/ diff --git a/test/android/mocks/ndk/win32/r11b-32bit/platforms/.gitignore b/test/android/mocks/ndk/win32/r11b-32bit/platforms/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/win32/r11b-32bit/source.properties b/test/android/mocks/ndk/win32/r11b-32bit/source.properties new file mode 100755 index 00000000..97322096 --- /dev/null +++ b/test/android/mocks/ndk/win32/r11b-32bit/source.properties @@ -0,0 +1,2 @@ +Pkg.Desc = Android NDK +Pkg.Revision = 11.1.2683735 diff --git a/test/android/mocks/ndk/win32/r11b-64bit/build/.gitignore b/test/android/mocks/ndk/win32/r11b-64bit/build/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/win32/r11b-64bit/ndk-build.cmd b/test/android/mocks/ndk/win32/r11b-64bit/ndk-build.cmd new file mode 100755 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/win32/r11b-64bit/ndk-which.cmd b/test/android/mocks/ndk/win32/r11b-64bit/ndk-which.cmd new file mode 100644 index 00000000..ed7509a5 --- /dev/null +++ b/test/android/mocks/ndk/win32/r11b-64bit/ndk-which.cmd @@ -0,0 +1 @@ +dummy-x86_64/ diff --git a/test/android/mocks/ndk/win32/r11b-64bit/platforms/.gitignore b/test/android/mocks/ndk/win32/r11b-64bit/platforms/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/win32/r11b-64bit/source.properties b/test/android/mocks/ndk/win32/r11b-64bit/source.properties new file mode 100755 index 00000000..97322096 --- /dev/null +++ b/test/android/mocks/ndk/win32/r11b-64bit/source.properties @@ -0,0 +1,2 @@ +Pkg.Desc = Android NDK +Pkg.Revision = 11.1.2683735 diff --git a/test/android/mocks/ndk/win32/r29/build/.gitignore b/test/android/mocks/ndk/win32/r29/build/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/win32/r29/ndk-build.cmd b/test/android/mocks/ndk/win32/r29/ndk-build.cmd new file mode 100755 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/win32/r29/ndk-which.cmd b/test/android/mocks/ndk/win32/r29/ndk-which.cmd new file mode 100644 index 00000000..ed7509a5 --- /dev/null +++ b/test/android/mocks/ndk/win32/r29/ndk-which.cmd @@ -0,0 +1 @@ +dummy-x86_64/ diff --git a/test/android/mocks/ndk/win32/r29/platforms/.gitignore b/test/android/mocks/ndk/win32/r29/platforms/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/win32/r29/source.properties b/test/android/mocks/ndk/win32/r29/source.properties new file mode 100644 index 00000000..5eb143b8 --- /dev/null +++ b/test/android/mocks/ndk/win32/r29/source.properties @@ -0,0 +1,4 @@ +Pkg.Desc = Android NDK +Pkg.Revision = 29.0.14206865 +Pkg.BaseRevision = 29.0.14206865 +Pkg.ReleaseName = r29 diff --git a/test/android/mocks/ndk/win32/r9d-32bit/RELEASE.TXT b/test/android/mocks/ndk/win32/r9d-32bit/RELEASE.TXT new file mode 100755 index 00000000..1c18d2bc --- /dev/null +++ b/test/android/mocks/ndk/win32/r9d-32bit/RELEASE.TXT @@ -0,0 +1 @@ +r9d (32-bit) diff --git a/test/android/mocks/ndk/win32/r9d-32bit/build/.gitignore b/test/android/mocks/ndk/win32/r9d-32bit/build/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/win32/r9d-32bit/ndk-build.cmd b/test/android/mocks/ndk/win32/r9d-32bit/ndk-build.cmd new file mode 100755 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/win32/r9d-32bit/ndk-which.cmd b/test/android/mocks/ndk/win32/r9d-32bit/ndk-which.cmd new file mode 100644 index 00000000..3f1b426b --- /dev/null +++ b/test/android/mocks/ndk/win32/r9d-32bit/ndk-which.cmd @@ -0,0 +1 @@ +dummy/ diff --git a/test/android/mocks/ndk/win32/r9d-32bit/platforms/.gitignore b/test/android/mocks/ndk/win32/r9d-32bit/platforms/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/win32/r9d-64bit/RELEASE.TXT b/test/android/mocks/ndk/win32/r9d-64bit/RELEASE.TXT new file mode 100755 index 00000000..4472de7e --- /dev/null +++ b/test/android/mocks/ndk/win32/r9d-64bit/RELEASE.TXT @@ -0,0 +1 @@ +r9d (64-bit) diff --git a/test/android/mocks/ndk/win32/r9d-64bit/build/.gitignore b/test/android/mocks/ndk/win32/r9d-64bit/build/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/win32/r9d-64bit/ndk-build.cmd b/test/android/mocks/ndk/win32/r9d-64bit/ndk-build.cmd new file mode 100755 index 00000000..e69de29b diff --git a/test/android/mocks/ndk/win32/r9d-64bit/ndk-which.cmd b/test/android/mocks/ndk/win32/r9d-64bit/ndk-which.cmd new file mode 100644 index 00000000..ed7509a5 --- /dev/null +++ b/test/android/mocks/ndk/win32/r9d-64bit/ndk-which.cmd @@ -0,0 +1 @@ +dummy-x86_64/ diff --git a/test/android/mocks/ndk/win32/r9d-64bit/platforms/.gitignore b/test/android/mocks/ndk/win32/r9d-64bit/platforms/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/sdk/all/invalid-tools-source-props/tools/source.properties b/test/android/mocks/sdk/all/invalid-tools-source-props/tools/source.properties new file mode 100644 index 00000000..74d0a43f --- /dev/null +++ b/test/android/mocks/sdk/all/invalid-tools-source-props/tools/source.properties @@ -0,0 +1 @@ +foo=bar diff --git a/test/android/mocks/sdk/all/missing-emulator/tools/source.properties b/test/android/mocks/sdk/all/missing-emulator/tools/source.properties new file mode 100644 index 00000000..806c0c98 --- /dev/null +++ b/test/android/mocks/sdk/all/missing-emulator/tools/source.properties @@ -0,0 +1,3 @@ +Pkg.UserSrc=false +Pkg.Revision=24.4.1 +Platform.MinPlatformToolsRev=20 diff --git a/test/android/mocks/sdk/posix/minimal/emulator/emulator b/test/android/mocks/sdk/posix/minimal/emulator/emulator new file mode 100644 index 00000000..1b29b65a --- /dev/null +++ b/test/android/mocks/sdk/posix/minimal/emulator/emulator @@ -0,0 +1,2 @@ +#!/bin/sh +echo "mock emulator" diff --git a/test/android/mocks/sdk/posix/minimal/platform-tools/adb b/test/android/mocks/sdk/posix/minimal/platform-tools/adb new file mode 100644 index 00000000..4c1c4ba9 --- /dev/null +++ b/test/android/mocks/sdk/posix/minimal/platform-tools/adb @@ -0,0 +1,2 @@ +#!/bin/sh +echo 'mock adb' diff --git a/test/android/mocks/sdk/posix/missing-adb/platform-tools/.gitkeep b/test/android/mocks/sdk/posix/missing-adb/platform-tools/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/sdk/posix/missing-emulator/platform-tools/adb b/test/android/mocks/sdk/posix/missing-emulator/platform-tools/adb new file mode 100644 index 00000000..4c1c4ba9 --- /dev/null +++ b/test/android/mocks/sdk/posix/missing-emulator/platform-tools/adb @@ -0,0 +1,2 @@ +#!/bin/sh +echo 'mock adb' diff --git a/test/android/mocks/sdk/posix/with-platforms-and-system-images/emulator/emulator b/test/android/mocks/sdk/posix/with-platforms-and-system-images/emulator/emulator new file mode 100644 index 00000000..1b29b65a --- /dev/null +++ b/test/android/mocks/sdk/posix/with-platforms-and-system-images/emulator/emulator @@ -0,0 +1,2 @@ +#!/bin/sh +echo "mock emulator" diff --git a/test/android/mocks/sdk/posix/with-platforms-and-system-images/platform-tools/adb b/test/android/mocks/sdk/posix/with-platforms-and-system-images/platform-tools/adb new file mode 100644 index 00000000..4c1c4ba9 --- /dev/null +++ b/test/android/mocks/sdk/posix/with-platforms-and-system-images/platform-tools/adb @@ -0,0 +1,2 @@ +#!/bin/sh +echo 'mock adb' diff --git a/test/android/mocks/sdk/posix/with-platforms-and-system-images/platforms/android-36/build.prop b/test/android/mocks/sdk/posix/with-platforms-and-system-images/platforms/android-36/build.prop new file mode 100644 index 00000000..539d917f --- /dev/null +++ b/test/android/mocks/sdk/posix/with-platforms-and-system-images/platforms/android-36/build.prop @@ -0,0 +1,104 @@ +#################################### +# from generate-common-build-props +# These properties identify this partition image. +#################################### +ro.product.system.brand=Android +ro.product.system.device=mainline_x86 +ro.product.system.manufacturer=unknown +ro.product.system.model=sdk +ro.product.system.name=sdk +ro.system.product.cpu.abilist=x86 +ro.system.product.cpu.abilist32=x86 +ro.system.product.cpu.abilist64= +ro.system.build.date=Mon Apr 14 08:51:49 UTC 2025 +ro.system.build.date.utc=1744620709 +ro.system.build.fingerprint=Android/sdk/mainline_x86:16/BP22.250325.007/13352765:userdebug/test-keys +ro.system.build.id=BP22.250325.007 +ro.system.build.tags=test-keys +ro.system.build.type=userdebug +ro.system.build.version.incremental=13352765 +ro.system.build.version.release=16 +ro.system.build.version.release_or_codename=16 +ro.system.build.version.sdk=36 +ro.system.build.version.sdk_full=36.0 +#################################### +# from gen_build_prop.py:generate_build_info +#################################### +# begin build properties +ro.build.id=BP22.250325.007 +ro.build.display.id=sdk-userdebug 16 BP22.250325.007 13352765 test-keys +ro.build.version.incremental=13352765 +ro.build.version.sdk=36 +ro.build.version.sdk_full=36.0 +ro.build.version.preview_sdk=0 +ro.build.version.preview_sdk_fingerprint=REL +ro.build.version.codename=REL +ro.build.version.all_codenames=REL +ro.build.version.known_codenames=Base,Base11,Cupcake,Donut,Eclair,Eclair01,EclairMr1,Froyo,Gingerbread,GingerbreadMr1,Honeycomb,HoneycombMr1,HoneycombMr2,IceCreamSandwich,IceCreamSandwichMr1,JellyBean,JellyBeanMr1,JellyBeanMr2,Kitkat,KitkatWatch,Lollipop,LollipopMr1,M,N,NMr1,O,OMr1,P,Q,R,S,Sv2,Tiramisu,UpsideDownCake,VanillaIceCream,Baklava +ro.build.version.release=16 +ro.build.version.release_or_codename=16 +ro.build.version.release_or_preview_display=16 +ro.build.version.security_patch=2025-04-05 +ro.build.version.base_os= +ro.build.version.min_supported_target_sdk=28 +ro.build.date=Mon Apr 14 08:51:49 UTC 2025 +ro.build.date.utc=1744620709 +ro.build.type=userdebug +ro.build.user=android-build +ro.build.host=7580da790f81 +ro.build.tags=test-keys +ro.build.flavor=sdk-userdebug +# ro.product.cpu.abi and ro.product.cpu.abi2 are obsolete, +# use ro.product.cpu.abilist instead. +ro.product.cpu.abi=x86 +ro.product.locale=en-US +ro.wifi.channels= +# ro.build.product is obsolete; use ro.product.device +ro.build.product=mainline_x86 +# Do not try to parse description or thumbprint +ro.build.description=sdk-userdebug 16 BP22.250325.007 13352765 test-keys +# end build properties +#################################### +# from variable ADDITIONAL_SYSTEM_PROPERTIES +#################################### +ro.treble.enabled=true +ro.llndk.api_level=202504 +ro.actionable_compatible_property.enabled=true +persist.debug.dalvik.vm.core_platform_api_policy=just-warn +ro.postinstall.fstab.prefix=/system +ro.secure=1 +security.perf_harden=1 +ro.allow.mock.location=0 +dalvik.vm.lockprof.threshold=500 +ro.debuggable=1 +xmpp.auto-presence=true +ro.config.nocheckin=yes +net.bt.name=Android +ro.force.debuggable=0 +#################################### +# from variable PRODUCT_SYSTEM_PROPERTIES +#################################### +dalvik.vm.image-dex2oat-Xms=64m +dalvik.vm.image-dex2oat-Xmx=64m +dalvik.vm.dex2oat-Xms=64m +dalvik.vm.dex2oat-Xmx=512m +#################################### +# from variable PRODUCT_SYSTEM_DEFAULT_PROPERTIES +#################################### +# Auto-added by post_process_props.py +persist.sys.usb.config=adb +#################################### +# Adding footer from :applied_backported_fixes +# with path out/soong/.intermediates/build/make/backported_fixes/applied_backported_fixes/gen/applied_backported_fixes.prop +#################################### +# The following backported fixes have been applied +# https://issuetracker.google.com/issues/350037023 with alias 1 +# https://issuetracker.google.com/issues/385124056 with alias 4 +ro.build.backported_fixes.alias_bitset.long_list=18 +# end of file +ro.build.user=generic +ro.build.host=generic +ro.product.brand=generic +ro.product.manufacturer=generic +ro.product.device=generic +ro.build.product=generic diff --git a/test/android/mocks/sdk/posix/with-platforms-and-system-images/platforms/android-36/sdk.properties b/test/android/mocks/sdk/posix/with-platforms-and-system-images/platforms/android-36/sdk.properties new file mode 100644 index 00000000..4f5ca6fe --- /dev/null +++ b/test/android/mocks/sdk/posix/with-platforms-and-system-images/platforms/android-36/sdk.properties @@ -0,0 +1,5 @@ +# SDK properties +# This file is copied in the root folder of each platform component. +# If it used by various tools to figure out what the platform can do. +sdk.ant.templates.revision=1 +sdk.skin.default=WVGA800 diff --git a/test/android/mocks/sdk/posix/with-platforms-and-system-images/platforms/android-36/skins/WVGA800/hardware.ini b/test/android/mocks/sdk/posix/with-platforms-and-system-images/platforms/android-36/skins/WVGA800/hardware.ini new file mode 100644 index 00000000..fd2a6d56 --- /dev/null +++ b/test/android/mocks/sdk/posix/with-platforms-and-system-images/platforms/android-36/skins/WVGA800/hardware.ini @@ -0,0 +1,4 @@ +# skin-specific hardware values +hw.lcd.density=240 +vm.heapSize=48 +hw.ramSize=512 diff --git a/test/android/mocks/sdk/posix/with-platforms-and-system-images/platforms/android-36/source.properties b/test/android/mocks/sdk/posix/with-platforms-and-system-images/platforms/android-36/source.properties new file mode 100644 index 00000000..bbd397db --- /dev/null +++ b/test/android/mocks/sdk/posix/with-platforms-and-system-images/platforms/android-36/source.properties @@ -0,0 +1,11 @@ +Pkg.Desc=Android SDK Platform 16 +Pkg.UserSrc=false +Platform.Version=16 +Platform.CodeName= +Pkg.Revision=2 +AndroidVersion.ApiLevel=36 +AndroidVersion.ExtensionLevel=17 +AndroidVersion.IsBaseSdk=true +Layoutlib.Api=15 +Layoutlib.Revision=1 +Platform.MinToolsRev=22 diff --git a/test/android/mocks/sdk/posix/with-platforms-and-system-images/system-images/android-36.1/example/x86_64/source.properties b/test/android/mocks/sdk/posix/with-platforms-and-system-images/system-images/android-36.1/example/x86_64/source.properties new file mode 100644 index 00000000..6de71b9b --- /dev/null +++ b/test/android/mocks/sdk/posix/with-platforms-and-system-images/system-images/android-36.1/example/x86_64/source.properties @@ -0,0 +1,12 @@ +Pkg.Desc=System Image x86_64 +Pkg.Revision=3 +Pkg.Dependencies=emulator#35.4.9 +AndroidVersion.ApiLevel=36.1 +AndroidVersion.ExtensionLevel=20 +AndroidVersion.IsBaseSdk=true +SystemImage.Abi=x86_64 +SystemImage.TagId=example +SystemImage.TagDisplay=Example +SystemImage.GpuSupport=true +Addon.VendorId=tidev +Addon.VendorDisplay=TiDev Inc. diff --git a/test/android/mocks/sdk/win32/minimal/emulator/emulator.exe b/test/android/mocks/sdk/win32/minimal/emulator/emulator.exe new file mode 100644 index 00000000..24671fd0 Binary files /dev/null and b/test/android/mocks/sdk/win32/minimal/emulator/emulator.exe differ diff --git a/test/android/mocks/sdk/win32/minimal/platform-tools/adb.exe b/test/android/mocks/sdk/win32/minimal/platform-tools/adb.exe new file mode 100644 index 00000000..9169ce74 Binary files /dev/null and b/test/android/mocks/sdk/win32/minimal/platform-tools/adb.exe differ diff --git a/test/android/mocks/sdk/win32/missing-adb/platform-tools/.gitkeep b/test/android/mocks/sdk/win32/missing-adb/platform-tools/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/test/android/mocks/sdk/win32/missing-emulator/platform-tools/adb.exe b/test/android/mocks/sdk/win32/missing-emulator/platform-tools/adb.exe new file mode 100644 index 00000000..9169ce74 Binary files /dev/null and b/test/android/mocks/sdk/win32/missing-emulator/platform-tools/adb.exe differ diff --git a/test/android/mocks/sdk/win32/with-platforms-and-system-images/emulator/emulator.exe b/test/android/mocks/sdk/win32/with-platforms-and-system-images/emulator/emulator.exe new file mode 100644 index 00000000..24671fd0 Binary files /dev/null and b/test/android/mocks/sdk/win32/with-platforms-and-system-images/emulator/emulator.exe differ diff --git a/test/android/mocks/sdk/win32/with-platforms-and-system-images/platform-tools/adb.exe b/test/android/mocks/sdk/win32/with-platforms-and-system-images/platform-tools/adb.exe new file mode 100644 index 00000000..9169ce74 Binary files /dev/null and b/test/android/mocks/sdk/win32/with-platforms-and-system-images/platform-tools/adb.exe differ diff --git a/test/android/mocks/sdk/win32/with-platforms-and-system-images/platforms/android-36/build.prop b/test/android/mocks/sdk/win32/with-platforms-and-system-images/platforms/android-36/build.prop new file mode 100644 index 00000000..539d917f --- /dev/null +++ b/test/android/mocks/sdk/win32/with-platforms-and-system-images/platforms/android-36/build.prop @@ -0,0 +1,104 @@ +#################################### +# from generate-common-build-props +# These properties identify this partition image. +#################################### +ro.product.system.brand=Android +ro.product.system.device=mainline_x86 +ro.product.system.manufacturer=unknown +ro.product.system.model=sdk +ro.product.system.name=sdk +ro.system.product.cpu.abilist=x86 +ro.system.product.cpu.abilist32=x86 +ro.system.product.cpu.abilist64= +ro.system.build.date=Mon Apr 14 08:51:49 UTC 2025 +ro.system.build.date.utc=1744620709 +ro.system.build.fingerprint=Android/sdk/mainline_x86:16/BP22.250325.007/13352765:userdebug/test-keys +ro.system.build.id=BP22.250325.007 +ro.system.build.tags=test-keys +ro.system.build.type=userdebug +ro.system.build.version.incremental=13352765 +ro.system.build.version.release=16 +ro.system.build.version.release_or_codename=16 +ro.system.build.version.sdk=36 +ro.system.build.version.sdk_full=36.0 +#################################### +# from gen_build_prop.py:generate_build_info +#################################### +# begin build properties +ro.build.id=BP22.250325.007 +ro.build.display.id=sdk-userdebug 16 BP22.250325.007 13352765 test-keys +ro.build.version.incremental=13352765 +ro.build.version.sdk=36 +ro.build.version.sdk_full=36.0 +ro.build.version.preview_sdk=0 +ro.build.version.preview_sdk_fingerprint=REL +ro.build.version.codename=REL +ro.build.version.all_codenames=REL +ro.build.version.known_codenames=Base,Base11,Cupcake,Donut,Eclair,Eclair01,EclairMr1,Froyo,Gingerbread,GingerbreadMr1,Honeycomb,HoneycombMr1,HoneycombMr2,IceCreamSandwich,IceCreamSandwichMr1,JellyBean,JellyBeanMr1,JellyBeanMr2,Kitkat,KitkatWatch,Lollipop,LollipopMr1,M,N,NMr1,O,OMr1,P,Q,R,S,Sv2,Tiramisu,UpsideDownCake,VanillaIceCream,Baklava +ro.build.version.release=16 +ro.build.version.release_or_codename=16 +ro.build.version.release_or_preview_display=16 +ro.build.version.security_patch=2025-04-05 +ro.build.version.base_os= +ro.build.version.min_supported_target_sdk=28 +ro.build.date=Mon Apr 14 08:51:49 UTC 2025 +ro.build.date.utc=1744620709 +ro.build.type=userdebug +ro.build.user=android-build +ro.build.host=7580da790f81 +ro.build.tags=test-keys +ro.build.flavor=sdk-userdebug +# ro.product.cpu.abi and ro.product.cpu.abi2 are obsolete, +# use ro.product.cpu.abilist instead. +ro.product.cpu.abi=x86 +ro.product.locale=en-US +ro.wifi.channels= +# ro.build.product is obsolete; use ro.product.device +ro.build.product=mainline_x86 +# Do not try to parse description or thumbprint +ro.build.description=sdk-userdebug 16 BP22.250325.007 13352765 test-keys +# end build properties +#################################### +# from variable ADDITIONAL_SYSTEM_PROPERTIES +#################################### +ro.treble.enabled=true +ro.llndk.api_level=202504 +ro.actionable_compatible_property.enabled=true +persist.debug.dalvik.vm.core_platform_api_policy=just-warn +ro.postinstall.fstab.prefix=/system +ro.secure=1 +security.perf_harden=1 +ro.allow.mock.location=0 +dalvik.vm.lockprof.threshold=500 +ro.debuggable=1 +xmpp.auto-presence=true +ro.config.nocheckin=yes +net.bt.name=Android +ro.force.debuggable=0 +#################################### +# from variable PRODUCT_SYSTEM_PROPERTIES +#################################### +dalvik.vm.image-dex2oat-Xms=64m +dalvik.vm.image-dex2oat-Xmx=64m +dalvik.vm.dex2oat-Xms=64m +dalvik.vm.dex2oat-Xmx=512m +#################################### +# from variable PRODUCT_SYSTEM_DEFAULT_PROPERTIES +#################################### +# Auto-added by post_process_props.py +persist.sys.usb.config=adb +#################################### +# Adding footer from :applied_backported_fixes +# with path out/soong/.intermediates/build/make/backported_fixes/applied_backported_fixes/gen/applied_backported_fixes.prop +#################################### +# The following backported fixes have been applied +# https://issuetracker.google.com/issues/350037023 with alias 1 +# https://issuetracker.google.com/issues/385124056 with alias 4 +ro.build.backported_fixes.alias_bitset.long_list=18 +# end of file +ro.build.user=generic +ro.build.host=generic +ro.product.brand=generic +ro.product.manufacturer=generic +ro.product.device=generic +ro.build.product=generic diff --git a/test/android/mocks/sdk/win32/with-platforms-and-system-images/platforms/android-36/sdk.properties b/test/android/mocks/sdk/win32/with-platforms-and-system-images/platforms/android-36/sdk.properties new file mode 100644 index 00000000..4f5ca6fe --- /dev/null +++ b/test/android/mocks/sdk/win32/with-platforms-and-system-images/platforms/android-36/sdk.properties @@ -0,0 +1,5 @@ +# SDK properties +# This file is copied in the root folder of each platform component. +# If it used by various tools to figure out what the platform can do. +sdk.ant.templates.revision=1 +sdk.skin.default=WVGA800 diff --git a/test/android/mocks/sdk/win32/with-platforms-and-system-images/platforms/android-36/skins/WVGA800/hardware.ini b/test/android/mocks/sdk/win32/with-platforms-and-system-images/platforms/android-36/skins/WVGA800/hardware.ini new file mode 100644 index 00000000..fd2a6d56 --- /dev/null +++ b/test/android/mocks/sdk/win32/with-platforms-and-system-images/platforms/android-36/skins/WVGA800/hardware.ini @@ -0,0 +1,4 @@ +# skin-specific hardware values +hw.lcd.density=240 +vm.heapSize=48 +hw.ramSize=512 diff --git a/test/android/mocks/sdk/win32/with-platforms-and-system-images/platforms/android-36/source.properties b/test/android/mocks/sdk/win32/with-platforms-and-system-images/platforms/android-36/source.properties new file mode 100644 index 00000000..bbd397db --- /dev/null +++ b/test/android/mocks/sdk/win32/with-platforms-and-system-images/platforms/android-36/source.properties @@ -0,0 +1,11 @@ +Pkg.Desc=Android SDK Platform 16 +Pkg.UserSrc=false +Platform.Version=16 +Platform.CodeName= +Pkg.Revision=2 +AndroidVersion.ApiLevel=36 +AndroidVersion.ExtensionLevel=17 +AndroidVersion.IsBaseSdk=true +Layoutlib.Api=15 +Layoutlib.Revision=1 +Platform.MinToolsRev=22 diff --git a/test/android/mocks/sdk/win32/with-platforms-and-system-images/system-images/android-36.1/example/x86_64/source.properties b/test/android/mocks/sdk/win32/with-platforms-and-system-images/system-images/android-36.1/example/x86_64/source.properties new file mode 100644 index 00000000..6de71b9b --- /dev/null +++ b/test/android/mocks/sdk/win32/with-platforms-and-system-images/system-images/android-36.1/example/x86_64/source.properties @@ -0,0 +1,12 @@ +Pkg.Desc=System Image x86_64 +Pkg.Revision=3 +Pkg.Dependencies=emulator#35.4.9 +AndroidVersion.ApiLevel=36.1 +AndroidVersion.ExtensionLevel=20 +AndroidVersion.IsBaseSdk=true +SystemImage.Abi=x86_64 +SystemImage.TagId=example +SystemImage.TagDisplay=Example +SystemImage.GpuSupport=true +Addon.VendorId=tidev +Addon.VendorDisplay=TiDev Inc. diff --git a/test/jdk/jdk.test.ts b/test/jdk/jdk.test.ts new file mode 100644 index 00000000..3e6dc70b --- /dev/null +++ b/test/jdk/jdk.test.ts @@ -0,0 +1,293 @@ +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { afterAll, afterEach, beforeAll, describe, expect, it } from 'vitest'; +import { config, resetConfig } from '../../src/config.js'; +import { detect, JDK } from '../../src/jdk.js'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const exe = process.platform === 'win32' ? '.exe' : ''; + +describe('JDK', function() { + let javaHome: string | undefined; + + beforeAll(() => { + javaHome = process.env.JAVA_HOME; + }); + + afterEach(() => { + delete process.env.MOCK_STDOUT; + delete process.env.MOCK_STDERR; + delete process.env.MOCK_EXITCODE; + resetConfig(); + }); + + afterAll(() => { + if (javaHome) { + process.env.JAVA_HOME = javaHome; + } else { + delete process.env.JAVA_HOME; + } + }); + + describe('load()', () => { + it('should throw error if dir is not a string', async () => { + await expect(JDK.load(undefined as any)).rejects + .toThrowError(new TypeError('Expected JDK path to be a valid string')); + await expect(JDK.load(123 as any)).rejects + .toThrowError(new TypeError('Expected JDK path to be a valid string')); + }); + + it('should throw error if dir does not exist', async () => { + await expect(JDK.load('doesnotexist')).rejects.toThrow('JDK path does not exist'); + }); + + it('should error if dir is missing essential jdk tools', async () => { + await expect(JDK.load(path.join(__dirname, 'mocks', 'incomplete-jdk'))).rejects + .toThrow('Directory missing required program'); + }); + + it('should detect JDK 1.6', async () => { + const dir = path.join(__dirname, 'mocks', 'mock-jdk'); + process.env.MOCK_STDERR = 'javac 1.6.0_45'; + const jdk = await JDK.load(dir); + + expect(jdk.build).toBe(45); + expect(jdk.executables).toEqual({ + java: path.join(dir, 'bin', `java${exe}`), + javac: path.join(dir, 'bin', `javac${exe}`), + keytool: path.join(dir, 'bin', `keytool${exe}`), + jarsigner: path.join(dir, 'bin', `jarsigner${exe}`), + }); + expect(jdk.path).toBe(dir); + expect(jdk.version).toBe('1.6.0'); + }); + + it('should detect JDK 1.7', async () => { + const dir = path.join(__dirname, 'mocks', 'mock-jdk'); + process.env.MOCK_STDERR = 'javac 1.7.0_80'; + const jdk = await JDK.load(dir); + + expect(jdk.build).toBe(80); + expect(jdk.executables).toEqual({ + java: path.join(dir, 'bin', `java${exe}`), + javac: path.join(dir, 'bin', `javac${exe}`), + keytool: path.join(dir, 'bin', `keytool${exe}`), + jarsigner: path.join(dir, 'bin', `jarsigner${exe}`), + }); + expect(jdk.path).toBe(dir); + expect(jdk.version).toBe('1.7.0'); + }); + + it('should detect JDK 1.8', async () => { + const dir = path.join(__dirname, 'mocks', 'mock-jdk'); + process.env.MOCK_STDERR = 'javac 1.8.0_92'; + const jdk = await JDK.load(dir); + + expect(jdk.build).toBe(92); + expect(jdk.executables).toEqual({ + java: path.join(dir, 'bin', `java${exe}`), + javac: path.join(dir, 'bin', `javac${exe}`), + keytool: path.join(dir, 'bin', `keytool${exe}`), + jarsigner: path.join(dir, 'bin', `jarsigner${exe}`), + }); + expect(jdk.path).toBe(dir); + expect(jdk.version).toBe('1.8.0'); + }); + + (process.platform === 'darwin' ? it : it.skip)( + 'should detect JDK 1.8 with macOS pathing', + async () => { + process.env.MOCK_STDERR = 'javac 1.8.0_92'; + const dir = path.join(__dirname, 'mocks', 'mock-jdk-darwin'); + const jdk = await JDK.load(dir); + + expect(jdk.build).toBe(92); + expect(jdk.executables).toEqual({ + java: path.join(dir, 'Contents', 'Home', 'bin', `java${exe}`), + javac: path.join(dir, 'Contents', 'Home', 'bin', `javac${exe}`), + keytool: path.join(dir, 'Contents', 'Home', 'bin', `keytool${exe}`), + jarsigner: path.join(dir, 'Contents', 'Home', 'bin', `jarsigner${exe}`), + }); + expect(jdk.path).toBe(path.join(dir, 'Contents', 'Home')); + expect(jdk.version).toBe('1.8.0'); + } + ); + + it('should detect JDK 9', async () => { + const dir = path.join(__dirname, 'mocks', 'mock-jdk'); + process.env.MOCK_STDOUT = 'javac 9'; + const jdk = await JDK.load(dir); + + expect(jdk.build).toBe(null); + expect(jdk.executables).toEqual({ + java: path.join(dir, 'bin', `java${exe}`), + javac: path.join(dir, 'bin', `javac${exe}`), + keytool: path.join(dir, 'bin', `keytool${exe}`), + jarsigner: path.join(dir, 'bin', `jarsigner${exe}`), + }); + expect(jdk.path).toBe(dir); + expect(jdk.version).toBe('9'); + }); + + (process.platform === 'darwin' ? it : it.skip)( + 'should detect JDK 9 with macOS pathing', + async () => { + const dir = path.join(__dirname, 'mocks', 'mock-jdk-darwin'); + process.env.MOCK_STDOUT = 'javac 9.0.1'; + const jdk = await JDK.load(dir); + + expect(jdk.build).toBe(null); + expect(jdk.executables).toEqual({ + java: path.join(dir, 'Contents', 'Home', 'bin', `java${exe}`), + javac: path.join(dir, 'Contents', 'Home', 'bin', `javac${exe}`), + keytool: path.join(dir, 'Contents', 'Home', 'bin', `keytool${exe}`), + jarsigner: path.join(dir, 'Contents', 'Home', 'bin', `jarsigner${exe}`), + }); + expect(jdk.path).toBe(path.join(dir, 'Contents', 'Home')); + expect(jdk.version).toBe('9.0.1'); + } + ); + + it('should detect JDK 20.0.1', async () => { + const dir = path.join(__dirname, 'mocks', 'mock-jdk'); + process.env.MOCK_STDOUT = 'javac 20.0.1'; + const jdk = await JDK.load(dir); + + expect(jdk.build).toBe(null); + expect(jdk.executables).toEqual({ + java: path.join(dir, 'bin', `java${exe}`), + javac: path.join(dir, 'bin', `javac${exe}`), + keytool: path.join(dir, 'bin', `keytool${exe}`), + jarsigner: path.join(dir, 'bin', `jarsigner${exe}`), + }); + expect(jdk.path).toBe(dir); + expect(jdk.version).toBe('20.0.1'); + }); + + it('should detect JDK 25', async () => { + const dir = path.join(__dirname, 'mocks', 'mock-jdk'); + process.env.MOCK_STDOUT = 'javac 25'; + const jdk = await JDK.load(dir); + + expect(jdk.build).toBe(null); + expect(jdk.executables).toEqual({ + java: path.join(dir, 'bin', `java${exe}`), + javac: path.join(dir, 'bin', `javac${exe}`), + keytool: path.join(dir, 'bin', `keytool${exe}`), + jarsigner: path.join(dir, 'bin', `jarsigner${exe}`), + }); + expect(jdk.path).toBe(dir); + expect(jdk.version).toBe('25'); + }); + + it('should not detect version if javac is bad', async () => { + const dir = path.join(__dirname, 'mocks', 'bad-bin-jdk'); + await expect(JDK.load(dir)).rejects.toThrow('Failed to determine JDK version'); + }); + }); + + describe('detect()', () => { + it('should find JDKs', async () => { + try { + const dir = path.join(__dirname, 'mocks', 'mock-jdk'); + process.env.MOCK_STDOUT = 'javac 9'; + process.env.JAVA_HOME = dir; + const { home, jdks } = await detect({ bypassCache: true }); + expect(home).toBe(dir); + + const jdk = jdks.find(jdk => jdk.path === dir); + expect(jdk).toBeDefined(); + expect(jdk!.build).toBeNull(); + expect(jdk!.executables).toEqual({ + java: path.join(dir, 'bin', `java${exe}`), + javac: path.join(dir, 'bin', `javac${exe}`), + keytool: path.join(dir, 'bin', `keytool${exe}`), + jarsigner: path.join(dir, 'bin', `jarsigner${exe}`), + }); + expect(jdk!.path).toBe(dir); + expect(jdk!.version).toBe('9'); + } finally { + delete process.env.JAVA_HOME; + } + }); + + it('should cache JDKs', async () => { + try { + const dir = path.join(__dirname, 'mocks', 'mock-jdk'); + process.env.MOCK_STDOUT = 'javac 9'; + process.env.JAVA_HOME = dir; + const results1 = await detect({ bypassCache: true }); + const results2 = await detect(); + expect(results1).toBe(results2); + } finally { + delete process.env.JAVA_HOME; + } + }); + + it('should find JDKs without JAVA_HOME', async () => { + try { + process.env.MOCK_STDOUT = 'javac 9'; + process.env.JAVA_HOME = 'does_not_exist'; + const { home } = await detect({ bypassCache: true }); + expect(home).toBeNull(); + } finally { + delete process.env.JAVA_HOME; + } + }); + + it('should return issues if no JDKs are found', async () => { + delete process.env.JAVA_HOME; + config.jdk.searchPaths[process.platform] = ['does_not_exist']; + const { jdks, issues } = await detect({ bypassCache: true }); + expect(jdks).toEqual([]); + expect(issues.length).toBe(1); + expect(issues[0].id).toBe('JDK_NOT_FOUND'); + expect(issues[0].type).toBe('error'); + }); + + it('should return issues if no valid JDKs are found', async () => { + delete process.env.JAVA_HOME; + config.jdk.searchPaths[process.platform] = []; + const { jdks, issues } = await detect({ + bypassCache: true, + searchPaths: [ + path.join(__dirname, 'mocks', 'incomplete-jdk'), + ] + }); + expect(jdks).toEqual([]); + expect(issues.length).toBe(1); + expect(issues[0].id).toBe('JDK_NOT_FOUND'); + expect(issues[0].type).toBe('error'); + }); + + it('should return issues if JDK path contains ampersand', async () => { + const dir = path.join(__dirname, 'mocks', 'mock-jdk-&ersand'); + config.jdk.searchPaths[process.platform] = [dir]; + process.env.MOCK_STDOUT = 'javac 25'; + delete process.env.JAVA_HOME; + const { jdks, issues } = await detect({ bypassCache: true }); + + expect(jdks).toHaveLength(1); + const jdk = jdks[0]; + expect(jdk).toBeDefined(); + + expect(jdk.build).toBe(null); + expect(jdk.executables).toEqual({ + java: path.join(dir, 'bin', `java${exe}`), + javac: path.join(dir, 'bin', `javac${exe}`), + keytool: path.join(dir, 'bin', `keytool${exe}`), + jarsigner: path.join(dir, 'bin', `jarsigner${exe}`), + }); + expect(jdk.path).toBe(dir); + expect(jdk.version).toBe('25'); + + if (process.platform === 'win32') { + expect(issues.length).toBe(1); + expect(issues[0].id).toBe('JDK_PATH_CONTAINS_AMPERSAND'); + expect(issues[0].type).toBe('warning'); + } else { + expect(issues).toEqual([]); + } + }); + }); +}); diff --git a/test/jdk/mocks/bad-bin-jdk/bin/jarsigner b/test/jdk/mocks/bad-bin-jdk/bin/jarsigner new file mode 100644 index 00000000..e69de29b diff --git a/test/jdk/mocks/bad-bin-jdk/bin/jarsigner.exe b/test/jdk/mocks/bad-bin-jdk/bin/jarsigner.exe new file mode 100644 index 00000000..09561313 Binary files /dev/null and b/test/jdk/mocks/bad-bin-jdk/bin/jarsigner.exe differ diff --git a/test/jdk/mocks/bad-bin-jdk/bin/java b/test/jdk/mocks/bad-bin-jdk/bin/java new file mode 100644 index 00000000..e69de29b diff --git a/test/jdk/mocks/bad-bin-jdk/bin/java.exe b/test/jdk/mocks/bad-bin-jdk/bin/java.exe new file mode 100644 index 00000000..234196cd Binary files /dev/null and b/test/jdk/mocks/bad-bin-jdk/bin/java.exe differ diff --git a/test/jdk/mocks/bad-bin-jdk/bin/javac b/test/jdk/mocks/bad-bin-jdk/bin/javac new file mode 100644 index 00000000..ecdbef95 --- /dev/null +++ b/test/jdk/mocks/bad-bin-jdk/bin/javac @@ -0,0 +1,2 @@ +#!/bin/sh +exit 1 diff --git a/test/jdk/mocks/bad-bin-jdk/bin/javac.exe b/test/jdk/mocks/bad-bin-jdk/bin/javac.exe new file mode 100644 index 00000000..de19a80a Binary files /dev/null and b/test/jdk/mocks/bad-bin-jdk/bin/javac.exe differ diff --git a/test/jdk/mocks/bad-bin-jdk/bin/keytool b/test/jdk/mocks/bad-bin-jdk/bin/keytool new file mode 100644 index 00000000..e69de29b diff --git a/test/jdk/mocks/bad-bin-jdk/bin/keytool.exe b/test/jdk/mocks/bad-bin-jdk/bin/keytool.exe new file mode 100644 index 00000000..7f6d8fd7 Binary files /dev/null and b/test/jdk/mocks/bad-bin-jdk/bin/keytool.exe differ diff --git a/test/jdk/mocks/bad-bin-jdk/jre/bin/server/jvm.dll b/test/jdk/mocks/bad-bin-jdk/jre/bin/server/jvm.dll new file mode 100644 index 00000000..e69de29b diff --git a/test/jdk/mocks/bad-bin-jdk/jre/lib/amd64/server/libjvm.so b/test/jdk/mocks/bad-bin-jdk/jre/lib/amd64/server/libjvm.so new file mode 100644 index 00000000..e69de29b diff --git a/test/jdk/mocks/bad-bin-jdk/jre/lib/server/libjvm.dylib b/test/jdk/mocks/bad-bin-jdk/jre/lib/server/libjvm.dylib new file mode 100644 index 00000000..e69de29b diff --git a/test/jdk/mocks/empty/.gitignore b/test/jdk/mocks/empty/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/jdk/mocks/incomplete-jdk/bin/javac b/test/jdk/mocks/incomplete-jdk/bin/javac new file mode 100755 index 00000000..95b23273 --- /dev/null +++ b/test/jdk/mocks/incomplete-jdk/bin/javac @@ -0,0 +1,26 @@ +#!/bin/bash + +out="${MOCK_STDOUT}" +err="${MOCK_STDERR}" +exitCode="${MOCK_EXITCODE}" + +code=0 +if [ -n "$exitCode" ]; then + # Validate that exitCode is a valid integer + if [ "$exitCode" -eq "$exitCode" ] 2>/dev/null && [ "$exitCode" -ge -2147483648 ] && [ "$exitCode" -le 2147483647 ]; then + code=$exitCode + fi +fi + +if [ -n "$out" ]; then + echo "$out" +fi +if [ -n "$err" ]; then + echo "$err" +fi +if [ -z "$out" ] && [ -z "$err" ]; then + echo "This is a mock executable" + echo "Set MOCK_STDOUT, MOCK_STDERR, and MOCK_EXITCODE to simulate executables" +fi + +exit $code diff --git a/test/jdk/mocks/incomplete-jdk/bin/javac.exe b/test/jdk/mocks/incomplete-jdk/bin/javac.exe new file mode 100644 index 00000000..720af670 Binary files /dev/null and b/test/jdk/mocks/incomplete-jdk/bin/javac.exe differ diff --git a/test/jdk/mocks/mock-jdk-&ersand/bin/jarsigner b/test/jdk/mocks/mock-jdk-&ersand/bin/jarsigner new file mode 100644 index 00000000..e69de29b diff --git a/test/jdk/mocks/mock-jdk-&ersand/bin/jarsigner.exe b/test/jdk/mocks/mock-jdk-&ersand/bin/jarsigner.exe new file mode 100644 index 00000000..720af670 Binary files /dev/null and b/test/jdk/mocks/mock-jdk-&ersand/bin/jarsigner.exe differ diff --git a/test/jdk/mocks/mock-jdk-&ersand/bin/java b/test/jdk/mocks/mock-jdk-&ersand/bin/java new file mode 100644 index 00000000..297dc2f7 --- /dev/null +++ b/test/jdk/mocks/mock-jdk-&ersand/bin/java @@ -0,0 +1,4 @@ +#!/bin/sh +>&2 echo "java version \"9\"" +>&2 echo "Java(TM) SE Runtime Environment (build 9+181)" +>&2 echo "Java HotSpot(TM) 64-Bit Server VM (build 9+181, mixed mode)" diff --git a/test/jdk/mocks/mock-jdk-&ersand/bin/java.exe b/test/jdk/mocks/mock-jdk-&ersand/bin/java.exe new file mode 100644 index 00000000..720af670 Binary files /dev/null and b/test/jdk/mocks/mock-jdk-&ersand/bin/java.exe differ diff --git a/test/jdk/mocks/mock-jdk-&ersand/bin/javac b/test/jdk/mocks/mock-jdk-&ersand/bin/javac new file mode 100755 index 00000000..95b23273 --- /dev/null +++ b/test/jdk/mocks/mock-jdk-&ersand/bin/javac @@ -0,0 +1,26 @@ +#!/bin/bash + +out="${MOCK_STDOUT}" +err="${MOCK_STDERR}" +exitCode="${MOCK_EXITCODE}" + +code=0 +if [ -n "$exitCode" ]; then + # Validate that exitCode is a valid integer + if [ "$exitCode" -eq "$exitCode" ] 2>/dev/null && [ "$exitCode" -ge -2147483648 ] && [ "$exitCode" -le 2147483647 ]; then + code=$exitCode + fi +fi + +if [ -n "$out" ]; then + echo "$out" +fi +if [ -n "$err" ]; then + echo "$err" +fi +if [ -z "$out" ] && [ -z "$err" ]; then + echo "This is a mock executable" + echo "Set MOCK_STDOUT, MOCK_STDERR, and MOCK_EXITCODE to simulate executables" +fi + +exit $code diff --git a/test/jdk/mocks/mock-jdk-&ersand/bin/javac.exe b/test/jdk/mocks/mock-jdk-&ersand/bin/javac.exe new file mode 100644 index 00000000..720af670 Binary files /dev/null and b/test/jdk/mocks/mock-jdk-&ersand/bin/javac.exe differ diff --git a/test/jdk/mocks/mock-jdk-&ersand/bin/keytool b/test/jdk/mocks/mock-jdk-&ersand/bin/keytool new file mode 100644 index 00000000..e69de29b diff --git a/test/jdk/mocks/mock-jdk-&ersand/bin/keytool.exe b/test/jdk/mocks/mock-jdk-&ersand/bin/keytool.exe new file mode 100644 index 00000000..720af670 Binary files /dev/null and b/test/jdk/mocks/mock-jdk-&ersand/bin/keytool.exe differ diff --git a/test/jdk/mocks/mock-jdk-&ersand/bin/server/jvm.dll b/test/jdk/mocks/mock-jdk-&ersand/bin/server/jvm.dll new file mode 100644 index 00000000..3dea9b24 Binary files /dev/null and b/test/jdk/mocks/mock-jdk-&ersand/bin/server/jvm.dll differ diff --git a/test/jdk/mocks/mock-jdk-&ersand/lib/server/libjvm.dylib b/test/jdk/mocks/mock-jdk-&ersand/lib/server/libjvm.dylib new file mode 100644 index 00000000..e69de29b diff --git a/test/jdk/mocks/mock-jdk-&ersand/lib/server/libjvm.so b/test/jdk/mocks/mock-jdk-&ersand/lib/server/libjvm.so new file mode 100644 index 00000000..e69de29b diff --git a/test/jdk/mocks/mock-jdk-darwin/Contents/Home/bin/jarsigner b/test/jdk/mocks/mock-jdk-darwin/Contents/Home/bin/jarsigner new file mode 100644 index 00000000..e69de29b diff --git a/test/jdk/mocks/mock-jdk-darwin/Contents/Home/bin/jarsigner.exe b/test/jdk/mocks/mock-jdk-darwin/Contents/Home/bin/jarsigner.exe new file mode 100644 index 00000000..720af670 Binary files /dev/null and b/test/jdk/mocks/mock-jdk-darwin/Contents/Home/bin/jarsigner.exe differ diff --git a/test/jdk/mocks/mock-jdk-darwin/Contents/Home/bin/java b/test/jdk/mocks/mock-jdk-darwin/Contents/Home/bin/java new file mode 100644 index 00000000..297dc2f7 --- /dev/null +++ b/test/jdk/mocks/mock-jdk-darwin/Contents/Home/bin/java @@ -0,0 +1,4 @@ +#!/bin/sh +>&2 echo "java version \"9\"" +>&2 echo "Java(TM) SE Runtime Environment (build 9+181)" +>&2 echo "Java HotSpot(TM) 64-Bit Server VM (build 9+181, mixed mode)" diff --git a/test/jdk/mocks/mock-jdk-darwin/Contents/Home/bin/java.exe b/test/jdk/mocks/mock-jdk-darwin/Contents/Home/bin/java.exe new file mode 100644 index 00000000..720af670 Binary files /dev/null and b/test/jdk/mocks/mock-jdk-darwin/Contents/Home/bin/java.exe differ diff --git a/test/jdk/mocks/mock-jdk-darwin/Contents/Home/bin/javac b/test/jdk/mocks/mock-jdk-darwin/Contents/Home/bin/javac new file mode 100755 index 00000000..95b23273 --- /dev/null +++ b/test/jdk/mocks/mock-jdk-darwin/Contents/Home/bin/javac @@ -0,0 +1,26 @@ +#!/bin/bash + +out="${MOCK_STDOUT}" +err="${MOCK_STDERR}" +exitCode="${MOCK_EXITCODE}" + +code=0 +if [ -n "$exitCode" ]; then + # Validate that exitCode is a valid integer + if [ "$exitCode" -eq "$exitCode" ] 2>/dev/null && [ "$exitCode" -ge -2147483648 ] && [ "$exitCode" -le 2147483647 ]; then + code=$exitCode + fi +fi + +if [ -n "$out" ]; then + echo "$out" +fi +if [ -n "$err" ]; then + echo "$err" +fi +if [ -z "$out" ] && [ -z "$err" ]; then + echo "This is a mock executable" + echo "Set MOCK_STDOUT, MOCK_STDERR, and MOCK_EXITCODE to simulate executables" +fi + +exit $code diff --git a/test/jdk/mocks/mock-jdk-darwin/Contents/Home/bin/javac.exe b/test/jdk/mocks/mock-jdk-darwin/Contents/Home/bin/javac.exe new file mode 100644 index 00000000..720af670 Binary files /dev/null and b/test/jdk/mocks/mock-jdk-darwin/Contents/Home/bin/javac.exe differ diff --git a/test/jdk/mocks/mock-jdk-darwin/Contents/Home/bin/keytool b/test/jdk/mocks/mock-jdk-darwin/Contents/Home/bin/keytool new file mode 100644 index 00000000..e69de29b diff --git a/test/jdk/mocks/mock-jdk-darwin/Contents/Home/bin/keytool.exe b/test/jdk/mocks/mock-jdk-darwin/Contents/Home/bin/keytool.exe new file mode 100644 index 00000000..720af670 Binary files /dev/null and b/test/jdk/mocks/mock-jdk-darwin/Contents/Home/bin/keytool.exe differ diff --git a/test/jdk/mocks/mock-jdk-darwin/Contents/Home/bin/server/jvm.dll b/test/jdk/mocks/mock-jdk-darwin/Contents/Home/bin/server/jvm.dll new file mode 100644 index 00000000..3dea9b24 Binary files /dev/null and b/test/jdk/mocks/mock-jdk-darwin/Contents/Home/bin/server/jvm.dll differ diff --git a/test/jdk/mocks/mock-jdk-darwin/Contents/Home/lib/server/libjvm.dylib b/test/jdk/mocks/mock-jdk-darwin/Contents/Home/lib/server/libjvm.dylib new file mode 100644 index 00000000..e69de29b diff --git a/test/jdk/mocks/mock-jdk-darwin/Contents/Home/lib/server/libjvm.so b/test/jdk/mocks/mock-jdk-darwin/Contents/Home/lib/server/libjvm.so new file mode 100644 index 00000000..e69de29b diff --git a/test/jdk/mocks/mock-jdk/bin/jarsigner b/test/jdk/mocks/mock-jdk/bin/jarsigner new file mode 100644 index 00000000..e69de29b diff --git a/test/jdk/mocks/mock-jdk/bin/jarsigner.exe b/test/jdk/mocks/mock-jdk/bin/jarsigner.exe new file mode 100644 index 00000000..720af670 Binary files /dev/null and b/test/jdk/mocks/mock-jdk/bin/jarsigner.exe differ diff --git a/test/jdk/mocks/mock-jdk/bin/java b/test/jdk/mocks/mock-jdk/bin/java new file mode 100644 index 00000000..297dc2f7 --- /dev/null +++ b/test/jdk/mocks/mock-jdk/bin/java @@ -0,0 +1,4 @@ +#!/bin/sh +>&2 echo "java version \"9\"" +>&2 echo "Java(TM) SE Runtime Environment (build 9+181)" +>&2 echo "Java HotSpot(TM) 64-Bit Server VM (build 9+181, mixed mode)" diff --git a/test/jdk/mocks/mock-jdk/bin/java.exe b/test/jdk/mocks/mock-jdk/bin/java.exe new file mode 100644 index 00000000..720af670 Binary files /dev/null and b/test/jdk/mocks/mock-jdk/bin/java.exe differ diff --git a/test/jdk/mocks/mock-jdk/bin/javac b/test/jdk/mocks/mock-jdk/bin/javac new file mode 100755 index 00000000..95b23273 --- /dev/null +++ b/test/jdk/mocks/mock-jdk/bin/javac @@ -0,0 +1,26 @@ +#!/bin/bash + +out="${MOCK_STDOUT}" +err="${MOCK_STDERR}" +exitCode="${MOCK_EXITCODE}" + +code=0 +if [ -n "$exitCode" ]; then + # Validate that exitCode is a valid integer + if [ "$exitCode" -eq "$exitCode" ] 2>/dev/null && [ "$exitCode" -ge -2147483648 ] && [ "$exitCode" -le 2147483647 ]; then + code=$exitCode + fi +fi + +if [ -n "$out" ]; then + echo "$out" +fi +if [ -n "$err" ]; then + echo "$err" +fi +if [ -z "$out" ] && [ -z "$err" ]; then + echo "This is a mock executable" + echo "Set MOCK_STDOUT, MOCK_STDERR, and MOCK_EXITCODE to simulate executables" +fi + +exit $code diff --git a/test/jdk/mocks/mock-jdk/bin/javac.exe b/test/jdk/mocks/mock-jdk/bin/javac.exe new file mode 100644 index 00000000..720af670 Binary files /dev/null and b/test/jdk/mocks/mock-jdk/bin/javac.exe differ diff --git a/test/jdk/mocks/mock-jdk/bin/keytool b/test/jdk/mocks/mock-jdk/bin/keytool new file mode 100644 index 00000000..e69de29b diff --git a/test/jdk/mocks/mock-jdk/bin/keytool.exe b/test/jdk/mocks/mock-jdk/bin/keytool.exe new file mode 100644 index 00000000..720af670 Binary files /dev/null and b/test/jdk/mocks/mock-jdk/bin/keytool.exe differ diff --git a/test/jdk/mocks/mock-jdk/bin/server/jvm.dll b/test/jdk/mocks/mock-jdk/bin/server/jvm.dll new file mode 100644 index 00000000..3dea9b24 Binary files /dev/null and b/test/jdk/mocks/mock-jdk/bin/server/jvm.dll differ diff --git a/test/jdk/mocks/mock-jdk/lib/server/libjvm.dylib b/test/jdk/mocks/mock-jdk/lib/server/libjvm.dylib new file mode 100644 index 00000000..e69de29b diff --git a/test/jdk/mocks/mock-jdk/lib/server/libjvm.so b/test/jdk/mocks/mock-jdk/lib/server/libjvm.so new file mode 100644 index 00000000..e69de29b diff --git a/test/titanium/i18n/i18n.test.ts b/test/titanium/i18n/i18n.test.ts new file mode 100644 index 00000000..05d4ec9d --- /dev/null +++ b/test/titanium/i18n/i18n.test.ts @@ -0,0 +1,18 @@ +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { describe, expect, it } from 'vitest'; +import * as i18n from '../../../src/titanium/i18n.js'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +describe('i18n', () => { + it('load()', async () => { + const result = await i18n.load(__dirname); + expect(result).toBeInstanceOf(Object); + }); + + it('findLaunchScreens()', async () => { + const result = await i18n.findLaunchScreens(__dirname, { bypassCache: true }); + expect(result).toBeInstanceOf(Array); + }); +}); diff --git a/test/titanium/i18n/mocks/empty/.gitkeep b/test/titanium/i18n/mocks/empty/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/test/titanium/i18n/mocks/good/app.xml b/test/titanium/i18n/mocks/good/app.xml new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/test/titanium/i18n/mocks/good/app.xml @@ -0,0 +1 @@ + diff --git a/test/titanium/i18n/mocks/good/custom.xml b/test/titanium/i18n/mocks/good/custom.xml new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/test/titanium/i18n/mocks/good/custom.xml @@ -0,0 +1 @@ + diff --git a/test/util/capitalize.test.ts b/test/util/capitalize.test.ts new file mode 100644 index 00000000..6daf61cf --- /dev/null +++ b/test/util/capitalize.test.ts @@ -0,0 +1,17 @@ +import { describe, expect, it } from 'vitest'; +import { capitalize } from '../../src/util/capitalize.js'; + +describe('capitalize', () => { + it('should capitalize the first letter of the string', () => { + expect(capitalize('hello')).toBe('Hello'); + }); + + it('should return an empty string if the input is an empty string', () => { + expect(capitalize('')).toBe(''); + }); + + it('should return the same string if the input is already capitalized', () => { + expect(capitalize('Hello')).toBe('Hello'); + expect(capitalize('HELLO')).toBe('HELLO'); + }); +}); diff --git a/test/util/is-dir.test.ts b/test/util/is-dir.test.ts new file mode 100644 index 00000000..6a79da8d --- /dev/null +++ b/test/util/is-dir.test.ts @@ -0,0 +1,21 @@ +import { dirname, join } from 'path'; +import { fileURLToPath } from 'url'; +import { describe, expect, it } from 'vitest'; +import { isDir } from '../../src/util/is-dir.js'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +describe('isDir()', () => { + it('should return true if the path is a directory', () => { + expect(isDir(__dirname)).toBe(true); + }); + + it("should return false if the path doesn't exist", () => { + expect(isDir(join(__dirname, 'does_not_exist'))).toBe(false); + }); + + it('should return false if the path is not a directory', () => { + expect(isDir(__filename)).toBe(false); + }); +}); diff --git a/test/util/is-file.test.ts b/test/util/is-file.test.ts new file mode 100644 index 00000000..83f91e89 --- /dev/null +++ b/test/util/is-file.test.ts @@ -0,0 +1,21 @@ +import { dirname, join } from 'path'; +import { fileURLToPath } from 'url'; +import { describe, expect, it } from 'vitest'; +import { isFile } from '../../src/util/is-file.js'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +describe('isFile()', () => { + it('should return true if the path is a file', () => { + expect(isFile(__filename)).toBe(true); + }); + + it("should return false if the path doesn't exist", () => { + expect(isFile(join(__dirname, 'does_not_exist'))).toBe(false); + }); + + it('should return false if the path is not a file', () => { + expect(isFile(__dirname)).toBe(false); + }); +}); diff --git a/test/util/tailgate.test.ts b/test/util/tailgate.test.ts new file mode 100644 index 00000000..f208c73f --- /dev/null +++ b/test/util/tailgate.test.ts @@ -0,0 +1,31 @@ +import { describe, expect, it } from 'vitest'; +import { setTimeout as delay } from 'node:timers/promises'; +import { tailgate } from '../../src/util/tailgate.js'; + +describe('tailgate()', () => { + it('should queue up multiple calls', async () => { + let count = 0; + const fn = () => tailgate('foo', () => ++count); + const results = await Promise.all([fn(), fn(), fn()]); + expect(count).toBe(3); + expect(results).toEqual([1, 2, 3]); + }); + + it('should queue up multiple async calls', async () => { + let count = 0; + const fn = () => + tailgate('foo', async () => { + await delay(50); + return ++count; + }); + const results = await Promise.all([fn(), fn(), fn()]); + expect(count).toBe(1); + expect(results).toEqual([1, 1, 1]); + }); + + it('should catch errors', async () => { + await expect(tailgate('foo', () => { + throw new Error('oh snap'); + })).rejects.toThrow(/oh snap/); + }); +}); diff --git a/test/util/version.test.ts b/test/util/version.test.ts new file mode 100644 index 00000000..c1fa5e38 --- /dev/null +++ b/test/util/version.test.ts @@ -0,0 +1,381 @@ +import { describe, expect, it } from 'vitest'; +import * as version from '../../src/util/version.js'; + +describe('version', () => { + describe('compare()', () => { + it('should compare two versions', () => { + expect(version.compare('1.0.0', '2.0.0')).toBe(-1); + expect(version.compare('2.0.0', '1.0.0')).toBe(1); + expect(version.compare('1.0.0', '1.0.0')).toBe(0); + + expect(version.compare('1.1.0', '1.2.0')).toBe(-1); + expect(version.compare('1.2.0', '1.1.0')).toBe(1); + expect(version.compare('1.1.0', '1.1.0')).toBe(0); + + expect(version.compare('1.1.1', '1.1.2')).toBe(-1); + expect(version.compare('1.1.2', '1.1.1')).toBe(1); + expect(version.compare('1.1.1', '1.1.1')).toBe(0); + }); + + it('should compare two versions with tags', () => { + expect(version.compare('1.0.0-beta', '1.0.0')).toBe(1); + expect(version.compare('1.0.0', '1.0.0-beta')).toBe(-1); + expect(version.compare('1.0.0-beta', '1.0.0-beta')).toBe(0); + + expect(version.compare('1.0.0-beta', '1.0.0-alpha')).toBe(1); + expect(version.compare('1.0.0-alpha', '1.0.0-beta')).toBe(-1); + expect(version.compare('1.0.0-beta', '1.0.0-beta')).toBe(0); + expect(version.compare('1.0.0-beta', '1.0.0-beta.1')).toBe(-1); + expect(version.compare('1.0.0-beta.1', '1.0.0-beta')).toBe(1); + }); + + it('should compare two versions with different number of segments', () => { + expect(version.compare('1.0.0', '1.0')).toBe(0); + expect(version.compare('1.0', '1.0.0')).toBe(0); + }); + + it('should compare two versions with different number of segments and tags', () => { + expect(version.compare('1.0.0-beta', '1.0')).toBe(1); + expect(version.compare('1.0', '1.0.0-beta')).toBe(-1); + expect(version.compare('1.0.0-beta', '1.0.0-beta')).toBe(0); + }); + + it('should compare two versions with different number of segments and tags', () => { + expect(version.compare('1.0.0-beta', '1.0')).toBe(1); + expect(version.compare('1.0', '1.0.0-beta')).toBe(-1); + expect(version.compare('1.0.0-beta', '1.0.0-beta')).toBe(0); + }); + + it('should compare two numbers', () => { + expect(version.compare(1, 2)).toBe(-1); + expect(version.compare(2, 1)).toBe(1); + expect(version.compare(1, 1)).toBe(0); + + expect(version.compare(1.2, 1.3)).toBe(-1); + expect(version.compare(1.3, 1.2)).toBe(1); + expect(version.compare(1.2, 1.2)).toBe(0); + }); + + it('should throw an error if the version is invalid', () => { + expect(() => version.compare('foo', 'bar')) + .toThrow('Invalid version format'); + }); + }); + + describe('format()', () => { + it('format integer versions', () => { + expect(version.format(1)).toBe('1'); + expect(version.format(1, 1)).toBe('1'); + expect(version.format(1, 2)).toBe('1.0'); + expect(version.format(1, 3)).toBe('1.0.0'); + expect(version.format(1, 4)).toBe('1.0.0.0'); + expect(version.format(1, 0, 1)).toBe('1'); + expect(version.format(1, 0, 2)).toBe('1'); + expect(version.format(1, 0, 3)).toBe('1'); + expect(version.format(1, 3, 3)).toBe('1.0.0'); + }); + + it('format float versions', () => { + expect(version.format(1.2)).toBe('1.2'); + expect(version.format(1.2, 1)).toBe('1.2'); + expect(version.format(1.2, 2)).toBe('1.2'); + expect(version.format(1.2, 3)).toBe('1.2.0'); + expect(version.format(1.2, 0, 1)).toBe('1'); + expect(version.format(1.2, 0, 2)).toBe('1.2'); + expect(version.format(1.2, 0, 3)).toBe('1.2'); + expect(version.format(1.2, 3, 3)).toBe('1.2.0'); + }); + + it('format single segment versions', () => { + expect(version.format('1')).toBe('1'); + expect(version.format('1', 1)).toBe('1'); + expect(version.format('1', 2)).toBe('1.0'); + expect(version.format('1', 3)).toBe('1.0.0'); + expect(version.format('1', 4)).toBe('1.0.0.0'); + expect(version.format('1', 0, 1)).toBe('1'); + expect(version.format('1', 0, 2)).toBe('1'); + expect(version.format('1', 0, 3)).toBe('1'); + expect(version.format('1', 3, 3)).toBe('1.0.0'); + expect(version.format('1-beta', 0, 1, true)).toBe('1'); + expect(version.format('1-beta', 0, 2, true)).toBe('1'); + expect(version.format('1-beta', 0, 3, true)).toBe('1'); + expect(version.format('1-beta', 3, 3, true)).toBe('1.0.0'); + }); + + it('format 2 segment versions', () => { + expect(version.format('1.2')).toBe('1.2'); + expect(version.format('1.2', 1)).toBe('1.2'); + expect(version.format('1.2', 2)).toBe('1.2'); + expect(version.format('1.2', 3)).toBe('1.2.0'); + expect(version.format('1.2', 4)).toBe('1.2.0.0'); + expect(version.format('1.2', 0, 1)).toBe('1'); + expect(version.format('1.2', 0, 2)).toBe('1.2'); + expect(version.format('1.2', 0, 3)).toBe('1.2'); + expect(version.format('1.2', 3, 3)).toBe('1.2.0'); + expect(version.format('1.2-beta', 0, 1, true)).toBe('1'); + expect(version.format('1.2-beta', 0, 2, true)).toBe('1.2'); + expect(version.format('1.2-beta', 0, 3, true)).toBe('1.2'); + expect(version.format('1.2-beta', 3, 3, true)).toBe('1.2.0'); + }); + + it('format 3 segment versions', () => { + expect(version.format('1.2.3')).toBe('1.2.3'); + expect(version.format('1.2.3', 1)).toBe('1.2.3'); + expect(version.format('1.2.3', 2)).toBe('1.2.3'); + expect(version.format('1.2.3', 3)).toBe('1.2.3'); + expect(version.format('1.2.3', 4)).toBe('1.2.3.0'); + expect(version.format('1.2.3', 0, 1)).toBe('1'); + expect(version.format('1.2.3', 0, 2)).toBe('1.2'); + expect(version.format('1.2.3', 0, 3)).toBe('1.2.3'); + expect(version.format('1.2.3', 3, 3)).toBe('1.2.3'); + expect(version.format('1.2.3-beta', 0, 1, true)).toBe('1'); + expect(version.format('1.2.3-beta', 0, 2, true)).toBe('1.2'); + expect(version.format('1.2.3-beta', 0, 3, true)).toBe('1.2.3'); + expect(version.format('1.2.3-beta', 3, 3, true)).toBe('1.2.3'); + expect(version.format('1.2.3-beta.foo', 3, 3, true)).toBe('1.2.3'); + }); + + it('format 4 segment versions', () => { + expect(version.format('1.2.3.4')).toBe('1.2.3.4'); + expect(version.format('1.2.3.4', 1)).toBe('1.2.3.4'); + expect(version.format('1.2.3.4', 2)).toBe('1.2.3.4'); + expect(version.format('1.2.3.4', 3)).toBe('1.2.3.4'); + expect(version.format('1.2.3.4', 4)).toBe('1.2.3.4'); + expect(version.format('1.2.3.4', 0, 1)).toBe('1'); + expect(version.format('1.2.3.4', 0, 2)).toBe('1.2'); + expect(version.format('1.2.3.4', 0, 3)).toBe('1.2.3'); + expect(version.format('1.2.3.4', 3, 3)).toBe('1.2.3'); + }); + + it('should throw an error if the version is invalid', () => { + expect(() => version.format(undefined as any)) + .toThrow('Invalid version "undefined"'); + expect(() => version.format(null as any)) + .toThrow('Invalid version "null"'); + }); + }); + + describe('isValid()', () => { + it('positive tests', () => { + expect(version.isValid('1')).toBe(true); + expect(version.isValid('1.0')).toBe(true); + expect(version.isValid('1.0.0')).toBe(true); + expect(version.isValid('1.0.0.0')).toBe(true); + }); + + it('negative tests', () => { + expect(version.isValid('a')).toBe(false); + expect(version.isValid(undefined as any)).toBe(false); + expect(version.isValid(null as any)).toBe(false); + }); + }); + + describe('eq()', () => { + it('positive tests', () => { + expect(version.eq(1, 1)).toBe(true); + expect(version.eq('1', 1)).toBe(true); + expect(version.eq(1, '1')).toBe(true); + expect(version.eq('1', '1')).toBe(true); + expect(version.eq('1.0', '1')).toBe(true); + expect(version.eq('1.0.0', '1')).toBe(true); + expect(version.eq('1', '1.0')).toBe(true); + expect(version.eq('1.0', '1.0')).toBe(true); + expect(version.eq('1.0.0', '1.0')).toBe(true); + expect(version.eq('1', '1.0.0')).toBe(true); + expect(version.eq('1.0', '1.0.0')).toBe(true); + expect(version.eq('1.0.0', '1.0.0')).toBe(true); + expect(version.eq('1.0.0', '1.0.0.2')).toBe(true); + expect(version.eq('1.0.0.1', '1.0.0.2')).toBe(true); + }); + + it('negative tests', () => { + expect(version.eq('1.0.0', '1.2')).toBe(false); + expect(version.eq('1.2.3', '1.2')).toBe(false); + expect(version.eq('1', '1.2')).toBe(false); + expect(version.eq('1', 2)).toBe(false); + expect(version.eq('1', 1.2)).toBe(false); + expect(version.eq('1', '2')).toBe(false); + expect(version.eq('1.3', '1')).toBe(false); + }); + }); + + describe('lt()', () => { + it('positive tests', () => { + expect(version.lt(1, 2)).toBe(true); + expect(version.lt(1.2, 1.3)).toBe(true); + expect(version.lt(1.2, 2)).toBe(true); + expect(version.lt('1.2', 2)).toBe(true); + expect(version.lt('1.2', '1.3')).toBe(true); + expect(version.lt('1.2', '2')).toBe(true); + expect(version.lt('1.2', '1.2.1')).toBe(true); + }); + + it('negative tests', () => { + expect(version.lt(1, 1)).toBe(false); + expect(version.lt(1.2, 1.2)).toBe(false); + expect(version.lt('1.2', 1.2)).toBe(false); + expect(version.lt(1.2, '1.2')).toBe(false); + expect(version.lt('1.2', '1.2')).toBe(false); + expect(version.lt('1.2.3', '1.2')).toBe(false); + expect(version.lt('1.2', '1.2.0')).toBe(false); + expect(version.lt('1.2.1', '1.2')).toBe(false); + expect(version.lt('1.0.0.1', '1.0.0')).toBe(false); + }); + }); + + describe('lte()', () => { + it('positive tests', () => { + expect(version.lte(1, 2)).toBe(true); + expect(version.lte(1.2, 1.2)).toBe(true); + expect(version.lte(1.2, 1.3)).toBe(true); + expect(version.lte(1.2, 2)).toBe(true); + expect(version.lte('1.2', 1.2)).toBe(true); + expect(version.lte('1.2', 2)).toBe(true); + expect(version.lte('1.2', '1.2')).toBe(true); + expect(version.lte('1.2', '1.3')).toBe(true); + expect(version.lte('1.2', '2')).toBe(true); + expect(version.lte('1.2', '1.2.0')).toBe(true); + expect(version.lte('1.2', '1.2.1')).toBe(true); + expect(version.lte('1.2.0', '1.2.0')).toBe(true); + expect(version.lte('1.2.0', '1.2.1')).toBe(true); + expect(version.lte('1.0.0.1', '1.0.0')).toBe(true); + }); + + it('negative tests', () => { + expect(version.lte(1.1, 1)).toBe(false); + expect(version.lte('1.0.1', 1)).toBe(false); + expect(version.lte(1.3, 1.2)).toBe(false); + expect(version.lte('1.3', 1.2)).toBe(false); + expect(version.lte(1.3, '1.2')).toBe(false); + expect(version.lte('1.3', '1.2')).toBe(false); + expect(version.lte('1.2.3', '1.2')).toBe(false); + expect(version.lte('1.2.3', '1.2.0')).toBe(false); + }); + }); + + describe('gt()', () => { + it('positive tests', () => { + expect(version.gt(2, 1)).toBe(true); + expect(version.gt(1.3, 1.2)).toBe(true); + expect(version.gt(2, 1.2)).toBe(true); + expect(version.gt(2, '1.2')).toBe(true); + expect(version.gt('1.3', '1.2')).toBe(true); + expect(version.gt('2', '1.2')).toBe(true); + expect(version.gt('1.2.1', '1.2')).toBe(true); + }); + + it('negative tests', () => { + expect(version.gt(1, 1)).toBe(false); + expect(version.gt(1.2, 1.2)).toBe(false); + expect(version.gt('1.2', 1.2)).toBe(false); + expect(version.gt(1.2, '1.2')).toBe(false); + expect(version.gt('1.2', '1.2')).toBe(false); + expect(version.gt('1.2', '1.2.3')).toBe(false); + expect(version.gt('1.2.0', '1.2')).toBe(false); + expect(version.gt('1.2', '1.2.1')).toBe(false); + expect(version.gt('1.0.0', '1.0.0.1')).toBe(false); + }); + }); + + describe('gte()', () => { + it('positive tests', () => { + expect(version.gte(2, 1)).toBe(true); + expect(version.gte(1.2, 1.2)).toBe(true); + expect(version.gte(1.3, 1.2)).toBe(true); + expect(version.gte(2, 1.2)).toBe(true); + expect(version.gte(1.2, '1.2')).toBe(true); + expect(version.gte(2, '1.2')).toBe(true); + expect(version.gte('1.2', '1.2')).toBe(true); + expect(version.gte('1.3', '1.2')).toBe(true); + expect(version.gte('2', '1.2')).toBe(true); + expect(version.gte('1.2.0', '1.2')).toBe(true); + expect(version.gte('1.2.1', '1.2')).toBe(true); + expect(version.gte('1.2.0', '1.2.0')).toBe(true); + expect(version.gte('1.2.1', '1.2.0')).toBe(true); + expect(version.gte('1.0.0', '1.0.0.1')).toBe(true); + }); + + it('negative tests', () => { + expect(version.gte(1, 1.1)).toBe(false); + expect(version.gte(1, '1.0.1')).toBe(false); + expect(version.gte(1.2, 1.3)).toBe(false); + expect(version.gte(1.2, '1.3')).toBe(false); + expect(version.gte('1.2', 1.3)).toBe(false); + expect(version.gte('1.2', '1.3')).toBe(false); + expect(version.gte('1.2', '1.2.3')).toBe(false); + expect(version.gte('1.2.0', '1.2.3')).toBe(false); + }); + }); + + describe('parseMin()', () => { + it('finds minimum version', () => { + expect(version.parseMin('1')).toBe('1'); + expect(version.parseMin('1.2')).toBe('1.2'); + expect(version.parseMin('>=1.0')).toBe('1.0'); + expect(version.parseMin('<1.0')).toBe('1.0'); + expect(version.parseMin('>=2.3.3 <=4.2')).toBe('2.3.3'); + expect(version.parseMin('>=2.3.3 <=4.2 || >=1.0')).toBe('1.0'); + expect(version.parseMin('>=2.3.3 <=4.2 || 2.0')).toBe('2.0'); + }); + }); + + describe('parseMax()', () => { + it('finds maximum version', () => { + expect(version.parseMax('1')).toBe('1'); + expect(version.parseMax('1.2')).toBe('1.2'); + expect(version.parseMax('>=1.0')).toBe('1.0'); + expect(version.parseMax('<1.0')).toBe('1.0'); + expect(version.parseMax('<18')).toBe('<18'); + expect(version.parseMax('>=2.3.3 <=4.2')).toBe('4.2'); + expect(version.parseMax('>=2.3.3 <=4.2.x')).toBe('4.2'); + expect(version.parseMax('>=2.3.3 <=4.2.x', true)).toBe('4.2.x'); + expect(version.parseMax('>=2.3.3 <=4.2 || >=1.0')).toBe('4.2'); + expect(version.parseMax('>=2.3.3 <=4.2 || 5.0')).toBe('5.0'); + }); + }); + + describe('satisfies()', () => { + it('in range', () => { + expect(version.satisfies('1.0.0', '1.0.0')).toBe(true); + expect(version.satisfies('1.0.0', '*')).toBe(true); + expect(version.satisfies('1.0.0', '>=2.0.0 || *')).toBe(true); + expect(version.satisfies('1.0.0', '>=1.0.0')).toBe(true); + expect(version.satisfies('3.0.0', '>=2.3.3 <=4.2')).toBe(true); + expect(version.satisfies('4', '>=2.3.3 <=4.2 || 5.0 || >=6.0')).toBe(true); + expect(version.satisfies('5', '>=2.3.3 <=4.2 || 5.0 || >=6.0')).toBe(true); + expect(version.satisfies('6', '>=2.3.3 <=4.2 || 5.0 || >=6.0')).toBe(true); + expect(version.satisfies('7', '>=2.3.3 <=4.2 || 5.0 || >=6.0')).toBe(true); + expect(version.satisfies('18.0.1', '<=18.x')).toBe(true); + expect(version.satisfies('18.0.1', '>=18.x')).toBe(true); + expect(version.satisfies('18.0.1', '>=19.x')).toBe(false); + }); + + it('not in range', () => { + expect(version.satisfies('2.0.0', '1.0.0')).toBe(false); + expect(version.satisfies('2.0.0', '>=2.3.3 <=4.2')).toBe(false); + expect(version.satisfies('2.3', '>=2.3.3 <=4.2')).toBe(false); + expect(version.satisfies('4.3', '>=2.3.3 <=4.2 || 5.0 || >=6.0')).toBe(false); + expect(version.satisfies('5.1', '>=2.3.3 <=4.2 || 5.0 || >=6.0')).toBe(false); + }); + + it('maybe', () => { + expect(version.satisfies('2.0', '1.0', true)).toBe('maybe'); + expect(version.satisfies('2.0', '>=1.0', true)).toBe(true); + expect(version.satisfies('2.0', '<1.0', true)).toBe('maybe'); + expect(version.satisfies('2.0', '>=2.3.3 <=4.2', true)).toBe(false); + expect(version.satisfies('5.0', '>=2.3.3 <=4.2', true)).toBe('maybe'); + expect(version.satisfies('18', '>=10 <=18', true)).toBe(true); + }); + }); + + describe('sort()', () => { + it('should sort versions', () => { + expect(version.sort(['1.0.2', '1.0.1', '1.0.0'])) + .toEqual(['1.0.0', '1.0.1', '1.0.2']); + expect(version.sort(['1.0.2-beta', '1.0.1-beta', '1.0.0-beta'])) + .toEqual(['1.0.0-beta', '1.0.1-beta', '1.0.2-beta']); + expect(version.sort(['1.0.2-beta', '1.0.1-beta', '1.0.0-beta'])) + .toEqual(['1.0.0-beta', '1.0.1-beta', '1.0.2-beta']); + }); + }); +}); diff --git a/tests/adb_test.js b/tests/adb_test.js deleted file mode 100644 index fd06549f..00000000 --- a/tests/adb_test.js +++ /dev/null @@ -1,230 +0,0 @@ -/* eslint no-unused-expressions: "off" */ -'use strict'; - -function MockConfig() { - this.get = function (s, d) { - return d; - }; -} - -const fs = require('fs'); -const path = require('path'); -const semver = require('semver'); -const should = require('should'); // eslint-disable-line no-unused-vars -const android = require('../lib/android'); -android.androidPackageJson({ - vendorDependencies: { - 'android sdk': '>=23.x <=27.x', - 'android build tools': '>=25.x <=27.x', - 'android platform tools': '27.x', - 'android tools': '<=26.x', - 'android ndk': '>=r11c <=r16c', - node: '>=4.0 <=8.x', - java: '>=1.8.x' - }, -}); - -const ADB = require('../lib/adb'); -const Emulator = require('../lib/emulator'); - -const config = new MockConfig(); -const adb = new ADB(config); -const emulator = new Emulator(config); - -describe('adb', function () { - - it('#version() returns a valid semver string', function (finished) { - adb.version(function (err, ver) { - if (err) { - return finished(err); - } - ver.should.match(/^1\.0\.\d+/); - should(semver.valid(ver)).not.be.null(); - finished(); - }); - }); - - // TODO: Add test where we start an emulator first, get it in listing, then stop it? - it('#devices() returns empty Array when no emulators running', function (finished) { - adb.devices(function (err, devices) { - if (err) { - return finished(err); - } - devices.should.be.an.Array(); - finished(); - }); - }); - - // TODO: Start an emulator, make sure we get event? - it('#trackDevices()', function (finished) { - let connection; - function done(e) { - connection.end(); - finished(e); - } - connection = adb.trackDevices(function (err, devices) { - if (err) { - return done(err); - } - // console.log('trackDevicesCallback: ' + JSON.stringify(devices)); - devices.should.be.an.Array(); - done(); - }); - }); - - describe('with an emulator running', function () { - let avd; - let device; - - before(function (finished) { - this.timeout(30000); - - emulator.detect(function (err, avds) { - if (err) { - return finished(err); - } - if (avds.length === 0) { - return finished(new Error('Tests require at least one emulator defined!')); - } - avd = avds[0]; - - emulator.start(avd.id, function (err, emu) { - if (err) { - return finished(err); - } - - emu.on('ready', function (d) { - device = d; - finished(); - }); - - emu.on('timeout', function () { - finished(new Error('emulator.start() timed out')); - }); - }); - }); - }); - - after(function (finished) { - this.timeout(35000); - // Just call finished if there is no device, there may have been an issue when starting - // the emulator in the before - if (!device) { - return finished(); - } - emulator.stop(device.emulator.id, function (errOrCode) { - errOrCode.should.eql(0); - setTimeout(finished, 5000); // let it wait 5 seconds or else adb will still report it as connected - }); - }); - - it('#shell()', function (finished) { - adb.shell(device.id, 'cat /system/build.prop', function (err, data) { - if (err) { - return finished(err); - } - - // data is a Buffer! - data.should.be.ok(); - // (typeof data).should.eql('Buffer'); - - finished(); - }); - }); - - it('#startApp(), #getPid() and #stopApp()', function (finished) { - this.timeout(30000); - - const appId = 'com.android.settings'; - adb.startApp(device.id, appId, 'wifi.WifiStatusTest', function (err, data) { - should(err).not.be.ok(); - - // data is a Buffer! - data.should.be.ok(); // TODO: Test data.toString() holds particular text? - - adb.getPid(device.id, appId, function (err, pid) { - should(err).not.be.ok(); - - pid.should.be.a.Number(); - pid.should.not.eql(0); - - adb.stopApp(device.id, appId, function (err) { - should(err).not.be.ok(); - - finished(); - }); - }); - }); - }); - - it('#pull()', function (finished) { - const dest = path.join(__dirname, 'hosts'); - fs.existsSync(dest).should.eql(false); - - adb.pull(device.id, '/system/etc/hosts', __dirname, function (err) { - should(err).not.be.ok(); - - // verify build.prop exists in current dir now! - try { - fs.existsSync(dest).should.eql(true); - } finally { - try { - fs.unlinkSync(dest); - } catch (_error) { - // squash - } - } - finished(); - }); - }); - - it('#push()', function (finished) { - const dest = '/mnt/sdcard/tmp/test-adb.js'; - - // Ensure dest file doesn't exist - adb.shell(device.id, 'rm -f ' + dest, function (err) { - should(err).not.be.ok(); - - // Then piush this file to dest - adb.push(device.id, __filename, dest, function (err) { - should(err).not.be.ok(); - - // verify it now exists and matches - adb.shell(device.id, 'cat ' + dest, function (err, data) { - should(err).not.be.ok(); - - // data is a Buffer! - data.should.be.ok(); - // normalize newlines, android uses \r\n - data.toString().replace(/\r\n/g, '\n').should.eql(fs.readFileSync(__filename).toString()); - - finished(); - }); - }); - }); - }); - }); // with running emulator - - // TODO: Install a pre-built test app! - // function testInstallApp() { - // adb.installApp('emulator-5554', '~/appc/workspace/testapp2/build/android/bin/app.apk', function (err, data) { - // if (err) { - // console.error('ERROR! ' + err + '\n'); - // } else { - // console.log('-----------------------------------------------------------------'); - // console.log(data); - // console.log(''); - // } - // }); - // } - // - // function testForward() { - // adb.forward('015d21d4ff181a17', 'tcp:5000', 'tcp:6000', function (err, data) { - // if (err) { - // console.error('ERROR! ' + err + '\n'); - // } else { - // console.log('result = ' + data + '\n'); - // } - // }); - // } -}); diff --git a/tests/avd_test.js b/tests/avd_test.js deleted file mode 100644 index ce9bdd49..00000000 --- a/tests/avd_test.js +++ /dev/null @@ -1,105 +0,0 @@ -/* eslint no-unused-expressions: "off" */ -'use strict'; - -function MockConfig() { - this.get = function (s, d) { - return d; - }; -} - -const should = require('should'); // eslint-disable-line no-unused-vars - -const config = new MockConfig(); -const Emulator = require('../lib/emulator'); -const android = require('../lib/android'); -android.androidPackageJson({ - vendorDependencies: { - 'android sdk': '>=23.x <=27.x', - 'android build tools': '>=25.x <=27.x', - 'android platform tools': '27.x', - 'android tools': '<=26.x', - 'android ndk': '>=r11c <=r16c', - node: '>=4.0 <=8.x', - java: '>=1.8.x' - }, -}); -const emulator = new Emulator(config); - -describe('emulator', function () { - it('#detect() any', function (finished) { - emulator.detect(function (err, avds) { - avds.should.be.an.Array; - finished(err); - }); - }); - - it('#detect() type: avd', function (finished) { - emulator.detect({ type: 'avd' }, function (err, avds) { - avds.should.be.an.Array; - finished(err); - }); - }); - - describe('lifecycle', function () { - let avd; - - before(function (finished) { - emulator.detect(function (err, avds) { - if (err) { - return finished(err); - } - if (avds.length === 0) { - return finished(new Error('Tests require at least one emulator defined!')); - } - avd = avds[0]; - finished(); - }); - }); - - it('#isRunning() returns null object when not running', function (finished) { - emulator.isRunning(avd.id, function (err, emu) { - should(emu).not.be.ok; - - finished(err); - }); - }); - - // FIXME: This test isn't right. I think it will only pass when the emulator is running and we pass in the id (that has port in the value)? - // it('#isEmulator() returns matching emulator?', function (finished) { - // emulator.isEmulator(avd.name, function (err, emu) { - // emu.should.be.ok; - // finished(err); - // }); - // }); - - it('#start(), #isRunning() and #stop()', function (finished) { - this.slow(30000); - this.timeout(280000); - - emulator.start(avd.id, function (err, emu) { - if (err) { - return finished(err); - } - - emu.should.be.ok(); - - emu.on('ready', function (device) { - device.should.be.ok(); - - emulator.isRunning(device.emulator.id, function (err, emu) { - emu.should.be.ok(); - - emulator.stop(device.emulator.id, function (errOrCode) { - errOrCode.should.eql(0); - setTimeout(finished, 6000); // let it wait 5 seconds or else adb will still report it as connected - }); - }); - }); - - emu.on('timeout', function () { - finished(new Error('emulator.start() timed out')); - }); - }); - }); - }); -}); diff --git a/tests/i18n/en/en.xml b/tests/i18n/en/en.xml deleted file mode 100644 index c31259ca..00000000 --- a/tests/i18n/en/en.xml +++ /dev/null @@ -1,3 +0,0 @@ - - value - diff --git a/tests/i18n/es/app.xml b/tests/i18n/es/app.xml deleted file mode 100644 index a70779a9..00000000 --- a/tests/i18n/es/app.xml +++ /dev/null @@ -1,3 +0,0 @@ - - my spanish value - diff --git a/tests/i18n_test.js b/tests/i18n_test.js deleted file mode 100644 index 8df9bfd7..00000000 --- a/tests/i18n_test.js +++ /dev/null @@ -1,34 +0,0 @@ -/* eslint no-unused-expressions: "off" */ -'use strict'; - -const should = require('should'); // eslint-disable-line no-unused-vars -const i18n = require('../lib/i18n'); -const path = require('path'); - -describe('i18n', function () { - it('#load()', function () { - const result = i18n.load(__dirname); - result.should.be.an.Object; - // first language, places values into 'strings' property - result.should.have.ownProperty('en'); - result.en.should.have.ownProperty('strings'); - result.en.strings.should.have.ownProperty('whatever'); - result.en.strings.whatever.should.eql('value'); - - // second language, places app.xml values into 'app' property - result.should.have.ownProperty('es'); - result.es.should.have.ownProperty('app'); - result.es.app.should.have.ownProperty('whatever'); - result.es.app.whatever.should.eql('my spanish value'); - }); - - it('#findLaunchSreens()', function () { - const results = i18n.findLaunchScreens(__dirname, console); - - results.should.be.an.Array(); - results.length.should.equal(1); - results.should.deepEqual([ - path.join(__dirname, 'i18n', 'en', 'Default-568h@2x.png') - ]); - }); -}); diff --git a/tests/jsanalyze_test.js b/tests/jsanalyze_test.js deleted file mode 100644 index 37a789b0..00000000 --- a/tests/jsanalyze_test.js +++ /dev/null @@ -1,215 +0,0 @@ -/* eslint no-unused-expressions: "off" */ -'use strict'; - -const path = require('path'); -const fs = require('fs-extra'); -const should = require('should'); // eslint-disable-line no-unused-vars -const jsanalyze = require('../lib/jsanalyze'); -const sortObject = require('../lib/jsanalyze').sortObject; - -describe('jsanalyze', function () { - describe('#analyzeJs()', function () { - const tmpDir = path.join(__dirname, 'tmp'); - - before(function (finish) { - if (fs.existsSync(tmpDir)) { - fs.removeSync(tmpDir); - } - fs.ensureDir(tmpDir, finish); - }); - - after(function (finish) { - fs.remove(tmpDir, finish); - }); - - it('tracks Ti API symbols', function () { - const results = jsanalyze.analyzeJs('Ti.API.info("yeah");', {}); - results.symbols.should.eql([ 'API.info', 'API' ]); - }); - - it('Should ignore Ti in string', function () { - const results = jsanalyze.analyzeJs(` - Ti.API.info("Ti. In A String Causes Issues?".toUpperCase()); - Ti.API.info(\`Ti.UI.AlertDialog selected button at index: \${index}\`); - const message = \`Ti.UI.TabbedBar changed to index: \${index}\`; - const messageAfterTranspile = "Ti.UI.TabbedBar changed to index: ".concat(index); - const view = Ti.UI.createLabel(); - console.log(\`version is \${Ti.API.version}\`); - "Ti.Test".toUpperCase(); - Ti['UI'].createWebView(); - "Ti.Test"`, {}); - results.symbols.should.eql([ 'API.info', 'API', 'UI.createLabel', 'UI', 'API.version', 'UI.createWebView' ]); - }); - - it('tracks Ti API usage across multiple calls', function () { - const results = jsanalyze.analyzeJs('Ti.UI.createView({});', {}); - results.symbols.should.eql([ 'UI.createView', 'UI' ]); // symbols only includes from this call - // includes symbols from this test and the one above! - jsanalyze.getAPIUsage().should.eql({ - 'Titanium.API': 4, - 'Titanium.API.info': 3, - 'Titanium.API.version': 1, - 'Titanium.UI': 3, - 'Titanium.UI.createLabel': 1, - 'Titanium.UI.createView': 1, - 'Titanium.UI.createWebView': 1 - }); - }); - - it('converts global "this" references into "global" references when transpiling', function () { - const results = jsanalyze.analyzeJs('this.myGlobalMethod = function() {};', { transpile: true }); - results.contents.should.eql('global.myGlobalMethod = function () {};'); - }); - - it('doesn\'t converts function-scoped "this" references into "global" references when transpiling', function () { - const results = jsanalyze.analyzeJs('var myGlobalMethod = function() { return this; };', { transpile: true }); - results.contents.should.eql('var myGlobalMethod = function myGlobalMethod() {return this;};'); - }); - - it('generates source maps inline into generated js file', function () { - const inputJSFile = path.join(__dirname, 'resources/input.js'); - const contents = fs.readFileSync(inputJSFile, 'utf-8'); - let expectedSourceMap = fs.readJSONSync(`${inputJSFile}.map`); - - expectedSourceMap.sourceRoot = path.dirname(inputJSFile); - expectedSourceMap = sortObject(expectedSourceMap); - - const results = jsanalyze.analyzeJs(contents, - { - transpile: true, - sourceMap: true, - filename: inputJSFile - }); - const expectedBase64Map = Buffer.from(JSON.stringify(expectedSourceMap)).toString('base64'); - results.contents.should.eql(`var myGlobalMethod = function myGlobalMethod() {return this;};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,${expectedBase64Map}\n`); - }); - - it('generates source maps inline into generated js file and removes sourcesContent for android platform', function () { - const inputJSFile = path.join(__dirname, 'resources/input.js'); - const contents = fs.readFileSync(inputJSFile, 'utf-8'); - let expectedSourceMap = fs.readJSONSync(`${inputJSFile}.map`); - expectedSourceMap.sourceRoot = path.dirname(inputJSFile); - delete expectedSourceMap.sourcesContent; - expectedSourceMap = sortObject(expectedSourceMap); - const results = jsanalyze.analyzeJs(contents, - { - transpile: true, - sourceMap: true, - filename: inputJSFile, - platform: 'android', - }); - const expectedBase64Map = Buffer.from(JSON.stringify(expectedSourceMap)).toString('base64'); - results.contents.should.eql(`var myGlobalMethod = function myGlobalMethod() {return this;};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,${expectedBase64Map}\n`); - }); - - it('handles input JS file with existing sourceMappingURL pointing to file', function () { - const inputMapFile = path.join(__dirname, 'resources/input.js.map'); - const inputJSFile = path.join(__dirname, 'resources/input.js'); - const results = jsanalyze.analyzeJs(`var myGlobalMethod = function() { return this; };\n//# sourceMappingURL=file://${inputMapFile}`, - { - transpile: true, - sourceMap: true, - filename: 'intermediate.js' - }); - let expectedSourceMap = fs.readJSONSync(path.join(__dirname, 'resources/intermediate.js.map')); - expectedSourceMap.sourceRoot = path.dirname(inputJSFile); // passes along the original source file via sources/sourceRoot - expectedSourceMap = sortObject(expectedSourceMap); - const expectedBase64Map = Buffer.from(JSON.stringify(expectedSourceMap)).toString('base64'); - results.contents.should.eql(`var myGlobalMethod = function myGlobalMethod() {return this;};\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,${expectedBase64Map}\n`); - }); - - it('handles input JS file with existing sourceMappingURL with data: uri', function () { - const originalSourceFile = path.join(__dirname, 'resources/input.js'); - // given that it's inlined, it will try to resolve the relative 'input.js' source as relative to the JS filename we pass along in options. - const results = jsanalyze.analyzeJs('var myGlobalMethod = function() { return this; };\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImlucHV0LmpzIl0sIm5hbWVzIjpbIm15R2xvYmFsTWV0aG9kIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxjQUFjLEdBQUcsU0FBakJBLGNBQWMsR0FBYyxDQUFFLE9BQU8sSUFBSSxDQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgbXlHbG9iYWxNZXRob2QgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH07Il19', - { - transpile: true, - sourceMap: true, - filename: path.join(__dirname, 'resources/intermediate.js') - }); - let expectedSourceMap = fs.readJSONSync(path.join(__dirname, 'resources/intermediate.js.map')); - expectedSourceMap.sourceRoot = path.dirname(originalSourceFile); // passes along the original source file via sources/sourceRoot - expectedSourceMap = sortObject(expectedSourceMap); - const expectedBase64Map = Buffer.from(JSON.stringify(expectedSourceMap)).toString('base64'); - results.contents.should.eql(`var myGlobalMethod = function myGlobalMethod() {return this;};\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,${expectedBase64Map}\n`); - }); - - it('handles input JS file with existing sourceMappingURL pointing to non-existent file', function () { - // treat like there is no original input source map.... - // only difference here is that there's an extra newline to deal with versus the "base" test case - const inputJSFile = path.join(__dirname, 'resources/input.nonexistent.sourcemapfile.js'); - const contents = fs.readFileSync(inputJSFile, 'utf-8'); - let expectedSourceMap = fs.readJSONSync(path.join(__dirname, 'resources/input.nonexistent.sourcemapfile.js.map')); - expectedSourceMap.sourceRoot = path.dirname(inputJSFile); - expectedSourceMap = sortObject(expectedSourceMap); - const results = jsanalyze.analyzeJs(contents, - { - transpile: true, - sourceMap: true, - filename: inputJSFile - }); - const expectedBase64Map = Buffer.from(JSON.stringify(expectedSourceMap)).toString('base64'); - results.contents.should.eql(`var myGlobalMethod = function myGlobalMethod() {return this;};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,${expectedBase64Map}\n`); - }); - - // babel-plugin-transform-titanium - it('converts OS_IOS into boolean', () => { - const results = jsanalyze.analyzeJs('if (OS_IOS) {}', { transpile: true, transform: { platform: 'ios' } }); - results.contents.should.eql('if (true) {}'); - }); - - it('should fallback to looser parsing if required', () => { - const results = jsanalyze.analyzeJs('return "foo";'); - results.contents.should.eql('return "foo";'); - }); - - it('should handle errors', () => { - should(() => jsanalyze.analyzeJs('return foo!;console.log("bar");')).throw('Failed to parse undefined\nUnexpected token, expected ";" (1:10)'); - }); - }); - - describe('#analyzeJsFile()', function () { - it('should transform contents', function () { - const inputJSFile = path.join(__dirname, 'resources/input.js'); - - let expectedSourceMap = fs.readJSONSync(`${inputJSFile}.map`); - expectedSourceMap.sourceRoot = path.dirname(inputJSFile); - expectedSourceMap = sortObject(expectedSourceMap); - const results = jsanalyze.analyzeJsFile(inputJSFile, - { - transpile: true, - sourceMap: true - }); - const expectedBase64Map = Buffer.from(JSON.stringify(expectedSourceMap)).toString('base64'); - results.contents.should.eql(`var myGlobalMethod = function myGlobalMethod() {return this;};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,${expectedBase64Map}\n`); - }); - }); - - describe('#analyzeHtml', function () { - it('should analyze an html file', function () { - const inputFile = path.join(__dirname, 'resources/hello.html'); - - const results = jsanalyze.analyzeHtml(fs.readFileSync(inputFile, 'utf8')); - results.should.be.an.Array(); - results.length.should.equal(2); - results.should.deepEqual([ - 'input.js', - 'resources/input.js' - ]); - }); - }); - - describe('#analyzeHtmlFile', function () { - it('should analyze an html file', function () { - const inputFile = path.join(__dirname, 'resources/hello.html'); - - const results = jsanalyze.analyzeHtmlFile(inputFile); - results.should.be.an.Array(); - results.length.should.equal(2); - results.should.deepEqual([ - 'input.js', - 'resources/input.js' - ]); - }); - }); -}); diff --git a/tests/resources/hello.html b/tests/resources/hello.html deleted file mode 100644 index 17fce6fa..00000000 --- a/tests/resources/hello.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - A Small Hello - - - -

Hi

-

This is very minimal "hello world" HTML document.

- - diff --git a/tests/resources/input.js b/tests/resources/input.js deleted file mode 100644 index 87a10626..00000000 --- a/tests/resources/input.js +++ /dev/null @@ -1 +0,0 @@ -var myGlobalMethod = function() { return this; }; \ No newline at end of file diff --git a/tests/resources/input.nonexistent.sourcemapfile.js b/tests/resources/input.nonexistent.sourcemapfile.js deleted file mode 100644 index b8c84af3..00000000 --- a/tests/resources/input.nonexistent.sourcemapfile.js +++ /dev/null @@ -1,2 +0,0 @@ -var myGlobalMethod = function() { return this; }; -//# sourceMappingURL=madeup.js.map \ No newline at end of file diff --git a/tests/resources/tiapp1.xml b/tests/resources/tiapp1.xml deleted file mode 100644 index c82bcc59..00000000 --- a/tests/resources/tiapp1.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - ti.testapp - testapp - 1.0 - tester - http:// - not specified - 2012 by tester - appicon.png - false - false - default - false - false - false - false - 088dc83c-64af-4a81-b57c-7407649453f0 - system - - - Ti.UI.PORTRAIT - - - Ti.UI.PORTRAIT - Ti.UI.UPSIDE_PORTRAIT - Ti.UI.LANDSCAPE_LEFT - Ti.UI.LANDSCAPE_RIGHT - - - - - - - true - true - - default - - - diff --git a/tests/resources/tiapp2.xml b/tests/resources/tiapp2.xml deleted file mode 100644 index 7f7c874b..00000000 --- a/tests/resources/tiapp2.xml +++ /dev/null @@ -1,246 +0,0 @@ - - - - true - true - true - - 2.2.0 - ti.testapp - testapp - 1.0 - tester - http:// - not specified - 2012 by tester - appicon.png - false - false - default - false - false - false - false - 088dc83c-64af-4a81-b57c-7407649453f0 - system - production - true - false - false - false - this "one" with quotes - ti.testapp.invoke.push - ti.testapp.invoke.open - Some Title for BB Push, typically the app name" - true - - true - - ti-api-usage-finder - - - xyz - - - - true - true - true - true - #FFFFFF - 5.0 - foo - 10571 - - - group.com.appc.foo - group.com.appc.bar - - - - - application-identifier - XXXXXXXXXX.com.test.app - aps-environment - production - beta-reports-active - - get-task-allow - - keychain-access-groups - - XXXXXXXXXX.com.test.app - - - - - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIBackgroundModes - - audio - location - voip - newsstand-content - external-accessory - bluetooth-central - - UIRequiredDeviceCapabilities - - telephony - wifi - sms - still-camera - auto-focus-camera - front-facing-camera - camera-flash - video-camera - accelerometer - gyroscope - location-services - gps - magnetometer - gamekit - microphone - opengles-1 - opengles-2 - armv6 - armv7 - peer-peer - bluetooth-le - - UIRequiresPersistentWiFi - - UIPrerenderedIcon - - UIStatusBarHidden - - UIStatusBarStyle - UIStatusBarStyleBlackTranslucent - UIAppFonts - - /fonts/MyFont_1.otf - /fonts/MyFont_2.otf - - - - - - - - - - - - - - abc - 123 - - - - - - - - - - - - Ti.UI.PORTRAIT - - - Ti.UI.PORTRAIT - Ti.UI.UPSIDE_PORTRAIT - Ti.UI.LANDSCAPE_LEFT - Ti.UI.LANDSCAPE_RIGHT - - - audio - location - voip - - - telephony - wifi - sms - still-camera - auto-focus-camera - front-facing-camera - camera-flash - video-camera - accelerometer - gyroscope - location-services - gps - magnetometer - gamekit - microphone - opengles-1 - opengles-2 - armv6 - armv7 - peer-peer - - - - something - someicon.png - public.item,public.content - true - - - - - - - - - - - - - - - - - - - - - - - - 10 - true - armeabi,armeabi-v7a,x86 - - - - - - alloy - - some_module - - - - ti.alltest - ti.cjstest - ti.mwtest - ti.androidtest - ti.iphonetest - - - ti_sample_plugin - - diff --git a/tests/resources/tiapp3.xml b/tests/resources/tiapp3.xml deleted file mode 100644 index 109e00a5..00000000 --- a/tests/resources/tiapp3.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - activity2.js - activity3.js - - 10 - true - armeabi,armeabi-v7a,x86 - - - - testservice3.js - - - diff --git a/tests/resources/tiapp4.xml b/tests/resources/tiapp4.xml deleted file mode 100644 index c175d448..00000000 --- a/tests/resources/tiapp4.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - ti.testapp - testapp - 1.0 - tester - http:// - not specified - 2012 by tester - appicon.png - false - false - default - false - false - false - false - 088dc83c-64af-4a81-b57c-7407649453f0 - system - - - Ti.UI.PORTRAIT - - - Ti.UI.PORTRAIT - Ti.UI.UPSIDE_PORTRAIT - Ti.UI.LANDSCAPE_LEFT - Ti.UI.LANDSCAPE_RIGHT - - - - - - - true - true - - default - - - - com.windows.example - - diff --git a/tests/results/tiapp2.json b/tests/results/tiapp2.json deleted file mode 100644 index 668a74d9..00000000 --- a/tests/results/tiapp2.json +++ /dev/null @@ -1 +0,0 @@ -{"deployment-targets":{"iphone":true,"ipad":true,"android":true},"sdk-version":"2.2.0","id":"ti.testapp","name":"testapp","version":"1.0","publisher":"tester","url":"http://","description":"not specified","copyright":"2012 by tester","icon":"appicon.png","persistent-wifi":false,"prerendered-icon":false,"statusbar-style":"default","statusbar-hidden":false,"fullscreen":false,"navbar-hidden":false,"analytics":false,"guid":"088dc83c-64af-4a81-b57c-7407649453f0","properties":{"ti.ui.defaultunit":{"type":"string","value":"system"},"ti.deploytype":{"type":"string","value":"production"},"ti.android.debug":{"type":"bool","value":true},"ti.android.loadfromsdcard":{"type":"bool","value":false},"ti.android.compilejs":{"type":"bool","value":false},"ti.android.include_all_modules":{"type":"bool","value":false},"another property":{"type":"string","value":"this \"one\" with quotes"},"ti.bb.invoke.target.key.push":{"type":"string","value":"ti.testapp.invoke.push"},"ti.bb.invoke.target.key.open":{"type":"string","value":"ti.testapp.invoke.open"},"push_title":{"type":"string","value":"Some Title for BB Push, typically the app name\""},"run-on-main-thread":{"type":"bool","value":true}},"code-processor":{"enabled":true,"plugins":["ti-api-usage-finder"],"options":{"some-option":"xyz"}},"ios":{"enable-launch-screen-storyboard":true,"use-app-thinning":true,"enablecoverage":true,"enablemdfind":true,"default-background-color":"#FFFFFF","min-ios-ver":5,"team-id":"foo","log-server-port":10571,"capabilities":{"app-groups":["group.com.appc.foo","group.com.appc.bar"]},"entitlements":{"application-identifier":"XXXXXXXXXX.com.test.app","aps-environment":"production","beta-reports-active":true,"get-task-allow":false,"keychain-access-groups":["XXXXXXXXXX.com.test.app"]},"plist":{"UISupportedInterfaceOrientations":["UIInterfaceOrientationPortrait","UIInterfaceOrientationPortraitUpsideDown","UIInterfaceOrientationLandscapeLeft","UIInterfaceOrientationLandscapeRight"],"UIBackgroundModes":["audio","location","voip","newsstand-content","external-accessory","bluetooth-central"],"UIRequiredDeviceCapabilities":["telephony","wifi","sms","still-camera","auto-focus-camera","front-facing-camera","camera-flash","video-camera","accelerometer","gyroscope","location-services","gps","magnetometer","gamekit","microphone","opengles-1","opengles-2","armv6","armv7","peer-peer","bluetooth-le"],"UIRequiresPersistentWiFi":true,"UIPrerenderedIcon":true,"UIStatusBarHidden":true,"UIStatusBarStyle":"UIStatusBarStyleBlackTranslucent","UIAppFonts":["/fonts/MyFont_1.otf","/fonts/MyFont_2.otf"]},"extensions":[{"projectPath":"/path/to/extention","targets":[{"name":"Some Target","ppUUIDs":{}}]},{"projectPath":"/path/to/extention2","targets":[{"name":"Another Target","ppUUIDs":{"device":"abc","dist-appstore":123,"dist-adhoc":""}}]},{"projectPath":"/path/to/another/extention","targets":[{"name":"Test WatchKit Extension","ppUUIDs":{}}]}]},"iphone":{"orientations":{"iphone":["Ti.UI.PORTRAIT"],"ipad":["Ti.UI.PORTRAIT","Ti.UI.UPSIDE_PORTRAIT","Ti.UI.LANDSCAPE_LEFT","Ti.UI.LANDSCAPE_RIGHT"]},"backgroundModes":["audio","location","voip"],"requiredFeatures":["telephony","wifi","sms","still-camera","auto-focus-camera","front-facing-camera","camera-flash","video-camera","accelerometer","gyroscope","location-services","gps","magnetometer","gamekit","microphone","opengles-1","opengles-2","armv6","armv7","peer-peer"],"types":[{"name":"something","icon":"someicon.png","uti":["public.item","public.content"],"owner":true}]},"android":{"manifest":"\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t","tool-api-level":10,"abi":["armeabi","armeabi-v7a","x86"],"services":{"testservice.js":{"type":"interval","url":"testservice.js","classname":"TestserviceService"}}},"webpack":{"type":"alloy","transpileDependencies":["some_module"]},"modules":[{"id":"ti.alltest","platform":"","version":"1.2.3"},{"id":"ti.cjstest","platform":"commonjs","version":"1.2.3"},{"id":"ti.mwtest","platform":"mobileweb","version":"4.5.6"},{"id":"ti.androidtest","platform":"android","version":"7.8"},{"id":"ti.iphonetest","platform":"iphone","version":"9.0"}],"plugins":[{"id":"ti_sample_plugin","version":"1.0"}]} diff --git a/tests/results/tiapp2.pretty.json b/tests/results/tiapp2.pretty.json deleted file mode 100644 index bc10af5b..00000000 --- a/tests/results/tiapp2.pretty.json +++ /dev/null @@ -1,290 +0,0 @@ -{ - "deployment-targets": { - "iphone": true, - "ipad": true, - "android": true - }, - "sdk-version": "2.2.0", - "id": "ti.testapp", - "name": "testapp", - "version": "1.0", - "publisher": "tester", - "url": "http://", - "description": "not specified", - "copyright": "2012 by tester", - "icon": "appicon.png", - "persistent-wifi": false, - "prerendered-icon": false, - "statusbar-style": "default", - "statusbar-hidden": false, - "fullscreen": false, - "navbar-hidden": false, - "analytics": false, - "guid": "088dc83c-64af-4a81-b57c-7407649453f0", - "properties": { - "ti.ui.defaultunit": { - "type": "string", - "value": "system" - }, - "ti.deploytype": { - "type": "string", - "value": "production" - }, - "ti.android.debug": { - "type": "bool", - "value": true - }, - "ti.android.loadfromsdcard": { - "type": "bool", - "value": false - }, - "ti.android.compilejs": { - "type": "bool", - "value": false - }, - "ti.android.include_all_modules": { - "type": "bool", - "value": false - }, - "another property": { - "type": "string", - "value": "this \"one\" with quotes" - }, - "ti.bb.invoke.target.key.push": { - "type": "string", - "value": "ti.testapp.invoke.push" - }, - "ti.bb.invoke.target.key.open": { - "type": "string", - "value": "ti.testapp.invoke.open" - }, - "push_title": { - "type": "string", - "value": "Some Title for BB Push, typically the app name\"" - }, - "run-on-main-thread": { - "type": "bool", - "value": true - } - }, - "code-processor": { - "enabled": true, - "plugins": [ - "ti-api-usage-finder" - ], - "options": { - "some-option": "xyz" - } - }, - "ios": { - "enable-launch-screen-storyboard": true, - "use-app-thinning": true, - "enablecoverage": true, - "enablemdfind": true, - "default-background-color": "#FFFFFF", - "min-ios-ver": 5, - "team-id": "foo", - "log-server-port": 10571, - "capabilities": { - "app-groups": [ - "group.com.appc.foo", - "group.com.appc.bar" - ] - }, - "entitlements": { - "application-identifier": "XXXXXXXXXX.com.test.app", - "aps-environment": "production", - "beta-reports-active": true, - "get-task-allow": false, - "keychain-access-groups": [ - "XXXXXXXXXX.com.test.app" - ] - }, - "plist": { - "UISupportedInterfaceOrientations": [ - "UIInterfaceOrientationPortrait", - "UIInterfaceOrientationPortraitUpsideDown", - "UIInterfaceOrientationLandscapeLeft", - "UIInterfaceOrientationLandscapeRight" - ], - "UIBackgroundModes": [ - "audio", - "location", - "voip", - "newsstand-content", - "external-accessory", - "bluetooth-central" - ], - "UIRequiredDeviceCapabilities": [ - "telephony", - "wifi", - "sms", - "still-camera", - "auto-focus-camera", - "front-facing-camera", - "camera-flash", - "video-camera", - "accelerometer", - "gyroscope", - "location-services", - "gps", - "magnetometer", - "gamekit", - "microphone", - "opengles-1", - "opengles-2", - "armv6", - "armv7", - "peer-peer", - "bluetooth-le" - ], - "UIRequiresPersistentWiFi": true, - "UIPrerenderedIcon": true, - "UIStatusBarHidden": true, - "UIStatusBarStyle": "UIStatusBarStyleBlackTranslucent", - "UIAppFonts": [ - "/fonts/MyFont_1.otf", - "/fonts/MyFont_2.otf" - ] - }, - "extensions": [ - { - "projectPath": "/path/to/extention", - "targets": [ - { - "name": "Some Target", - "ppUUIDs": {} - } - ] - }, - { - "projectPath": "/path/to/extention2", - "targets": [ - { - "name": "Another Target", - "ppUUIDs": { - "device": "abc", - "dist-appstore": 123, - "dist-adhoc": "" - } - } - ] - }, - { - "projectPath": "/path/to/another/extention", - "targets": [ - { - "name": "Test WatchKit Extension", - "ppUUIDs": {} - } - ] - } - ] - }, - "iphone": { - "orientations": { - "iphone": [ - "Ti.UI.PORTRAIT" - ], - "ipad": [ - "Ti.UI.PORTRAIT", - "Ti.UI.UPSIDE_PORTRAIT", - "Ti.UI.LANDSCAPE_LEFT", - "Ti.UI.LANDSCAPE_RIGHT" - ] - }, - "backgroundModes": [ - "audio", - "location", - "voip" - ], - "requiredFeatures": [ - "telephony", - "wifi", - "sms", - "still-camera", - "auto-focus-camera", - "front-facing-camera", - "camera-flash", - "video-camera", - "accelerometer", - "gyroscope", - "location-services", - "gps", - "magnetometer", - "gamekit", - "microphone", - "opengles-1", - "opengles-2", - "armv6", - "armv7", - "peer-peer" - ], - "types": [ - { - "name": "something", - "icon": "someicon.png", - "uti": [ - "public.item", - "public.content" - ], - "owner": true - } - ] - }, - "android": { - "manifest": "\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t", - "tool-api-level": 10, - "abi": [ - "armeabi", - "armeabi-v7a", - "x86" - ], - "services": { - "testservice.js": { - "type": "interval", - "url": "testservice.js", - "classname": "TestserviceService" - } - } - }, - "webpack": { - "type": "alloy", - "transpileDependencies": [ - "some_module" - ] - }, - "modules": [ - { - "id": "ti.alltest", - "platform": "", - "version": "1.2.3" - }, - { - "id": "ti.cjstest", - "platform": "commonjs", - "version": "1.2.3" - }, - { - "id": "ti.mwtest", - "platform": "mobileweb", - "version": "4.5.6" - }, - { - "id": "ti.androidtest", - "platform": "android", - "version": "7.8" - }, - { - "id": "ti.iphonetest", - "platform": "iphone", - "version": "9.0" - } - ], - "plugins": [ - { - "id": "ti_sample_plugin", - "version": "1.0" - } - ] -} diff --git a/tests/results/tiapp2.xml b/tests/results/tiapp2.xml deleted file mode 100644 index 50145e90..00000000 --- a/tests/results/tiapp2.xml +++ /dev/null @@ -1,240 +0,0 @@ - - - - true - true - true - - 2.2.0 - ti.testapp - testapp - 1.0 - tester - http:// - not specified - 2012 by tester - appicon.png - false - false - default - false - false - false - false - 088dc83c-64af-4a81-b57c-7407649453f0 - system - production - true - false - false - false - this "one" with quotes - ti.testapp.invoke.push - ti.testapp.invoke.open - Some Title for BB Push, typically the app name" - true - - true - - ti-api-usage-finder - - - xyz - - - - true - true - true - 5.0 - #FFFFFF - foo - true - 10571 - - - group.com.appc.foo - group.com.appc.bar - - - - - application-identifier - XXXXXXXXXX.com.test.app - aps-environment - production - beta-reports-active - - get-task-allow - - keychain-access-groups - - XXXXXXXXXX.com.test.app - - - - - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIBackgroundModes - - audio - location - voip - newsstand-content - external-accessory - bluetooth-central - - UIRequiredDeviceCapabilities - - telephony - wifi - sms - still-camera - auto-focus-camera - front-facing-camera - camera-flash - video-camera - accelerometer - gyroscope - location-services - gps - magnetometer - gamekit - microphone - opengles-1 - opengles-2 - armv6 - armv7 - peer-peer - bluetooth-le - - UIRequiresPersistentWiFi - - UIPrerenderedIcon - - UIStatusBarHidden - - UIStatusBarStyle - UIStatusBarStyleBlackTranslucent - UIAppFonts - - /fonts/MyFont_1.otf - /fonts/MyFont_2.otf - - - - - - - - - - - - abc - 123 - - - - - - - - - - - - - Ti.UI.PORTRAIT - - - Ti.UI.PORTRAIT - Ti.UI.UPSIDE_PORTRAIT - Ti.UI.LANDSCAPE_LEFT - Ti.UI.LANDSCAPE_RIGHT - - - audio - location - voip - - - telephony - wifi - sms - still-camera - auto-focus-camera - front-facing-camera - camera-flash - video-camera - accelerometer - gyroscope - location-services - gps - magnetometer - gamekit - microphone - opengles-1 - opengles-2 - armv6 - armv7 - peer-peer - - - - something - someicon.png - public.item,public.content - true - - - - - - - - - - - - - - - - - - - - - - - 10 - armeabi,armeabi-v7a,x86 - - - - - - alloy - - some_module - - - - ti.alltest - ti.cjstest - ti.mwtest - ti.androidtest - ti.iphonetest - - - ti_sample_plugin - - diff --git a/tools/resizer/META-INF/MANIFEST.MF b/tools/resizer/META-INF/MANIFEST.MF new file mode 100644 index 00000000..6fe0046b --- /dev/null +++ b/tools/resizer/META-INF/MANIFEST.MF @@ -0,0 +1,2 @@ +Manifest-Version: 1.0 +Main-Class: com.appcelerator.image.Resizer diff --git a/tools/resizer/Makefile b/tools/resizer/Makefile new file mode 100644 index 00000000..2fa66c4b --- /dev/null +++ b/tools/resizer/Makefile @@ -0,0 +1,2 @@ +all: + javac -cp .:lib/imgscalr-lib-4.2.jar com/appcelerator/image/Resizer.java && jar cfm resizer.jar META-INF/MANIFEST.MF com/appcelerator/image/Resizer.class org/imgscalr/*.class diff --git a/tools/resizer/README.md b/tools/resizer/README.md new file mode 100644 index 00000000..4de94237 --- /dev/null +++ b/tools/resizer/README.md @@ -0,0 +1,20 @@ +# Resizer + +Resizer is a Java-based image resize command line tool that uses the imgscalr library. + +## Building + + make + +or + + javac -cp .:lib/imgscalr-lib-4.2.jar com/appcelerator/image/Resizer.java && jar cfm resizer.jar META-INF/MANIFEST.MF com/appcelerator/image/Resizer.class org/imgscalr/*.class + +## Example + + java -cp .:lib/imgscalr-lib-4.2.jar -Dquiet=true resizer appicon.png favicon.png 16 16 + +## imgscalr + +The [imgscalr](https://github.com/thebuzzmedia/imgscalr) Java-based image-scaling library is licensed under the Apache v2.0 license. +Copyright 2011 The Buzz Media, LLC. diff --git a/tools/resizer/com/appcelerator/image/Resizer.class b/tools/resizer/com/appcelerator/image/Resizer.class new file mode 100644 index 00000000..b140af39 Binary files /dev/null and b/tools/resizer/com/appcelerator/image/Resizer.class differ diff --git a/tools/resizer/com/appcelerator/image/Resizer.java b/tools/resizer/com/appcelerator/image/Resizer.java new file mode 100644 index 00000000..58744041 --- /dev/null +++ b/tools/resizer/com/appcelerator/image/Resizer.java @@ -0,0 +1,75 @@ +package com.appcelerator.image; + +import org.imgscalr.Scalr; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import javax.imageio.ImageIO; + +public class Resizer { + + private static void help() { + System.out.println("Titanium Image Resizer\n\nUsage:\n java -jar resizer.jar [ ]"); + System.exit(0); + } + + private static void error(String message) { + System.out.println("[ERROR] " + message); + System.exit(1); + } + + public static void main(String[] args) { + if (args.length < 4) + help(); + + System.setProperty("java.awt.headless", "true"); + + if (!(new File(args[0])).exists()) + error("Source image \"" + args[0] + "\" does not exist"); + + Boolean quiet = System.getProperty("quiet", "not set").equals("true"); + + try { + BufferedImage source = ImageIO.read(new File(args[0])); + + for (int i = 1; i < args.length; i += 3) { + String dest = args[i]; + File destFile = new File(dest); + int p = dest.lastIndexOf('.'); + if (p == -1) { + error("Invalid destination image \"" + dest + "\", image must have an extension"); + } + + String ext = dest.substring(p + 1, dest.length()); + + int width = 16; + try { + width = Integer.parseInt(args[i + 1]); + } catch (NumberFormatException nfe) { + error("Invalid image width \"" + args[i + 1] + "\""); + } + + int height = 16; + try { + height = Integer.parseInt(args[i + 2]); + } catch (NumberFormatException nfe) { + error("Invalid image height \"" + args[i + 2] + "\""); + } + + try { + if (!quiet) { + System.out.println("[INFO] Creating " + dest); + } + ImageIO.write(Scalr.resize(source, Scalr.Method.ULTRA_QUALITY, Scalr.Mode.FIT_EXACT, width, height), ext, destFile); + } catch (IOException ioe) { + error("Unable to writing destination image \"" + dest + "\""); + } + } + } catch (IOException ioe) { + error("Unable to read source image \"" + args[0] + "\""); + } + + System.exit(0); + } + +} diff --git a/tools/resizer/lib/imgscalr-lib-4.2.jar b/tools/resizer/lib/imgscalr-lib-4.2.jar new file mode 100644 index 00000000..bb7a406b Binary files /dev/null and b/tools/resizer/lib/imgscalr-lib-4.2.jar differ diff --git a/tools/resizer/org/imgscalr/AsyncScalr$1.class b/tools/resizer/org/imgscalr/AsyncScalr$1.class new file mode 100644 index 00000000..ccc09b01 Binary files /dev/null and b/tools/resizer/org/imgscalr/AsyncScalr$1.class differ diff --git a/tools/resizer/org/imgscalr/AsyncScalr$10.class b/tools/resizer/org/imgscalr/AsyncScalr$10.class new file mode 100644 index 00000000..32579b54 Binary files /dev/null and b/tools/resizer/org/imgscalr/AsyncScalr$10.class differ diff --git a/tools/resizer/org/imgscalr/AsyncScalr$11.class b/tools/resizer/org/imgscalr/AsyncScalr$11.class new file mode 100644 index 00000000..59dbc959 Binary files /dev/null and b/tools/resizer/org/imgscalr/AsyncScalr$11.class differ diff --git a/tools/resizer/org/imgscalr/AsyncScalr$12.class b/tools/resizer/org/imgscalr/AsyncScalr$12.class new file mode 100644 index 00000000..ad793d42 Binary files /dev/null and b/tools/resizer/org/imgscalr/AsyncScalr$12.class differ diff --git a/tools/resizer/org/imgscalr/AsyncScalr$13.class b/tools/resizer/org/imgscalr/AsyncScalr$13.class new file mode 100644 index 00000000..8fed4094 Binary files /dev/null and b/tools/resizer/org/imgscalr/AsyncScalr$13.class differ diff --git a/tools/resizer/org/imgscalr/AsyncScalr$14.class b/tools/resizer/org/imgscalr/AsyncScalr$14.class new file mode 100644 index 00000000..39ba85b2 Binary files /dev/null and b/tools/resizer/org/imgscalr/AsyncScalr$14.class differ diff --git a/tools/resizer/org/imgscalr/AsyncScalr$2.class b/tools/resizer/org/imgscalr/AsyncScalr$2.class new file mode 100644 index 00000000..385d0f95 Binary files /dev/null and b/tools/resizer/org/imgscalr/AsyncScalr$2.class differ diff --git a/tools/resizer/org/imgscalr/AsyncScalr$3.class b/tools/resizer/org/imgscalr/AsyncScalr$3.class new file mode 100644 index 00000000..3af798a5 Binary files /dev/null and b/tools/resizer/org/imgscalr/AsyncScalr$3.class differ diff --git a/tools/resizer/org/imgscalr/AsyncScalr$4.class b/tools/resizer/org/imgscalr/AsyncScalr$4.class new file mode 100644 index 00000000..9cf25d30 Binary files /dev/null and b/tools/resizer/org/imgscalr/AsyncScalr$4.class differ diff --git a/tools/resizer/org/imgscalr/AsyncScalr$5.class b/tools/resizer/org/imgscalr/AsyncScalr$5.class new file mode 100644 index 00000000..6f30c794 Binary files /dev/null and b/tools/resizer/org/imgscalr/AsyncScalr$5.class differ diff --git a/tools/resizer/org/imgscalr/AsyncScalr$6.class b/tools/resizer/org/imgscalr/AsyncScalr$6.class new file mode 100644 index 00000000..1b5cf510 Binary files /dev/null and b/tools/resizer/org/imgscalr/AsyncScalr$6.class differ diff --git a/tools/resizer/org/imgscalr/AsyncScalr$7.class b/tools/resizer/org/imgscalr/AsyncScalr$7.class new file mode 100644 index 00000000..e3593191 Binary files /dev/null and b/tools/resizer/org/imgscalr/AsyncScalr$7.class differ diff --git a/tools/resizer/org/imgscalr/AsyncScalr$8.class b/tools/resizer/org/imgscalr/AsyncScalr$8.class new file mode 100644 index 00000000..a6762472 Binary files /dev/null and b/tools/resizer/org/imgscalr/AsyncScalr$8.class differ diff --git a/tools/resizer/org/imgscalr/AsyncScalr$9.class b/tools/resizer/org/imgscalr/AsyncScalr$9.class new file mode 100644 index 00000000..5053a79f Binary files /dev/null and b/tools/resizer/org/imgscalr/AsyncScalr$9.class differ diff --git a/tools/resizer/org/imgscalr/AsyncScalr$DefaultThreadFactory.class b/tools/resizer/org/imgscalr/AsyncScalr$DefaultThreadFactory.class new file mode 100644 index 00000000..7bd455ae Binary files /dev/null and b/tools/resizer/org/imgscalr/AsyncScalr$DefaultThreadFactory.class differ diff --git a/tools/resizer/org/imgscalr/AsyncScalr$ServerThreadFactory.class b/tools/resizer/org/imgscalr/AsyncScalr$ServerThreadFactory.class new file mode 100644 index 00000000..3c371764 Binary files /dev/null and b/tools/resizer/org/imgscalr/AsyncScalr$ServerThreadFactory.class differ diff --git a/tools/resizer/org/imgscalr/AsyncScalr.class b/tools/resizer/org/imgscalr/AsyncScalr.class new file mode 100644 index 00000000..cfb7b92b Binary files /dev/null and b/tools/resizer/org/imgscalr/AsyncScalr.class differ diff --git a/tools/resizer/org/imgscalr/Main.class b/tools/resizer/org/imgscalr/Main.class new file mode 100644 index 00000000..85281dd1 Binary files /dev/null and b/tools/resizer/org/imgscalr/Main.class differ diff --git a/tools/resizer/org/imgscalr/Scalr$1.class b/tools/resizer/org/imgscalr/Scalr$1.class new file mode 100644 index 00000000..c96d486b Binary files /dev/null and b/tools/resizer/org/imgscalr/Scalr$1.class differ diff --git a/tools/resizer/org/imgscalr/Scalr$Method.class b/tools/resizer/org/imgscalr/Scalr$Method.class new file mode 100644 index 00000000..d02dcdd2 Binary files /dev/null and b/tools/resizer/org/imgscalr/Scalr$Method.class differ diff --git a/tools/resizer/org/imgscalr/Scalr$Mode.class b/tools/resizer/org/imgscalr/Scalr$Mode.class new file mode 100644 index 00000000..710392a0 Binary files /dev/null and b/tools/resizer/org/imgscalr/Scalr$Mode.class differ diff --git a/tools/resizer/org/imgscalr/Scalr$Rotation.class b/tools/resizer/org/imgscalr/Scalr$Rotation.class new file mode 100644 index 00000000..17314bf6 Binary files /dev/null and b/tools/resizer/org/imgscalr/Scalr$Rotation.class differ diff --git a/tools/resizer/org/imgscalr/Scalr.class b/tools/resizer/org/imgscalr/Scalr.class new file mode 100644 index 00000000..b129eeab Binary files /dev/null and b/tools/resizer/org/imgscalr/Scalr.class differ diff --git a/tools/resizer/org/imgscalr/imgscalr-mac.png b/tools/resizer/org/imgscalr/imgscalr-mac.png new file mode 100644 index 00000000..e47d925d Binary files /dev/null and b/tools/resizer/org/imgscalr/imgscalr-mac.png differ diff --git a/tools/resizer/resizer.jar b/tools/resizer/resizer.jar new file mode 100644 index 00000000..031f6c6d Binary files /dev/null and b/tools/resizer/resizer.jar differ diff --git a/tsconfig.build.json b/tsconfig.build.json new file mode 100644 index 00000000..58fbd1d4 --- /dev/null +++ b/tsconfig.build.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "module": "esnext", + "moduleResolution": "Bundler", + "rootDir": "./src", + "sourceMap": true + }, + "extends": "./tsconfig.json", + "include": ["./src"] +} diff --git a/tsconfig.check.json b/tsconfig.check.json new file mode 100644 index 00000000..e8edd233 --- /dev/null +++ b/tsconfig.check.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "declaration": false, + "noEmit": true + }, + "include": ["./dist"], + "exclude": [] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..7077e885 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "allowSyntheticDefaultImports": true, + "composite": false, + "declaration": true, + "declarationMap": false, + "esModuleInterop": false, + "forceConsistentCasingInFileNames": true, + "inlineSources": false, + "isolatedDeclarations": true, + "isolatedModules": true, + "lib": ["esnext"], + "module": "esnext", + "moduleResolution": "node", + "noImplicitAny": false, + "noUnusedLocals": false, + "noUnusedParameters": false, + "outDir": "./dist", + "preserveWatchOutput": true, + "removeComments": true, + "skipLibCheck": true, + "strict": true, + "sourceMap": false, + "target": "esnext", + "typeRoots": ["./node_modules/@types"], + "types": ["node"] + }, + "include": ["./tsdown.config.ts", "./src", "./test"] +} diff --git a/tsdown.config.ts b/tsdown.config.ts new file mode 100644 index 00000000..c07e2302 --- /dev/null +++ b/tsdown.config.ts @@ -0,0 +1,26 @@ +import replace from '@rollup/plugin-replace'; +import { readFileSync } from 'node:fs'; +import { defineConfig, type UserConfig } from 'tsdown'; + +const { version } = JSON.parse(readFileSync('./package.json', 'utf8')); + +const config: UserConfig = defineConfig({ + external: [ + 'msgpackr', + 'ordered-binary', + ], + entry: './src/index.ts', + format: ['es', 'cjs'], + minify: !process.env.SKIP_MINIFY, + platform: 'node', + plugins: [ + replace({ + preventAssignment: true, + values: { + 'ROCKSDB_JS_VERSION': version, + }, + }), + ], + tsconfig: './tsconfig.build.json', +}); +export default config; diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 00000000..93222892 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,17 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + allowOnly: true, + coverage: { + include: ['src/**/*.ts'], + reporter: ['html', 'lcov', 'text'], + }, + environment: 'node', + globals: false, + include: ['test/**/*.test.ts'], + reporters: ['verbose'], + silent: false, + watch: false, + }, +});