diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..43b0d22 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,47 @@ +name: Release + +on: + push: + branches: + - main + +jobs: + release: + name: Release + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - name: Use pnpm 8.x + uses: pnpm/action-setup@v2 + with: + version: 8 + + - name: Use Node.js 20.x + uses: actions/setup-node@v3 + with: + node-version: 20 + cache: 'pnpm' + + - name: Install Dependencies + run: CI=true pnpm install + + - name: Biome CI + run: pnpm exec biome ci . + + - name: Build + run: pnpm build + + - name: Semantic Release + uses: cycjimmy/semantic-release-action@v3 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + HUSKY: 0 + id: semantic + with: + semantic_version: 19.0.5 + extra_plugins: | + @semantic-release/changelog@6.0 + @semantic-release/git@10.0 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e660115 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/cdk.out +/node_modules +/dist diff --git a/.lefthook/commit-msg/commitlint.sh b/.lefthook/commit-msg/commitlint.sh new file mode 100755 index 0000000..0a9c5a3 --- /dev/null +++ b/.lefthook/commit-msg/commitlint.sh @@ -0,0 +1 @@ +echo $(head -n1 $1) | npx commitlint --color diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..4f8b39e --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Soliant Consulting + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..937e358 --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +# Create Auth0 CICD + +Init project for creating Auth0 CICD projects with Bitbucket Pipelines integration. + +To create a new project, run the following command: + +```pnpm dlx @soliantconsulting/create-auth0-cicd@latest []``` + +The script will place the project in a directory with the given name under the current working directory. diff --git a/assets/logo.svg b/assets/logo.svg new file mode 100644 index 0000000..877cdfe --- /dev/null +++ b/assets/logo.svg @@ -0,0 +1,2 @@ + + diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..5984454 --- /dev/null +++ b/biome.json @@ -0,0 +1,56 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.5.2/schema.json", + "organizeImports": { + "enabled": true + }, + "files": { + "include": [ + "biome.json", + "cdk.json", + "release.config.cjs", + "commitlint.config.cjs", + "src/**/*" + ] + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "nursery": { + "noEmptyTypeParameters": "error", + "noInvalidUseBeforeDeclaration": "error", + "noUnusedImports": "error", + "noUnusedPrivateClassMembers": "error", + "noUselessLoneBlockStatements": "error", + "noUselessTernary": "error", + "useExportType": "error", + "useImportType": "error", + "useForOf": "error", + "useGroupedTypeImport": "error" + }, + "complexity": { + "noExcessiveCognitiveComplexity": "warn", + "useSimplifiedLogicExpression": "error" + }, + "correctness": { + "noNewSymbol": "error" + }, + "style": { + "useBlockStatements": "error", + "useCollapsedElseIf": "error", + "useShorthandArrayType": "error", + "useShorthandAssign": "error", + "useSingleCaseStatement": "error" + }, + "suspicious": { + "noApproximativeNumericConstant": "warn", + "noConsoleLog": "error" + } + } + }, + "formatter": { + "indentStyle": "space", + "indentWidth": 4, + "lineWidth": 100 + } +} diff --git a/commitlint.config.cjs b/commitlint.config.cjs new file mode 100644 index 0000000..5073c20 --- /dev/null +++ b/commitlint.config.cjs @@ -0,0 +1 @@ +module.exports = { extends: ["@commitlint/config-conventional"] }; diff --git a/lefthook.yml b/lefthook.yml new file mode 100644 index 0000000..dcd16bb --- /dev/null +++ b/lefthook.yml @@ -0,0 +1,10 @@ +pre-commit: + commands: + check: + glob: "*.{js,ts,cjs,mjs,d.cts,d.mts,jsx,tsx,json,jsonc}" + run: npx biome check --apply --no-errors-on-unmatched --files-ignore-unknown=true {staged_files} && git update-index --again + +commit-msg: + scripts: + "commitlint.sh": + runner: bash diff --git a/package.json b/package.json new file mode 100644 index 0000000..cbab249 --- /dev/null +++ b/package.json @@ -0,0 +1,63 @@ +{ + "name": "@soliantconsulting/create-auth0-cicd", + "version": "1.0.0", + "description": "Create Auth0 CICD", + "type": "module", + "author": "Soliant Consulting", + "license": "MIT", + "publishConfig": { + "access": "public" + }, + "files": [ + "dist/**/*", + "skeleton/**/*" + ], + "bin": { + "create-auth0-cicd": "./dist/cli.js" + }, + "scripts": { + "build": "tsc", + "format": "biome format . --write", + "check": "biome check . --apply" + }, + "devDependencies": { + "@biomejs/biome": "1.5.3", + "@commitlint/cli": "^18.5.0", + "@commitlint/config-conventional": "^18.5.0", + "@tsconfig/node20": "^20.1.2", + "@types/node": "^20.11.5", + "@types/semver": "^7.5.6", + "@types/slug": "^5.0.7", + "@types/source-map-support": "^0.5.10", + "lefthook": "^1.6.0", + "pkg-types": "^1.0.3", + "tsx": "^4.7.0", + "typescript": "^5.3.3" + }, + "dependencies": { + "@aws-cdk/cli-lib-alpha": "2.130.0-alpha.0", + "@aws-sdk/client-acm": "^3.496.0", + "@aws-sdk/client-cloudformation": "^3.496.0", + "@aws-sdk/client-iam": "^3.523.0", + "@aws-sdk/client-s3": "^3.523.0", + "@aws-sdk/client-sts": "^3.496.0", + "@listr2/prompt-adapter-enquirer": "^2.0.1", + "@soliantconsulting/bitbucket-cloud-cli-auth": "^1.0.0", + "@soliantconsulting/bitbucket-openid-connect": "^1.1.1", + "auth0": "^4.3.1", + "aws-cdk": "^2.122.0", + "aws-cdk-lib": "^2.130.0", + "camelcase": "^8.0.0", + "constructs": "^10.3.0", + "deepmerge": "^4.3.1", + "enquirer": "^2.4.1", + "execa": "^8.0.1", + "glob": "^10.3.10", + "handlebars": "^4.7.8", + "listr2": "^8.0.1", + "meow": "^13.1.0", + "semver": "^7.5.4", + "slug": "^8.2.3", + "source-map-support": "^0.5.21" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..3744016 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,4516 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@aws-cdk/cli-lib-alpha': + specifier: 2.130.0-alpha.0 + version: 2.130.0-alpha.0 + '@aws-sdk/client-acm': + specifier: ^3.496.0 + version: 3.496.0 + '@aws-sdk/client-cloudformation': + specifier: ^3.496.0 + version: 3.496.0 + '@aws-sdk/client-iam': + specifier: ^3.523.0 + version: 3.523.0 + '@aws-sdk/client-s3': + specifier: ^3.523.0 + version: 3.523.0 + '@aws-sdk/client-sts': + specifier: ^3.496.0 + version: 3.496.0 + '@listr2/prompt-adapter-enquirer': + specifier: ^2.0.1 + version: 2.0.1(enquirer@2.4.1) + '@soliantconsulting/bitbucket-cloud-cli-auth': + specifier: ^1.0.0 + version: 1.0.0 + '@soliantconsulting/bitbucket-openid-connect': + specifier: ^1.1.1 + version: 1.1.1 + auth0: + specifier: ^4.3.1 + version: 4.3.1 + aws-cdk: + specifier: ^2.122.0 + version: 2.122.0 + aws-cdk-lib: + specifier: ^2.130.0 + version: 2.130.0(constructs@10.3.0) + camelcase: + specifier: ^8.0.0 + version: 8.0.0 + constructs: + specifier: ^10.3.0 + version: 10.3.0 + deepmerge: + specifier: ^4.3.1 + version: 4.3.1 + enquirer: + specifier: ^2.4.1 + version: 2.4.1 + execa: + specifier: ^8.0.1 + version: 8.0.1 + glob: + specifier: ^10.3.10 + version: 10.3.10 + handlebars: + specifier: ^4.7.8 + version: 4.7.8 + listr2: + specifier: ^8.0.1 + version: 8.0.1 + meow: + specifier: ^13.1.0 + version: 13.1.0 + semver: + specifier: ^7.5.4 + version: 7.5.4 + slug: + specifier: ^8.2.3 + version: 8.2.3 + source-map-support: + specifier: ^0.5.21 + version: 0.5.21 + +devDependencies: + '@biomejs/biome': + specifier: 1.5.3 + version: 1.5.3 + '@commitlint/cli': + specifier: ^18.5.0 + version: 18.5.0(@types/node@20.11.5)(typescript@5.3.3) + '@commitlint/config-conventional': + specifier: ^18.5.0 + version: 18.5.0 + '@tsconfig/node20': + specifier: ^20.1.2 + version: 20.1.2 + '@types/node': + specifier: ^20.11.5 + version: 20.11.5 + '@types/semver': + specifier: ^7.5.6 + version: 7.5.6 + '@types/slug': + specifier: ^5.0.7 + version: 5.0.7 + '@types/source-map-support': + specifier: ^0.5.10 + version: 0.5.10 + lefthook: + specifier: ^1.6.0 + version: 1.6.0 + pkg-types: + specifier: ^1.0.3 + version: 1.0.3 + tsx: + specifier: ^4.7.0 + version: 4.7.0 + typescript: + specifier: ^5.3.3 + version: 5.3.3 + +packages: + + /@aws-cdk/asset-awscli-v1@2.2.202: + resolution: {integrity: sha512-JqlF0D4+EVugnG5dAsNZMqhu3HW7ehOXm5SDMxMbXNDMdsF0pxtQKNHRl52z1U9igsHmaFpUgSGjbhAJ+0JONg==} + dev: false + + /@aws-cdk/asset-kubectl-v20@2.1.2: + resolution: {integrity: sha512-3M2tELJOxQv0apCIiuKQ4pAbncz9GuLwnKFqxifWfe77wuMxyTRPmxssYHs42ePqzap1LT6GDcPygGs+hHstLg==} + dev: false + + /@aws-cdk/asset-node-proxy-agent-v6@2.0.1: + resolution: {integrity: sha512-DDt4SLdLOwWCjGtltH4VCST7hpOI5DzieuhGZsBpZ+AgJdSI2GCjklCXm0GCTwJG/SolkL5dtQXyUKgg9luBDg==} + dev: false + + /@aws-cdk/cli-lib-alpha@2.122.0-alpha.0: + resolution: {integrity: sha512-Kes7hAz9QU5sbtzqwFt32cOG2/pfH4OCDqVqsUg8YRKWy5lz4IkxgjuEbcHfNuu/gv52HYTsgGOkcAbG0unSXQ==} + engines: {node: '>= 14.15.0'} + dev: false + + /@aws-cdk/cli-lib-alpha@2.130.0-alpha.0: + resolution: {integrity: sha512-CZPcTnC7Lyfco6WaLkAT1z7PZK+u3G1K3LvaRQtAzotKnx4ejK1V16zdU7Z4XjorjHayiFKsmQqlJqu/qMqR9w==} + engines: {node: '>= 14.15.0'} + dev: false + + /@aws-crypto/crc32@3.0.0: + resolution: {integrity: sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==} + dependencies: + '@aws-crypto/util': 3.0.0 + '@aws-sdk/types': 3.496.0 + tslib: 1.14.1 + dev: false + + /@aws-crypto/crc32c@3.0.0: + resolution: {integrity: sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w==} + dependencies: + '@aws-crypto/util': 3.0.0 + '@aws-sdk/types': 3.523.0 + tslib: 1.14.1 + dev: false + + /@aws-crypto/ie11-detection@3.0.0: + resolution: {integrity: sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==} + dependencies: + tslib: 1.14.1 + dev: false + + /@aws-crypto/sha1-browser@3.0.0: + resolution: {integrity: sha512-NJth5c997GLHs6nOYTzFKTbYdMNA6/1XlKVgnZoaZcQ7z7UJlOgj2JdbHE8tiYLS3fzXNCguct77SPGat2raSw==} + dependencies: + '@aws-crypto/ie11-detection': 3.0.0 + '@aws-crypto/supports-web-crypto': 3.0.0 + '@aws-crypto/util': 3.0.0 + '@aws-sdk/types': 3.523.0 + '@aws-sdk/util-locate-window': 3.495.0 + '@aws-sdk/util-utf8-browser': 3.259.0 + tslib: 1.14.1 + dev: false + + /@aws-crypto/sha256-browser@3.0.0: + resolution: {integrity: sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==} + dependencies: + '@aws-crypto/ie11-detection': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-crypto/supports-web-crypto': 3.0.0 + '@aws-crypto/util': 3.0.0 + '@aws-sdk/types': 3.496.0 + '@aws-sdk/util-locate-window': 3.495.0 + '@aws-sdk/util-utf8-browser': 3.259.0 + tslib: 1.14.1 + dev: false + + /@aws-crypto/sha256-js@3.0.0: + resolution: {integrity: sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==} + dependencies: + '@aws-crypto/util': 3.0.0 + '@aws-sdk/types': 3.496.0 + tslib: 1.14.1 + dev: false + + /@aws-crypto/supports-web-crypto@3.0.0: + resolution: {integrity: sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==} + dependencies: + tslib: 1.14.1 + dev: false + + /@aws-crypto/util@3.0.0: + resolution: {integrity: sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==} + dependencies: + '@aws-sdk/types': 3.496.0 + '@aws-sdk/util-utf8-browser': 3.259.0 + tslib: 1.14.1 + dev: false + + /@aws-sdk/client-acm@3.496.0: + resolution: {integrity: sha512-f01lz/1+HHX+Jdg5hWDXdRzrTt3AIsj49Oe+o1YnyAtS4XkGEES3K5gnwVkqesGLeRZnQlYFrVCJnGP9lsLhmQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/client-sts': 3.496.0 + '@aws-sdk/core': 3.496.0 + '@aws-sdk/credential-provider-node': 3.496.0 + '@aws-sdk/middleware-host-header': 3.496.0 + '@aws-sdk/middleware-logger': 3.496.0 + '@aws-sdk/middleware-recursion-detection': 3.496.0 + '@aws-sdk/middleware-signing': 3.496.0 + '@aws-sdk/middleware-user-agent': 3.496.0 + '@aws-sdk/region-config-resolver': 3.496.0 + '@aws-sdk/types': 3.496.0 + '@aws-sdk/util-endpoints': 3.496.0 + '@aws-sdk/util-user-agent-browser': 3.496.0 + '@aws-sdk/util-user-agent-node': 3.496.0 + '@smithy/config-resolver': 2.1.1 + '@smithy/core': 1.3.1 + '@smithy/fetch-http-handler': 2.4.1 + '@smithy/hash-node': 2.1.1 + '@smithy/invalid-dependency': 2.1.1 + '@smithy/middleware-content-length': 2.1.1 + '@smithy/middleware-endpoint': 2.4.1 + '@smithy/middleware-retry': 2.1.1 + '@smithy/middleware-serde': 2.1.1 + '@smithy/middleware-stack': 2.1.1 + '@smithy/node-config-provider': 2.2.1 + '@smithy/node-http-handler': 2.3.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/smithy-client': 2.3.1 + '@smithy/types': 2.9.1 + '@smithy/url-parser': 2.1.1 + '@smithy/util-base64': 2.1.1 + '@smithy/util-body-length-browser': 2.1.1 + '@smithy/util-body-length-node': 2.2.1 + '@smithy/util-defaults-mode-browser': 2.1.1 + '@smithy/util-defaults-mode-node': 2.1.1 + '@smithy/util-endpoints': 1.1.1 + '@smithy/util-retry': 2.1.1 + '@smithy/util-utf8': 2.1.1 + '@smithy/util-waiter': 2.1.1 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/client-cloudformation@3.496.0: + resolution: {integrity: sha512-yfbwzt06QFfCMjRe5oceIsnoFMDGViIoLRh5jDsF65oJxRH8WDUkKq34XFa/7nIIqKZ4U1tlHPCirhqjx64s7A==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/client-sts': 3.496.0 + '@aws-sdk/core': 3.496.0 + '@aws-sdk/credential-provider-node': 3.496.0 + '@aws-sdk/middleware-host-header': 3.496.0 + '@aws-sdk/middleware-logger': 3.496.0 + '@aws-sdk/middleware-recursion-detection': 3.496.0 + '@aws-sdk/middleware-signing': 3.496.0 + '@aws-sdk/middleware-user-agent': 3.496.0 + '@aws-sdk/region-config-resolver': 3.496.0 + '@aws-sdk/types': 3.496.0 + '@aws-sdk/util-endpoints': 3.496.0 + '@aws-sdk/util-user-agent-browser': 3.496.0 + '@aws-sdk/util-user-agent-node': 3.496.0 + '@smithy/config-resolver': 2.1.1 + '@smithy/core': 1.3.1 + '@smithy/fetch-http-handler': 2.4.1 + '@smithy/hash-node': 2.1.1 + '@smithy/invalid-dependency': 2.1.1 + '@smithy/middleware-content-length': 2.1.1 + '@smithy/middleware-endpoint': 2.4.1 + '@smithy/middleware-retry': 2.1.1 + '@smithy/middleware-serde': 2.1.1 + '@smithy/middleware-stack': 2.1.1 + '@smithy/node-config-provider': 2.2.1 + '@smithy/node-http-handler': 2.3.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/smithy-client': 2.3.1 + '@smithy/types': 2.9.1 + '@smithy/url-parser': 2.1.1 + '@smithy/util-base64': 2.1.1 + '@smithy/util-body-length-browser': 2.1.1 + '@smithy/util-body-length-node': 2.2.1 + '@smithy/util-defaults-mode-browser': 2.1.1 + '@smithy/util-defaults-mode-node': 2.1.1 + '@smithy/util-endpoints': 1.1.1 + '@smithy/util-retry': 2.1.1 + '@smithy/util-utf8': 2.1.1 + '@smithy/util-waiter': 2.1.1 + fast-xml-parser: 4.2.5 + tslib: 2.6.2 + uuid: 8.3.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/client-iam@3.523.0: + resolution: {integrity: sha512-ghiGVdklDJIrwDbIGRogPeDOiPyzBdIKMKSN3fM6fPm0q0KjcEuvUrDxxytkrKOMgi9yNnCDCukHcZS6KkvtEg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/client-sts': 3.523.0(@aws-sdk/credential-provider-node@3.523.0) + '@aws-sdk/core': 3.523.0 + '@aws-sdk/credential-provider-node': 3.523.0 + '@aws-sdk/middleware-host-header': 3.523.0 + '@aws-sdk/middleware-logger': 3.523.0 + '@aws-sdk/middleware-recursion-detection': 3.523.0 + '@aws-sdk/middleware-user-agent': 3.523.0 + '@aws-sdk/region-config-resolver': 3.523.0 + '@aws-sdk/types': 3.523.0 + '@aws-sdk/util-endpoints': 3.523.0 + '@aws-sdk/util-user-agent-browser': 3.523.0 + '@aws-sdk/util-user-agent-node': 3.523.0 + '@smithy/config-resolver': 2.1.4 + '@smithy/core': 1.3.5 + '@smithy/fetch-http-handler': 2.4.3 + '@smithy/hash-node': 2.1.3 + '@smithy/invalid-dependency': 2.1.3 + '@smithy/middleware-content-length': 2.1.3 + '@smithy/middleware-endpoint': 2.4.4 + '@smithy/middleware-retry': 2.1.4 + '@smithy/middleware-serde': 2.1.3 + '@smithy/middleware-stack': 2.1.3 + '@smithy/node-config-provider': 2.2.4 + '@smithy/node-http-handler': 2.4.1 + '@smithy/protocol-http': 3.2.1 + '@smithy/smithy-client': 2.4.2 + '@smithy/types': 2.10.1 + '@smithy/url-parser': 2.1.3 + '@smithy/util-base64': 2.1.1 + '@smithy/util-body-length-browser': 2.1.1 + '@smithy/util-body-length-node': 2.2.1 + '@smithy/util-defaults-mode-browser': 2.1.4 + '@smithy/util-defaults-mode-node': 2.2.3 + '@smithy/util-endpoints': 1.1.4 + '@smithy/util-middleware': 2.1.3 + '@smithy/util-retry': 2.1.3 + '@smithy/util-utf8': 2.1.1 + '@smithy/util-waiter': 2.1.3 + fast-xml-parser: 4.2.5 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/client-s3@3.523.0: + resolution: {integrity: sha512-d8kFgZpdHOCLtv38nNkItTs3Ew+Ui/YadkCprvbY0boCrFZFTynficFM4orVk+fV3beJ2qVeJm6t8t14V5TaVA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/sha1-browser': 3.0.0 + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/client-sts': 3.523.0(@aws-sdk/credential-provider-node@3.523.0) + '@aws-sdk/core': 3.523.0 + '@aws-sdk/credential-provider-node': 3.523.0 + '@aws-sdk/middleware-bucket-endpoint': 3.523.0 + '@aws-sdk/middleware-expect-continue': 3.523.0 + '@aws-sdk/middleware-flexible-checksums': 3.523.0 + '@aws-sdk/middleware-host-header': 3.523.0 + '@aws-sdk/middleware-location-constraint': 3.523.0 + '@aws-sdk/middleware-logger': 3.523.0 + '@aws-sdk/middleware-recursion-detection': 3.523.0 + '@aws-sdk/middleware-sdk-s3': 3.523.0 + '@aws-sdk/middleware-signing': 3.523.0 + '@aws-sdk/middleware-ssec': 3.523.0 + '@aws-sdk/middleware-user-agent': 3.523.0 + '@aws-sdk/region-config-resolver': 3.523.0 + '@aws-sdk/signature-v4-multi-region': 3.523.0 + '@aws-sdk/types': 3.523.0 + '@aws-sdk/util-endpoints': 3.523.0 + '@aws-sdk/util-user-agent-browser': 3.523.0 + '@aws-sdk/util-user-agent-node': 3.523.0 + '@aws-sdk/xml-builder': 3.523.0 + '@smithy/config-resolver': 2.1.4 + '@smithy/core': 1.3.5 + '@smithy/eventstream-serde-browser': 2.1.3 + '@smithy/eventstream-serde-config-resolver': 2.1.3 + '@smithy/eventstream-serde-node': 2.1.3 + '@smithy/fetch-http-handler': 2.4.3 + '@smithy/hash-blob-browser': 2.1.3 + '@smithy/hash-node': 2.1.3 + '@smithy/hash-stream-node': 2.1.3 + '@smithy/invalid-dependency': 2.1.3 + '@smithy/md5-js': 2.1.3 + '@smithy/middleware-content-length': 2.1.3 + '@smithy/middleware-endpoint': 2.4.4 + '@smithy/middleware-retry': 2.1.4 + '@smithy/middleware-serde': 2.1.3 + '@smithy/middleware-stack': 2.1.3 + '@smithy/node-config-provider': 2.2.4 + '@smithy/node-http-handler': 2.4.1 + '@smithy/protocol-http': 3.2.1 + '@smithy/smithy-client': 2.4.2 + '@smithy/types': 2.10.1 + '@smithy/url-parser': 2.1.3 + '@smithy/util-base64': 2.1.1 + '@smithy/util-body-length-browser': 2.1.1 + '@smithy/util-body-length-node': 2.2.1 + '@smithy/util-defaults-mode-browser': 2.1.4 + '@smithy/util-defaults-mode-node': 2.2.3 + '@smithy/util-endpoints': 1.1.4 + '@smithy/util-retry': 2.1.3 + '@smithy/util-stream': 2.1.3 + '@smithy/util-utf8': 2.1.1 + '@smithy/util-waiter': 2.1.3 + fast-xml-parser: 4.2.5 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/client-sso-oidc@3.523.0(@aws-sdk/credential-provider-node@3.523.0): + resolution: {integrity: sha512-OktkdiuJ5DtYgNrJlo53Tf7pJ+UWfOt7V7or0ije6MysLP18GwlTkbg2UE4EUtfOxt/baXxHMlExB1vmRtlATw==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@aws-sdk/credential-provider-node': ^3.523.0 + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/client-sts': 3.523.0(@aws-sdk/credential-provider-node@3.523.0) + '@aws-sdk/core': 3.523.0 + '@aws-sdk/credential-provider-node': 3.523.0 + '@aws-sdk/middleware-host-header': 3.523.0 + '@aws-sdk/middleware-logger': 3.523.0 + '@aws-sdk/middleware-recursion-detection': 3.523.0 + '@aws-sdk/middleware-user-agent': 3.523.0 + '@aws-sdk/region-config-resolver': 3.523.0 + '@aws-sdk/types': 3.523.0 + '@aws-sdk/util-endpoints': 3.523.0 + '@aws-sdk/util-user-agent-browser': 3.523.0 + '@aws-sdk/util-user-agent-node': 3.523.0 + '@smithy/config-resolver': 2.1.4 + '@smithy/core': 1.3.5 + '@smithy/fetch-http-handler': 2.4.3 + '@smithy/hash-node': 2.1.3 + '@smithy/invalid-dependency': 2.1.3 + '@smithy/middleware-content-length': 2.1.3 + '@smithy/middleware-endpoint': 2.4.4 + '@smithy/middleware-retry': 2.1.4 + '@smithy/middleware-serde': 2.1.3 + '@smithy/middleware-stack': 2.1.3 + '@smithy/node-config-provider': 2.2.4 + '@smithy/node-http-handler': 2.4.1 + '@smithy/protocol-http': 3.2.1 + '@smithy/smithy-client': 2.4.2 + '@smithy/types': 2.10.1 + '@smithy/url-parser': 2.1.3 + '@smithy/util-base64': 2.1.1 + '@smithy/util-body-length-browser': 2.1.1 + '@smithy/util-body-length-node': 2.2.1 + '@smithy/util-defaults-mode-browser': 2.1.4 + '@smithy/util-defaults-mode-node': 2.2.3 + '@smithy/util-endpoints': 1.1.4 + '@smithy/util-middleware': 2.1.3 + '@smithy/util-retry': 2.1.3 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/client-sso@3.496.0: + resolution: {integrity: sha512-fuaMuxKg7CMUsP9l3kxYWCOxFsBjdA0xj5nlikaDm1661/gB4KkAiGqRY8LsQkpNXvXU8Nj+f7oCFADFyGYzyw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/core': 3.496.0 + '@aws-sdk/middleware-host-header': 3.496.0 + '@aws-sdk/middleware-logger': 3.496.0 + '@aws-sdk/middleware-recursion-detection': 3.496.0 + '@aws-sdk/middleware-user-agent': 3.496.0 + '@aws-sdk/region-config-resolver': 3.496.0 + '@aws-sdk/types': 3.496.0 + '@aws-sdk/util-endpoints': 3.496.0 + '@aws-sdk/util-user-agent-browser': 3.496.0 + '@aws-sdk/util-user-agent-node': 3.496.0 + '@smithy/config-resolver': 2.1.1 + '@smithy/core': 1.3.1 + '@smithy/fetch-http-handler': 2.4.1 + '@smithy/hash-node': 2.1.1 + '@smithy/invalid-dependency': 2.1.1 + '@smithy/middleware-content-length': 2.1.1 + '@smithy/middleware-endpoint': 2.4.1 + '@smithy/middleware-retry': 2.1.1 + '@smithy/middleware-serde': 2.1.1 + '@smithy/middleware-stack': 2.1.1 + '@smithy/node-config-provider': 2.2.1 + '@smithy/node-http-handler': 2.3.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/smithy-client': 2.3.1 + '@smithy/types': 2.9.1 + '@smithy/url-parser': 2.1.1 + '@smithy/util-base64': 2.1.1 + '@smithy/util-body-length-browser': 2.1.1 + '@smithy/util-body-length-node': 2.2.1 + '@smithy/util-defaults-mode-browser': 2.1.1 + '@smithy/util-defaults-mode-node': 2.1.1 + '@smithy/util-endpoints': 1.1.1 + '@smithy/util-retry': 2.1.1 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/client-sso@3.523.0: + resolution: {integrity: sha512-vob/Tk9bIr6VIyzScBWsKpP92ACI6/aOXBL2BITgvRWl5Umqi1jXFtfssj/N2UJHM4CBMRwxIJ33InfN0gPxZw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/core': 3.523.0 + '@aws-sdk/middleware-host-header': 3.523.0 + '@aws-sdk/middleware-logger': 3.523.0 + '@aws-sdk/middleware-recursion-detection': 3.523.0 + '@aws-sdk/middleware-user-agent': 3.523.0 + '@aws-sdk/region-config-resolver': 3.523.0 + '@aws-sdk/types': 3.523.0 + '@aws-sdk/util-endpoints': 3.523.0 + '@aws-sdk/util-user-agent-browser': 3.523.0 + '@aws-sdk/util-user-agent-node': 3.523.0 + '@smithy/config-resolver': 2.1.4 + '@smithy/core': 1.3.5 + '@smithy/fetch-http-handler': 2.4.3 + '@smithy/hash-node': 2.1.3 + '@smithy/invalid-dependency': 2.1.3 + '@smithy/middleware-content-length': 2.1.3 + '@smithy/middleware-endpoint': 2.4.4 + '@smithy/middleware-retry': 2.1.4 + '@smithy/middleware-serde': 2.1.3 + '@smithy/middleware-stack': 2.1.3 + '@smithy/node-config-provider': 2.2.4 + '@smithy/node-http-handler': 2.4.1 + '@smithy/protocol-http': 3.2.1 + '@smithy/smithy-client': 2.4.2 + '@smithy/types': 2.10.1 + '@smithy/url-parser': 2.1.3 + '@smithy/util-base64': 2.1.1 + '@smithy/util-body-length-browser': 2.1.1 + '@smithy/util-body-length-node': 2.2.1 + '@smithy/util-defaults-mode-browser': 2.1.4 + '@smithy/util-defaults-mode-node': 2.2.3 + '@smithy/util-endpoints': 1.1.4 + '@smithy/util-middleware': 2.1.3 + '@smithy/util-retry': 2.1.3 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/client-sts@3.496.0: + resolution: {integrity: sha512-3pSdqgegdwbK3CT1WvGHhA+Bf91R9cr8G1Ynp+iU2wZvy8ueJfMUk0NYfjo3EEv0YhSbMLKuduzZfvQHFHXYhw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/core': 3.496.0 + '@aws-sdk/credential-provider-node': 3.496.0 + '@aws-sdk/middleware-host-header': 3.496.0 + '@aws-sdk/middleware-logger': 3.496.0 + '@aws-sdk/middleware-recursion-detection': 3.496.0 + '@aws-sdk/middleware-user-agent': 3.496.0 + '@aws-sdk/region-config-resolver': 3.496.0 + '@aws-sdk/types': 3.496.0 + '@aws-sdk/util-endpoints': 3.496.0 + '@aws-sdk/util-user-agent-browser': 3.496.0 + '@aws-sdk/util-user-agent-node': 3.496.0 + '@smithy/config-resolver': 2.1.1 + '@smithy/core': 1.3.1 + '@smithy/fetch-http-handler': 2.4.1 + '@smithy/hash-node': 2.1.1 + '@smithy/invalid-dependency': 2.1.1 + '@smithy/middleware-content-length': 2.1.1 + '@smithy/middleware-endpoint': 2.4.1 + '@smithy/middleware-retry': 2.1.1 + '@smithy/middleware-serde': 2.1.1 + '@smithy/middleware-stack': 2.1.1 + '@smithy/node-config-provider': 2.2.1 + '@smithy/node-http-handler': 2.3.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/smithy-client': 2.3.1 + '@smithy/types': 2.9.1 + '@smithy/url-parser': 2.1.1 + '@smithy/util-base64': 2.1.1 + '@smithy/util-body-length-browser': 2.1.1 + '@smithy/util-body-length-node': 2.2.1 + '@smithy/util-defaults-mode-browser': 2.1.1 + '@smithy/util-defaults-mode-node': 2.1.1 + '@smithy/util-endpoints': 1.1.1 + '@smithy/util-middleware': 2.1.1 + '@smithy/util-retry': 2.1.1 + '@smithy/util-utf8': 2.1.1 + fast-xml-parser: 4.2.5 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/client-sts@3.523.0(@aws-sdk/credential-provider-node@3.523.0): + resolution: {integrity: sha512-ggAkL8szaJkqD8oOsS68URJ9XMDbLA/INO/NPZJqv9BhmftecJvfy43uUVWGNs6n4YXNzfF0Y+zQ3DT0fZkv9g==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@aws-sdk/credential-provider-node': ^3.523.0 + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/core': 3.523.0 + '@aws-sdk/credential-provider-node': 3.523.0 + '@aws-sdk/middleware-host-header': 3.523.0 + '@aws-sdk/middleware-logger': 3.523.0 + '@aws-sdk/middleware-recursion-detection': 3.523.0 + '@aws-sdk/middleware-user-agent': 3.523.0 + '@aws-sdk/region-config-resolver': 3.523.0 + '@aws-sdk/types': 3.523.0 + '@aws-sdk/util-endpoints': 3.523.0 + '@aws-sdk/util-user-agent-browser': 3.523.0 + '@aws-sdk/util-user-agent-node': 3.523.0 + '@smithy/config-resolver': 2.1.4 + '@smithy/core': 1.3.5 + '@smithy/fetch-http-handler': 2.4.3 + '@smithy/hash-node': 2.1.3 + '@smithy/invalid-dependency': 2.1.3 + '@smithy/middleware-content-length': 2.1.3 + '@smithy/middleware-endpoint': 2.4.4 + '@smithy/middleware-retry': 2.1.4 + '@smithy/middleware-serde': 2.1.3 + '@smithy/middleware-stack': 2.1.3 + '@smithy/node-config-provider': 2.2.4 + '@smithy/node-http-handler': 2.4.1 + '@smithy/protocol-http': 3.2.1 + '@smithy/smithy-client': 2.4.2 + '@smithy/types': 2.10.1 + '@smithy/url-parser': 2.1.3 + '@smithy/util-base64': 2.1.1 + '@smithy/util-body-length-browser': 2.1.1 + '@smithy/util-body-length-node': 2.2.1 + '@smithy/util-defaults-mode-browser': 2.1.4 + '@smithy/util-defaults-mode-node': 2.2.3 + '@smithy/util-endpoints': 1.1.4 + '@smithy/util-middleware': 2.1.3 + '@smithy/util-retry': 2.1.3 + '@smithy/util-utf8': 2.1.1 + fast-xml-parser: 4.2.5 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/core@3.496.0: + resolution: {integrity: sha512-yT+ug7Cw/3eJi7x2es0+46x12+cIJm5Xv+GPWsrTFD1TKgqO/VPEgfDtHFagDNbFmjNQA65Ygc/kEdIX9ICX/A==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/core': 1.3.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/signature-v4': 2.1.1 + '@smithy/smithy-client': 2.3.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/core@3.523.0: + resolution: {integrity: sha512-JHa3ngEWkTzZ2YTn6EavcADC8gv6zZU4U9WBAleClh6ioXH0kGMBawZje3y0F0mKyLTfLhFqFUlCV5sngI/Qcw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/core': 1.3.5 + '@smithy/protocol-http': 3.2.1 + '@smithy/signature-v4': 2.1.3 + '@smithy/smithy-client': 2.4.2 + '@smithy/types': 2.10.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/credential-provider-env@3.496.0: + resolution: {integrity: sha512-lukQMJ8SWWP5RqkRNOHi/H+WMhRvSWa3Fc5Jf/VP6xHiPLfF1XafcvthtV91e0VwPCiseI+HqChrcGq8pvnxHw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.496.0 + '@smithy/property-provider': 2.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/credential-provider-env@3.523.0: + resolution: {integrity: sha512-Y6DWdH6/OuMDoNKVzZlNeBc6f1Yjk1lYMjANKpIhMbkRCvLJw/PYZKOZa8WpXbTYdgg9XLjKybnLIb3ww3uuzA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.523.0 + '@smithy/property-provider': 2.1.3 + '@smithy/types': 2.10.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/credential-provider-http@3.523.0: + resolution: {integrity: sha512-6YUtePbn3UFpY9qfVwHFWIVnFvVS5vsbGxxkTO02swvZBvVG4sdG0Xj0AbotUNQNY9QTCN7WkhwIrd50rfDQ9Q==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.523.0 + '@smithy/fetch-http-handler': 2.4.3 + '@smithy/node-http-handler': 2.4.1 + '@smithy/property-provider': 2.1.3 + '@smithy/protocol-http': 3.2.1 + '@smithy/smithy-client': 2.4.2 + '@smithy/types': 2.10.1 + '@smithy/util-stream': 2.1.3 + tslib: 2.6.2 + dev: false + + /@aws-sdk/credential-provider-ini@3.496.0: + resolution: {integrity: sha512-2nD1jp1sIwcQaWK1y/9ruQOkW16RUxZpzgjbW/gnK3iiUXwx+/FNQWxshud+GTSx3Q4x6eIhqsbjtP4VVPPuUA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/credential-provider-env': 3.496.0 + '@aws-sdk/credential-provider-process': 3.496.0 + '@aws-sdk/credential-provider-sso': 3.496.0 + '@aws-sdk/credential-provider-web-identity': 3.496.0 + '@aws-sdk/types': 3.496.0 + '@smithy/credential-provider-imds': 2.2.1 + '@smithy/property-provider': 2.1.1 + '@smithy/shared-ini-file-loader': 2.3.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/credential-provider-ini@3.523.0(@aws-sdk/credential-provider-node@3.523.0): + resolution: {integrity: sha512-dRch5Ts67FFRZY5r9DpiC3PM6BVHv1tRcy1b26hoqfFkxP9xYH3dsTSPBog1azIqaJa2GcXqEvKCqhghFTt4Xg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/client-sts': 3.523.0(@aws-sdk/credential-provider-node@3.523.0) + '@aws-sdk/credential-provider-env': 3.523.0 + '@aws-sdk/credential-provider-process': 3.523.0 + '@aws-sdk/credential-provider-sso': 3.523.0(@aws-sdk/credential-provider-node@3.523.0) + '@aws-sdk/credential-provider-web-identity': 3.523.0(@aws-sdk/credential-provider-node@3.523.0) + '@aws-sdk/types': 3.523.0 + '@smithy/credential-provider-imds': 2.2.4 + '@smithy/property-provider': 2.1.3 + '@smithy/shared-ini-file-loader': 2.3.4 + '@smithy/types': 2.10.1 + tslib: 2.6.2 + transitivePeerDependencies: + - '@aws-sdk/credential-provider-node' + - aws-crt + dev: false + + /@aws-sdk/credential-provider-node@3.496.0: + resolution: {integrity: sha512-IVF9RvLePfRa5S5/eBIRChJCWOzQkGwM8P/L79Gl84u/cH2oSG4NtUI/YTDlrtmnYn7YsGhINSV0WnzfF2twfQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/credential-provider-env': 3.496.0 + '@aws-sdk/credential-provider-ini': 3.496.0 + '@aws-sdk/credential-provider-process': 3.496.0 + '@aws-sdk/credential-provider-sso': 3.496.0 + '@aws-sdk/credential-provider-web-identity': 3.496.0 + '@aws-sdk/types': 3.496.0 + '@smithy/credential-provider-imds': 2.2.1 + '@smithy/property-provider': 2.1.1 + '@smithy/shared-ini-file-loader': 2.3.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/credential-provider-node@3.523.0: + resolution: {integrity: sha512-0aW5ylA8pZmvv/8qA/+iel4acEyzSlHRiaHYL3L0qu9SSoe2a92+RHjrxKl6+Sb55eA2mRfQjaN8oOa5xiYyKA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/credential-provider-env': 3.523.0 + '@aws-sdk/credential-provider-http': 3.523.0 + '@aws-sdk/credential-provider-ini': 3.523.0(@aws-sdk/credential-provider-node@3.523.0) + '@aws-sdk/credential-provider-process': 3.523.0 + '@aws-sdk/credential-provider-sso': 3.523.0(@aws-sdk/credential-provider-node@3.523.0) + '@aws-sdk/credential-provider-web-identity': 3.523.0(@aws-sdk/credential-provider-node@3.523.0) + '@aws-sdk/types': 3.523.0 + '@smithy/credential-provider-imds': 2.2.4 + '@smithy/property-provider': 2.1.3 + '@smithy/shared-ini-file-loader': 2.3.4 + '@smithy/types': 2.10.1 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/credential-provider-process@3.496.0: + resolution: {integrity: sha512-/YZscCTGOKVmGr916Th4XF8Sz6JDtZ/n2loHG9exok9iy/qIbACsTRNLP9zexPxhPoue/oZqecY5xbVljfY34A==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.496.0 + '@smithy/property-provider': 2.1.1 + '@smithy/shared-ini-file-loader': 2.3.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/credential-provider-process@3.523.0: + resolution: {integrity: sha512-f0LP9KlFmMvPWdKeUKYlZ6FkQAECUeZMmISsv6NKtvPCI9e4O4cLTeR09telwDK8P0HrgcRuZfXM7E30m8re0Q==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.523.0 + '@smithy/property-provider': 2.1.3 + '@smithy/shared-ini-file-loader': 2.3.4 + '@smithy/types': 2.10.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/credential-provider-sso@3.496.0: + resolution: {integrity: sha512-eP7GxpT2QYubSDG7uk1GJW4eNymZCq65IxDyEFCXOP/kfqkxriCY+iVEFG6/Mo3LxvgrgHXU4jxrCAXMAWN43g==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/client-sso': 3.496.0 + '@aws-sdk/token-providers': 3.496.0 + '@aws-sdk/types': 3.496.0 + '@smithy/property-provider': 2.1.1 + '@smithy/shared-ini-file-loader': 2.3.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/credential-provider-sso@3.523.0(@aws-sdk/credential-provider-node@3.523.0): + resolution: {integrity: sha512-/VfOJuI8ImV//W4gr+yieF/4shzWAzWYeaaNu7hv161C5YW7/OoCygwRVHSnF4KKeUGQZomZWwml5zHZ57f8xQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/client-sso': 3.523.0 + '@aws-sdk/token-providers': 3.523.0(@aws-sdk/credential-provider-node@3.523.0) + '@aws-sdk/types': 3.523.0 + '@smithy/property-provider': 2.1.3 + '@smithy/shared-ini-file-loader': 2.3.4 + '@smithy/types': 2.10.1 + tslib: 2.6.2 + transitivePeerDependencies: + - '@aws-sdk/credential-provider-node' + - aws-crt + dev: false + + /@aws-sdk/credential-provider-web-identity@3.496.0: + resolution: {integrity: sha512-IbP+qLlvJSpNPj+zW6TtFuLRTK5Tf0hW+2pom4vFyi5YSH4pn8UOC136UdewX8vhXGS9BJQ5zBDMasIyl5VeGQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.496.0 + '@smithy/property-provider': 2.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/credential-provider-web-identity@3.523.0(@aws-sdk/credential-provider-node@3.523.0): + resolution: {integrity: sha512-EyBwVoTNZrhLRIHly3JnLzy86deT2hHGoxSCrT3+cVcF1Pq3FPp6n9fUkHd6Yel+wFrjpXCRggLddPvajUoXtQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/client-sts': 3.523.0(@aws-sdk/credential-provider-node@3.523.0) + '@aws-sdk/types': 3.523.0 + '@smithy/property-provider': 2.1.3 + '@smithy/types': 2.10.1 + tslib: 2.6.2 + transitivePeerDependencies: + - '@aws-sdk/credential-provider-node' + - aws-crt + dev: false + + /@aws-sdk/middleware-bucket-endpoint@3.523.0: + resolution: {integrity: sha512-mrZbixWjk0d9NqxC4xBnKtfwErum0we4Uk2O4fgvDVI+XxAimUlZ9c4o/QJ2+TzeQ/8QclT2k4WidsQdWtPNvg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.523.0 + '@aws-sdk/util-arn-parser': 3.495.0 + '@smithy/node-config-provider': 2.2.4 + '@smithy/protocol-http': 3.2.1 + '@smithy/types': 2.10.1 + '@smithy/util-config-provider': 2.2.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-expect-continue@3.523.0: + resolution: {integrity: sha512-E5DyRAHU39VHaAlQLqXYS/IKpgk3vsryuU6kkOcIIK8Dgw0a2tjoh5AOCaNa8pD+KgAGrFp35JIMSX1zui5diA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.523.0 + '@smithy/protocol-http': 3.2.1 + '@smithy/types': 2.10.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-flexible-checksums@3.523.0: + resolution: {integrity: sha512-lIa1TdWY9q4zsDFarfSnYcdrwPR+nypaU4n6hb95i620/1F5M5s6H8P0hYtwTNNvx+slrR8F3VBML9pjBtzAHw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/crc32': 3.0.0 + '@aws-crypto/crc32c': 3.0.0 + '@aws-sdk/types': 3.523.0 + '@smithy/is-array-buffer': 2.1.1 + '@smithy/protocol-http': 3.2.1 + '@smithy/types': 2.10.1 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-host-header@3.496.0: + resolution: {integrity: sha512-jUdPpSJeqCYXf6hSjfwsfHway7peIV8Vz51w/BN91bF4vB/bYwAC5o9/iJiK/EoByp5asxA8fg9wFOyGjzdbLg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.496.0 + '@smithy/protocol-http': 3.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-host-header@3.523.0: + resolution: {integrity: sha512-4g3q7Ta9sdD9TMUuohBAkbx/e3I/juTqfKi7TPgP+8jxcYX72MOsgemAMHuP6CX27eyj4dpvjH+w4SIVDiDSmg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.523.0 + '@smithy/protocol-http': 3.2.1 + '@smithy/types': 2.10.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-location-constraint@3.523.0: + resolution: {integrity: sha512-1QAUXX3U0jkARnU0yyjk81EO4Uw5dCeQOtvUY5s3bUOHatR3ThosQeIr6y9BCsbXHzNnDe1ytCjqAPyo8r/bYw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.523.0 + '@smithy/types': 2.10.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-logger@3.496.0: + resolution: {integrity: sha512-EwMVSY6iBMeGbVnvwdaFl/ClMS/YWtxCAo+bcEtgk8ltRuo7qgbJem8Km/fvWC1vdWvIbe4ArdJ8iGzq62ffAw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.496.0 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-logger@3.523.0: + resolution: {integrity: sha512-PeDNJNhfiaZx54LBaLTXzUaJ9LXFwDFFIksipjqjvxMafnoVcQwKbkoPUWLe5ytT4nnL1LogD3s55mERFUsnwg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.523.0 + '@smithy/types': 2.10.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-recursion-detection@3.496.0: + resolution: {integrity: sha512-+IuOcFsfqg2WAnaEzH6KhVbicqCxtOq9w3DH2jwTpddRlCx2Kqf6wCzg8luhHRGyjBZdsbIS+OXwyMevoppawA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.496.0 + '@smithy/protocol-http': 3.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-recursion-detection@3.523.0: + resolution: {integrity: sha512-nZ3Vt7ehfSDYnrcg/aAfjjvpdE+61B3Zk68i6/hSUIegT3IH9H1vSW67NDKVp+50hcEfzWwM2HMPXxlzuyFyrw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.523.0 + '@smithy/protocol-http': 3.2.1 + '@smithy/types': 2.10.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-sdk-s3@3.523.0: + resolution: {integrity: sha512-cCZ3+XcAJMSC2rsw5F2h+ILVgjijRTxgzD6l7vExhc7UUOOPxXa6R9oGV3+6ANQ/P0w8rvE78j8UAMzlpq+cZA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.523.0 + '@aws-sdk/util-arn-parser': 3.495.0 + '@smithy/node-config-provider': 2.2.4 + '@smithy/protocol-http': 3.2.1 + '@smithy/signature-v4': 2.1.3 + '@smithy/smithy-client': 2.4.2 + '@smithy/types': 2.10.1 + '@smithy/util-config-provider': 2.2.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-signing@3.496.0: + resolution: {integrity: sha512-Oq73Brs4IConvWnRlh8jM1V7LHoTw9SVQklu/QW2FPlNrB3B8fuTdWHHYIWv7ybw1bykXoCY99v865Mmq/Or/g==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.496.0 + '@smithy/property-provider': 2.1.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/signature-v4': 2.1.1 + '@smithy/types': 2.9.1 + '@smithy/util-middleware': 2.1.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-signing@3.523.0: + resolution: {integrity: sha512-pFXV4don6qcmew/OvEjLUr2foVjzoJ8o5k57Oz9yAHz8INx3RHK8MP/K4mVhHo6n0SquRcWrm4kY/Tw+89gkEA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.523.0 + '@smithy/property-provider': 2.1.3 + '@smithy/protocol-http': 3.2.1 + '@smithy/signature-v4': 2.1.3 + '@smithy/types': 2.10.1 + '@smithy/util-middleware': 2.1.3 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-ssec@3.523.0: + resolution: {integrity: sha512-FaqAZQeF5cQzZLOIboIJRaWVOQ2F2pJZAXGF5D7nJsxYNFChotA0O0iWimBRxU35RNn7yirVxz35zQzs20ddIw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.523.0 + '@smithy/types': 2.10.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-user-agent@3.496.0: + resolution: {integrity: sha512-+iMtRxFk0GmFWNUF4ilxylOQd9PZdR4ZC9jkcPIh1PZlvKtpCyFywKlk5RRZKklSoJ/CttcqwhMvOXTNbWm/0w==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.496.0 + '@aws-sdk/util-endpoints': 3.496.0 + '@smithy/protocol-http': 3.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-user-agent@3.523.0: + resolution: {integrity: sha512-5OoKkmAPNaxLgJuS65gByW1QknGvvXdqzrIMXLsm9LjbsphTOscyvT439qk3Jf08TL4Zlw2x+pZMG7dZYuMAhQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.523.0 + '@aws-sdk/util-endpoints': 3.523.0 + '@smithy/protocol-http': 3.2.1 + '@smithy/types': 2.10.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/region-config-resolver@3.496.0: + resolution: {integrity: sha512-URrNVOPHPgEDm6QFu6lDC2cUFs+Jx23mA3jEwCvoKlXiEY/ZoWjH8wlX3OMUlLrF1qoUTuD03jjrJzF6zoCgug==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.496.0 + '@smithy/node-config-provider': 2.2.1 + '@smithy/types': 2.9.1 + '@smithy/util-config-provider': 2.2.1 + '@smithy/util-middleware': 2.1.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/region-config-resolver@3.523.0: + resolution: {integrity: sha512-IypIAecBc8b4jM0uVBEj90NYaIsc0vuLdSFyH4LPO7is4rQUet4CkkD+S036NvDdcdxBsQ4hJZBmWrqiizMHhQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.523.0 + '@smithy/node-config-provider': 2.2.4 + '@smithy/types': 2.10.1 + '@smithy/util-config-provider': 2.2.1 + '@smithy/util-middleware': 2.1.3 + tslib: 2.6.2 + dev: false + + /@aws-sdk/signature-v4-multi-region@3.523.0: + resolution: {integrity: sha512-TU1AfF6YlihdMy4H5YtkmFYmA/Zrh7sqk2V6tPiR2Vu6idc+9xm1R0UE/2V/DKgMIkxfr4+cAojtp2kqYuuF/A==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/middleware-sdk-s3': 3.523.0 + '@aws-sdk/types': 3.523.0 + '@smithy/protocol-http': 3.2.1 + '@smithy/signature-v4': 2.1.3 + '@smithy/types': 2.10.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/token-providers@3.496.0: + resolution: {integrity: sha512-fyi8RcObEa1jNETJdc2H6q9VHrrdKCj/b6+fbLvymb7mUVRd0aWUn+24SNUImnSOnrwYnwaMfyyEC388X4MbFQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/middleware-host-header': 3.496.0 + '@aws-sdk/middleware-logger': 3.496.0 + '@aws-sdk/middleware-recursion-detection': 3.496.0 + '@aws-sdk/middleware-user-agent': 3.496.0 + '@aws-sdk/region-config-resolver': 3.496.0 + '@aws-sdk/types': 3.496.0 + '@aws-sdk/util-endpoints': 3.496.0 + '@aws-sdk/util-user-agent-browser': 3.496.0 + '@aws-sdk/util-user-agent-node': 3.496.0 + '@smithy/config-resolver': 2.1.1 + '@smithy/fetch-http-handler': 2.4.1 + '@smithy/hash-node': 2.1.1 + '@smithy/invalid-dependency': 2.1.1 + '@smithy/middleware-content-length': 2.1.1 + '@smithy/middleware-endpoint': 2.4.1 + '@smithy/middleware-retry': 2.1.1 + '@smithy/middleware-serde': 2.1.1 + '@smithy/middleware-stack': 2.1.1 + '@smithy/node-config-provider': 2.2.1 + '@smithy/node-http-handler': 2.3.1 + '@smithy/property-provider': 2.1.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/shared-ini-file-loader': 2.3.1 + '@smithy/smithy-client': 2.3.1 + '@smithy/types': 2.9.1 + '@smithy/url-parser': 2.1.1 + '@smithy/util-base64': 2.1.1 + '@smithy/util-body-length-browser': 2.1.1 + '@smithy/util-body-length-node': 2.2.1 + '@smithy/util-defaults-mode-browser': 2.1.1 + '@smithy/util-defaults-mode-node': 2.1.1 + '@smithy/util-endpoints': 1.1.1 + '@smithy/util-retry': 2.1.1 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/token-providers@3.523.0(@aws-sdk/credential-provider-node@3.523.0): + resolution: {integrity: sha512-m3sPEnLuGV3JY9A8ytcz90SogVtjxEyIxUDFeswxY4C5wP/36yOq3ivenRu07dH+QIJnBhsQdjnHwJfrIetG6g==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/client-sso-oidc': 3.523.0(@aws-sdk/credential-provider-node@3.523.0) + '@aws-sdk/types': 3.523.0 + '@smithy/property-provider': 2.1.3 + '@smithy/shared-ini-file-loader': 2.3.4 + '@smithy/types': 2.10.1 + tslib: 2.6.2 + transitivePeerDependencies: + - '@aws-sdk/credential-provider-node' + - aws-crt + dev: false + + /@aws-sdk/types@3.496.0: + resolution: {integrity: sha512-umkGadK4QuNQaMoDICMm7NKRI/mYSXiyPjcn3d53BhsuArYU/52CebGQKdt4At7SwwsiVJZw9RNBHyN5Mm0HVw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/types@3.523.0: + resolution: {integrity: sha512-AqGIu4u+SxPiUuNBp2acCVcq80KDUFjxe6e3cMTvKWTzCbrVk1AXv0dAaJnCmdkWIha6zJDWxpIk/aL4EGhZ9A==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.10.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-arn-parser@3.495.0: + resolution: {integrity: sha512-hwdA3XAippSEUxs7jpznwD63YYFR+LtQvlEcebPTgWR9oQgG9TfS+39PUfbnEeje1ICuOrN3lrFqFbmP9uzbMg==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-endpoints@3.496.0: + resolution: {integrity: sha512-1QzOiWHi383ZwqSi/R2KgKCd7M+6DxkxI5acqLPm8mvDRDP2jRjrnVaC0g9/tlttWousGEemDUWStwrD2mVYSw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.496.0 + '@smithy/types': 2.9.1 + '@smithy/util-endpoints': 1.1.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-endpoints@3.523.0: + resolution: {integrity: sha512-f4qe4AdafjAZoVGoVt69Jb2rXCgo306OOobSJ/f4bhQ0zgAjGELKJATNRRe0J7P28+ffmSxeuYwM3r4gDkD/QA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.523.0 + '@smithy/types': 2.10.1 + '@smithy/util-endpoints': 1.1.4 + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-locate-window@3.495.0: + resolution: {integrity: sha512-MfaPXT0kLX2tQaR90saBT9fWQq2DHqSSJRzW+MZWsmF+y5LGCOhO22ac/2o6TKSQm7h0HRc2GaADqYYYor62yg==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-user-agent-browser@3.496.0: + resolution: {integrity: sha512-4j2spN+h0I0qfSMsGvJXTfQBu1e18rPdekKvzsGJxhaAE1tNgUfUT4nbvc5uVn0sNjZmirskmJ3kfbzVOrqIFg==} + dependencies: + '@aws-sdk/types': 3.496.0 + '@smithy/types': 2.9.1 + bowser: 2.11.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-user-agent-browser@3.523.0: + resolution: {integrity: sha512-6ZRNdGHX6+HQFqTbIA5+i8RWzxFyxsZv8D3soRfpdyWIKkzhSz8IyRKXRciwKBJDaC7OX2jzGE90wxRQft27nA==} + dependencies: + '@aws-sdk/types': 3.523.0 + '@smithy/types': 2.10.1 + bowser: 2.11.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-user-agent-node@3.496.0: + resolution: {integrity: sha512-h0Ax0jlDc7UIo3KoSI4C4tVLBFoiAdx3+DhTVfgLS7x93d41dMlziPoBX2RgdcFn37qnzw6AQKTVTMwDbRCGpg==} + engines: {node: '>=14.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + dependencies: + '@aws-sdk/types': 3.496.0 + '@smithy/node-config-provider': 2.2.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-user-agent-node@3.523.0: + resolution: {integrity: sha512-tW7vliJ77EsE8J1bzFpDYCiUyrw2NTcem+J5ddiWD4HA/xNQUyX0CMOXMBZCBA31xLTIchyz0LkZHlDsmB9LUw==} + engines: {node: '>=14.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + dependencies: + '@aws-sdk/types': 3.523.0 + '@smithy/node-config-provider': 2.2.4 + '@smithy/types': 2.10.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-utf8-browser@3.259.0: + resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} + dependencies: + tslib: 2.6.2 + dev: false + + /@aws-sdk/xml-builder@3.523.0: + resolution: {integrity: sha512-wfvyVymj2TUw7SuDor9IuFcAzJZvWRBZotvY/wQJOlYa3UP3Oezzecy64N4FWfBJEsZdrTN+HOZFl+IzTWWnUA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.10.1 + tslib: 2.6.2 + dev: false + + /@babel/code-frame@7.23.5: + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.23.4 + chalk: 2.4.2 + dev: true + + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/highlight@7.23.4: + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + + /@biomejs/biome@1.5.3: + resolution: {integrity: sha512-yvZCa/g3akwTaAQ7PCwPWDCkZs3Qa5ONg/fgOUT9e6wAWsPftCjLQFPXBeGxPK30yZSSpgEmRCfpGTmVbUjGgg==} + engines: {node: '>=14.*'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@biomejs/cli-darwin-arm64': 1.5.3 + '@biomejs/cli-darwin-x64': 1.5.3 + '@biomejs/cli-linux-arm64': 1.5.3 + '@biomejs/cli-linux-arm64-musl': 1.5.3 + '@biomejs/cli-linux-x64': 1.5.3 + '@biomejs/cli-linux-x64-musl': 1.5.3 + '@biomejs/cli-win32-arm64': 1.5.3 + '@biomejs/cli-win32-x64': 1.5.3 + dev: true + + /@biomejs/cli-darwin-arm64@1.5.3: + resolution: {integrity: sha512-ImU7mh1HghEDyqNmxEZBoMPr8SxekkZuYcs+gynKlNW+TALQs7swkERiBLkG9NR0K1B3/2uVzlvYowXrmlW8hw==} + engines: {node: '>=14.*'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@biomejs/cli-darwin-x64@1.5.3: + resolution: {integrity: sha512-vCdASqYnlpq/swErH7FD6nrFz0czFtK4k/iLgj0/+VmZVjineFPgevOb+Sr9vz0tk0GfdQO60bSpI74zU8M9Dw==} + engines: {node: '>=14.*'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@biomejs/cli-linux-arm64-musl@1.5.3: + resolution: {integrity: sha512-DYuMizUYUBYfS0IHGjDrOP1RGipqWfMGEvNEJ398zdtmCKLXaUvTimiox5dvx4X15mBK5M2m8wgWUgOP1giUpQ==} + engines: {node: '>=14.*'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@biomejs/cli-linux-arm64@1.5.3: + resolution: {integrity: sha512-cupBQv0sNF1OKqBfx7EDWMSsKwRrBUZfjXawT4s6hKV6ALq7p0QzWlxr/sDmbKMLOaLQtw2Qgu/77N9rm+f9Rg==} + engines: {node: '>=14.*'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@biomejs/cli-linux-x64-musl@1.5.3: + resolution: {integrity: sha512-UUHiAnlDqr2Y/LpvshBFhUYMWkl2/Jn+bi3U6jKuav0qWbbBKU/ByHgR4+NBxpKBYoCtWxhnmatfH1bpPIuZMw==} + engines: {node: '>=14.*'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@biomejs/cli-linux-x64@1.5.3: + resolution: {integrity: sha512-YQrSArQvcv4FYsk7Q91Yv4uuu5F8hJyORVcv3zsjCLGkjIjx2RhjYLpTL733SNL7v33GmOlZY0eFR1ko38tuUw==} + engines: {node: '>=14.*'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@biomejs/cli-win32-arm64@1.5.3: + resolution: {integrity: sha512-HxatYH7vf/kX9nrD+pDYuV2GI9GV8EFo6cfKkahAecTuZLPxryHx1WEfJthp5eNsE0+09STGkKIKjirP0ufaZA==} + engines: {node: '>=14.*'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@biomejs/cli-win32-x64@1.5.3: + resolution: {integrity: sha512-fMvbSouZEASU7mZH8SIJSANDm5OqsjgtVXlbUqxwed6BP7uuHRSs396Aqwh2+VoW8fwTpp6ybIUoC9FrzB0kyA==} + engines: {node: '>=14.*'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@commitlint/cli@18.5.0(@types/node@20.11.5)(typescript@5.3.3): + resolution: {integrity: sha512-g/N0mJBrHcTdiccUpJknS6/ru45eIEAZyhEy9sL2ILjzK2IVNrpzlAPtxEr8bZCZLGwPBUrQ5UCIIu4uebhImw==} + engines: {node: '>=v18'} + hasBin: true + dependencies: + '@commitlint/format': 18.4.4 + '@commitlint/lint': 18.5.0 + '@commitlint/load': 18.5.0(@types/node@20.11.5)(typescript@5.3.3) + '@commitlint/read': 18.4.4 + '@commitlint/types': 18.4.4 + execa: 5.1.1 + lodash.isfunction: 3.0.9 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - typescript + dev: true + + /@commitlint/config-conventional@18.5.0: + resolution: {integrity: sha512-XGmU4u3Z7bCn0H0nTEG9LUn6hMDUIPP4P6dun7PKFhtnt/wwiKAqmPj+QRmFiqWjkOWcmrh7w7xRiDL32cWS5g==} + engines: {node: '>=v18'} + dependencies: + conventional-changelog-conventionalcommits: 7.0.2 + dev: true + + /@commitlint/config-validator@18.5.0: + resolution: {integrity: sha512-mDAA6WQPjh9Ida8ACdInDylBQcqeUD2gBHE+dQu+B3OIHiWiSSrq4F2+wg3nDU9EzfcQSwPwYL+QbMmiW5SmLA==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/types': 18.4.4 + ajv: 8.12.0 + dev: true + + /@commitlint/ensure@18.4.4: + resolution: {integrity: sha512-KjD19p6julB5WrQL+Cd8p+AePwpl1XzGAjB0jnuFMKWtji9L7ucCZUKDstGjlkBZGGzH/nvdB8K+bh5K27EVUg==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/types': 18.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 + dev: true + + /@commitlint/execute-rule@18.4.4: + resolution: {integrity: sha512-a37Nd3bDQydtg9PCLLWM9ZC+GO7X5i4zJvrggJv5jBhaHsXeQ9ZWdO6ODYR+f0LxBXXNYK3geYXJrCWUCP8JEg==} + engines: {node: '>=v18'} + dev: true + + /@commitlint/format@18.4.4: + resolution: {integrity: sha512-2v3V5hVlv0R3pe7p66IX5F7cjeVvGM5JqITRIbBCFvGHPJ/CG74rjTkAu0RBEiIhlk3eOaLjVGq3d5falPkLBA==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/types': 18.4.4 + chalk: 4.1.2 + dev: true + + /@commitlint/is-ignored@18.4.4: + resolution: {integrity: sha512-rXWes9owKBTjfTr6Od7YlflRg4N+ngkOH+dUZhk0qL/XQb26mHz0EgVgdixMVBac1OsohRwJaLmVHX+5F6vfmg==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/types': 18.4.4 + semver: 7.5.4 + dev: true + + /@commitlint/lint@18.5.0: + resolution: {integrity: sha512-4VbfTGTZf/aDaOn+vednMQFu5EIKfERvv7j8La3etQCra0O2QMrZL28xugTroYekawpTkiWWvLswtpVfabIbgw==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/is-ignored': 18.4.4 + '@commitlint/parse': 18.4.4 + '@commitlint/rules': 18.4.4 + '@commitlint/types': 18.4.4 + dev: true + + /@commitlint/load@18.5.0(@types/node@20.11.5)(typescript@5.3.3): + resolution: {integrity: sha512-vpyGgk7rzbFsU01NVwPNC/WetHFP0EwSYnQ1R833SJFHkEo+cWvqoVlw/VoZwBMoI6sF5/lwEdKzFDr1DHJ6+A==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/config-validator': 18.5.0 + '@commitlint/execute-rule': 18.4.4 + '@commitlint/resolve-extends': 18.5.0 + '@commitlint/types': 18.4.4 + chalk: 4.1.2 + cosmiconfig: 8.3.6(typescript@5.3.3) + cosmiconfig-typescript-loader: 5.0.0(@types/node@20.11.5)(cosmiconfig@8.3.6)(typescript@5.3.3) + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + lodash.uniq: 4.5.0 + resolve-from: 5.0.0 + transitivePeerDependencies: + - '@types/node' + - typescript + dev: true + + /@commitlint/message@18.4.4: + resolution: {integrity: sha512-lHF95mMDYgAI1LBXveJUyg4eLaMXyOqJccCK3v55ZOEUsMPrDi8upqDjd/NmzWmESYihaOMBTAnxm+6oD1WoDQ==} + engines: {node: '>=v18'} + dev: true + + /@commitlint/parse@18.4.4: + resolution: {integrity: sha512-99G7dyn/OoyNWXJni0Ki0K3aJd01pEb/Im/Id6y4X7PN+kGOahjz2z/cXYYHn7xDdooqFVdiVrVLeChfgpWZ2g==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/types': 18.4.4 + conventional-changelog-angular: 7.0.0 + conventional-commits-parser: 5.0.0 + dev: true + + /@commitlint/read@18.4.4: + resolution: {integrity: sha512-r58JbWky4gAFPea/CZmvlqP9Ehbs+8gSEUqhIJOojKzTc3xlxFnZUDVPcEnnaqzQEEoV6C69VW7xuzdcBlu/FQ==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/top-level': 18.4.4 + '@commitlint/types': 18.4.4 + git-raw-commits: 2.0.11 + minimist: 1.2.8 + dev: true + + /@commitlint/resolve-extends@18.5.0: + resolution: {integrity: sha512-OxCYOMnlkOEEIkwTaRiFjHyuWBq962WBZQVHfMHej8tr3d+SfjznvqZhPmW8/SuqtfmGEiJPGWUNOxgwH+O0MA==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/config-validator': 18.5.0 + '@commitlint/types': 18.4.4 + import-fresh: 3.3.0 + lodash.mergewith: 4.6.2 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + dev: true + + /@commitlint/rules@18.4.4: + resolution: {integrity: sha512-6Uzlsnl/GljEI+80NWjf4ThOfR8NIsbm18IfXYuCEchlwMHSxiuYG4rHSK5DNmG/+MIo8eR5VdQ0gQyt7kWzAA==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/ensure': 18.4.4 + '@commitlint/message': 18.4.4 + '@commitlint/to-lines': 18.4.4 + '@commitlint/types': 18.4.4 + execa: 5.1.1 + dev: true + + /@commitlint/to-lines@18.4.4: + resolution: {integrity: sha512-mwe2Roa59NCz/krniAdCygFabg7+fQCkIhXqBHw00XQ8Y7lw4poZLLxeGI3p3bLpcEOXdqIDrEGLwHmG5lBdwQ==} + engines: {node: '>=v18'} + dev: true + + /@commitlint/top-level@18.4.4: + resolution: {integrity: sha512-PBwW1drgeavl9CadB7IPRUk6rkUP/O8jEkxjlC+ofuh3pw0bzJdAT+Kw7M1Yc9KtTb9xTaqUB8uvRtaybHa/tQ==} + engines: {node: '>=v18'} + dependencies: + find-up: 5.0.0 + dev: true + + /@commitlint/types@18.4.4: + resolution: {integrity: sha512-/FykLtodD8gKs3+VNkAUwofu4LBHankclj+I8fB2jTRvG6PV7k/OUt4P+VbM7ip853qS4F0g7Z6hLNa6JeMcAQ==} + engines: {node: '>=v18'} + dependencies: + chalk: 4.1.2 + dev: true + + /@esbuild/aix-ppc64@0.19.11: + resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.19.11: + resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.19.11: + resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.19.11: + resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.19.11: + resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.19.11: + resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.19.11: + resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.19.11: + resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.19.11: + resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.19.11: + resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.19.11: + resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.19.11: + resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.19.11: + resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.19.11: + resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.19.11: + resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.19.11: + resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.19.11: + resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.19.11: + resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.19.11: + resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.19.11: + resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.19.11: + resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.19.11: + resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.19.11: + resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: false + + /@listr2/prompt-adapter-enquirer@2.0.1(enquirer@2.4.1): + resolution: {integrity: sha512-vRAa2raxKfpcUkh4ihszcb6vNb931sfz7af85zQn7oyJxQOffqr2QRwk0T2nBmKAk3dRD48b8nl3v0qoZ4sbyA==} + engines: {node: '>=18.0.0'} + peerDependencies: + enquirer: '>= 2.3.0 < 3' + dependencies: + enquirer: 2.4.1 + dev: false + + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: false + optional: true + + /@smithy/abort-controller@2.1.1: + resolution: {integrity: sha512-1+qdrUqLhaALYL0iOcN43EP6yAXXQ2wWZ6taf4S2pNGowmOc5gx+iMQv+E42JizNJjB0+gEadOXeV1Bf7JWL1Q==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/abort-controller@2.1.3: + resolution: {integrity: sha512-c2aYH2Wu1RVE3rLlVgg2kQOBJGM0WbjReQi5DnPTm2Zb7F0gk7J2aeQeaX2u/lQZoHl6gv8Oac7mt9alU3+f4A==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.10.1 + tslib: 2.6.2 + dev: false + + /@smithy/chunked-blob-reader-native@2.1.1: + resolution: {integrity: sha512-zNW+43dltfNMUrBEYLMWgI8lQr0uhtTcUyxkgC9EP4j17WREzgSFMPUFVrVV6Rc2+QtWERYjb4tzZnQGa7R9fQ==} + dependencies: + '@smithy/util-base64': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/chunked-blob-reader@2.1.1: + resolution: {integrity: sha512-NjNFCKxC4jVvn+lUr3Yo4/PmUJj3tbyqH6GNHueyTGS5Q27vlEJ1MkNhUDV8QGxJI7Bodnc2pD18lU2zRfhHlQ==} + dependencies: + tslib: 2.6.2 + dev: false + + /@smithy/config-resolver@2.1.1: + resolution: {integrity: sha512-lxfLDpZm+AWAHPFZps5JfDoO9Ux1764fOgvRUBpHIO8HWHcSN1dkgsago1qLRVgm1BZ8RCm8cgv99QvtaOWIhw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/node-config-provider': 2.2.1 + '@smithy/types': 2.9.1 + '@smithy/util-config-provider': 2.2.1 + '@smithy/util-middleware': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/config-resolver@2.1.4: + resolution: {integrity: sha512-AW2WUZmBAzgO3V3ovKtsUbI3aBNMeQKFDumoqkNxaVDWF/xfnxAWqBKDr/NuG7c06N2Rm4xeZLPiJH/d+na0HA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/node-config-provider': 2.2.4 + '@smithy/types': 2.10.1 + '@smithy/util-config-provider': 2.2.1 + '@smithy/util-middleware': 2.1.3 + tslib: 2.6.2 + dev: false + + /@smithy/core@1.3.1: + resolution: {integrity: sha512-tf+NIu9FkOh312b6M9G4D68is4Xr7qptzaZGZUREELF8ysE1yLKphqt7nsomjKZVwW7WE5pDDex9idowNGRQ/Q==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/middleware-endpoint': 2.4.1 + '@smithy/middleware-retry': 2.1.1 + '@smithy/middleware-serde': 2.1.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/smithy-client': 2.3.1 + '@smithy/types': 2.9.1 + '@smithy/util-middleware': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/core@1.3.5: + resolution: {integrity: sha512-Rrc+e2Jj6Gu7Xbn0jvrzZlSiP2CZocIOfZ9aNUA82+1sa6GBnxqL9+iZ9EKHeD9aqD1nU8EK4+oN2EiFpSv7Yw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/middleware-endpoint': 2.4.4 + '@smithy/middleware-retry': 2.1.4 + '@smithy/middleware-serde': 2.1.3 + '@smithy/protocol-http': 3.2.1 + '@smithy/smithy-client': 2.4.2 + '@smithy/types': 2.10.1 + '@smithy/util-middleware': 2.1.3 + tslib: 2.6.2 + dev: false + + /@smithy/credential-provider-imds@2.2.1: + resolution: {integrity: sha512-7XHjZUxmZYnONheVQL7j5zvZXga+EWNgwEAP6OPZTi7l8J4JTeNh9aIOfE5fKHZ/ee2IeNOh54ZrSna+Vc6TFA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/node-config-provider': 2.2.1 + '@smithy/property-provider': 2.1.1 + '@smithy/types': 2.9.1 + '@smithy/url-parser': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/credential-provider-imds@2.2.4: + resolution: {integrity: sha512-DdatjmBZQnhGe1FhI8gO98f7NmvQFSDiZTwC3WMvLTCKQUY+Y1SVkhJqIuLu50Eb7pTheoXQmK+hKYUgpUWsNA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/node-config-provider': 2.2.4 + '@smithy/property-provider': 2.1.3 + '@smithy/types': 2.10.1 + '@smithy/url-parser': 2.1.3 + tslib: 2.6.2 + dev: false + + /@smithy/eventstream-codec@2.1.1: + resolution: {integrity: sha512-E8KYBxBIuU4c+zrpR22VsVrOPoEDzk35bQR3E+xm4k6Pa6JqzkDOdMyf9Atac5GPNKHJBdVaQ4JtjdWX2rl/nw==} + dependencies: + '@aws-crypto/crc32': 3.0.0 + '@smithy/types': 2.9.1 + '@smithy/util-hex-encoding': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/eventstream-codec@2.1.3: + resolution: {integrity: sha512-rGlCVuwSDv6qfKH4/lRxFjcZQnIE0LZ3D4lkMHg7ZSltK9rA74r0VuGSvWVQ4N/d70VZPaniFhp4Z14QYZsa+A==} + dependencies: + '@aws-crypto/crc32': 3.0.0 + '@smithy/types': 2.10.1 + '@smithy/util-hex-encoding': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/eventstream-serde-browser@2.1.3: + resolution: {integrity: sha512-qAgKbZ9m2oBfSyJWWurX/MvQFRPrYypj79cDSleEgDwBoez6Tfd+FTpu2L/j3ZeC3mDlDHIKWksoeaXZpLLAHw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/eventstream-serde-universal': 2.1.3 + '@smithy/types': 2.10.1 + tslib: 2.6.2 + dev: false + + /@smithy/eventstream-serde-config-resolver@2.1.3: + resolution: {integrity: sha512-48rvsNv/MgAFCxOE0qwR7ZwKhaEdDoTxqH5HM+T6SDxICmPGb7gEuQzjTxQhcieCPgqyXeZFW8cU0QJxdowuIg==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.10.1 + tslib: 2.6.2 + dev: false + + /@smithy/eventstream-serde-node@2.1.3: + resolution: {integrity: sha512-RPJWWDhj8isk3NtGfm3Xt1WdHyX9ZE42V+m1nLU1I0zZ1hEol/oawHsTnhva/VR5bn+bJ2zscx+BYr0cEPRtmg==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/eventstream-serde-universal': 2.1.3 + '@smithy/types': 2.10.1 + tslib: 2.6.2 + dev: false + + /@smithy/eventstream-serde-universal@2.1.3: + resolution: {integrity: sha512-ssvSMk1LX2jRhiOVgVLGfNJXdB8SvyjieKcJDHq698Gi3LOog6g/+l7ggrN+hZxyjUiDF4cUxgKaZTBUghzhLw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/eventstream-codec': 2.1.3 + '@smithy/types': 2.10.1 + tslib: 2.6.2 + dev: false + + /@smithy/fetch-http-handler@2.4.1: + resolution: {integrity: sha512-VYGLinPsFqH68lxfRhjQaSkjXM7JysUOJDTNjHBuN/ykyRb2f1gyavN9+VhhPTWCy32L4yZ2fdhpCs/nStEicg==} + dependencies: + '@smithy/protocol-http': 3.1.1 + '@smithy/querystring-builder': 2.1.1 + '@smithy/types': 2.9.1 + '@smithy/util-base64': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/fetch-http-handler@2.4.3: + resolution: {integrity: sha512-Fn/KYJFo6L5I4YPG8WQb2hOmExgRmNpVH5IK2zU3JKrY5FKW7y9ar5e0BexiIC9DhSKqKX+HeWq/Y18fq7Dkpw==} + dependencies: + '@smithy/protocol-http': 3.2.1 + '@smithy/querystring-builder': 2.1.3 + '@smithy/types': 2.10.1 + '@smithy/util-base64': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/hash-blob-browser@2.1.3: + resolution: {integrity: sha512-sHLTM5xQYw5Wxz07DFo+eh1PVC6P5+kazQRF1k5nsvOhZG5VnkIy4LZ7N0ZNWqJx16g9otGd5MvqUOpb3WWtgA==} + dependencies: + '@smithy/chunked-blob-reader': 2.1.1 + '@smithy/chunked-blob-reader-native': 2.1.1 + '@smithy/types': 2.10.1 + tslib: 2.6.2 + dev: false + + /@smithy/hash-node@2.1.1: + resolution: {integrity: sha512-Qhoq0N8f2OtCnvUpCf+g1vSyhYQrZjhSwvJ9qvR8BUGOtTXiyv2x1OD2e6jVGmlpC4E4ax1USHoyGfV9JFsACg==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.9.1 + '@smithy/util-buffer-from': 2.1.1 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/hash-node@2.1.3: + resolution: {integrity: sha512-FsAPCUj7VNJIdHbSxMd5uiZiF20G2zdSDgrgrDrHqIs/VMxK85Vqk5kMVNNDMCZmMezp6UKnac0B4nAyx7HJ9g==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.10.1 + '@smithy/util-buffer-from': 2.1.1 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/hash-stream-node@2.1.3: + resolution: {integrity: sha512-fWpUx2ca/u5lcD5RhNJogEG5FD7H0RDDpYmfQgxFqIUv3Ow7bZsapMukh8uzQPVO8R+NDAvSdxmgXoy4Hz8sFw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.10.1 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/invalid-dependency@2.1.1: + resolution: {integrity: sha512-7WTgnKw+VPg8fxu2v9AlNOQ5yaz6RA54zOVB4f6vQuR0xFKd+RzlCpt0WidYTsye7F+FYDIaS/RnJW4pxjNInw==} + dependencies: + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/invalid-dependency@2.1.3: + resolution: {integrity: sha512-wkra7d/G4CbngV4xsjYyAYOvdAhahQje/WymuQdVEnXFExJopEu7fbL5AEAlBPgWHXwu94VnCSG00gVzRfExyg==} + dependencies: + '@smithy/types': 2.10.1 + tslib: 2.6.2 + dev: false + + /@smithy/is-array-buffer@2.1.1: + resolution: {integrity: sha512-xozSQrcUinPpNPNPds4S7z/FakDTh1MZWtRP/2vQtYB/u3HYrX2UXuZs+VhaKBd6Vc7g2XPr2ZtwGBNDN6fNKQ==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@smithy/md5-js@2.1.3: + resolution: {integrity: sha512-zmn3M6+mP4IJlSmXBN9964AztgkIO8b5lRzAgdJn9AdCFwA6xLkcW2B6uEnpBjvotxtQMmXTUP19tIO7NmFPpw==} + dependencies: + '@smithy/types': 2.10.1 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/middleware-content-length@2.1.1: + resolution: {integrity: sha512-rSr9ezUl9qMgiJR0UVtVOGEZElMdGFyl8FzWEF5iEKTlcWxGr2wTqGfDwtH3LAB7h+FPkxqv4ZU4cpuCN9Kf/g==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/protocol-http': 3.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/middleware-content-length@2.1.3: + resolution: {integrity: sha512-aJduhkC+dcXxdnv5ZpM3uMmtGmVFKx412R1gbeykS5HXDmRU6oSsyy2SoHENCkfOGKAQOjVE2WVqDJibC0d21g==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/protocol-http': 3.2.1 + '@smithy/types': 2.10.1 + tslib: 2.6.2 + dev: false + + /@smithy/middleware-endpoint@2.4.1: + resolution: {integrity: sha512-XPZTb1E2Oav60Ven3n2PFx+rX9EDsU/jSTA8VDamt7FXks67ekjPY/XrmmPDQaFJOTUHJNKjd8+kZxVO5Ael4Q==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/middleware-serde': 2.1.1 + '@smithy/node-config-provider': 2.2.1 + '@smithy/shared-ini-file-loader': 2.3.1 + '@smithy/types': 2.9.1 + '@smithy/url-parser': 2.1.1 + '@smithy/util-middleware': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/middleware-endpoint@2.4.4: + resolution: {integrity: sha512-4yjHyHK2Jul4JUDBo2sTsWY9UshYUnXeb/TAK/MTaPEb8XQvDmpwSFnfIRDU45RY1a6iC9LCnmJNg/yHyfxqkw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/middleware-serde': 2.1.3 + '@smithy/node-config-provider': 2.2.4 + '@smithy/shared-ini-file-loader': 2.3.4 + '@smithy/types': 2.10.1 + '@smithy/url-parser': 2.1.3 + '@smithy/util-middleware': 2.1.3 + tslib: 2.6.2 + dev: false + + /@smithy/middleware-retry@2.1.1: + resolution: {integrity: sha512-eMIHOBTXro6JZ+WWzZWd/8fS8ht5nS5KDQjzhNMHNRcG5FkNTqcKpYhw7TETMYzbLfhO5FYghHy1vqDWM4FLDA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/node-config-provider': 2.2.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/service-error-classification': 2.1.1 + '@smithy/smithy-client': 2.3.1 + '@smithy/types': 2.9.1 + '@smithy/util-middleware': 2.1.1 + '@smithy/util-retry': 2.1.1 + tslib: 2.6.2 + uuid: 8.3.2 + dev: false + + /@smithy/middleware-retry@2.1.4: + resolution: {integrity: sha512-Cyolv9YckZTPli1EkkaS39UklonxMd08VskiuMhURDjC0HHa/AD6aK/YoD21CHv9s0QLg0WMLvk9YeLTKkXaFQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/node-config-provider': 2.2.4 + '@smithy/protocol-http': 3.2.1 + '@smithy/service-error-classification': 2.1.3 + '@smithy/smithy-client': 2.4.2 + '@smithy/types': 2.10.1 + '@smithy/util-middleware': 2.1.3 + '@smithy/util-retry': 2.1.3 + tslib: 2.6.2 + uuid: 8.3.2 + dev: false + + /@smithy/middleware-serde@2.1.1: + resolution: {integrity: sha512-D8Gq0aQBeE1pxf3cjWVkRr2W54t+cdM2zx78tNrVhqrDykRA7asq8yVJij1u5NDtKzKqzBSPYh7iW0svUKg76g==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/middleware-serde@2.1.3: + resolution: {integrity: sha512-s76LId+TwASrHhUa9QS4k/zeXDUAuNuddKklQzRgumbzge5BftVXHXIqL4wQxKGLocPwfgAOXWx+HdWhQk9hTg==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.10.1 + tslib: 2.6.2 + dev: false + + /@smithy/middleware-stack@2.1.1: + resolution: {integrity: sha512-KPJhRlhsl8CjgGXK/DoDcrFGfAqoqvuwlbxy+uOO4g2Azn1dhH+GVfC3RAp+6PoL5PWPb+vt6Z23FP+Mr6qeCw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/middleware-stack@2.1.3: + resolution: {integrity: sha512-opMFufVQgvBSld/b7mD7OOEBxF6STyraVr1xel1j0abVILM8ALJvRoFbqSWHGmaDlRGIiV9Q5cGbWi0sdiEaLQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.10.1 + tslib: 2.6.2 + dev: false + + /@smithy/node-config-provider@2.2.1: + resolution: {integrity: sha512-epzK3x1xNxA9oJgHQ5nz+2j6DsJKdHfieb+YgJ7ATWxzNcB7Hc+Uya2TUck5MicOPhDV8HZImND7ZOecVr+OWg==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/property-provider': 2.1.1 + '@smithy/shared-ini-file-loader': 2.3.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/node-config-provider@2.2.4: + resolution: {integrity: sha512-nqazHCp8r4KHSFhRQ+T0VEkeqvA0U+RhehBSr1gunUuNW3X7j0uDrWBxB2gE9eutzy6kE3Y7L+Dov/UXT871vg==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/property-provider': 2.1.3 + '@smithy/shared-ini-file-loader': 2.3.4 + '@smithy/types': 2.10.1 + tslib: 2.6.2 + dev: false + + /@smithy/node-http-handler@2.3.1: + resolution: {integrity: sha512-gLA8qK2nL9J0Rk/WEZSvgin4AppvuCYRYg61dcUo/uKxvMZsMInL5I5ZdJTogOvdfVug3N2dgI5ffcUfS4S9PA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/abort-controller': 2.1.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/querystring-builder': 2.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/node-http-handler@2.4.1: + resolution: {integrity: sha512-HCkb94soYhJMxPCa61wGKgmeKpJ3Gftx1XD6bcWEB2wMV1L9/SkQu/6/ysKBnbOzWRE01FGzwrTxucHypZ8rdg==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/abort-controller': 2.1.3 + '@smithy/protocol-http': 3.2.1 + '@smithy/querystring-builder': 2.1.3 + '@smithy/types': 2.10.1 + tslib: 2.6.2 + dev: false + + /@smithy/property-provider@2.1.1: + resolution: {integrity: sha512-FX7JhhD/o5HwSwg6GLK9zxrMUrGnb3PzNBrcthqHKBc3dH0UfgEAU24xnJ8F0uow5mj17UeBEOI6o3CF2k7Mhw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/property-provider@2.1.3: + resolution: {integrity: sha512-bMz3se+ySKWNrgm7eIiQMa2HO/0fl2D0HvLAdg9pTMcpgp4SqOAh6bz7Ik6y7uQqSrk4rLjIKgbQ6yzYgGehCQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.10.1 + tslib: 2.6.2 + dev: false + + /@smithy/protocol-http@3.1.1: + resolution: {integrity: sha512-6ZRTSsaXuSL9++qEwH851hJjUA0OgXdQFCs+VDw4tGH256jQ3TjYY/i34N4vd24RV3nrjNsgd1yhb57uMoKbzQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/protocol-http@3.2.1: + resolution: {integrity: sha512-KLrQkEw4yJCeAmAH7hctE8g9KwA7+H2nSJwxgwIxchbp/L0B5exTdOQi9D5HinPLlothoervGmhpYKelZ6AxIA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.10.1 + tslib: 2.6.2 + dev: false + + /@smithy/querystring-builder@2.1.1: + resolution: {integrity: sha512-C/ko/CeEa8jdYE4gt6nHO5XDrlSJ3vdCG0ZAc6nD5ZIE7LBp0jCx4qoqp7eoutBu7VrGMXERSRoPqwi1WjCPbg==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.9.1 + '@smithy/util-uri-escape': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/querystring-builder@2.1.3: + resolution: {integrity: sha512-kFD3PnNqKELe6m9GRHQw/ftFFSZpnSeQD4qvgDB6BQN6hREHELSosVFUMPN4M3MDKN2jAwk35vXHLoDrNfKu0A==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.10.1 + '@smithy/util-uri-escape': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/querystring-parser@2.1.1: + resolution: {integrity: sha512-H4+6jKGVhG1W4CIxfBaSsbm98lOO88tpDWmZLgkJpt8Zkk/+uG0FmmqMuCAc3HNM2ZDV+JbErxr0l5BcuIf/XQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/querystring-parser@2.1.3: + resolution: {integrity: sha512-3+CWJoAqcBMR+yvz6D+Fc5VdoGFtfenW6wqSWATWajrRMGVwJGPT3Vy2eb2bnMktJc4HU4bpjeovFa566P3knQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.10.1 + tslib: 2.6.2 + dev: false + + /@smithy/service-error-classification@2.1.1: + resolution: {integrity: sha512-txEdZxPUgM1PwGvDvHzqhXisrc5LlRWYCf2yyHfvITWioAKat7srQvpjMAvgzf0t6t7j8yHrryXU9xt7RZqFpw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.9.1 + dev: false + + /@smithy/service-error-classification@2.1.3: + resolution: {integrity: sha512-iUrpSsem97bbXHHT/v3s7vaq8IIeMo6P6cXdeYHrx0wOJpMeBGQF7CB0mbJSiTm3//iq3L55JiEm8rA7CTVI8A==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.10.1 + dev: false + + /@smithy/shared-ini-file-loader@2.3.1: + resolution: {integrity: sha512-2E2kh24igmIznHLB6H05Na4OgIEilRu0oQpYXo3LCNRrawHAcfDKq9004zJs+sAMt2X5AbY87CUCJ7IpqpSgdw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/shared-ini-file-loader@2.3.4: + resolution: {integrity: sha512-CiZmPg9GeDKbKmJGEFvJBsJcFnh0AQRzOtQAzj1XEa8N/0/uSN/v1LYzgO7ry8hhO8+9KB7+DhSW0weqBra4Aw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.10.1 + tslib: 2.6.2 + dev: false + + /@smithy/signature-v4@2.1.1: + resolution: {integrity: sha512-Hb7xub0NHuvvQD3YwDSdanBmYukoEkhqBjqoxo+bSdC0ryV9cTfgmNjuAQhTPYB6yeU7hTR+sPRiFMlxqv6kmg==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/eventstream-codec': 2.1.1 + '@smithy/is-array-buffer': 2.1.1 + '@smithy/types': 2.9.1 + '@smithy/util-hex-encoding': 2.1.1 + '@smithy/util-middleware': 2.1.1 + '@smithy/util-uri-escape': 2.1.1 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/signature-v4@2.1.3: + resolution: {integrity: sha512-Jq4iPPdCmJojZTsPePn4r1ULShh6ONkokLuxp1Lnk4Sq7r7rJp4HlA1LbPBq4bD64TIzQezIpr1X+eh5NYkNxw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/eventstream-codec': 2.1.3 + '@smithy/is-array-buffer': 2.1.1 + '@smithy/types': 2.10.1 + '@smithy/util-hex-encoding': 2.1.1 + '@smithy/util-middleware': 2.1.3 + '@smithy/util-uri-escape': 2.1.1 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/smithy-client@2.3.1: + resolution: {integrity: sha512-YsTdU8xVD64r2pLEwmltrNvZV6XIAC50LN6ivDopdt+YiF/jGH6PY9zUOu0CXD/d8GMB8gbhnpPsdrjAXHS9QA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/middleware-endpoint': 2.4.1 + '@smithy/middleware-stack': 2.1.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/types': 2.9.1 + '@smithy/util-stream': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/smithy-client@2.4.2: + resolution: {integrity: sha512-ntAFYN51zu3N3mCd95YFcFi/8rmvm//uX+HnK24CRbI6k5Rjackn0JhgKz5zOx/tbNvOpgQIwhSX+1EvEsBLbA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/middleware-endpoint': 2.4.4 + '@smithy/middleware-stack': 2.1.3 + '@smithy/protocol-http': 3.2.1 + '@smithy/types': 2.10.1 + '@smithy/util-stream': 2.1.3 + tslib: 2.6.2 + dev: false + + /@smithy/types@2.10.1: + resolution: {integrity: sha512-hjQO+4ru4cQ58FluQvKKiyMsFg0A6iRpGm2kqdH8fniyNd2WyanoOsYJfMX/IFLuLxEoW6gnRkNZy1y6fUUhtA==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@smithy/types@2.9.1: + resolution: {integrity: sha512-vjXlKNXyprDYDuJ7UW5iobdmyDm6g8dDG+BFUncAg/3XJaN45Gy5RWWWUVgrzIK7S4R1KWgIX5LeJcfvSI24bw==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@smithy/url-parser@2.1.1: + resolution: {integrity: sha512-qC9Bv8f/vvFIEkHsiNrUKYNl8uKQnn4BdhXl7VzQRP774AwIjiSMMwkbT+L7Fk8W8rzYVifzJNYxv1HwvfBo3Q==} + dependencies: + '@smithy/querystring-parser': 2.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/url-parser@2.1.3: + resolution: {integrity: sha512-X1NRA4WzK/ihgyzTpeGvI9Wn45y8HmqF4AZ/FazwAv8V203Ex+4lXqcYI70naX9ETqbqKVzFk88W6WJJzCggTQ==} + dependencies: + '@smithy/querystring-parser': 2.1.3 + '@smithy/types': 2.10.1 + tslib: 2.6.2 + dev: false + + /@smithy/util-base64@2.1.1: + resolution: {integrity: sha512-UfHVpY7qfF/MrgndI5PexSKVTxSZIdz9InghTFa49QOvuu9I52zLPLUHXvHpNuMb1iD2vmc6R+zbv/bdMipR/g==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/util-buffer-from': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/util-body-length-browser@2.1.1: + resolution: {integrity: sha512-ekOGBLvs1VS2d1zM2ER4JEeBWAvIOUKeaFch29UjjJsxmZ/f0L3K3x0dEETgh3Q9bkZNHgT+rkdl/J/VUqSRag==} + dependencies: + tslib: 2.6.2 + dev: false + + /@smithy/util-body-length-node@2.2.1: + resolution: {integrity: sha512-/ggJG+ta3IDtpNVq4ktmEUtOkH1LW64RHB5B0hcr5ZaWBmo96UX2cIOVbjCqqDickTXqBWZ4ZO0APuaPrD7Abg==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@smithy/util-buffer-from@2.1.1: + resolution: {integrity: sha512-clhNjbyfqIv9Md2Mg6FffGVrJxw7bgK7s3Iax36xnfVj6cg0fUG7I4RH0XgXJF8bxi+saY5HR21g2UPKSxVCXg==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/is-array-buffer': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/util-config-provider@2.2.1: + resolution: {integrity: sha512-50VL/tx9oYYcjJn/qKqNy7sCtpD0+s8XEBamIFo4mFFTclKMNp+rsnymD796uybjiIquB7VCB/DeafduL0y2kw==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@smithy/util-defaults-mode-browser@2.1.1: + resolution: {integrity: sha512-lqLz/9aWRO6mosnXkArtRuQqqZBhNpgI65YDpww4rVQBuUT7qzKbDLG5AmnQTCiU4rOquaZO/Kt0J7q9Uic7MA==} + engines: {node: '>= 10.0.0'} + dependencies: + '@smithy/property-provider': 2.1.1 + '@smithy/smithy-client': 2.3.1 + '@smithy/types': 2.9.1 + bowser: 2.11.0 + tslib: 2.6.2 + dev: false + + /@smithy/util-defaults-mode-browser@2.1.4: + resolution: {integrity: sha512-J6XAVY+/g7jf03QMnvqPyU+8jqGrrtXoKWFVOS+n1sz0Lg8HjHJ1ANqaDN+KTTKZRZlvG8nU5ZrJOUL6VdwgcQ==} + engines: {node: '>= 10.0.0'} + dependencies: + '@smithy/property-provider': 2.1.3 + '@smithy/smithy-client': 2.4.2 + '@smithy/types': 2.10.1 + bowser: 2.11.0 + tslib: 2.6.2 + dev: false + + /@smithy/util-defaults-mode-node@2.1.1: + resolution: {integrity: sha512-tYVrc+w+jSBfBd267KDnvSGOh4NMz+wVH7v4CClDbkdPfnjvImBZsOURncT5jsFwR9KCuDyPoSZq4Pa6+eCUrA==} + engines: {node: '>= 10.0.0'} + dependencies: + '@smithy/config-resolver': 2.1.1 + '@smithy/credential-provider-imds': 2.2.1 + '@smithy/node-config-provider': 2.2.1 + '@smithy/property-provider': 2.1.1 + '@smithy/smithy-client': 2.3.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/util-defaults-mode-node@2.2.3: + resolution: {integrity: sha512-ttUISrv1uVOjTlDa3nznX33f0pthoUlP+4grhTvOzcLhzArx8qHB94/untGACOG3nlf8vU20nI2iWImfzoLkYA==} + engines: {node: '>= 10.0.0'} + dependencies: + '@smithy/config-resolver': 2.1.4 + '@smithy/credential-provider-imds': 2.2.4 + '@smithy/node-config-provider': 2.2.4 + '@smithy/property-provider': 2.1.3 + '@smithy/smithy-client': 2.4.2 + '@smithy/types': 2.10.1 + tslib: 2.6.2 + dev: false + + /@smithy/util-endpoints@1.1.1: + resolution: {integrity: sha512-sI4d9rjoaekSGEtq3xSb2nMjHMx8QXcz2cexnVyRWsy4yQ9z3kbDpX+7fN0jnbdOp0b3KSTZJZ2Yb92JWSanLw==} + engines: {node: '>= 14.0.0'} + dependencies: + '@smithy/node-config-provider': 2.2.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/util-endpoints@1.1.4: + resolution: {integrity: sha512-/qAeHmK5l4yQ4/bCIJ9p49wDe9rwWtOzhPHblu386fwPNT3pxmodgcs9jDCV52yK9b4rB8o9Sj31P/7Vzka1cg==} + engines: {node: '>= 14.0.0'} + dependencies: + '@smithy/node-config-provider': 2.2.4 + '@smithy/types': 2.10.1 + tslib: 2.6.2 + dev: false + + /@smithy/util-hex-encoding@2.1.1: + resolution: {integrity: sha512-3UNdP2pkYUUBGEXzQI9ODTDK+Tcu1BlCyDBaRHwyxhA+8xLP8agEKQq4MGmpjqb4VQAjq9TwlCQX0kP6XDKYLg==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@smithy/util-middleware@2.1.1: + resolution: {integrity: sha512-mKNrk8oz5zqkNcbcgAAepeJbmfUW6ogrT2Z2gDbIUzVzNAHKJQTYmH9jcy0jbWb+m7ubrvXKb6uMjkSgAqqsFA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/util-middleware@2.1.3: + resolution: {integrity: sha512-/+2fm7AZ2ozl5h8wM++ZP0ovE9/tiUUAHIbCfGfb3Zd3+Dyk17WODPKXBeJ/TnK5U+x743QmA0xHzlSm8I/qhw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.10.1 + tslib: 2.6.2 + dev: false + + /@smithy/util-retry@2.1.1: + resolution: {integrity: sha512-Mg+xxWPTeSPrthpC5WAamJ6PW4Kbo01Fm7lWM1jmGRvmrRdsd3192Gz2fBXAMURyXpaNxyZf6Hr/nQ4q70oVEA==} + engines: {node: '>= 14.0.0'} + dependencies: + '@smithy/service-error-classification': 2.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/util-retry@2.1.3: + resolution: {integrity: sha512-Kbvd+GEMuozbNUU3B89mb99tbufwREcyx2BOX0X2+qHjq6Gvsah8xSDDgxISDwcOHoDqUWO425F0Uc/QIRhYkg==} + engines: {node: '>= 14.0.0'} + dependencies: + '@smithy/service-error-classification': 2.1.3 + '@smithy/types': 2.10.1 + tslib: 2.6.2 + dev: false + + /@smithy/util-stream@2.1.1: + resolution: {integrity: sha512-J7SMIpUYvU4DQN55KmBtvaMc7NM3CZ2iWICdcgaovtLzseVhAqFRYqloT3mh0esrFw+3VEK6nQFteFsTqZSECQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/fetch-http-handler': 2.4.1 + '@smithy/node-http-handler': 2.3.1 + '@smithy/types': 2.9.1 + '@smithy/util-base64': 2.1.1 + '@smithy/util-buffer-from': 2.1.1 + '@smithy/util-hex-encoding': 2.1.1 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/util-stream@2.1.3: + resolution: {integrity: sha512-HvpEQbP8raTy9n86ZfXiAkf3ezp1c3qeeO//zGqwZdrfaoOpGKQgF2Sv1IqZp7wjhna7pvczWaGUHjcOPuQwKw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/fetch-http-handler': 2.4.3 + '@smithy/node-http-handler': 2.4.1 + '@smithy/types': 2.10.1 + '@smithy/util-base64': 2.1.1 + '@smithy/util-buffer-from': 2.1.1 + '@smithy/util-hex-encoding': 2.1.1 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/util-uri-escape@2.1.1: + resolution: {integrity: sha512-saVzI1h6iRBUVSqtnlOnc9ssU09ypo7n+shdQ8hBTZno/9rZ3AuRYvoHInV57VF7Qn7B+pFJG7qTzFiHxWlWBw==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@smithy/util-utf8@2.1.1: + resolution: {integrity: sha512-BqTpzYEcUMDwAKr7/mVRUtHDhs6ZoXDi9NypMvMfOr/+u1NW7JgqodPDECiiLboEm6bobcPcECxzjtQh865e9A==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/util-buffer-from': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/util-waiter@2.1.1: + resolution: {integrity: sha512-kYy6BLJJNif+uqNENtJqWdXcpqo1LS+nj1AfXcDhOpqpSHJSAkVySLyZV9fkmuVO21lzGoxjvd1imGGJHph/IA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/abort-controller': 2.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/util-waiter@2.1.3: + resolution: {integrity: sha512-3R0wNFAQQoH9e4m+bVLDYNOst2qNxtxFgq03WoNHWTBOqQT3jFnOBRj1W51Rf563xDA5kwqjziksxn6RKkHB+Q==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/abort-controller': 2.1.3 + '@smithy/types': 2.10.1 + tslib: 2.6.2 + dev: false + + /@soliantconsulting/bitbucket-cloud-cli-auth@1.0.0: + resolution: {integrity: sha512-W6ZKQRCCIcT8/5Xb8I7099XlYsp2hSemhGXjrwNewRRz4bfhypv+ETMErvv3kmYdC+f5NaXzyJSofc4tRZYR8w==} + dependencies: + koa: 2.15.0 + open: 10.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /@soliantconsulting/bitbucket-openid-connect@1.1.1: + resolution: {integrity: sha512-VfFN9AEE5CM262Sqv6jSereYvOrNltUvEW2kEYHR+tnBLV4sRFb9L8Fsbs9RERZP7Mqd5cJHSjvfZFQkgAF9FA==} + hasBin: true + dependencies: + '@aws-cdk/cli-lib-alpha': 2.122.0-alpha.0 + '@aws-sdk/client-cloudformation': 3.496.0 + aws-cdk: 2.122.0 + aws-cdk-lib: 2.130.0(constructs@10.3.0) + commander: 11.1.0 + constructs: 10.3.0 + transitivePeerDependencies: + - aws-crt + dev: false + + /@tsconfig/node20@20.1.2: + resolution: {integrity: sha512-madaWq2k+LYMEhmcp0fs+OGaLFk0OenpHa4gmI4VEmCKX4PJntQ6fnnGADVFrVkBj0wIdAlQnK/MrlYTHsa1gQ==} + dev: true + + /@types/minimist@1.2.5: + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + dev: true + + /@types/node@20.11.5: + resolution: {integrity: sha512-g557vgQjUUfN76MZAN/dt1z3dzcUsimuysco0KeluHgrPdJXkP/XdAURgyO2W9fZWHRtRBiVKzKn8vyOAwlG+w==} + dependencies: + undici-types: 5.26.5 + dev: true + + /@types/normalize-package-data@2.4.4: + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + dev: true + + /@types/semver@7.5.6: + resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} + dev: true + + /@types/slug@5.0.7: + resolution: {integrity: sha512-u5T21+PqfRpHszRWSv5gJYDIkm6lmYUXLjZVYvQyWNO9aC0zs+a11qqtbxbsNRiNLTmw0Xi+5NWK/Qz+JjaB9w==} + dev: true + + /@types/source-map-support@0.5.10: + resolution: {integrity: sha512-tgVP2H469x9zq34Z0m/fgPewGhg/MLClalNOiPIzQlXrSS2YrKu/xCdSCKnEDwkFha51VKEKB6A9wW26/ZNwzA==} + dependencies: + source-map: 0.6.1 + dev: true + + /JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + dev: true + + /accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: false + + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + + /ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + dev: false + + /ansi-escapes@6.2.0: + resolution: {integrity: sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==} + engines: {node: '>=14.16'} + dependencies: + type-fest: 3.13.1 + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: false + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: false + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + dev: true + + /arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + dev: true + + /auth0@4.3.1: + resolution: {integrity: sha512-VuR/PdNHwXD9QiYUZf8UN0qiv07yJWHKfF2yEhePaPCrpwbEm6lHM6dkN7ylOdseogCkGmvchxYGMga0IPNrCA==} + engines: {node: '>=18'} + dependencies: + jose: 4.15.4 + uuid: 9.0.1 + dev: false + + /aws-cdk-lib@2.130.0(constructs@10.3.0): + resolution: {integrity: sha512-yK7ibePipdjlI4AFM94fwwtsCkmpWJ0JFZTMPahahC/3Pxe/BA/nnI/4Namvl5QPxW5QlU0xQYU7cywioq3RQg==} + engines: {node: '>= 14.15.0'} + peerDependencies: + constructs: ^10.0.0 + dependencies: + '@aws-cdk/asset-awscli-v1': 2.2.202 + '@aws-cdk/asset-kubectl-v20': 2.1.2 + '@aws-cdk/asset-node-proxy-agent-v6': 2.0.1 + constructs: 10.3.0 + dev: false + bundledDependencies: + - '@balena/dockerignore' + - case + - fs-extra + - ignore + - jsonschema + - minimatch + - punycode + - semver + - table + - yaml + - mime-types + + /aws-cdk@2.122.0: + resolution: {integrity: sha512-WqiVTedcuW4LjH4WqtQncliUdeDa9j9xgu3II8Qd1HmCZotbzBorYIHDvOJ+m3ovIzd9DL+hNq9PPUqxtBe0VQ==} + engines: {node: '>= 14.15.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: false + + /bowser@2.11.0: + resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + dev: false + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: false + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: false + + /bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + dependencies: + run-applescript: 7.0.0 + dev: false + + /cache-content-type@1.0.1: + resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} + engines: {node: '>= 6.0.0'} + dependencies: + mime-types: 2.1.35 + ylru: 1.3.2 + dev: false + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + dev: true + + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: true + + /camelcase@8.0.0: + resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} + engines: {node: '>=16'} + dev: false + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + restore-cursor: 4.0.0 + dev: false + + /cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + dependencies: + slice-ansi: 5.0.0 + string-width: 7.1.0 + dev: false + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: false + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + dev: false + + /commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + dev: false + + /compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + dev: true + + /constructs@10.3.0: + resolution: {integrity: sha512-vbK8i3rIb/xwZxSpTjz3SagHn1qq9BChLEfy5Hf6fB3/2eFbrwt2n9kHwQcS0CPTRBesreeAcsJfMq2229FnbQ==} + engines: {node: '>= 16.14.0'} + dev: false + + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + dev: false + + /conventional-changelog-angular@7.0.0: + resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} + engines: {node: '>=16'} + dependencies: + compare-func: 2.0.0 + dev: true + + /conventional-changelog-conventionalcommits@7.0.2: + resolution: {integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==} + engines: {node: '>=16'} + dependencies: + compare-func: 2.0.0 + dev: true + + /conventional-commits-parser@5.0.0: + resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} + engines: {node: '>=16'} + hasBin: true + dependencies: + JSONStream: 1.3.5 + is-text-path: 2.0.0 + meow: 12.1.1 + split2: 4.2.0 + dev: true + + /cookies@0.9.1: + resolution: {integrity: sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + keygrip: 1.1.0 + dev: false + + /cosmiconfig-typescript-loader@5.0.0(@types/node@20.11.5)(cosmiconfig@8.3.6)(typescript@5.3.3): + resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} + engines: {node: '>=v16'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=8.2' + typescript: '>=4' + dependencies: + '@types/node': 20.11.5 + cosmiconfig: 8.3.6(typescript@5.3.3) + jiti: 1.21.0 + typescript: 5.3.3 + dev: true + + /cosmiconfig@8.3.6(typescript@5.3.3): + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + typescript: 5.3.3 + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /dargs@7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + dev: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: false + + /decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + dev: true + + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + dev: true + + /deep-equal@1.0.1: + resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} + dev: false + + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + dev: false + + /default-browser-id@5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} + dev: false + + /default-browser@5.2.1: + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + engines: {node: '>=18'} + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.0 + dev: false + + /define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + dev: false + + /delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: false + + /depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + dev: false + + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: false + + /destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dev: false + + /dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + dependencies: + is-obj: 2.0.0 + dev: true + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: false + + /ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + dev: false + + /emoji-regex@10.3.0: + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + dev: false + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: false + + /encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + dev: false + + /enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + dev: false + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + + /esbuild@0.19.11: + resolution: {integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.11 + '@esbuild/android-arm': 0.19.11 + '@esbuild/android-arm64': 0.19.11 + '@esbuild/android-x64': 0.19.11 + '@esbuild/darwin-arm64': 0.19.11 + '@esbuild/darwin-x64': 0.19.11 + '@esbuild/freebsd-arm64': 0.19.11 + '@esbuild/freebsd-x64': 0.19.11 + '@esbuild/linux-arm': 0.19.11 + '@esbuild/linux-arm64': 0.19.11 + '@esbuild/linux-ia32': 0.19.11 + '@esbuild/linux-loong64': 0.19.11 + '@esbuild/linux-mips64el': 0.19.11 + '@esbuild/linux-ppc64': 0.19.11 + '@esbuild/linux-riscv64': 0.19.11 + '@esbuild/linux-s390x': 0.19.11 + '@esbuild/linux-x64': 0.19.11 + '@esbuild/netbsd-x64': 0.19.11 + '@esbuild/openbsd-x64': 0.19.11 + '@esbuild/sunos-x64': 0.19.11 + '@esbuild/win32-arm64': 0.19.11 + '@esbuild/win32-ia32': 0.19.11 + '@esbuild/win32-x64': 0.19.11 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: false + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: true + + /eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + dev: false + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.2.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + dev: false + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-xml-parser@4.2.5: + resolution: {integrity: sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==} + hasBin: true + dependencies: + strnum: 1.0.5 + dev: false + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + dev: false + + /fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + dev: false + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: false + 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] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-east-asian-width@1.2.0: + resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} + engines: {node: '>=18'} + dev: false + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + dev: false + + /get-tsconfig@4.7.2: + resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} + dependencies: + resolve-pkg-maps: 1.0.0 + dev: true + + /git-raw-commits@2.0.11: + resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + dargs: 7.0.0 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + dev: true + + /glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.3 + minipass: 7.0.4 + path-scurry: 1.10.1 + dev: false + + /global-dirs@0.1.1: + resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} + engines: {node: '>=4'} + dependencies: + ini: 1.3.8 + dev: true + + /handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.17.4 + dev: false + + /hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: false + + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: false + + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: true + + /hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + + /hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + dependencies: + lru-cache: 6.0.0 + dev: true + + /http-assert@1.5.0: + resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} + engines: {node: '>= 0.8'} + dependencies: + deep-equal: 1.0.1 + http-errors: 1.8.1 + dev: false + + /http-errors@1.8.1: + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 1.5.0 + toidentifier: 1.0.1 + dev: false + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + dev: false + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true + + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.0 + dev: true + + /is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dev: false + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: false + + /is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + dependencies: + get-east-asian-width: 1.2.0 + dev: false + + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + dev: false + + /is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + dependencies: + is-docker: 3.0.0 + dev: false + + /is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + dev: true + + /is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /is-text-path@2.0.0: + resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} + engines: {node: '>=8'} + dependencies: + text-extensions: 2.4.0 + dev: true + + /is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + dependencies: + is-inside-container: 1.0.0 + dev: false + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: false + + /jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + hasBin: true + dev: true + + /jose@4.15.4: + resolution: {integrity: sha512-W+oqK4H+r5sITxfxpSU+MMdr/YSWGvgZMQDIsNoBDGGy4i7GBPTtvFKibQzW06n3U3TqHjhvBJsirShsEJ6eeQ==} + dev: false + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: true + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true + + /jsonc-parser@3.2.1: + resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + dev: true + + /jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + dev: true + + /keygrip@1.1.0: + resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} + engines: {node: '>= 0.6'} + dependencies: + tsscmp: 1.0.6 + dev: false + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: true + + /koa-compose@4.1.0: + resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} + dev: false + + /koa-convert@2.0.0: + resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} + engines: {node: '>= 10'} + dependencies: + co: 4.6.0 + koa-compose: 4.1.0 + dev: false + + /koa@2.15.0: + resolution: {integrity: sha512-KEL/vU1knsoUvfP4MC4/GthpQrY/p6dzwaaGI6Rt4NQuFqkw3qrvsdYF5pz3wOfi7IGTvMPHC9aZIcUKYFNxsw==} + engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} + dependencies: + accepts: 1.3.8 + cache-content-type: 1.0.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookies: 0.9.1 + debug: 4.3.4 + delegates: 1.0.0 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + fresh: 0.5.2 + http-assert: 1.5.0 + http-errors: 1.8.1 + is-generator-function: 1.0.10 + koa-compose: 4.1.0 + koa-convert: 2.0.0 + on-finished: 2.4.1 + only: 0.0.2 + parseurl: 1.3.3 + statuses: 1.5.0 + type-is: 1.6.18 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /lefthook-darwin-arm64@1.6.0: + resolution: {integrity: sha512-rfyfpC6aIVU3qmr4nGBiTeFPV87NXJ5y6BX1WgHqYojKBSlADL0hoCNLZxPakySugY5DHJ7TBcl46eQKXsjJ4g==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /lefthook-darwin-x64@1.6.0: + resolution: {integrity: sha512-8icA0+M87Oq9p4UlPReRYl7X0AzSE+gqiCZK5g8GNmxiEZY79u34Cw88rgr3IbQmrAAaQcD/N2G0q/a6LgI/0g==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /lefthook-freebsd-arm64@1.6.0: + resolution: {integrity: sha512-eK1YIP/BpI+aUNzdyaW7ucVlcKCeKDaGHTMmUB8zMVb3NFjcUXZfqtUGeeX20VdGT62DEYuzPBcIJN1rF9VD6Q==} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /lefthook-freebsd-x64@1.6.0: + resolution: {integrity: sha512-u28hbye+9eMzKbdlhKnpuVhjJ4eZlbhw4b1AyFse1jJCNM8mWkjC2V2Gz5Ms0yvW5sLT7torM/fj3T5ljpdfaQ==} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /lefthook-linux-arm64@1.6.0: + resolution: {integrity: sha512-L02GU57pOoPuxoeCfM7831ZFPebBie54C5ny7erLbW3/M0buOwgb/zEpCJKbtfAcdX3LwiykxgJUO61Ux5Yduw==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /lefthook-linux-x64@1.6.0: + resolution: {integrity: sha512-pvBZ5UEl3nNDRMX5GItbuQaGvHfu0cd1ory6K5Z4x8aA1tlJ8ln9OBYLn3kbUP89hmb8vSYQmTkNtri0DaHn7g==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /lefthook-windows-arm64@1.6.0: + resolution: {integrity: sha512-pKpIwvkme3C1wGQUFSEkQDyjnYqemSxEjr6eFOxa0zaHTEUtz+cKhbNLnAAW+humQXjorvHDreWjt1LtCNosIg==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /lefthook-windows-x64@1.6.0: + resolution: {integrity: sha512-6+UbtalKvPXEiIovL1XPzHnjo+NlvGf17++RfP9iFNcM7YmY6s5DA3dxNnF1SBzSbT0DsPxAriIm9B+AyLUmng==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /lefthook@1.6.0: + resolution: {integrity: sha512-s7AkCE4dn83UDmMhbV36xMPUwjO3kAjYTDpeFmv3rEsRM9DYQGC78QbGJy476xK/grS/gGxMGtw3jt9/Yd2dSw==} + hasBin: true + requiresBuild: true + optionalDependencies: + lefthook-darwin-arm64: 1.6.0 + lefthook-darwin-x64: 1.6.0 + lefthook-freebsd-arm64: 1.6.0 + lefthook-freebsd-x64: 1.6.0 + lefthook-linux-arm64: 1.6.0 + lefthook-linux-x64: 1.6.0 + lefthook-windows-arm64: 1.6.0 + lefthook-windows-x64: 1.6.0 + dev: true + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /listr2@8.0.1: + resolution: {integrity: sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==} + engines: {node: '>=18.0.0'} + dependencies: + cli-truncate: 4.0.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.0.0 + rfdc: 1.3.1 + wrap-ansi: 9.0.0 + dev: false + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: true + + /lodash.isfunction@3.0.9: + resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} + dev: true + + /lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + dev: true + + /lodash.kebabcase@4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + dev: true + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + dev: true + + /lodash.snakecase@4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + dev: true + + /lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + dev: true + + /lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + dev: true + + /lodash.upperfirst@4.3.1: + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /log-update@6.0.0: + resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} + engines: {node: '>=18'} + dependencies: + ansi-escapes: 6.2.0 + cli-cursor: 4.0.0 + slice-ansi: 7.1.0 + strip-ansi: 7.1.0 + wrap-ansi: 9.0.0 + dev: false + + /lru-cache@10.1.0: + resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} + engines: {node: 14 || >=16.14} + dev: false + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + + /map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + dev: true + + /map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + dev: true + + /media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + dev: false + + /meow@12.1.1: + resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} + engines: {node: '>=16.10'} + dev: true + + /meow@13.1.0: + resolution: {integrity: sha512-o5R/R3Tzxq0PJ3v3qcQJtSvSE9nKOLSAaDuuoMzDVuGTwHdccMWcYomh9Xolng2tjT6O/Y83d+0coVGof6tqmA==} + engines: {node: '>=18'} + dev: false + + /meow@8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + dependencies: + '@types/minimist': 1.2.5 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + dev: true + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: false + + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: false + + /minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + /minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + dev: false + + /mlly@1.5.0: + resolution: {integrity: sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==} + dependencies: + acorn: 8.11.3 + pathe: 1.1.2 + pkg-types: 1.0.3 + ufo: 1.3.2 + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: false + + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: false + + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + dev: false + + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.8 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.13.1 + semver: 7.5.4 + validate-npm-package-license: 3.0.4 + dev: true + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /npm-run-path@5.2.0: + resolution: {integrity: sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: false + + /on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: false + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: false + + /only@0.0.2: + resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} + dev: false + + /open@10.0.4: + resolution: {integrity: sha512-oujJ/FFr7ra6/7gJuQ4ZJJ8Gf2VHM0J3J/W7IvH++zaqEzacWVxzK++NiVY5NLHTTj7u/jNH5H3Ei9biL31Lng==} + engines: {node: '>=18'} + dependencies: + default-browser: 5.2.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 3.1.0 + dev: false + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.23.5 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + + /parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + dev: false + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: false + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 10.1.0 + minipass: 7.0.4 + dev: false + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + dev: true + + /pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + dependencies: + jsonc-parser: 3.2.1 + mlly: 1.5.0 + pathe: 1.1.2 + dev: true + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: true + + /quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + dev: true + + /read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: true + + /redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve-global@1.0.0: + resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} + engines: {node: '>=8'} + dependencies: + global-dirs: 0.1.1 + dev: true + + /resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + dev: true + + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: false + + /rfdc@1.3.1: + resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} + dev: false + + /run-applescript@7.0.0: + resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + engines: {node: '>=18'} + dev: false + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + dev: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: false + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: false + + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: false + + /slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 5.0.0 + dev: false + + /slug@8.2.3: + resolution: {integrity: sha512-fXjhAZszNecz855GUNIwW0+sFPi9WV4bMiEKDOCA4wcq1ts1UnUVNy/F78B0Aat7/W3rA+se//33ILKNMrbeYQ==} + hasBin: true + dev: false + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: false + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.16 + dev: true + + /spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + dev: true + + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.16 + dev: true + + /spdx-license-ids@3.0.16: + resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} + dev: true + + /split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + dependencies: + readable-stream: 3.6.2 + dev: true + + /split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + dev: true + + /statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + dev: false + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: false + + /string-width@7.1.0: + resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} + engines: {node: '>=18'} + dependencies: + emoji-regex: 10.3.0 + get-east-asian-width: 1.2.0 + strip-ansi: 7.1.0 + dev: false + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: false + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: false + + /strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strnum@1.0.5: + resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + dev: false + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /text-extensions@2.4.0: + resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} + engines: {node: '>=8'} + dev: true + + /through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + dependencies: + readable-stream: 3.6.2 + dev: true + + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: true + + /toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + dev: false + + /trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + dev: true + + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: false + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: false + + /tsscmp@1.0.6: + resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} + engines: {node: '>=0.6.x'} + dev: false + + /tsx@4.7.0: + resolution: {integrity: sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==} + engines: {node: '>=18.0.0'} + hasBin: true + dependencies: + esbuild: 0.19.11 + get-tsconfig: 4.7.2 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: true + + /type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: true + + /type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + dev: false + + /type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: false + + /typescript@5.3.3: + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /ufo@1.3.2: + resolution: {integrity: sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==} + dev: true + + /uglify-js@3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + engines: {node: '>=0.8.0'} + hasBin: true + requiresBuild: true + dev: false + optional: true + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + dev: true + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + dev: false + + /uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + dev: false + + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: true + + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: false + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + + /wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + dev: false + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: false + + /wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + dependencies: + ansi-styles: 6.2.1 + string-width: 7.1.0 + strip-ansi: 7.1.0 + dev: false + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: true + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + 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.8 + yargs-parser: 21.1.1 + dev: true + + /ylru@1.3.2: + resolution: {integrity: sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==} + engines: {node: '>= 4.0.0'} + dev: false + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true diff --git a/release.config.cjs b/release.config.cjs new file mode 100644 index 0000000..2c5f5eb --- /dev/null +++ b/release.config.cjs @@ -0,0 +1,19 @@ +module.exports = { + branches: ["main"], + plugins: [ + "@semantic-release/commit-analyzer", + "@semantic-release/release-notes-generator", + "@semantic-release/changelog", + "@semantic-release/npm", + "@semantic-release/github", + [ + "@semantic-release/git", + { + assets: ["CHANGELOG.md", "package.json", "package-lock.json"], + message: + "chore(release): set `package.json` to ${nextRelease.version} [skip ci]" + + "\n\n${nextRelease.notes}", + }, + ], + ], +}; diff --git a/skeleton/base/.gitignore.rm-ext b/skeleton/base/.gitignore.rm-ext new file mode 100644 index 0000000..a3b1526 --- /dev/null +++ b/skeleton/base/.gitignore.rm-ext @@ -0,0 +1,4 @@ +/node_modules +/cdktf.out +/dist +/terraform.* diff --git a/skeleton/base/.lefthook/commit-msg/commitlint.sh b/skeleton/base/.lefthook/commit-msg/commitlint.sh new file mode 100755 index 0000000..a0cfd73 --- /dev/null +++ b/skeleton/base/.lefthook/commit-msg/commitlint.sh @@ -0,0 +1 @@ +echo $(head -n1 $1) | pnpm exec commitlint --color diff --git a/skeleton/base/README.md b/skeleton/base/README.md new file mode 100644 index 0000000..3ebea0b --- /dev/null +++ b/skeleton/base/README.md @@ -0,0 +1,13 @@ +# Auth0 CICD + +Project for managing Auth0 infrastructure via IaC. + +## Setup + +- `pnpm install` +- `pnpm start` + +## Provider update + +If a new version of the Auth0 provider should be used, update the version in `cdktf.json` and then run +`update-provider.sh` to generate the new TypeScript files. diff --git a/skeleton/base/biome.json b/skeleton/base/biome.json new file mode 100644 index 0000000..d7772a5 --- /dev/null +++ b/skeleton/base/biome.json @@ -0,0 +1,57 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.5.3/schema.json", + "organizeImports": { + "enabled": true + }, + "files": { + "include": [ + "biome.json", + "commitlint.config.cjs", + "ecosystem.config.cjs", + "update-provider.js", + "src/**/*" + ], + "ignore": ["src/gen/**/*"] + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "nursery": { + "noEmptyTypeParameters": "error", + "noInvalidUseBeforeDeclaration": "error", + "noUnusedImports": "error", + "noUnusedPrivateClassMembers": "error", + "noUselessLoneBlockStatements": "error", + "noUselessTernary": "error", + "useExportType": "error", + "useImportType": "error", + "useForOf": "error", + "useGroupedTypeImport": "error" + }, + "complexity": { + "noExcessiveCognitiveComplexity": "warn", + "useSimplifiedLogicExpression": "error" + }, + "correctness": { + "noNewSymbol": "error" + }, + "style": { + "useBlockStatements": "error", + "useCollapsedElseIf": "error", + "useShorthandArrayType": "error", + "useShorthandAssign": "error", + "useSingleCaseStatement": "error" + }, + "suspicious": { + "noApproximativeNumericConstant": "warn", + "noConsoleLog": "error" + } + } + }, + "formatter": { + "indentStyle": "space", + "indentWidth": 4, + "lineWidth": 100 + } +} diff --git a/skeleton/base/commitlint.config.cjs b/skeleton/base/commitlint.config.cjs new file mode 100644 index 0000000..5073c20 --- /dev/null +++ b/skeleton/base/commitlint.config.cjs @@ -0,0 +1 @@ +module.exports = { extends: ["@commitlint/config-conventional"] }; diff --git a/skeleton/base/lefthook.yml b/skeleton/base/lefthook.yml new file mode 100644 index 0000000..ee468b1 --- /dev/null +++ b/skeleton/base/lefthook.yml @@ -0,0 +1,10 @@ +pre-commit: + commands: + check: + glob: "*.{js,ts,cjs,mjs,d.cts,d.mts,jsx,tsx,json,jsonc}" + run: pnpm exec biome check --apply --no-errors-on-unmatched --files-ignore-unknown=true {staged_files} && git update-index --again + +commit-msg: + scripts: + "commitlint.sh": + runner: bash diff --git a/skeleton/base/src/env-variables.ts b/skeleton/base/src/env-variables.ts new file mode 100644 index 0000000..2de80a0 --- /dev/null +++ b/skeleton/base/src/env-variables.ts @@ -0,0 +1,14 @@ +const loadFromEnv = (name: string): string => { + if (!process.env[name]) { + throw new Error(`Env variable with name ${name} not found`); + } + + return name; +}; + +export const envVariables = { + ses: { + accessKeyId: loadFromEnv("SES_ACCESS_KEY_ID"), + secretAccessKey: loadFromEnv("SES_SECRET_ACCESS_KEY"), + }, +}; diff --git a/skeleton/base/update-provider.js b/skeleton/base/update-provider.js new file mode 100644 index 0000000..96048dc --- /dev/null +++ b/skeleton/base/update-provider.js @@ -0,0 +1,6 @@ +import { rmSync } from "fs"; +import { execa } from "execa"; + +await execa("pnpm", ["exec", "cdktf", "get", "--output=./src/gen"]).pipeStdout(process.stdout); +rmSync("./src/gen/providers/auth0/index.ts", { force: true }); +rmSync("./src/gen/providers/auth0/lazy-index.ts", { force: true }); diff --git a/skeleton/package.json b/skeleton/package.json new file mode 100644 index 0000000..25469c1 --- /dev/null +++ b/skeleton/package.json @@ -0,0 +1,27 @@ +{ + "version": "1.0.0", + "private": true, + "type": "module", + "devDependencies": { + "@biomejs/biome": "1.5.3", + "@commitlint/cli": "^19.0.3", + "@commitlint/config-conventional": "^19.0.3", + "@tsconfig/node20": "^20.1.2", + "@types/node": "^20.11.24", + "@types/source-map-support": "^0.5.10", + "execa": "^8.0.1", + "lefthook": "^1.6.4", + "typescript": "^5.3.3" + }, + "dependencies": { + "cdktf": "^0.20.4", + "cdktf-cli": "^0.20.4", + "constructs": "^10.3.0", + "source-map-support": "^0.5.21" + }, + "scripts": { + "build": "tsc", + "format": "biome format . --write", + "check": "biome check . --apply" + } +} diff --git a/skeleton/templates/bitbucket-pipelines.yml.mustache b/skeleton/templates/bitbucket-pipelines.yml.mustache new file mode 100644 index 0000000..392d03d --- /dev/null +++ b/skeleton/templates/bitbucket-pipelines.yml.mustache @@ -0,0 +1,99 @@ +image: node:20 + +definitions: + caches: + pnpm: + key: + files: + - pnpm-lock.yaml + path: $BITBUCKET_CLONE_DIR/.pnpm-store + steps: + - step: &biome + name: Biome + runs-on: + - 'self.hosted' + - 'linux' + script: + - corepack enable + - corepack prepare pnpm@latest-8 --activate + - pnpm install + - pnpm exec biome ci . + caches: + - pnpm + - step: &deploy + runs-on: + - 'self.hosted' + - 'linux' + oidc: true + caches: + - pnpm + script: + # Configure OIDC + - export AWS_REGION={{{region}}} + - export AWS_ROLE_ARN={{{deployRoleArn}}} + - export AWS_WEB_IDENTITY_TOKEN_FILE=$(pwd)/web-identity-token + - echo $BITBUCKET_STEP_OIDC_TOKEN > $(pwd)/web-identity-token + # Install terraform + - TERRAFORM_VERSION=1.7.4 + - wget https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_linux_amd64.zip + - unzip terraform_${TERRAFORM_VERSION}_linux_amd64.zip + - rm terraform_${TERRAFORM_VERSION}_linux_amd64.zip + - mv terraform /usr/local/bin + # Install dependencies + - corepack enable + - corepack prepare pnpm@latest-8 --activate + - pnpm install -P + # Deploy with CDK + - pnpm exec cdktf deploy --app "node dist/env-$BITBUCKET_DEPLOYMENT_ENVIRONMENT.js" --auto-approve + +pipelines: + branches: + main: + - parallel: + steps: + - step: *biome + - step: + name: Build + runs-on: + - 'self.hosted' + - 'linux' + script: + - corepack enable + - corepack prepare pnpm@latest-8 --activate + - pnpm install + - pnpm build + caches: + - pnpm + artifacts: + - dist/** + - step: + <<: *deploy + name: Deploy Development + deployment: test + - step: + <<: *deploy + name: Deploy Staging + deployment: staging + trigger: manual + - step: + <<: *deploy + name: Deploy Production + deployment: production + trigger: manual + pull-requests: + '**': + - parallel: + steps: + - step: *biome + - step: + name: Type check + runs-on: + - 'self.hosted' + - 'linux' + script: + - corepack enable + - corepack prepare pnpm@latest-8 --activate + - pnpm install + - pnpm exec tsc --noEmit + caches: + - pnpm diff --git a/skeleton/templates/cdktf.json.mustache b/skeleton/templates/cdktf.json.mustache new file mode 100644 index 0000000..24eb79b --- /dev/null +++ b/skeleton/templates/cdktf.json.mustache @@ -0,0 +1,11 @@ +{ + "language": "typescript", + "app": "null", + "projectId": "{{{projectId}}}", + "sendCrashReports": "false", + "terraformProviders": [ + "auth0/auth0@~> 1.2" + ], + "terraformModules": [], + "context": {} +} diff --git a/skeleton/templates/src/auth0-stack.ts.mustache b/skeleton/templates/src/auth0-stack.ts.mustache new file mode 100644 index 0000000..82cc2f1 --- /dev/null +++ b/skeleton/templates/src/auth0-stack.ts.mustache @@ -0,0 +1,111 @@ +import { S3Backend, TerraformStack } from 'cdktf'; +import type { Construct } from 'constructs'; +import { Branding } from './gen/providers/auth0/branding/index.js'; +import { Client } from './gen/providers/auth0/client/index.js'; +import { Connection } from './gen/providers/auth0/connection/index.js'; +import { EmailProvider } from './gen/providers/auth0/email-provider/index.js'; +import { Auth0Provider } from './gen/providers/auth0/provider/index.js'; +import { ResourceServer } from './gen/providers/auth0/resource-server/index.js'; +import { Tenant } from './gen/providers/auth0/tenant/index.js'; + +type Props = { + stateKey: string; + friendlyTenantName: string; +{{#if spa}} + {{{spa.propPrefix}}}BaseUrl: string; +{{/if}} + ses?: { + accessKeyId: string; + secretAccessKey: string; + region: string; + }; +}; + +class Auth0Stack extends TerraformStack { + public constructor(scope: Construct, id: string, props: Props) { + super(scope, id); + + new S3Backend(this, { + bucket: "{{{awsDeployResult.stateBucketName}}}", + key: props.stateKey, + region: "{{{region}}}", + }); + + new Auth0Provider(this, "Auth0Provider"); + + new Tenant(this, "Tenant", { + friendlyName: props.friendlyTenantName, + pictureUrl: "https://{{{awsDeployResult.staticBucketDomainName}}}/tenant-logo.svg", + supportEmail: "{{{tenant.supportEmailAddress}}}", + supportUrl: "{{{tenant.supportUrl}}}", + }); + + new Connection(this, "UsernamePasswordAuthenticationConnection", { + name: "Username-Password-Authentication", + strategy: "auth0", + options: { + passwordPolicy: "low", + passwordComplexityOptions: { + minLength: 12, + }, + passwordDictionary: { + enable: true, + }, + passwordNoPersonalInfo: { + enable: true, + }, + }, + }); + + new Branding(this, "Branding", { + logoUrl: "https://{{{awsDeployResult.staticBucketDomainName}}}/branding-logo.svg", + colors: { + primary: "#635dff", + pageBackground: "#000000", + }, + }); + +{{#if api}} + new ResourceServer(this, "{{{api.resourceName}}}", { + identifier: "{{{api.identifier}}}", + name: "{{{api.name}}}", + skipConsentForVerifiableFirstPartyClients: true, + }); + +{{/if}} +{{#if spa}} + new Client(this, "{{{spa.resourceName}}}", { + name: "{{{spa.name}}}", + appType: "spa", + isFirstParty: true, + oidcConformant: true, + logoUri: "https://{{{awsDeployResult.staticBucketDomainName}}}/{{{spa.identifier}}}-logo.svg", + refreshToken: { + rotationType: "rotating", + expirationType: "expiring", + tokenLifetime: 60 * 60 * 24 * 30, + idleTokenLifetime: 60 * 60 * 24 * 15 + }, + callbacks: [props.{{{spa.propPrefix}}}BaseUrl], + allowedOrigins: [props.{{{spa.propPrefix}}}BaseUrl], + allowedLogoutUrls: [props.{{{spa.propPrefix}}}BaseUrl], + webOrigins: [props.{{{spa.propPrefix}}}BaseUrl], + grantTypes: [ + "authorization_code", + "refresh_token", + ], + }); + +{{/if}} + if (props.ses) { + new EmailProvider(this, "EmailProvider", { + name: "ses", + defaultFromAddress: "{{{tenant.defaultFromAddress}}}", + enabled: true, + credentials: props.ses, + }); + } + } +} + +export default Auth0Stack; diff --git a/skeleton/templates/src/env-production.ts.mustache b/skeleton/templates/src/env-production.ts.mustache new file mode 100644 index 0000000..e8b158c --- /dev/null +++ b/skeleton/templates/src/env-production.ts.mustache @@ -0,0 +1,17 @@ +import { App } from 'cdktf'; +import Auth0Stack from './auth0-stack.js'; +import { envVariables } from './env-variables.js'; + +const app = new App(); +new Auth0Stack(app, "ProductionStack", { + stateKey: "production.state", + friendlyTenantName: "{{{tenant.friendlyName}}}", +{{#if spa}} + {{{spa.propPrefix}}}BaseUrl: "https://example.com", +{{/if}} + ses: { + ...envVariables.ses, + region: "{{{region}}}", + }, +}); +app.synth(); diff --git a/skeleton/templates/src/env-staging.ts.mustache b/skeleton/templates/src/env-staging.ts.mustache new file mode 100644 index 0000000..d5600c5 --- /dev/null +++ b/skeleton/templates/src/env-staging.ts.mustache @@ -0,0 +1,17 @@ +import { App } from 'cdktf'; +import Auth0Stack from './auth0-stack.js'; +import { envVariables } from './env-variables.js'; + +const app = new App(); +new Auth0Stack(app, "StagingStack", { + stateKey: "staging.state", + friendlyTenantName: "{{{tenant.friendlyName}}} (Staging)", +{{#if spa}} + {{{spa.propPrefix}}}BaseUrl: "https://example.com", +{{/if}} + ses: { + ...envVariables.ses, + region: "{{{region}}}", + }, +}); +app.synth(); diff --git a/skeleton/templates/src/env-test.ts.mustache b/skeleton/templates/src/env-test.ts.mustache new file mode 100644 index 0000000..c2c4f32 --- /dev/null +++ b/skeleton/templates/src/env-test.ts.mustache @@ -0,0 +1,12 @@ +import { App } from 'cdktf'; +import Auth0Stack from './auth0-stack.js'; + +const app = new App(); +new Auth0Stack(app, "DevelopmentStack", { + stateKey: "development.state", + friendlyTenantName: "{{{tenant.friendlyName}}} (Development)", +{{#if spa}} + {{{spa.propPrefix}}}BaseUrl: "https://example.com", +{{/if}} +}); +app.synth(); diff --git a/skeleton/tsconfig.json b/skeleton/tsconfig.json new file mode 100644 index 0000000..cb654f8 --- /dev/null +++ b/skeleton/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": ["@tsconfig/node20/tsconfig.json"], + "compilerOptions": { + "strict": true, + "noImplicitAny": true, + "sourceMap": true, + "outDir": "dist" + }, + "include": [ + "src/**/*" + ] +} diff --git a/src/auth0.ts b/src/auth0.ts new file mode 100644 index 0000000..422711b --- /dev/null +++ b/src/auth0.ts @@ -0,0 +1,147 @@ +import { ManagementClient } from "auth0"; +import { execute } from "./util.js"; + +type App = { + name: string; + client_id: string; + client_secret: string; +}; + +type Apps = App[]; + +export type Auth0Credential = { + tenant: string; + clientId: string; + clientSecret: string; +}; + +const getProviderCredential = async (tenant: string, apps: Apps): Promise => { + const existingProvider = apps.find((app) => app.name === "Auth0 Terraform Provider"); + + if (existingProvider) { + return { + tenant, + clientId: existingProvider.client_id, + clientSecret: existingProvider.client_secret, + }; + } + + const createResult = await execute(null, "auth0", [ + "apps", + "create", + "--name", + "Auth0 Terraform Provider", + "--description", + "Auth0 Terraform Provider M2M", + "--type", + "m2m", + "--tenant", + tenant, + "--reveal-secrets", + "--json", + ]); + + const credentials = JSON.parse(createResult.stdout) as App; + + return { + tenant, + clientId: credentials.client_id, + clientSecret: credentials.client_secret, + }; +}; + +type Apis = { + id: string; + identifier: string; + name: string; + scopes: { + value: string; + description: string; + }[]; +}[]; + +const grantClient = async ( + tenant: string, + clientId: string, + stdout: NodeJS.WritableStream, +): Promise => { + const listApisResult = await execute(null, "auth0", [ + "apis", + "ls", + "--tenant", + tenant, + "--json", + ]); + const apis = JSON.parse(listApisResult.stdout) as Apis; + const managementApi = apis.find((api) => api.name === "Auth0 Management API"); + + if (!managementApi) { + throw new Error("Could not find management API"); + } + + const data = JSON.stringify({ + client_id: clientId, + audience: managementApi.identifier, + scope: managementApi.scopes.map((scope) => scope.value), + }); + + await execute( + stdout, + "auth0", + ["api", "post", "client-grants", "--tenant", tenant, '--data', data], + { stdin: "ignore" }, + ); +}; + +const deleteDefaultResources = async ( + tenant: string, + apps: Apps, + credential: Auth0Credential, + stdout: NodeJS.WritableStream, +): Promise => { + const defaultApp = apps.find((app) => app.name === "Default App"); + + if (defaultApp) { + await execute(stdout, "auth0", [ + "apps", + "rm", + defaultApp.client_id, + "--tenant", + tenant, + "--force", + ]); + } + + const management = new ManagementClient({ + domain: tenant, + clientId: credential.clientId, + clientSecret: credential.clientSecret, + }); + + const connections = await management.connections.getAll(); + + for (const connection of connections.data) { + await management.connections.delete({ id: connection.id }); + } +}; + +export const setupTenant = async ( + tenant: string, + stdout: NodeJS.WritableStream, +): Promise => { + const listAppsResult = await execute(null, "auth0", [ + "apps", + "ls", + "--reveal-secrets", + "--json", + "--tenant", + tenant, + ]); + + const apps = JSON.parse(listAppsResult.stdout) as Apps; + const credential = await getProviderCredential(tenant, apps); + await grantClient(tenant, credential.clientId, stdout); + await deleteDefaultResources(tenant, apps, credential, stdout); + + return credential; +}; diff --git a/src/aws-stack.ts b/src/aws-stack.ts new file mode 100644 index 0000000..c09734d --- /dev/null +++ b/src/aws-stack.ts @@ -0,0 +1,111 @@ +import { + AwsCdkCli, + type ICloudAssemblyDirectoryProducer, + RequireApproval, +} from "@aws-cdk/cli-lib-alpha"; +import { CloudFormation, type Stack } from "@aws-sdk/client-cloudformation"; +import * as cdk from "aws-cdk-lib"; +import { App, type AppProps, CfnOutput, RemovalPolicy } from "aws-cdk-lib"; +import { Effect, PolicyStatement, User } from "aws-cdk-lib/aws-iam"; +import { BlockPublicAccess, Bucket } from "aws-cdk-lib/aws-s3"; +import type { Construct } from "constructs"; + +class AwsStack extends cdk.Stack { + public constructor(scope: Construct, id: string, props: cdk.StackProps) { + super(scope, id, props); + + const stateBucket = new Bucket(this, "StateBucket", { + autoDeleteObjects: true, + blockPublicAccess: BlockPublicAccess.BLOCK_ALL, + removalPolicy: RemovalPolicy.DESTROY, + }); + + const staticBucket = new Bucket(this, "StaticBucket", { + autoDeleteObjects: true, + publicReadAccess: true, + blockPublicAccess: new BlockPublicAccess({ + blockPublicAcls: false, + blockPublicPolicy: false, + ignorePublicAcls: false, + restrictPublicBuckets: false, + }), + removalPolicy: RemovalPolicy.DESTROY, + }); + + const auth0User = new User(this, "Auth0User"); + auth0User.addToPolicy( + new PolicyStatement({ + effect: Effect.ALLOW, + actions: ["ses:SendRawEmail", "ses:SendEmail"], + resources: ["*"], + }), + ); + + new CfnOutput(this, "StateBucketName", { + value: stateBucket.bucketName, + }); + + new CfnOutput(this, "StaticBucketName", { + value: staticBucket.bucketName, + }); + + new CfnOutput(this, "StaticBucketDomainName", { + value: staticBucket.bucketDomainName, + }); + + new CfnOutput(this, "Auth0UserName", { + value: auth0User.userName, + }); + } +} + +class Producer implements ICloudAssemblyDirectoryProducer { + public constructor(private readonly region: string) { + } + + public async produce(context: AppProps["context"]): Promise { + const app = new App({ context }); + new AwsStack(app, "auth0-cicd", {env: {region: this.region}}); + return app.synth().directory; + } +} + +export type AwsDeployResult = { + stateBucketName: string; + staticBucketName: string; + staticBucketDomainName: string; + auth0UserName: string; +}; + +const resolveOutput = (stack: Stack, name: string): string => { + const output = stack.Outputs?.find((output) => output.OutputKey === name); + + if (!output?.OutputValue) { + throw new Error(`Could not find ${name} output`); + } + + return output.OutputValue; +}; + +export const deployAwsStack = async (region: string): Promise => { + const cli = AwsCdkCli.fromCloudAssemblyDirectoryProducer(new Producer(region)); + await cli.deploy({ requireApproval: RequireApproval.NEVER }); + + const cf = new CloudFormation({region}); + const result = await cf.describeStacks({ + StackName: "auth0-cicd", + }); + + if (!result.Stacks?.[0]) { + throw new Error("Could not locate auth0-cicd stack"); + } + + const stack = result.Stacks[0]; + + return { + stateBucketName: resolveOutput(stack, "StateBucketName"), + staticBucketName: resolveOutput(stack, "StaticBucketName"), + staticBucketDomainName: resolveOutput(stack, "StaticBucketDomainName"), + auth0UserName: resolveOutput(stack, "Auth0UserName"), + }; +}; diff --git a/src/bitbucket.ts b/src/bitbucket.ts new file mode 100644 index 0000000..f3c591e --- /dev/null +++ b/src/bitbucket.ts @@ -0,0 +1,143 @@ +const BASE_URL = "https://api.bitbucket.org/2.0"; + +type GetRepositoryResponse = { + uuid: string; +}; + +type GetEnvironmentsResponse = { + values: { + type: string; + uuid: string; + name: string; + }[]; +}; + +type Environment = { + uuid: string; + type: string; + name: string; +}; + +export class BitBucketClient { + public constructor( + private readonly accessToken: string, + private readonly workspace: string, + private readonly repoSlug: string, + ) {} + + public async getRepositoryUuid(): Promise { + const response = await fetch( + `${BASE_URL}/repositories/${this.workspace}/${this.repoSlug}`, + { + headers: { + authorization: `Bearer ${this.accessToken}`, + }, + }, + ); + + if (!response.ok) { + throw new Error("Failed to fetch repository"); + } + + const body = (await response.json()) as GetRepositoryResponse; + return body.uuid; + } + + public async enablePipeline(): Promise { + const response = await fetch( + `${BASE_URL}/repositories/${this.workspace}/${this.repoSlug}/pipelines_config`, + { + method: "PUT", + headers: { + authorization: `Bearer ${this.accessToken}`, + "content-type": "application/json", + }, + body: JSON.stringify({ + enabled: true, + }), + }, + ); + + if (!response.ok) { + throw new Error("Failed to enable pipeline"); + } + } + + public async getEnvironments(): Promise { + const response = await fetch( + `${BASE_URL}/repositories/${this.workspace}/${this.repoSlug}/environments`, + { + headers: { + authorization: `Bearer ${this.accessToken}`, + }, + }, + ); + + if (!response.ok) { + throw new Error("Failed to fetch environments"); + } + + const body = (await response.json()) as GetEnvironmentsResponse; + + return body.values.map((value) => ({ + uuid: value.uuid, + type: value.type, + name: value.name, + })); + } + + public async createRepositoryVariable( + key: string, + value: string, + secured: boolean, + ): Promise { + const response = await fetch( + `${BASE_URL}/repositories/${this.workspace}/${this.repoSlug}/pipelines_config/variables/`, + { + method: "POST", + headers: { + authorization: `Bearer ${this.accessToken}`, + "content-type": "application/json", + }, + body: JSON.stringify({ key, value, secured }), + }, + ); + + if (response.status === 409) { + // Already applied + return; + } + + if (!response.ok) { + throw new Error("Failed to create repository variable"); + } + } + + public async createEnvVariable( + envUuid: string, + key: string, + value: string, + secured: boolean, + ): Promise { + const response = await fetch( + `${BASE_URL}/repositories/${this.workspace}/${this.repoSlug}/deployments_config/environments/${envUuid}/variables/`, + { + method: "POST", + headers: { + authorization: `Bearer ${this.accessToken}`, + "content-type": "application/json", + }, + body: JSON.stringify({ key, value, secured }), + }, + ); + + if (response.status === 409) { + // Already applied + return; + } + + if (!response.ok) { + throw new Error("Failed to create env variable"); + } + } +} diff --git a/src/cli.ts b/src/cli.ts new file mode 100644 index 0000000..284ef57 --- /dev/null +++ b/src/cli.ts @@ -0,0 +1,657 @@ +#!/usr/bin/env node + +import { randomUUID } from "crypto"; +import path from "path"; +import { fileURLToPath } from "url"; +import { IAM } from "@aws-sdk/client-iam"; +import { S3 } from "@aws-sdk/client-s3"; +import { STS } from "@aws-sdk/client-sts"; +import type { GetCallerIdentityResponse } from "@aws-sdk/client-sts/dist-types/models/models_0.js"; +import { ListrEnquirerPromptAdapter } from "@listr2/prompt-adapter-enquirer"; +import { getAccessToken } from "@soliantconsulting/bitbucket-cloud-cli-auth"; +import camelcase from "camelcase"; +import type { ExecaReturnValue } from "execa"; +import { readFile, stat } from "fs/promises"; +import { Listr, ListrLogLevels, ListrLogger } from "listr2"; +import meow from "meow"; +import semver from "semver/preload.js"; +import slug from "slug"; +import "source-map-support/register.js"; +import { type Auth0Credential, setupTenant } from "./auth0.js"; +import { type AwsDeployResult, deployAwsStack } from "./aws-stack.js"; +import { BitBucketClient } from "./bitbucket.js"; +import { type ApiSettings, type SpaSettings, type TenantSettings, synthProject } from "./synth.js"; +import { execute } from "./util.js"; + +const logger = new ListrLogger(); + +const cli = meow( + ` + Usage + + $ npm init @soliantconsulting/auth0-cicd [name|-v|--version|-h|--help] +`, + { + booleanDefault: undefined, + flags: { + help: { + type: "boolean", + shortFlag: "h", + }, + version: { + type: "boolean", + shortFlag: "v", + }, + }, + importMeta: import.meta, + }, +); + +const [name] = cli.input; + +type Context = { + accountId: string; + workspace: string; + repository: string; + deployRoleArn: string; + bitbucketAccessToken: string; + name: string; + region: string; + repositoryUuid: string; + projectPath: string; + projectId: string; + tenant: TenantSettings; + spa: SpaSettings | null; + api: ApiSettings | null; + awsDeployResult: AwsDeployResult; + awsAuth0Credentials: { + accessKeyId: string; + secretAccessKey: string; + }; + auth0Credentials: { + development: Auth0Credential; + staging: Auth0Credential; + production: Auth0Credential; + }; +}; + +const tasks = new Listr( + [ + { + title: "Check pnpm version", + task: async (_context, task): Promise => { + let result: ExecaReturnValue; + + try { + result = await execute(task.stdout(), "pnpm", ["--version"]); + } catch { + throw new Error( + "pnpm not found, please install latest version: https://pnpm.io/installation", + ); + } + + const version = result.stdout.trim(); + + if (!semver.gte(version, "8.14.0")) { + throw new Error(`pnpm version ${version} found, need at least 8.14.0`); + } + }, + }, + { + title: "Check auth0 version", + task: async (_context, task): Promise => { + let result: ExecaReturnValue; + + try { + result = await execute(task.stdout(), "auth0", ["--version"]); + } catch { + throw new Error( + "auth0 not found, please install latest version: https://github.com/auth0/auth0-cli?tab=readme-ov-file#installation", + ); + } + + const versionMatch = result.stdout.match(/version ([^ ]+)/); + + if (!versionMatch) { + throw new Error("Could not match version"); + } + + const version = versionMatch[1]; + + if (!semver.gte(version, "1.4.0")) { + throw new Error(`auth0 version ${version} found, need at least 1.4.0`); + } + }, + }, + { + title: "Check terraform version", + task: async (_context, task): Promise => { + let result: ExecaReturnValue; + + try { + result = await execute(task.stdout(), "terraform", ["--version"]); + } catch { + throw new Error( + "terraform not found, please install latest version: https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli", + ); + } + + const versionMatch = result.stdout.match(/v([0-9.]+)/); + + if (!versionMatch) { + throw new Error("Could not match version"); + } + + const version = versionMatch[1]; + + if (!semver.gte(version, "1.7.4")) { + throw new Error(`terraform version ${version} found, need at least 1.7.4`); + } + }, + }, + { + title: "Retrieve AWS account ID", + task: async (context, _task): Promise => { + const sts = new STS({ region: "us-east-1" }); + let identity: GetCallerIdentityResponse; + + try { + identity = await sts.getCallerIdentity({}); + } catch (error) { + throw new Error( + "Could not acquire account ID, have you set up AWS env variables?", + ); + } + + if (!identity.Account) { + throw new Error("Failed to acquire account ID from identity"); + } + + context.accountId = identity.Account; + }, + }, + { + title: "Setup tenants", + task: async (_context, task): Promise => { + const prompt = task.prompt(ListrEnquirerPromptAdapter); + const confirmed = await prompt.run({ + type: "confirm", + message: "Created and logged into all tenants?", + footer: + "You must create three tenants (, -development, -staging).\n" + + "Set each tenants enviornment tag to their respective environment.\n" + + "Then run `auth0 login --scopes create:client_grants,delete:connections` for each tenant.", + }); + + if (!confirmed) { + throw new Error("Tenants not prepared"); + } + }, + }, + { + title: "Configure tenants", + task: async (context, task): Promise => { + const rawTenants = await execute(null, "auth0", [ + "tenants", + "ls", + "--csv", + "--no-color", + ]); + + const tenants = rawTenants.stdout + .split("\n") + .slice(1) + .map((raw) => { + const parts = raw.split(","); + return parts[parts.length - 1]; + }) + .sort(); + + if (tenants.length === 0) { + throw new Error("No tenants found"); + } + + const envs = ["development", "staging", "production"] as const; + context.auth0Credentials = {} as unknown as Context["auth0Credentials"]; + + return task.newListr( + envs.map((env) => ({ + title: `Environment ${env}`, + task: async (context, task) => { + const prompt = task.prompt(ListrEnquirerPromptAdapter); + + const tenant = await prompt.run({ + type: "select", + message: `Tenant for ${env}:`, + choices: tenants, + }); + + const confirmed = await prompt.run({ + type: "confirm", + message: `WARNING: Confirm to delete all connections and default resources from ${tenant}`, + }); + + if (!confirmed) { + throw new Error("Operation aborted"); + } + + context.auth0Credentials[env] = await setupTenant( + tenant, + task.stdout(), + ); + }, + })), + { concurrent: false }, + ); + }, + }, + { + title: "Gather project settings", + task: async (context, task): Promise => { + context.projectId = randomUUID(); + + const prompt = task.prompt(ListrEnquirerPromptAdapter); + + const repositoryClonePrompt = await prompt.run({ + type: "input", + message: "Repository clone prompt:", + }); + + const repositoryMatch = repositoryClonePrompt.match( + /@bitbucket\.org[:\/]([^\/]+)\/(.+)\.git/, + ); + + if (!repositoryMatch) { + throw new Error("Invalid repository clone prompt"); + } + + const [, workspace, repository] = repositoryMatch; + context.workspace = workspace; + context.repository = repository; + + context.name = await prompt.run({ + type: "input", + message: "Name:", + initial: name, + }); + + context.projectPath = path.join(process.cwd(), context.name); + let projectPathExists = false; + + try { + await stat(context.projectPath); + projectPathExists = true; + } catch { + // Noop + } + + if (projectPathExists) { + throw new Error(`Path ${context.projectPath} already exists`); + } + + context.region = await prompt.run({ + type: "input", + message: "AWS region:", + initial: "us-east-1", + }); + }, + }, + { + title: "Gather tenant settings", + task: async (context, task): Promise => { + const prompt = task.prompt(ListrEnquirerPromptAdapter); + + context.tenant = await prompt.run([ + { + name: "friendlyName", + type: "input", + message: "Friendly Name:", + }, + { + name: "supportUrl", + type: "input", + message: "Support URL:", + }, + { + name: "supportEmailAddress", + type: "input", + message: "Support Email Address:", + }, + { + name: "defaultFromAddress", + type: "input", + message: "Default From Address:", + }, + ]); + }, + }, + { + title: "Gather SPA settings", + task: async (context, task): Promise => { + const prompt = task.prompt(ListrEnquirerPromptAdapter); + + const enableSpa = await prompt.run({ + type: "toggle", + message: "Enable SPA:", + initial: true, + }); + + if (!enableSpa) { + context.spa = null; + return; + } + + const name = await prompt.run({ + type: "input", + message: "Friendly name (e.g. My Web):", + }); + + const identifier = slug(name); + const resourceName = `${camelcase(identifier, { pascalCase: true })}Client`; + + context.spa = { + name, + identifier, + resourceName, + propPrefix: camelcase(identifier), + }; + }, + }, + { + title: "Gather API settings", + task: async (context, task): Promise => { + const prompt = task.prompt(ListrEnquirerPromptAdapter); + + const enableApi = await prompt.run({ + type: "toggle", + message: "Enable API:", + initial: true, + }); + + if (!enableApi) { + context.api = null; + return; + } + + const name = await prompt.run({ + type: "input", + message: "Friendly name (e.g. My API):", + }); + + const identifier = slug(name); + const resourceName = `${camelcase(identifier, { pascalCase: true })}ResourceServer`; + + context.api = { + name, + identifier, + resourceName, + }; + }, + }, + { + title: "Connect to BitBucket", + task: async (context): Promise => { + context.bitbucketAccessToken = await getAccessToken("knXh7CKqDtCUHLrhVW", 31337); + }, + }, + { + title: "Retrieve repository UUID", + task: async (context): Promise => { + const bitbucket = new BitBucketClient( + context.bitbucketAccessToken, + context.workspace, + context.repository, + ); + context.repositoryUuid = await bitbucket.getRepositoryUuid(); + }, + }, + { + title: "Configure pipeline environments", + task: async (context): Promise => { + const bitbucket = new BitBucketClient( + context.bitbucketAccessToken, + context.workspace, + context.repository, + ); + await bitbucket.enablePipeline(); + const environments = await bitbucket.getEnvironments(); + const envs = [ + ["Test", "development"], + ["Staging", "staging"], + ["Production", "production"], + ] as const; + + for (const [pipelineEnv, auth0Env] of envs) { + const credentials = context.auth0Credentials[auth0Env]; + const environment = environments.find( + (environment) => environment.name === pipelineEnv, + ); + + if (!environment) { + throw new Error(`Could not find pipeline environment ${pipelineEnv}`); + } + + await bitbucket.createEnvVariable( + environment.uuid, + "AUTH0_DOMAIN", + credentials.tenant, + false, + ); + await bitbucket.createEnvVariable( + environment.uuid, + "AUTH0_CLIENT_ID", + credentials.clientId, + false, + ); + await bitbucket.createEnvVariable( + environment.uuid, + "AUTH0_CLIENT_SECRET", + credentials.clientSecret, + true, + ); + } + }, + }, + { + title: "Bootstrap CDK", + task: async (context, task): Promise => { + await execute( + task.stdout(), + "pnpm", + ["exec", "cdk", "bootstrap", `aws://${context.accountId}/${context.region}`], + { + cwd: fileURLToPath(new URL(".", import.meta.url)), + env: { + AWS_REGION: context.region, + }, + }, + ); + }, + }, + { + title: "Setup AWS resources", + task: async (context): Promise => { + const deployResult = await deployAwsStack(context.region); + const iam = new IAM({region: context.region}); + const listAccessKeysResult = await iam.listAccessKeys({UserName: deployResult.auth0UserName}); + + for (const accessKey of listAccessKeysResult.AccessKeyMetadata ?? []) { + await iam.deleteAccessKey({UserName: deployResult.auth0UserName, AccessKeyId: accessKey.AccessKeyId}); + } + + const createAccessKeyResult = await iam.createAccessKey({ + UserName: deployResult.auth0UserName, + }); + + if ( + !( + createAccessKeyResult.AccessKey?.AccessKeyId && + createAccessKeyResult.AccessKey?.SecretAccessKey + ) + ) { + throw new Error("Could not create access key"); + } + + context.awsAuth0Credentials = { + accessKeyId: createAccessKeyResult.AccessKey.AccessKeyId, + secretAccessKey: createAccessKeyResult.AccessKey.SecretAccessKey, + }; + + const logo = await readFile( + fileURLToPath(new URL("../assets/logo.svg", import.meta.url)), + ); + + const s3 = new S3({region: context.region}); + await s3.putObject({ + Bucket: deployResult.staticBucketName, + Key: "tenant-logo.svg", + Body: logo, + ContentType: "image/svg+xml", + }); + await s3.putObject({ + Bucket: deployResult.staticBucketName, + Key: "branding-logo.svg", + Body: logo, + ContentType: "image/svg+xml", + }); + + if (context.spa) { + await s3.putObject({ + Bucket: deployResult.staticBucketName, + Key: `${context.spa.identifier}-logo.svg`, + Body: logo, + ContentType: "image/svg+xml", + }); + } + + context.awsDeployResult = deployResult; + }, + }, + { + title: "Configure repository variables", + task: async (context): Promise => { + const bitbucket = new BitBucketClient( + context.bitbucketAccessToken, + context.workspace, + context.repository, + ); + + await bitbucket.createRepositoryVariable( + "SES_ACCESS_KEY_ID", + context.awsAuth0Credentials.accessKeyId, + false, + ); + await bitbucket.createRepositoryVariable( + "SES_SECRET_ACCESS_KEY", + context.awsAuth0Credentials.secretAccessKey, + true, + ); + }, + }, + { + title: "Setup deployment role", + task: async (context, task): Promise => { + await execute( + task.stdout(), + "pnpm", + [ + "exec", + "bitbucket-openid-connect", + "deploy", + "bitbucket-openid-connect", + context.name, + context.repositoryUuid, + ], + { + cwd: fileURLToPath(new URL(".", import.meta.url)), + env: { + AWS_REGION: context.region, + }, + }, + ); + + const result = await execute( + task.stdout(), + "pnpm", + [ + "exec", + "bitbucket-openid-connect", + "get-role-arn", + "bitbucket-openid-connect", + context.name, + ], + { + cwd: fileURLToPath(new URL(".", import.meta.url)), + env: { + AWS_REGION: context.region, + }, + }, + ); + + context.deployRoleArn = result.stdout; + }, + }, + { + title: "Synth project", + task: async (context, task): Promise => { + await synthProject(context.projectPath, context, task.stdout()); + }, + }, + { + title: "Git init", + task: async (context, task): Promise => { + await execute(task.stdout(), "git", ["init"], { cwd: context.projectPath }); + await execute(task.stdout(), "git", ["add", "."], { cwd: context.projectPath }); + await execute(task.stdout(), "git", ["commit", "-m", '"feat: initial commit"'], { + cwd: context.name, + }); + await execute( + task.stdout(), + "git", + [ + "remote", + "add", + "origin", + `git@bitbucket.org:${context.workspace}/${context.repository}.git`, + ], + { cwd: context.name }, + ); + await execute(task.stdout(), "pnpm", ["exec", "lefthook", "install"], { + cwd: context.name, + }); + + let forcePush = false; + + try { + await execute(task.stdout(), "git", ["push", "-u", "origin", "main"], { + cwd: context.name, + }); + } catch { + forcePush = await task.prompt(ListrEnquirerPromptAdapter).run({ + type: "toggle", + message: "Push failed, try force push?", + initial: false, + }); + } + + if (forcePush) { + await execute(task.stdout(), "git", ["push", "-fu", "origin", "main"], { + cwd: context.name, + }); + } + }, + }, + ], + { concurrent: false }, +); + +try { + await tasks.run(); + + logger.log( + ListrLogLevels.COMPLETED, + "Project creation successful, you must run the pipeline manually once.", + ); +} catch (error) { + logger.log(ListrLogLevels.FAILED, error as string); +} diff --git a/src/synth.ts b/src/synth.ts new file mode 100644 index 0000000..b1f9ce5 --- /dev/null +++ b/src/synth.ts @@ -0,0 +1,143 @@ +import path from "path"; +import { fileURLToPath } from "url"; +import merge from "deepmerge"; +import { cp, mkdir, readFile, rename, writeFile } from "fs/promises"; +import { glob } from "glob"; +import Handlebars from "handlebars"; +import type { PackageJson, TSConfig } from "pkg-types"; +import type { AwsDeployResult } from "./aws-stack.js"; +import { execute } from "./util.js"; + +export type TenantSettings = { + friendlyName: string; + supportUrl: string; + supportEmailAddress: string; + defaultFromAddress: string; +}; + +export type SpaSettings = { + resourceName: string; + identifier: string; + name: string; + propPrefix: string; +}; + +export type ApiSettings = { + resourceName: string; + identifier: string; + name: string; +}; + +export type ProjectConfig = { + accountId: string; + region: string; + deployRoleArn: string; + name: string; + awsDeployResult: AwsDeployResult; + tenant: TenantSettings; + spa: SpaSettings | null; + api: ApiSettings | null; +}; + +type ProjectContext = { + projectPath: string; + skeletonPath: string; + stdout: NodeJS.WritableStream; +}; + +const loadPackageJson = async (basePath: string): Promise => { + try { + const json = await readFile(path.join(basePath, "package.json"), { encoding: "utf-8" }); + return JSON.parse(json) as PackageJson; + } catch { + return {}; + } +}; + +const loadTsConfig = async (basePath: string): Promise => { + try { + const json = await readFile(path.join(basePath, "tsconfig.json"), { encoding: "utf-8" }); + return JSON.parse(json) as TSConfig; + } catch { + return {}; + } +}; + +const orderDeps = (deps: Record): Record => { + return Object.keys(deps) + .sort() + .reduce( + (sorted, key) => { + sorted[key] = deps[key]; + return sorted; + }, + {} as Record, + ); +}; + +const copyTemplates = async (context: ProjectContext, config: ProjectConfig): Promise => { + const basePath = path.join(context.skeletonPath, "templates"); + const templatePaths = await glob("**/*.mustache", { cwd: basePath, dot: true }); + + for (const templatePath of templatePaths) { + const rawTemplate = await readFile(path.join(basePath, templatePath), { + encoding: "utf-8", + }); + const template = Handlebars.compile(rawTemplate); + const targetPath = path.join(context.projectPath, templatePath.replace(/\.mustache$/, "")); + await mkdir(path.dirname(targetPath), { recursive: true }); + await writeFile(targetPath, template(config)); + } +}; + +export const synthProject = async ( + projectPath: string, + config: ProjectConfig, + stdout: NodeJS.WritableStream, +): Promise => { + const context: ProjectContext = { + projectPath, + skeletonPath: fileURLToPath(new URL("../skeleton", import.meta.url)), + stdout: stdout, + }; + + await cp(path.join(context.skeletonPath, "base"), projectPath, { recursive: true }); + await copyTemplates(context, config); + const packageJson = merge( + { name: config.name } as PackageJson, + await loadPackageJson(context.skeletonPath), + ); + const tsConfig = await loadTsConfig(context.skeletonPath); + + if (packageJson.dependencies) { + packageJson.dependencies = orderDeps(packageJson.dependencies); + } + + if (packageJson.devDependencies) { + packageJson.devDependencies = orderDeps(packageJson.devDependencies); + } + + await writeFile( + path.join(projectPath, "package.json"), + JSON.stringify(packageJson, undefined, 4), + ); + await writeFile( + path.join(projectPath, "tsconfig.json"), + JSON.stringify(tsConfig, undefined, 4), + ); + + const rmExtPaths = await glob(path.join(projectPath, "**/*.rm-ext"), { dot: true }); + + for (const rmExtPath of rmExtPaths) { + const newPath = rmExtPath.replace(/\.rm-ext$/, ""); + await rename(rmExtPath, newPath); + } + + await execute(context.stdout, "pnpm", ["install"], { cwd: projectPath }); + await execute(context.stdout, "pnpm", ["exec", "biome", "check", ".", "--apply"], { + cwd: projectPath, + }); + await execute(context.stdout, "node", ["update-provider.js"], { + cwd: projectPath, + }); +}; diff --git a/src/util.ts b/src/util.ts new file mode 100644 index 0000000..94d6caa --- /dev/null +++ b/src/util.ts @@ -0,0 +1,17 @@ +import { type ExecaReturnValue, type Options, execa } from "execa"; + +export const execute = async ( + stdout: NodeJS.WritableStream | null, + file: string, + args: readonly string[], + options?: Options, +): Promise => { + const execute = execa(file, args, options); + + if (stdout) { + execute.stdout?.pipe(stdout); + execute.stderr?.pipe(stdout); + } + + return execute; +}; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..949f2e9 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": ["@tsconfig/node20/tsconfig.json"], + "compilerOptions": { + "strict": true, + "noImplicitAny": true, + "sourceMap": true, + "outDir": "dist" + }, + "include": [ + "src/**/*" + ] +}